C# WinForms ComboBox:自动完成不降序排序

C# WinForms ComboBox: AutoComplete does not sort descending

在 WinForms 数据查看器项目中,我创建了一个 ComboBox 以 select 过滤值。列表项来自数据库查询。它们按降序排列。 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 控件。

欢迎提出任何建议。

使用 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);