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

时间:2019-06-05 09:08:33

标签: c# wpf

我正在尝试使用TextBox实现搜索/过滤器功能。文本框应搜索我的列表框,该列表框是通过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());
        }

    }

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

任何帮助我都将受到赞赏,我已经从事了一段时间。

2 个答案:

答案 0 :(得分:1)

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

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;
}

然后,您可以简单地通过GetAreas()方法过滤所有项的集合:

private void GetAreas()
{
    Area.ItemsSource = _allTowns.Where(x => x.Contains(Search.Text)).ToArray();
}

答案 1 :(得分:0)

您应该考虑只过滤数据视图,而不是在每个textchange事件上触发SQL查询:

DataView dv = new DataView(dt);
dv.RowFilter = String.Format("Town like '%{0}%'", SearchText);
Area.ItemsSource = dv;

列表框的XAML应该如下所示:

<ListBox DisplayMemberPath="Town"/>