如何在 .NET 中使用自动完成 ComboBox






4.45/5 (10投票s)
2002年6月3日
3分钟阅读

115821

2562
展示了如何从 ComboBox 派生一个类,并为其添加自动完成功能。 示例使用 Managed C++。
引言
本文是一个基本教程,向您展示了如何在您的 Managed C++ 程序中使用自动完成组合框。当然,将代码直接转换为 C# 或 VB .NET 应该不会太难。 本文描述的技术要求您拥有 VS.NET 的最终版本。它不适用于任何 beta 版本的 VS.NET,包括 beta 2,我在经历了 2 天的挫败感后才发现这一点。
屏幕截图
上面的截图显示了它对于下拉组合框的工作方式。
此截图显示了它对于简单组合框的工作方式
描述
基本上,我们在这里所做的是从 ComboBox
类派生一个类。 然后我们重写 OnKeyPress
方法,该方法在按下键时被调用。 对于某些键,我们希望调用基类处理程序。 这些键是 BackSpace 键,它有一些预期的行为,如果我们的类妨碍预期的行为,那将是不礼貌的。 其他具有预定义角色的键包括光标键。 我们还需要检查 ComboBox
的样式。 如果它是一个下拉列表组合框,编辑框不可编辑,我们不应该做任何奇怪的事情,而是简单地调用基类函数。
if(e->KeyChar == Windows::Forms::Keys::Back ||
e->KeyChar == Windows::Forms::Keys::Up ||
e->KeyChar == Windows::Forms::Keys::Down ||
e->KeyChar == Windows::Forms::Keys::Right ||
e->KeyChar == Windows::Forms::Keys::Left ||
DropDownStyle == ComboBoxStyle::DropDownList )
{
ComboBox::OnKeyPress(e);
}
好的。所以我们知道什么时候调用基类。现在对于所有其他情况,我们需要做的事情很简单。 从编辑框中获取现有文本。 在组合框中搜索以该文本开头的条目。 现在我们需要将组合框中的文本设置为搜索到的文本,除了超过旧文本的所有新文本部分都应该被选中。 因此,用户可以键入他想键入的任何键并删除所有选中的文本。 这就是自动完成组合框应该做的。 我编写了一个简单的搜索函数,名为 FirstMatch
,它接受一个字符串并返回一个字符串。
如果我们的搜索成功,我们实际上可以下拉我们的组合框,优点是选择栏将自动移动到与编辑框中最接近的匹配项。 在我们的例子中,当然会有确切的匹配。 我一直在想如何获得这种效果,而且免费获得这种效果非常令人高兴。 但是我们必须记住检查组合框是否设置了 DropDown
样式。 如果它是一个简单的组合框,我们不想尝试下拉它。
String *str = FirstMatch(Text); if(str->Length) { int q1 = Text->Length; int q2 = str->Length - Text->Length; Text = str; if(DropDownStyle == ComboBoxStyle::DropDown) DroppedDown = true; SelectionStart = q1; SelectionLength = q2; } else { if(DropDownStyle == ComboBoxStyle::DropDown) DroppedDown = false; }
最后,我们需要通知 Windows 该事件已被处理。 为此,我们需要将传递给我们的 KeyPressEventArgs
对象的 Handled
属性设置为 true
。 如果我们没有将其设置为 true
,此消息将被发送进行默认处理。 由于我们已经处理了它,因此没有必要这样做。
e->Handled = true;
结论
我注意到当你从开始菜单中选择“运行”时,会有一个自动完成组合框。 但它有一个区别,即下拉列表是可调整大小的。 不幸的是,我还没有弄清楚如何做到这一点,如果有人能给我一些提示,我将不胜感激。 我希望它不会涉及到任何自定义绘制的东西!