C# WinForms ComboBox:AutoComplete 不按降序排序

Posted

技术标签:

【中文标题】C# WinForms ComboBox:AutoComplete 不按降序排序【英文标题】:C# WinForms ComboBox: AutoComplete does not sort descending 【发布时间】:2021-08-15 18:54:06 【问题描述】:

在 WinForms 数据查看器项目中,我制作了一个 ComboBox 来选择过滤器值。列表项来自数据库查询。它们按降序排列。组合框使用AutoCompleteMode.Append。尽管下拉列表按降序排序,但自动完成总是建议最低匹配值而不是最高匹配值。即使我用降序数据显式填充AutoCompleteCustomSource,也会发生这种情况。

有谁知道如何让自动完成提示最高匹配值?

输入“010”后的组合框如下所示:

这是下拉列表的一部分: ... 012-0020-00 010-0070-00 010-0069-00 010-0068-00 008-1018-00 ...

为什么这很重要: 我将使用此过滤器处理包含数字的各种字符串数据,例如零件代码、文档代码、项目代码等。较新的条目具有更高的数字。并且最常查询最新条目。在上面的例子中,010-0070-00010 组的最新部件代码。因此,我希望自动完成功能在我输入 010 后显示 010-0070-00

此项目取代了 MS Access 前端。如果列表按降序排序,Access ComboBox 会建议最高值。如果按升序排序,则为最小值。但是 Access ComboBoxes 不是 WinForms 控件。

欢迎提出任何建议。

【问题讨论】:

好像不可能,见:***.com/questions/5821206/… 另一种想法是使用 ToolStripDropDownMenu 创建您自己的自动完成功能。 【参考方案1】:

使用ToolStripDropDown 的示例:

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    String[] data = "012-0020-00,010-0070-00,010-0069-00,010-0068-00,008-1018-00".Split(',');
    ComboBox combo = new ComboBox();
    //ToolStripDropDownMenu menu = new ToolStripDropDownMenu(); // has image/icon border
    ToolStripDropDown menu = new ToolStripDropDown(); // plain menu, no image/icon border
    menu.AutoClose = false;
    bool isAdjusting = false;
    combo.LostFocus += delegate 
        if (!isAdjusting)
            menu.Close();
    ;
    menu.ItemClicked += (o, e) => 
        isAdjusting = true;
        combo.Text = e.ClickedItem.Text;
        menu.Close();
        isAdjusting = false;
    ;

    combo.TextChanged += delegate 
        if (isAdjusting)
            return;
        isAdjusting = true;
        String prefix = combo.Text;
        menu.SuspendLayout();
        for (int i = menu.Items.Count - 1; i >= 0; i--) 
            var item = menu.Items[i];
            menu.Items.RemoveAt(i);
            item.Dispose();
        
        foreach (String part in data) 
            if (part.StartsWith(prefix))
                menu.Items.Add(new ToolStripMenuItem(part));
        
        menu.ResumeLayout();
        menu.Show(combo, 0, combo.Height);
        combo.Focus();
        combo.SelectionStart = prefix.Length;
        isAdjusting = false;
    ;

    Form f7 = new Form();
    f7.Controls.Add(combo);
    Application.Run(f7);

【讨论】:

令人着迷!您的解决方案并不是我所期望的(经典的自动完成行为)。但它可能会更好,因为它显示的列表越我输入越短。非常感谢。

以上是关于C# WinForms ComboBox:AutoComplete 不按降序排序的主要内容,如果未能解决你的问题,请参考以下文章

在 C# .net winforms 中将字典绑定到 ComboBox

C# winfrom comboBox

C# WinForms TextBox 等的垂直对齐

C# Combobox (Dropdownstyle = Simple) -- 如何在键入时选择项目

如何禁用 C# 组合框中元素的编辑?

WinForms ComboBox DropDown 和 Autocomplete 窗口都出现