1

ReadOnly プロパティが True に設定されている多数のセルを含む DataGridView があります。

ユーザーが Tab キーを使用してセルをタブ移動すると、ReadOnly プロパティが true の場合、フォーカスを次のセルに移動したいと考えています。私のコードは以下の通りです:

    private void filterGrid_CellEnter(object sender, DataGridViewCellEventArgs e)
    {
        if (!filterGrid.Rows[e.RowIndex].Cells[e.ColumnIndex].ReadOnly)
        {
            EditCell(sender, e);                
        }
        else
        {
            //Move to the next cell
            filterGrid.Rows[e.RowIndex].Cells[e.ColumnIndex + 1].Selected = true;
        }            
    }

ただし、上記のコードを実行すると、次のエラーが表示されます。

SetCurrentCellAddressCore 関数への再入可能呼び出しになるため、操作は無効です。

私はC#4.0を使用しています

前もって感謝します。

4

3 に答える 3

3

このようなものには派生 DataGridView を使用します。これは Tab キーにのみ影響するため、ユーザーは読み取り専用セルをクリックしてコピーして貼り付けることができます。

using System.Windows.Forms;

namespace WindowsFormsApplication5
{
    class MyDGV : DataGridView
    {
        public bool SelectNextCell()
        {
            int row = CurrentCell.RowIndex;
            int column = CurrentCell.ColumnIndex;
            DataGridViewCell startingCell = CurrentCell;

            do
            {
                column++;
                if (column == Columns.Count)
                {
                    column = 0;
                    row++;
                }
                if (row == Rows.Count)
                    row = 0;
            } while (this[column, row].ReadOnly == true && this[column, row] != startingCell);

            if (this[column, row] == startingCell)
                return false;
            CurrentCell = this[column, row];
            return true;
        }

        protected override bool ProcessDataGridViewKey(KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Tab)
                return SelectNextCell();
            return base.ProcessDataGridViewKey(e);
        }

        protected override bool ProcessDialogKey(Keys keyData)
        {
            if ((keyData & Keys.KeyCode) == Keys.Tab)
                return SelectNextCell();
            return base.ProcessDialogKey(keyData);
        } 
    }
}
于 2012-08-16T14:51:35.810 に答える
0

2つの提案のうちの1つが機能するはずです

使用する

 else
        {
            filterGrid.ClearSelection();
            filterGrid.Rows[e.RowIndex].Cells[e.ColumnIndex + 1].Selected = true;
        }

それ以外の場合は、理由とともに別の方法がここで提案されます。
また、これは同じ問題を意味します:-
InvalidOperationException - セルの編集を終了して別のセルに移動する場合

于 2012-08-16T14:22:09.607 に答える
0

datagridview cell Enter イベントを使用して、読み取り専用セル タブ インデックスを別のセルにバイパスできます。これが私の例です: -

    private void dgVData_CellEnter(object sender, DataGridViewCellEventArgs e)
    {
        if (dgVData.CurrentRow.Cells[e.ColumnIndex].ReadOnly)
        {
            SendKeys.Send("{tab}");
        }
    }
于 2017-06-22T16:03:24.290 に答える