C# 如何从文本框中搜索数据库生成的列表框项目

C# 如何从文本框中搜索数据库生成的列表框项目,c#,wpf,C#,Wpf,我正在尝试用文本框实现搜索/过滤功能。文本框应该搜索我的列表框,它是通过SQL数据库中的数据填充的 这就是我目前所尝试的 private void Search_TextChanged(object sender, TextChangedEventArgs e) { GetAreas(); } private void GetAreas() { using (SqlConnection sqlCon = new SqlConnection(connectionString))

我正在尝试用文本框实现搜索/过滤功能。文本框应该搜索我的列表框,它是通过SQL数据库中的数据填充的

这就是我目前所尝试的

 private void Search_TextChanged(object sender, TextChangedEventArgs e)
{
    GetAreas();
}

private void GetAreas()
{
    using (SqlConnection sqlCon = new SqlConnection(connectionString))
        {
            sqlCon.Open();
            string query_search = "SELECT * FROM tblAllPostCodes WHERE (Town LIKE @Town)";
            SqlCommand com = new SqlCommand(query_search, sqlCon);


            com.Parameters.AddWithValue("@Town", "%" + Search.Text + "%");

            using (SqlDataAdapter adapter = new SqlDataAdapter(com))
            {
                DataTable dt = new DataTable();
                adapter.Fill(dt);
                Area.ItemsSource = dt.DefaultView;
            }
            sqlCon.Close();
        }
}
这是获取我的列表框项目的方式

public void AreaList()
    {

        DataTable dt = new DataTable();
        SqlDataAdapter adpt = new SqlDataAdapter("SELECT DISTINCT Town from tblAllPostCodes", sqlCon);
        adpt.Fill(dt);

        foreach (DataRow dr in dt.Rows)
        {
            Area.Items.Add(dr["Town"].ToString());
        }

    }
我曾尝试过清除项目,但它们最终在搜索时被清除,并且没有填充匹配的文本


任何帮助都可以理解,我已经在这方面工作了一段时间。

< P>而不是在每个TrExchange事件上启动SQL查询,你应该考虑只过滤你的DATAView,比如:

列表框的XAML应如下所示:

<ListBox DisplayMemberPath="Town"/>

您只需查询数据库一次,并将结果保存在集合变量中:

private readonly List<string> _allTowns = new List<string>();
public void AreaList()
{
    _allTowns.Clear();
    using (DataTable dt = new DataTable())
    using (SqlDataAdapter adpt = new SqlDataAdapter("SELECT DISTINCT Town from tblAllPostCodes", sqlCon))
    {
        adpt.Fill(dt);
        foreach (DataRow dr in dt.Rows)
        {
            _allTowns.Add(dr["Town"].ToString());
        }
    }
    Area.ItemsSource = _allTowns;
}

虽然不完全是你的问题的答案,但这里有一个提示,我希望我能更快得到:考虑把你的数据提取到数据对象/模型的列表中,而不是使用数据表。它使数据提取稍微复杂一些,但它使其他一切都简单得多。
private readonly List<string> _allTowns = new List<string>();
public void AreaList()
{
    _allTowns.Clear();
    using (DataTable dt = new DataTable())
    using (SqlDataAdapter adpt = new SqlDataAdapter("SELECT DISTINCT Town from tblAllPostCodes", sqlCon))
    {
        adpt.Fill(dt);
        foreach (DataRow dr in dt.Rows)
        {
            _allTowns.Add(dr["Town"].ToString());
        }
    }
    Area.ItemsSource = _allTowns;
}
private void GetAreas()
{
    Area.ItemsSource = _allTowns.Where(x => x.Contains(Search.Text)).ToArray();
}