Как фильтровать значения Datagrid с помощью TextBox (WPF C#)



У меня возникли некоторые проблемы с фильтрацией значений datagrid (из базы данных) с помощью Textbox. Действительно, я новичок в WPF C#, и мне нужна помощь в этом деле.



Введите описание изображения здесь



Это мой XAML:



<Button Name="btnSelect"
Content="Select All"
Height="30"
Width="80"
Margin="4"
HorizontalAlignment="Center"
Click="btn_SelectUser"/>
<DataGrid Name="dtgUser"
AutoGenerateColumns="True"
HorizontalAlignment="Left"
VerticalAlignment="Top" Height="380" Width="684"
Margin="10,54,0,0"/>


Вот мой код для выбора значений из базы данных после нажатия кнопки Select:



private void btn_SelectUser(object sender, RoutedEventArgs e)
{

_con = new SqlConnection(_strConn);
try
{
_con.Open();
string query = "select id_int_user, name_str_user from tbl_user";
_cmd = new SqlCommand(query, _con);
_cmd.ExecuteNonQuery();

_adp = new SqlDataAdapter(_cmd);
_dt = new DataTable("tbl_user");
_adp.Fill(_dt);
dtgUser.ItemsSource = _dt.DefaultView;
_adp.Update(_dt);

_con.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

}


И это для выбора только что отредактированного значения в текстовом поле.Как реализовать этот метод? (Примечание: мне нужно принести значения из базы данных через datagrid):



private void txt_SearchUser(object sender, TextChangedEventArgs e)
{
//Here is my difficulty //I know nothing how to do it.
}
1108   2  

2 ответов:

Ваш метод может быть не лучшим способом заполнения DataGrid (вы можете использовать привязку данных в будущем), но вот несколько быстрых трюков для вашей ситуации:

1) если пользователю нужно сначала нажать кнопку Выбрать все, то отфильтруйте данные по ID:

private void txt_SearchUser(object sender, TextChangedEventArgs e)
{
    DataTable tempDt = _dt.Copy();
    tempDt.Clear();
    if (txt_Search.Text != "") // Note: txt_Search is the TextBox..
    {
        foreach (DataRow dr in _dt.Rows)
        {
            if (dr["id_int_user"].ToString() = txt_Search.Text)
            {
                tempDt.ImportRow(dr);
            }
        }
        dtgUser.ItemsSource = tempDt.DefaultView;
    }
    else
    {
        dtgUser.ItemsSource = _dt.DefaultView;
    }
}

2) Если вы хотите фильтровать данные из базы данных каждый раз, когда пользователь вводит идентификатор в поле поиска (не нажимая сначала кнопку Выбрать все):

private void txt_SearchUser(object sender, TextChangedEventArgs e)
{
    _con = new SqlConnection(_strConn);
    try
    {
        _con.Open();
        string query = "select id_int_user, name_str_user from tbl_user";
        if(txt_Search.Text != "") // Note: txt_Search is the TextBox..
        {
            query += " where id_int_user = " + txt_Search.Text;
        }
        _cmd = new SqlCommand(query, _con);
        _cmd.ExecuteNonQuery();

        _adp = new SqlDataAdapter(_cmd);
        _dt = new DataTable("tbl_user");
        _adp.Fill(_dt);
        dtgUser.ItemsSource = _dt.DefaultView;
        _adp.Update(_dt);

        _con.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Используйте ICollectionView для DataGrid.ItemsSource в модели представления и установите Filter для фильтрации элементов.

Сначала подготовьте объект коллекции (например, ObservableCollection<YourItemClass>) и определите SourceItems в модели представления:

public ICollectionView SourceItems {
  get {
    return _sourceItems 
      ?? (_sourceItems = CollectionViewSource.GetDefaultView(_source));
  }
}

Затем в ответ на некоторые события добавьте предикат фильтрации для фильтрации рассматриваемых элементов:

var items = (ListCollectionView)SourceItems;
items.Filter = obj => obj.UserName == user_name_for_filter;

И конечно же, установить привязку.

<Window.DataContext>
  <local:YourViewModel />
</Window.DataContext>

<DataGrid ItemsSource={Binding SourceItems} ... />

Comments

    Ничего не найдено.