2012-03-10 100 views
2

我有一个Windows窗体VS2010 .NET 4项目,标准DataGridView绑定到窗体上的数据源。DataGridView编辑WinForms上的单元格

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

我已经尝试了几件事情:

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 

但这没什么。

我只是想删除两个或三个点击以获得需要调整的角色位置。

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

任何建议将不胜感激。

回答

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

出色答卷做的主要工作位,我一直在为这个搜索了好半天。它不会完成上行,但我可能会修改它。关于获取前一个单元格的任何想法。 – 2012-03-11 12:28:42

+0

我只是通过将编辑控件(来自编辑控件显示)放置在表单级别的专用变量中,然后在编辑控件离开事件期间将SelectionStart值放置在表单级别的int变量中,从而非常迅速地对此进行了验证。然后,一旦在网格外面,我检查了整数,它有最后一个编辑控制位置。只花了我一分钟的时间来测试,这样你就可以很容易地将类似的东西放入该示例的子类dgv中。 – 2012-03-11 12:41:39

+0

谢谢大卫,我有插入位置,但是当使用上/下箭头时,它不会进入下一行的编辑模式,我不知道如何设置编辑,然后重新定位插入符号。我尝试将EditMode设置为EditOnEnter,但这样可以防止鼠标单击编辑。对不起,这是一个新手... – 2012-03-11 14:23:01

相关问题