vb.net - DataGridView 在 WinForms 上编辑单元格

标签 vb.net datagridview editing cells

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

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

我尝试了一些方法:

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

但这没有任何作用。

我只是想删除两三次点击以到达需要调整的字符位置。

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

如有任何建议,我们将不胜感激。

最佳答案

没有现成的好方法可以做到这一点。最接近的方法是将网格的 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是一个表单级私有(private)变量。 t 的事件处理程序如下所示:

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

我们再次有一个类级私有(private)字段 - 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;
    }
} 

关于vb.net - DataGridView 在 WinForms 上编辑单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9651108/

相关文章:

c# - 从xml中分层获取数据

text - 使用 Racket 编辑文件中的文本

java - 在数据集中查找一行并复制到java中的另一个文件

c# - .net - Array.Sort 和 Array.BinarySearch 的问题 - 文化和全局化

vb.net - 部署到 IIS 后,RDLC 报告没有发布到?

c# - DataGridView 中的计算列绑定(bind)到一个对象

WPF IsEditable=true 填充对象的 ComboBox 将 ToString() 显示为所选项目

vb.net - 处理错误的更好方法

mysql - 使用过滤器填充组合框

c# - 如何使用 C# 将 Excel 工作表中特定行或单元格的字体加粗?