2015-08-19 10 views
3

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

enter image description here

Это моя 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. 
    } 
+0

Параметр 'DataGrid'«s 'ItemsSource' позволит вам поместить данные в нем, однако, он принимает только' 'IEnumerable так что вы можете найти работу вокруг об этом. –

+0

Почему вы возвращаете все значения из базы данных? если значение уже было введено, почему бы не добавить предложение where в ваш SQL-запрос? – Nikerym

+0

@Nikerym Он использовал «Обновление», чтобы поместить данные в «DataTable». Я предполагаю, что он хочет запросить их все и отфильтровать с клиентской стороны. –

ответ

0

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

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); 
    } 
} 
+0

Я хочу использовать этот код, когда пользователь начинает вводить ID в текстовом поле автоматически datagrid показывает результаты по ID в текстовом поле. Как это сделать Без нажатия кнопки? –

+0

Если это то, что вам нужно, тогда я думаю, что второй пример в этом ответе должен сработать для вас. – Ignatius

+0

да, второй пример - это почти ответ, который мне нужен. Но когда я вхожу в действительный идентификатор, ничего не происходит. –

0

Использование 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} ... /> 
Смежные вопросы