1

可能重复:
C# 自动完成

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

就像是:

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

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

4

1 回答 1

0

既然你已经更新了你的问题,我更好地理解了你的问题。您还说底层数据和功能不相关,这使得很难准确理解您要实现的目标,所以我的建议是创建一个自定义ComboBox,看看您是否可以自己处理匹配.


我认为编写一个函数来测试输入的文本是否是 a 中的项目的最优雅的方法是ComboBox使用扩展方法。您的电话将如下所示:

// 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();

可以按如下方式创建扩展方法,您可以在其中准确自定义搜索逻辑的工作方式。在我下面写的两个扩展方法中,它们只是检查输入到的文本ComboBox是否在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();
    }
}   
于 2012-04-24T00:04:45.437 回答