C# 如何防止下拉菜单中的组合框中自动选择(精确匹配除外)?
我有一个组合框,它是与包含数据库行的数据网格相关的细节显示的一部分。不存在对组合框的绑定,我正在手动执行此操作。组合框允许手动输入,就像它是一个文本字段一样,同时仍然提供下拉选择 我的问题是,如果我在字段中手动输入文本,然后单击下拉列表,则组合框显然想要查找匹配项。而且,搜索似乎很简单,因此C# 如何防止下拉菜单中的组合框中自动选择(精确匹配除外)?,c#,combobox,C#,Combobox,我有一个组合框,它是与包含数据库行的数据网格相关的细节显示的一部分。不存在对组合框的绑定,我正在手动执行此操作。组合框允许手动输入,就像它是一个文本字段一样,同时仍然提供下拉选择 我的问题是,如果我在字段中手动输入文本,然后单击下拉列表,则组合框显然想要查找匹配项。而且,搜索似乎很简单,因此KG匹配KG/天。我必须避免这种情况,并强制进行精确匹配 但更进一步,我认为我需要能够自己管理整个过程,因为要使事情进一步复杂化,下拉项实际上将显示KG/天-KG/天。但是,从中提取数据的数据库字段仅存储连字
KG
匹配KG/天
。我必须避免这种情况,并强制进行精确匹配
但更进一步,我认为我需要能够自己管理整个过程,因为要使事情进一步复杂化,下拉项实际上将显示KG/天-KG/天
。但是,从中提取数据的数据库字段仅存储连字符之前的部分,因此KG/天
因此,我需要截取下拉操作,以允许我做两件事:
1) 执行我自己的搜索,以查找我是否有临时文本或“真实”匹配。因为它最初是从下拉列表中选择的;换句话说,我有KG/天
,而不仅仅是KG
2) 消除ComboBox想要执行的自动搜索行为
我已经尝试使用表单中的方法处理程序来处理这些事情,例如
ComboBox::DropDown()和ComboBox::DropDownClosed()
但似乎这些仍然不允许我停止基本的组合框搜索/匹配
我也尝试过创建一个从ComboBox继承的类,但我真的不知道该重写什么,或者通常如何获得我想要的,停止我不想要的
因此,我感谢你的建议
编辑:要扩展我已经尝试过的内容。。。
在继承的类中,我试图使用WndProc
重写。根据我在另一个论坛上找到的一些建议,我的目标是截取组合框消息LB_FINDSTRING
,并将其替换为LB_FINDSTRINGEXACT
。帖子建议ComboBox默认为LB_-FiNDSTRING
,这与我看到的情况相符,而subbingLB_-FINDSTRINGEXACT
可以解决这个问题。问题是,除非我得到了一个关于LB_FINDSTRING
的错误定义,否则它从未收到过
这是我的枚举:
[Flags]
public enum ListBoxFlags
{
LB_ADDSTRING = 0x0180,
LB_SETSEL = 0x0185,
LB_GETSELITEMS = 0x0191,
LB_GETSELCOUNT = 0x0190,
LB_GETCURSEL = 0x0188,
LB_SELECTSTRING = 0x018C,
LB_SETCURSEL = 0x0186,
LB_FINDSTRING = 0x018F,
LB_FINDSTRINGEXACT = 0x01A2,
LB_GETCOUNT = 0x018B,
LB_GETSEL = 0x0187,
LB_GETTEXT = 0x0189,
LB_RESETCONTENT = 0x0184,
LB_SETHORIZONTALEXTENT = 0x0194,
LB_GETHORIZONTALEXTENT = 0x0193,
LB_GETTOPINDEX = 0x018E,
LB_SETTOPINDEX = 0x0197,
LB_INSERTSTRING = 0x0181,
LB_DELETESTRING = 0x0182,
LB_GETITEMDATA = 0x0199
}
制作了一些可能有帮助的示例代码-您可以将其用作指南 其思想是处理组合框的
TextChanged
事件,并在此时修改组合框列表项。下面的示例将修改列表以添加当前文本(最重要的是,单击组合框时不会更改文本)和符合搜索条件的任何其他项目
我认为当焦点丢失时,您不需要代码来重新初始化列表项,而是留在那里以防万一
//contains a list of default items for the combobox items
List<string> comboList = new List<string>();
public Form1()
{
InitializeComponent();
initComboList(); //initialize the defaults
initCombobox(); //initialize the combobox list items
}
//fills the defaults for the combobox items
private void initComboList()
{
comboList.Add("red");
comboList.Add("blue");
comboList.Add("green");
}
//initializes the combobox items
private void initCombobox()
{
comboBox1.Items.Clear();
foreach (string s in comboList)
comboBox1.Items.Add(s);
}
//occurs when the text changes in the combobox
private void comboBox1_TextChanged(object sender, EventArgs e)
{
string curtext = comboBox1.Text;
insertIntoComboBox(curtext); //insert the current text into combobox
comboBox1.Select(curtext.Length, 0); //if you don't do this, the cursor goes back to index 0 :-(
}
//called whenever is desired to insert the current text into the combobox items
private void insertIntoComboBox(string curtext)
{
comboBox1.Items.Clear();
//only add the current text if it's not already in the list of defaults and not empty string
if (comboList.Contains(curtext) == false && curtext.Length > 0)
comboBox1.Items.Add(curtext);
foreach (string s in comboList)
comboBox1.Items.Add(s);
}
//called whenever combobox loses focus
private void comboBox1_Leave(object sender, EventArgs e)
{
initCombobox();
}
//包含组合框项目的默认项目列表
列表组合列表=新列表();
公共表格1()
{
初始化组件();
initComboList();//初始化默认值
initCombobox();//初始化combobox列表项
}
//填充组合框项目的默认值
私有void initComboList()
{
组合列表。添加(“红色”);
组合列表。添加(“蓝色”);
组合列表。添加(“绿色”);
}
//初始化组合框项目
私有void initCombobox()
{
comboBox1.Items.Clear();
foreach(组合列表中的字符串s)
comboBox1.Items.Add(s);
}
//在组合框中的文本更改时发生
private void comboBox1_TextChanged(对象发送方,事件参数e)
{
字符串curtext=comboBox1.Text;
insertIntoComboBox(CurtText);//将当前文本插入combobox
comboBox1.Select(curtext.Length,0);//如果不这样做,光标将返回到索引0:-(
}
//在需要将当前文本插入组合框项目时调用
专用void insertIntoComboBox(字符串curtext)
{
comboBox1.Items.Clear();
//仅当当前文本不在默认值列表中且不是空字符串时才添加该文本
if(comboList.Contains(curtext)=false&&curtext.Length>0)
comboBox1.Items.Add(curtext);
foreach(组合列表中的字符串s)
comboBox1.Items.Add(s);
}
//每当combobox失去焦点时调用
私有void组合框1_Leave(对象发送方,事件参数e)
{
initCombobox();
}
如果将DropDownStyle
更改为DropDownList
,该怎么办?这将阻止输入不在列表中的项目,但是当您键入文本时,它仍将与项目匹配。区别在于组合框中的文本始终为空或完全匹配。@JohnWillemse-因为这样的项目在t中是允许的他收集数据。将列表视为建议,而不是绝对要求。你的思路是正确的。组合框由三个句柄组成,你必须明确地获得列表框窗口的句柄。请参阅:Upvote for Loating的评论返回到另一个堆栈链接。它有原始海报所寻找的正确答案。没有什么奇怪的解决方法这是必需的。我很感激你的建议,但我真的更愿意完全阻止匹配,这样我的列表就不会被修改。我的用户希望有一个一致的选择列表,因为它是从政府标准列表中获取的。不幸的是,这种方法会导致一个不断变化和不可预测的列表。好的,明白了。Based在您对John Willemse的评论回复中,下拉列表项目不是唯一有效的项目,对吗?您是否有任何理由不在组合框中填写所有有效项目的列表?该列表包含政府提供的股票选择。用户可以