6

我使用从 DataTable 获取数据的 DataGridView 来编辑一些数据。一切似乎都很好,但有些不便。当用户开始编辑单元格时,该单元格的文本自动被选中,光标移动到单元格文本的末尾。当用户开始编辑单元格文本时,我想将光标(插入符号)放在以编程方式编辑单元格的文本开头。我试过:

private void gridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        DataGridViewTextBoxEditingControl dText = (DataGridViewTextBoxEditingControl)e.Control;
        dText.Select(0, 0);
    }

那是行不通的。我也尝试在 CellBeginEdit 中取消选择文本 - 也没有结果。

4

1 回答 1

10

我本来希望你所做的也能奏效。但是 DataGridView 是一个包含许多事件的复杂控件,并且通常不能直观地工作。好像EditingControlShowing事件发生的时候,控件还没有初始化,所以不能影响它。当CellBeginEdit事件发生时,控件甚至还没有被创建。

应该并且可能有更好的方法来做到这一点,但我使用该CellEnter事件让它工作:

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
    if (dgv.CurrentCell.EditType == typeof(DataGridViewTextBoxEditingControl))
    {
        dgv.BeginEdit(false);            
        ((TextBox)dgv.EditingControl).SelectionStart = 0;
    }
}

因此,当输入单元格时,我直接进入编辑模式,但我将false传递给BeginEdit()它告诉它不要选择任何文本。现在编辑控件已完全初始化,我可以将光标设置SelectionStart为零以将光标移动到文本的开头。

如果单元格不是文本框,那么我什么也不做。

如果你愿意,你可以做

dgv.EditMode = DataGridViewEditMode.EditProgrammatically;

so that you have full control over when editing begins, but I find this isn't necessary.

于 2011-12-14T23:52:53.393 回答