我有一个datagridview显示某些列中的信息,每列都有一个用于搜索的不可见文本框。当用户点击一列时,我得到列索引,如果用户提示任何键,我会在文本框上写下该键,并使其显示一秒钟。 1秒后,我刷新datagridview,将文本框中的文本应用为过滤器,然后再次使文本框不可见。
private void buscarInformacion(object sender, KeyEventArgs e)
{
if (indiceBusqueda >= 0)
{
listTextBox[indiceBusqueda].Visible = true;
listTextBox[indiceBusqueda].Focus();
SendKeys.Send(e.KeyData+"");
e.Handled = true;
assistant.TextChanged();
}
}
但我有一个退格或类似系统键的问题(写“后退”而不是删除一个字符)。有什么想法吗?
答案 0 :(得分:0)
好的,问题是这一行:
SendKeys.Send(e.KeyData+"");
技术上做的是在e.KeyData上调用.ToString() - 这意味着如果击键是退格,那就说
[A backspace character].ToString() + "";
...也就是说,它不是发送一个实际的仰泳 - 而是发送它的文本表示(你看到它不起作用。)它这样做的原因是因为当你添加几乎任何东西时一个字符串,它调用ToString()方法使事物兼容(3 +“a”变成3.ToString()+“a”,变成“3”+“a”,结果为“3a”。)
好的,你有什么选择?
选项#1 - 不要使用SendKeys。将实际的Key事件发送到适当的GUI控件。
选项#2 - 不要使用不可见的文本框来收集数据,也不要使用不同的元素来显示数据。当您单击该列时,让它弹出文本框并让用户键入那个文本框。没有按键重定向恶作剧。
选项#3 - 创建TextBox控件的子类,并在其中添加行为。老实说,这是低维护的选项,以及你应该的用途(如果你需要添加新的列或调整大小,天堂会帮助你的继任者。)你的'ShortTermTextBox'弹出窗口,并且自动 - 当内部没有任何按键超过一秒钟时关闭。然后,当您单击某列时,让它动态创建 new ShortTermTextBox。
无论如何,希望这会有所帮助!祝你好运: - )