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}");
我已阅读过本网站和其他网站上的许多主题,但无法让它发挥作用。任何建议都将不胜感激。
谢谢!
答案 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];
}