2

我有一个 Windows Form VS2010 .NET 4 项目,其标准 DataGridView 绑定到表单上的数据源。

网格有一个文本列,我想成为一个点并在单击的字符处进行编辑。当您单击要调整的字符时,就像普通的文本框/编辑器一样。如果可能的话,我还想使用向上/向下键在行之间移动,但希望光标在同一列中明显移动到同一字符位置,而不选择整个文本。

我尝试了几件事:

DataGridView1.ClearSelection()

DataGridView1.BeginEdit(False)

BeginEdit 只是将光标放在文本的末尾,这意味着再次单击以指向字符位置进行编辑。

我知道像 DevExpress 这样的商业网格默认为编辑,您可以在其中单击到正确的字符位置,但显然要花钱。

我在 DataGridView1_EditingControlShowing 事件中尝试过

If TypeOf e.Control Is System.Windows.Forms.DataGridViewTextBoxEditingControl Then
        Dim tb As TextBox = e.Control
        tb.SelectionStart = 5
        tb.SelectionLength = 5
End If

但这无济于事。

我只是想删除两到三下的点击以到达需要调整的角色位置。

我还没有看过自定义数据列。

任何建议将不胜感激。

4

1 回答 1

2

这样做没有开箱即用的好方法。最接近的是EditMode将网格设置为,EditOnEnter但这意味着您只需要单击两次,而不是单击三次。

您将需要编写自己的列类型。

有人在这里做过。

我没有检查该示例是否向上和向下处理 - 如果没有,那么您在正确的轨道上使用 SelectionStart 和 SelectionLength 属性,只需抓住您要离开的单元格的插入符号位置并将其应用于新单元格.


事实证明,设置这些属性比我记得的要复杂一些(可能是因为我上次这样做时已经使用了 MaskedTextBox 自定义列类型)。

下面的代码(在 c# 中,但原则适用于 vb.Net,如果您不能自己转换它,我可以提供 vb 代码)工作愉快 - 可以通过将其放入自定义控件来整理,但我会留下作为练习:)

首先,我为 EditingControlShowing 事件添加一个处理程序:

void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    DataGridViewTextBoxEditingControl t = e.Control as DataGridViewTextBoxEditingControl;
    current_control = t;
    t.Leave += new EventHandler(t_Leave);
}

在上面的方法中 current_control 是一个表单级别的私有变量。t 的事件处理程序如下所示:

void t_Leave(object sender, EventArgs e)
{
    cell_caret_pos = current_control.SelectionStart;
}

再次,我们有一个类级别的私有字段 - cell_caret_pos。

然后我发现要设置 SelectionStart 和 SelectionLength 您需要在 CellEnter 事件处理程序中工作:

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
    dataGridView1.BeginEdit(false);
    DataGridViewTextBoxEditingControl editControl =
        (DataGridViewTextBoxEditingControl)dataGridView1.EditingControl;

    if (cell_caret_pos != 0)
    {
        editControl.SelectionStart = cell_caret_pos;
        editControl.SelectionLength = 0;
    }
} 
于 2012-03-10T23:39:52.997 回答