0

我有两个 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 作为第二列尝试了同样的事情,效果很好。我猜第二列初始化其编辑控件的方式有什么问题?

4

1 回答 1

0

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

然后,如果您的验证成功(格式为 DateTime),您可以使用该DataGridView::SelectNextControl()方法。如这篇文章所述:DataGridView SelectNextControl 不要忘记DetatchEditingControl调用CurrentCell

于 2013-09-18T15:16:35.073 回答