当用户开始编辑单元格文本时,如何通过编程将光标置于编辑DataGridView单元格文本的开头?

6

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

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

这并没有起作用。同时我尝试在CellBeginEdit中取消选择文本,但也没有效果。

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;
    }
}

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

如果单元格不是文本框,则不执行任何操作。

如果您想这样做,可以:

dgv.EditMode = DataGridViewEditMode.EditProgrammatically;

虽然你可以完全控制何时开始编辑,但我发现这并非必要。


在几个空引用异常之后,我添加了一个小的改进:Private Sub dataGridView1_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles Dgv.CellEnter If Dgv.CurrentCell.EditType = GetType(DataGridViewTextBoxEditingControl) Then DgGradeText.BeginEdit(False) Dim EditBox = DirectCast(Dgv.EditingControl, TextBox) If IsNothing(EditBox) = False Then EditBox.SelectionStart = 0 End If End Sub - Richard Griffiths

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接