.net 组合框自动完成:如何设置自定义“匹配模式”

.net 组合框自动完成:如何设置自定义“匹配模式”,.net,winforms,autocomplete,combobox,.net,Winforms,Autocomplete,Combobox,可能重复: 我有一个标准的winform组合框。我已将其自动完成属性设置为true。我想更改由UI自动完成的键入文本和项目文本之间的比较 比如: autoCompleteCombo.XXXX = new Func<string, string, bool> { (search, item) => item.Contains(search) }; 注意:编写的函数只是一个示例。我真正想要的是更复杂一点。既然你更新了你的问题,我就更了解你的问题了。您还说过底层数据和函数不相关,

可能重复:

我有一个标准的winform组合框。我已将其自动完成属性设置为true。我想更改由UI自动完成的键入文本和项目文本之间的比较

比如:

autoCompleteCombo.XXXX = new Func<string, string, bool> { (search, item) => item.Contains(search) };

注意:编写的函数只是一个示例。我真正想要的是更复杂一点。

既然你更新了你的问题,我就更了解你的问题了。您还说过底层数据和函数不相关,这使得您很难准确理解您想要实现的目标,因此我的建议是创建一个自定义组合框,看看您是否可以自己处理匹配

我认为编写函数以测试键入的文本是否是组合框中的项的最优雅的方法是使用扩展方法。您的电话如下所示:

// see if the Text typed in the combobox is in the autocomplete list
bool bFoundAuto = autoCompleteCombo.TextIsAutocompleteItem();

// see if the Text type in the combobox is an item in the items list
bool bFoundItem = autoCompleteCombo.TextIsItem();
扩展方法可以按如下方式创建,您可以自定义搜索逻辑的工作方式。在我下面编写的两个扩展方法中,它们只是检查键入组合框的文本是否在AutoCompleteCustomSource集合中找到,或者在第二个函数中,是否在Items集合中找到

public static class MyExtensions
{
    // returns true if the Text property value is found in the 
    // AutoCompleteCustomSource collection
    public static bool TextIsAutocompleteItem(this ComboBox cb)
    {
        return cb.AutoCompleteCustomSource.OfType<string>()
            .Where(a => a.ToLower() == cb.Text.ToLower()).Any();
    }

    // returns true of the Text property value is found in the Items col
    public static bool TextIsItem(this ComboBox cb)
    {
        return cb.Items.OfType<string>()
            .Where(a => a.ToLower() == cb.Text.ToLower()).Any();
    }
}   

我会在哪里使用它??你能再给我引路一点吗?第二个代码是方法。好了,第一个代码应该写在哪里?您可以将MyExtensions类放在项目@Diego中它自己的文件中。只需将其与表单保持在同一名称空间中即可。然后,在代码中需要检查键入的文本是否是名为autoCompleteCombo.TextIsItem;的组合框中的项目的地方;。我认为我们理解有误。我想做的是拥有AutoComplete的所有功能,但当它从ComboBox搜索匹配的项目时,它使用一个自定义比较器。@Diego,您必须编辑原始问题,并包括要将组合框项目和/或自动完成绑定到的类,以及您希望键入的文本如何与基础项目匹配的说明。我编辑了问题以避免误解。我觉得已经够清楚了。我认为comboxbox项目的类型或定义匹配的函数与此无关。