Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net WinForms上的DataGridView编辑单元格_Vb.net_Datagridview_Editing_Cells - Fatal编程技术网

Vb.net WinForms上的DataGridView编辑单元格

Vb.net WinForms上的DataGridView编辑单元格,vb.net,datagridview,editing,cells,Vb.net,Datagridview,Editing,Cells,我有一个WindowsFormVS2010.NET4项目,其中一个标准DataGridView绑定到表单上的数据源 网格中有一个文本列,我希望它成为一个点,并在单击的角色处进行编辑。 与普通文本框/编辑器一样,当您单击要调整的字符时。如果可能的话,我也希望使用上/下键在行之间移动,但希望光标移动到同一列中的相同字符位置,而不选择整个文本 我试过几件事: DataGridView1.ClearSelection() DataGridView1.BeginEdit(False) BeginEdit只

我有一个WindowsFormVS2010.NET4项目,其中一个标准DataGridView绑定到表单上的数据源

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

我试过几件事:

DataGridView1.ClearSelection()

DataGridView1.BeginEdit(False)

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

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

我在DataGridView1\u 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
设置为
editonener
,但这意味着您只需要单击两次,而不是三次

您需要编写自己的列类型

有人就是这么做的

我还没有检查该示例是否可以上下处理—如果不能,则说明您使用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);
}
在上面的方法中,当前_控件是窗体级别的私有变量。t的事件处理程序如下所示:

void t_Leave(object sender, EventArgs e)
{
    cell_caret_pos = current_control.SelectionStart;
}
我们还有一个类级别的私有字段-cell\u caret\u 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;
    }
} 

很好的答案确实很重要,我已经找了很久了。它没有向上向下的部分,但我可能可以修改它。关于获取上一个单元格的任何想法。我只是通过将编辑控件(来自编辑控件显示)放置在表单级私有变量中,然后在编辑控件离开事件期间将SelectionStart值放置在表单级int变量中,快速证明了这一点。一旦超出网格,我检查int,它就有了最后一个编辑控件位置。我只花了一分钟的时间进行测试,因此您应该能够很容易地将类似的内容放入该示例的子类dgv中。谢谢David,我有插入符号位置,但当使用上/下箭头时,它不会进入下一行的编辑模式,我不确定如何设置编辑,然后重新定位插入符号。我尝试将EditMode设置为editonener,但这阻止了鼠标的一键编辑。抱歉有点新手…再次感谢David,我只需要用一键编辑来修复它,也就是说,当单元格插入符号位置被设置时,鼠标单元格输入事件会在鼠标单击后发生,它会覆盖单击后的原始位置;通过将cell_caret_pos(在OnMouseDown事件中)设置为-1并在cell回车行周围放置一个if,修复了上面的问题。我唯一不喜欢的是单元格行移动之间的绘画,它变为白色,然后显示文本,但这是一件小事。非常感谢大卫的帮助。