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-00
是010
组的最新部件代码。因此,我希望自动完成功能在我输入 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