我有两个datagridview列;使用本文中描述的自定义MaskedTextBox列类型启动和结束:http://www.codeproject.com/Articles/26005/DataGridViewColumn-Hosting-MaskedTextBox
现在,当用户在列中输入有效日期时,我想自动将编辑焦点移动到同一行的下一个单元格。
MaskedTextBox列的工作方式是 OnTextChanged()事件 我尝试将.Text值转换为DateTime,如果没有异常,我将该DateTime值分配给DataGridView.CurrentCell.Value。
然后我尝试使用 DataGridView.CellValueChanged 事件移动到下一个单元格,如下所示:
private void myDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == -1 || e.RowIndex == -1)
return;
//Move to next cell on the same row
if (myDataGridView.Columns[e.ColumnIndex].ValueType.Equals(typeof(DateTime)))
{
try
{
myDataGridView.EndEdit(DataGridViewDataErrorContexts.Commit);
int NewColIndex = myDataGridView.CurrentCell.ColumnIndex + 1;
if (NewColIndex > -1 && NewColIndex < myDataGridView.Columns.Count)
myDataGridView.CurrentCell = myDataGridView[NewColIndex, myDataGridView.CurrentCell.RowIndex];
}
catch
{
}
}
}
编辑焦点DO被更改为下一列/单元格,但是当我开始在第二列/单元格中键入时,我得到一个NullReference异常,源自 PositionEditingControl()方法i> DataGridViewMaskedTextCell 类。
任何人都可以告诉我为什么会这样吗?
是否有一种“更好”的方式来移动到下一个单元格而不是设置.CurrentCell?
编辑: 看来这个问题与第二列也使用这个自定义editcontrol的事实有关。使用常规TextBoxColumn作为第二列尝试相同的事情并且效果很好。第二列正在初始化其编辑控件的方式有什么想法吗?
答案 0 :(得分:0)
从人体工程学的角度来看,我建议您在验证单元格的内容之前等待用户按“Enter”键。您应该使用CellEndEdit
事件处理程序来捕获它,而不是CellValueChanged
然后,如果验证成功(格式为DateTime),则可以使用DataGridView::SelectNextControl()
方法。
如本帖所述:DataGridView SelectNextControl
不要忘记调用DetatchEditingControl
CurrentCell
方法