winforms 列表中的自动完成文本框

9njqaruj  于 2023-05-18  发布在  其他
关注(0)|答案(2)|浏览(120)

这个问题是来自服务器故障的migrated,因为它可以在堆栈溢出上回答。Migrated 5天前.
我得到了一个包含字符串List<string> custList = new List<string>();的列表,我得到了一个textbox,我找不到或想一种方法来搜索列表,而在我的文本框写作。列表字符串格式是这样的211 | john smith | 03125468879我需要能够搜索的名字或电话号码,我尝试了其他方法,但过滤器从一开始。

lfapxunr

lfapxunr1#

要在C#中搜索字符串列表,可以使用LINQ(语言集成查询)根据条件过滤列表。在本例中,我们希望根据文本框中输入的姓名或电话号码过滤列表。
首先,我们需要获取文本框中输入的文本。我们可以通过处理textbox的TextChanged事件来做到这一点。每次文本框中的文本更改时,都会引发此事件。然后,我们可以使用在文本框中输入的文本来过滤列表。

private void textBox1_TextChanged(object sender, EventArgs e)
{
    string searchText = textBox1.Text;
    List<string> filteredList = custList.Where(s => s.Contains(searchText)).ToList();
    // display the filtered list in a ListBox or DataGridView
}

在上面的代码中,我们获取了在textbox中输入的文本,并将其存储在searchText变量中。然后,我们使用LINQ根据列表中的每个字符串是否包含searchText来过滤custList。Where方法返回IEnumerable<string>,我们使用ToList*方法将其转换为List<string>。最后,我们可以在ListBox或DataGridView中显示过滤后的列表。
但是,此代码将仅根据每个字符串是否包含搜索文本来筛选列表。要特别根据姓名或电话号码过滤列表,我们需要将列表中的每个字符串拆分为其组成部分,并分别比较它们。

private void textBox1_TextChanged(object sender, EventArgs e)
{
    string searchText = textBox1.Text;
    List<string> filteredList = custList.Where(s =>
    {
        string[] parts = s.Split('|');
        string name = parts[1].Trim();
        string phone = parts[2].Trim();
        return name.Contains(searchText) || phone.Contains(searchText);
    }).ToList();
    // display the filtered list in a ListBox or DataGridView
}

在上面的代码中,我们使用Split方法将列表中的每个字符串拆分为其组成部分。然后,我们修剪姓名和电话号码,以删除任何前导或尾随空格。最后,我们使用Contains方法将姓名和电话号码分别与搜索文本进行比较。Where方法返回IEnumerable<string>,我们使用ToList*方法将其转换为List<string>。最后,我们可以在ListBox或DataGridView中显示过滤后的列表。
请注意,此代码假设列表中的每个字符串的格式为**“ID|姓名、名称|电话号码”**。如果格式不同,则需要相应地调整代码。

06odsfpq

06odsfpq2#

我在代码中添加了2行

AutoCompleteStringCollection sourceName = new AutoCompleteStringCollection();  
 AutoCompleteStringCollection sourcePhone = new AutoCompleteStringCollection();

然后我用计时器检查输入是否以“0”开始,因为我所有的电话号码都以0开始

private void autoCompleteTimer_Tick(object sender, EventArgs e)
{
    if (NameOrPhoneTb.Text.StartsWith("0"))
    {
        NameOrPhoneTb.AutoCompleteCustomSource = sourcePhone;
    }
    else
    {
        NameOrPhoneTb.AutoCompleteCustomSource = sourceName;
    }
}

当然,对于我的集合,我在循环中使用了这两行来将我的字符串添加到集合列表

string startWithNameSt= custName + " | " + custPhone + " | " + custId;
string startWithPhoneSt = custPhone + " | " + custName + " | " + custId;
sourceName.Add(startWithPhoneSt);
sourcePhone.Add(startWithNameSt);

拆分文本211 | john smith | 03125468879以获取电话或姓名到我的文本框(电话)和(姓名)我使用了一个方法

public static string GetUntilOrEmpty(string text, string stopAt = "|")
        {
            if (!string.IsNullOrWhiteSpace(text))
            {
                int charLocation = text.IndexOf(stopAt, StringComparison.Ordinal);

                if (charLocation > 0)
                {
                    return text.Substring(0, charLocation);
                }
            }

            return string.Empty;
        }

最后是我使用的SQL查询

string searchString = GetUntilOrEmpty(NameOrPhoneTb.Text, "|");

相关问题