我正在尝试使用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());
}
}
我曾尝试清除项目,但最终在搜索时被清除并且没有填充匹配的文本。
任何帮助我都将受到赞赏,我已经从事了一段时间。
答案 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"/>