当用户开始编辑单元格文本时,如何以编程方式在编辑DataGridView单元格时将光标放在文本的开头?

时间:2011-12-13 17:38:59

标签: c# text datagridview cursor cell

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

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

这不行。我还尝试在CellBeginEdit中取消选择文本 - 也没有结果。

1 个答案:

答案 0 :(得分:9)

我会期待你做的工作。但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;

这样您就可以完全控制编辑开始的时间,但我发现这不是必需的。