我有一个 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/