C# 在有效输入后自动选择下一列(带有自定义列的DataGridView)

C# 在有效输入后自动选择下一列(带有自定义列的DataGridView),c#,.net,winforms,datagridview,C#,.net,Winforms,Datagridview,我有两个datagridview列;startdate和enddate使用本文中描述的自定义MaskedTextBox列类型: 现在,当用户在列中输入有效日期时,我想自动将编辑焦点移动到同一行的下一个单元格 此MaskedTextBox列的工作方式是在OnTextChanged()事件中 我尝试将.Text值转换为DateTime,如果没有例外,我会将该DateTime值指定给DataGridView.CurrentCell.value 然后,我尝试使用DataGridView.CellValu

我有两个datagridview列;startdate和enddate使用本文中描述的自定义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
            {

            }
       }
    }
private void myDataGridView\u CellValueChanged(对象发送方,DataGridViewCellEventArgs e)
{
如果(e.ColumnIndex=-1 | | e.RowIndex=-1)
返回;
//移动到同一行的下一个单元格
if(myDataGridView.Columns[e.ColumnIndex].ValueType.Equals(typeof(DateTime)))
{
尝试
{
myDataGridView.EndEdit(DataGridViewDataErrorContexts.Commit);
int NewColIndex=myDataGridView.CurrentCell.ColumnIndex+1;
if(NewColIndex>-1&&NewColIndex
编辑焦点确实会更改为下一列/单元格,但当我开始在第二列/单元格中键入时,会出现NullReference异常,该异常源自DataGridViewMaskedTextCell类中的PositionEditingControl()方法

谁能告诉我为什么会这样

是否有比设置.CurrentCell更好的方法移动到下一个单元格


编辑:
这个问题似乎与第二列也使用这个自定义editcontrol有关。在常规TextBoxColumn中尝试了与第二列相同的方法,效果非常好。我想第二列初始化编辑控件的方式可能有问题?

从功能学的角度来看,我建议您在验证单元格内容之前等待用户按“回车”键。您应该使用
CellEndEdit
事件处理程序来捕获它,而不是
CellValueChanged

然后,如果验证成功(格式为DateTime),则可以使用
DataGridView::SelectNextControl()
方法。 如本文所述:
不要忘记调用
CurrentCell

DetatchEditingControl
方法发送制表键怎么样?发送制表键=相同的结果我不能像这样使用回车键。回车键应导致跳转到下一行。我尝试在一系列不同的事件中使用DataGridView.SelectNextControl(),但没有成功。