Как вам искать сгенерированные базой данных элементы списка из текстового поля - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь реализовать функцию поиска / фильтрации с помощью TextBox.TextBox должен искать мой ListBox, который заполняется данными из базы данных 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();
        }
}

Вот как получить элементы списка 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());
        }

    }

Я пытался очистить элементы, но они заканчиваютсядо очистки при поиске и не заполняется соответствующим текстом.

Буду признателен за любую помощь. Я уже некоторое время работаю над этим.

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Вам нужно только один раз запросить базу данных и сохранить результаты в переменной коллекции:

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();
}
0 голосов
/ 05 июня 2019

Вместо того, чтобы запускать SQL-запрос для каждого события textchange, вам следует подумать о том, чтобы просто отфильтровать ваше представление данных как:

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

XAML для списка должен выглядеть следующим образом:

<ListBox DisplayMemberPath="Town"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...