DataGridView在WinForms上编辑单元格

时间:2012-03-10 23:28:59

标签: vb.net datagridview editing cells

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

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

我尝试了一些事情:

DataGridView1.ClearSelection()

DataGridView1.BeginEdit(假)

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

但这没有任何作用。

我只想删除两到三次点击以进入需要调整的角色位置。

我还没有看过Custom DataColumn。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:2)

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

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

有人完成了here

我没有检查该示例是否上下处理 - 如果没有,那么您使用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;
    }
}