将焦点设置为DataGridView中的不同列

时间:2017-07-06 21:49:18

标签: c# winforms datagridview

DataGridView控件中的列0是只读的。如果用户使用鼠标选择列0或按下上一行中最后一列的Tab键,我希望焦点移至第1列。我在CellEnter事件中尝试了以下代码,但它导致异常"操作无效,因为它导致对CurrentCellAddressCore函数的重入调用"。第1列命名为" patternsTerminator"。

private void dataGridView_patterns_CellEnter(object sender, DataGridViewCellEventArgs e)
{
    int currentRow = e.RowIndex;

    try
    {
        if (this.dataGridView_patterns.CurrentCell.ColumnIndex == 0)
            this.dataGridView_patterns.CurrentCell = this.dataGridView_patterns.Rows[currentRow].Cells["patternsTerminator"];
    }
    catch (Exception ex)
    {
        MessageBox.Show(this, ex.Message, errCaption, button, icon);
    }
}

我理解为什么会发生异常。当焦点移到第1列时,将再次调用CellEnter事件,并且该异常会阻止对CellEnter事件的递归调用。

我尝试了以下作为解决方法,但它忽略了Tab键。当我在第0列中单击时,将调用SendKeys,但光标将保留在第0列。

if (this.dataGridView_patterns.CurrentCell.ColumnIndex == 0)
    SendKeys.Send("{TAB}");

我已阅读过本网站和其他网站上的许多主题,但无法让它发挥作用。任何建议都将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:1)

我解决了异常,但焦点无法正常工作 - 对我来说,它希望使用以下代码跳过第二列。我没时间了。玩弄它,如果你不能得到它我会很快跟进。

private void DgNew_CellEnter(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == 0)
    {
        this.BeginInvoke(new MethodInvoker(() =>
        {
            moveCellTo(dgNew, e.RowIndex, 1);
        }));
    }
}

private void moveCellTo(DataGridView dgCurrent, int rowIndex, int columnIndex)
{
    dgCurrent.CurrentCell = dgCurrent.Rows[rowIndex].Cells[columnIndex];
}

我从这篇文章中得到了这个想法:How to evade reentrant call to setCurrentCellAddressCore?

答案 1 :(得分:0)

添加到Jared的答案,我测试了以下代码并且它有效。这个和Jared的答案之间唯一的区别是columnIndex是由它的名字而不是它的索引值引用的。再次感谢,Jared。

        try
        {
            // Display the pattern number in column 0
            this.dataGridView_patterns.Rows[currentRow].Cells["patternNumber"].Value = currentRow + 1;

            // Move the current cell focus to column 1 (Terminator pattern) on current row
            if (e.ColumnIndex == 0)
            {
                this.BeginInvoke(new MethodInvoker(() =>
                {
                    moveCellTo(dataGridView_patterns, e.RowIndex, "patternsTer");
                }));
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(this, ex.Message, errCaption, button, icon);
        }
    }

    private void moveCellTo(DataGridView dgCurrent, int rowIndex, string columnName)
    {
        dgCurrent.CurrentCell = dgCurrent.Rows[rowIndex].Cells[columnName];
    }