我有两个 datagridview 列;startdate 和 enddate 使用本文中描述的自定义 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
{
}
}
}
编辑焦点确实更改为下一列/单元格,但是当我开始输入第二列/单元格时出现 NullReference 异常,该异常源自DataGridViewMaskedTextCell类中的PositionEditingControl()方法。
谁能告诉我为什么会这样?
有没有比设置 .CurrentCell 移动到下一个单元格的“更好”方法?
编辑:似乎这个问题与第二列也使用这个自定义编辑控件的事实有关。用常规的 TextBoxColumn 作为第二列尝试了同样的事情,效果很好。我猜第二列初始化其编辑控件的方式有什么问题?