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