65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.45/5 (10投票s)

2002年6月3日

3分钟阅读

viewsIcon

115821

downloadIcon

2562

展示了如何从 ComboBox 派生一个类,并为其添加自动完成功能。 示例使用 Managed C++。

引言

本文是一个基本教程,向您展示了如何在您的 Managed C++ 程序中使用自动完成组合框。当然,将代码直接转换为 C# 或 VB .NET 应该不会太难。 本文描述的技术要求您拥有 VS.NET 的最终版本。它不适用于任何 beta 版本的 VS.NET,包括 beta 2,我在经历了 2 天的挫败感后才发现这一点。

屏幕截图

Sample Image - image01.gif

上面的截图显示了它对于下拉组合框的工作方式。


Sample Image - image02.gif

此截图显示了它对于简单组合框的工作方式

描述

基本上,我们在这里所做的是从 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;

结论

我注意到当你从开始菜单中选择“运行”时,会有一个自动完成组合框。 但它有一个区别,即下拉列表是可调整大小的。 不幸的是,我还没有弄清楚如何做到这一点,如果有人能给我一些提示,我将不胜感激。 我希望它不会涉及到任何自定义绘制的东西!

© . All rights reserved.