Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止下拉菜单中的组合框中自动选择(精确匹配除外)?_C#_Combobox - Fatal编程技术网

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
,这与我看到的情况相符,而subbing
LB_-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的评论回复中,下拉列表项目不是唯一有效的项目,对吗?您是否有任何理由不在组合框中填写所有有效项目的列表?该列表包含政府提供的股票选择。用户可以