1

我有一个 DataGridView,其中有许多单元格的 ReadOnly 属性设置为 True。

当用户使用 tab 键在单元格中切换时,如果 ReadOnly 属性为真,我想将焦点移动到下一个单元格上。我的代码如下:

    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

两个建议之一应该有效

利用

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

否则,这里建议使用另一种方法以及原因,
这也意味着同样的问题:-
InvalidOperationException - 结束编辑单元格并移动到另一个单元格时

于 2012-08-16T14:22:09.607 回答
0

您可以使用 datagridview 单元格 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 回答