【问题标题】:Automatically select next column after valid input (DataGridView with custom column)有效输入后自动选择下一列(带有自定义列的DataGridView)
【发布时间】:2013-09-18 14:19:48
【问题描述】:

我有两个 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 异常,它源自 PositionEditingControl() 中的方法i>DataGridViewMaskedTextCell 类。

谁能告诉我为什么会这样?

有没有比设置 .CurrentCell 移动到下一个单元格的“更好”方式?


编辑: 似乎这个问题与第二列也使用这个自定义编辑控件的事实有关。用常规的 TextBoxColumn 作为第二列尝试了同样的事情,效果很好。我猜第二列初始化其编辑控件的方式有什么问题?

【问题讨论】:

  • 发送tab键呢?
  • 发送 Tab 键 = 相同结果

标签: c# .net winforms datagridview


【解决方案1】:

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

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

【讨论】:

  • 我不能这样使用 Enter 键。 Enter 键应导致跳转到下一行。我尝试在一堆不同的事件中使用 DataGridView.SelectNextControl() - 没用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多