【问题标题】:How do you search database generated listbox items from a textbox如何从文本框中搜索数据库生成的列表框项目
【发布时间】:2019-06-05 09:08:33
【问题描述】:

我正在尝试使用 TextBox 实现搜索/过滤功能。 TextBox 应该搜索通过 SQL 数据库中的数据填充的 ListBox。

这是我目前尝试过的。

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

这就是让我的 ListBox 项目显示的方式

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

    }

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

任何帮助将不胜感激,我已经为此工作了一段时间。

【问题讨论】:

  • 虽然不完全是您问题的答案,但我希望我早点得到一个提示:考虑将您的数据提取到数据对象/模型列表中,而不是使用数据表。它使数据提取稍微复杂一些,但它使其他一切变得简单得多。

标签: c# wpf


【解决方案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();
}

【讨论】:

    【解决方案2】:

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

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

    列表框的 XAML 应如下所示:

    <ListBox DisplayMemberPath="Town"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多