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

时间:2013-09-18 14:19:49

标签: c# .net winforms datagridview

我有两个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作为第二列尝试相同的事情并且效果很好。第二列正在初始化其编辑控件的方式有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

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

CurrentCell方法