【发布时间】:2017-03-28 13:37:08
【问题描述】:
我们有一个DataGridView,其中包含表单中的数据。为了实现快速搜索,我们将 TextBox 添加到 DataGridView.Controls 并突出显示包含 TextBox 中的文本的单元格。
但是,有一个问题。 DataGridView 使用左箭头 ←、右箭头 →、Home 和 End(带或不带 Shift ) 键即使光标在 TextBox 中,用户也无法更改插入符号的位置或从键盘选择文本。
TextBox 生成一个PreviewKeyDown 事件,然后没有任何反应。
简化代码:
public partial class TestForm : Form
{
public TestForm()
{
InitializeComponent();
Width = 400;
Height = 400;
var txt = new TextBox { Dock = DockStyle.Bottom, BackColor = Color.Khaki };
var dgv = new DataGridView
{
Dock = DockStyle.Fill,
ColumnCount = 3,
RowCount = 5
};
dgv.Controls.Add(txt);
Controls.Add(dgv);
dgv.PreviewKeyDown += DgvOnPreviewKeyDown;
dgv.KeyDown += DgvOnKeyDown;
txt.PreviewKeyDown += TxtOnPreviewKeyDown;
txt.KeyDown += TxtOnKeyDown;
}
private void DgvOnPreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
Debug.WriteLine(String.Format("Dgv Key Preview {0}", e.KeyCode));
e.IsInputKey = true;
}
private void DgvOnKeyDown(object sender, KeyEventArgs e)
{
Debug.WriteLine(String.Format("Dgv Key {0}", e.KeyCode));
}
private void TxtOnPreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
Debug.WriteLine(String.Format("Txt Key Preview {0}", e.KeyCode));
}
private void TxtOnKeyDown(object sender, KeyEventArgs e)
{
Debug.WriteLine(String.Format("Txt Key {0}", e.KeyCode));
}
}
在 TextBox 中键入 123,然后尝试右箭头、左箭头、End 或 Home。 DataGridView 更改选定的单元格,但 TextBox 插入符号没有移动。
TextBox 如果不在 DataGridView 内也可以正常工作(例如,使用相同的方法将其添加到 TreeView 时完全没有问题)。 TextBox 的作用类似于浏览器中的快速搜索面板,并且必须位于 DataGridView 之上。将 TextBox 添加到 Form(或者更具体地说,添加到 DataGridView 父级)会创建自己的一组问题(跟踪位置、大小、可见性......)并且是不可接受的。
如何确保 TextBox 接收这些键并更改插入符号位置或选择文本?
【问题讨论】:
-
如果文本框有焦点并且用户点击右键,是否应该移动插入符号位置并移动 DGV 中的选定列?
-
@David,主要关注的是 TextBox 的正确行为。当 TextBox 有焦点时,DGV 不必处理导航键(实际上,在这种情况下,DGV 不应该做任何事情)
标签: c# .net winforms datagridview