在用户在查询中键入的组合框中列出类似的搜索结果

时间:2014-08-12 23:31:11

标签: c# combobox

目前,我的地址查询应用程序仅在用户输入查询并点击搜索按钮后返回一个结果。搜索 Mow Mead 会返回列表中的第一个匹配项。

enter image description here

但是,我希望它能够使用 Mow Mead 的所有地址填充 AddressEntry 组合框,而不是只有一个搜索结果,如下所示。我怎样才能在C#中做到这一点?我的假设是它会发生在按键事件上,但我不太确定如何以编程方式用实时结果填充组合框。

我已经包含了我的csv here的一个示例。

enter image description here

到目前为止,这是我的代码:

    private void SearchButton_Click(object sender, EventArgs e)
    {
        String addressText = GetAddress(AddressEntry.Text);
        AddressEntry.Text = addressText;
    }

    private String GetAddress(String addressText)
    {
        var strLength = File.ReadAllLines("pca_mk_addresslist.csv");
        var strLines = File.ReadAllLines("pca_mk_addresslist.csv");

        foreach (var line in strLines)
        {
            var fields = line.Split(',');

            foreach (var field in fields)
            {
                string needle = addressText.Trim().ToLower();
                string haystack = field.Trim().ToLower();
                if (haystack.Contains(needle))
                    return line.Trim();
            }
        }

        return "Nothing found.";
    }

    private void AddressEntryField_KeyPress(object sender, KeyPressEventArgs e)
    {
        // do something here, i.e. fill the combobox with the nearest matches as 
        // the user types in their entry and then they can select their final 
        // decision from the combobox.
    }

1 个答案:

答案 0 :(得分:1)

阅读文件以获取您要搜索的地址,就像您目前正在进行的那样:

var addresses = File.ReadAllLines("pca_mk_addresslist.csv");

如果您的搜索框只有一个搜索字词,例如“Mow Mead”,则可以返回如下匹配结果:

var matches = addresses.Where(address =>
    address.Contains(AddressEntry.Text.Trim().ToLower());

如果您的搜索框可能有多个以逗号分隔的字词,则可以先将它们拆分:

var searchTerms = AddressEntry.Text.Split(',');

然后在地址中搜索以下任何搜索字词:

var matches = addresses.Where(address => searchTerms.Any(address.Contains));

最后,只需将字符串(地址)集合分配给ComboBox:

yourComboBox.DataSource = matches;