我正在使用datagridview
开发一个表单。
我想要的结果是:
我在Cell_Enter Event
上做了这个(我有理由在Cell_Enter
上编码。我必须使用Cell_Enter)。
DataGridViewCell cell = myGrid.Rows[cursorRow].Cells[cursorCol];
myGrid.CurrentCell = cell;
myGrid.BeginEdit(true);
点击Editable Cell
即可,点击ReadOnly Cell
会出现例外错误:
错误 - > 操作无效,因为它会导致对SetCurrentCellAddressCore函数的重入调用。
那么,这个问题有解决方案吗? (当用户点击ReadOnly Cell
时,光标将移至Editable
单元格。)
编辑:我想要的解决方案是如何将光标移动到非当前单元格的其他单元格?
答案 0 :(得分:2)
我找到了解决此问题的解决方案here。
private void myGrid_CellEnter(object sender, DataGridViewCellEventArgs e)
{
//Do stuff
Application.Idle += new EventHandler(Application_Idle);
}
void Application_Idle(object sender, EventArgs e)
{
Application.Idle -= new EventHandler(Application_Idle);
myGrid.CurrentCell = myGrid[cursorCol,cursorRow];
}
答案 1 :(得分:1)
尝试使用If.. else ..statement
if (cursorCol == 1) //When user clicks on ReadOnly Cell, the Cursor will move to Editable Cell.
{
myGrid.CurrentCell = myGrid[cursorRow, cursorCol];
}
else //When user clicks on Editable Cell, the Cursor will be on this Current Editable Cell.
{
//Do stuff
myGrid.BeginEdit(true);
}
答案 2 :(得分:1)
我不是100%肯定这会适合你的情况,但是由于我们客户的愚蠢UI要求,我曾经遇到过类似的问题。快速解决方法是将代码包装在BeginInvoke
中。例如:
BeginInvoke((Action)delegate
{
DataGridViewCell cell = myGrid.Rows[cursorRow].Cells[cursorCol];
myGrid.CurrentCell = cell;
myGrid.BeginEdit(true);
});
本质上,这将使它在CellEnter
事件之后执行代码,允许DataGridView
执行导致异常的幕后操作。
最终,它被重构为自定义控件,不再需要扩展DataGridView
和BeginInvoke
。