2012-10-07 2 views
1

Я уже привязываю все данные к своей сетке данных. Теперь я хочу выполнить поиск.поиск по сетке данных wpf

Я понял, я могу выполнить соединение sql для поиска. но я только хочу выполнить поиск по моему datagrid. потому что мои данные уже привязаны к моему datagrid.

здесь ПИК enter image description here

наверху, у меня есть текстовое поле. как я могу выполнить поиск/фильтрацию с помощью текстового поля? Возможно, я мог бы набрать «Bahan Baku», он будет искать «Nama Kategori». или я также могу напечатать «Sayur», он будет искать «Keterangan Kategori». и что я набираю, повлияет на мой datagrid.

любой совет? Благодарю.

EDIT

Вот мой код.

public partial class MainWindow : Window 
{ 
    //private ICollectionView MyData; 
    //string SearchText = string.Empty; 
    ObservableCollection<Category> _data = new ObservableCollection<Category>(); 
    public ObservableCollection<Category> data { get { return _data; } } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     showData(); 
    } 

    private void showData() 
    { 
     OleDbConnection conn = null; 
     OleDbCommand cmd = null; 

     try 
     { 
      conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=dbDemo1.accdb"); 
      cmd = new OleDbCommand("select categoryID, categoryDesc, categoryItem from t_category", conn); 
      conn.Open(); 
      using (var reader = cmd.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        data.Add(new Category 
         { 
          nCateogryID = int.Parse(reader[0].ToString()), 
          sCategoryDesc = reader[1].ToString(), 
          sCategoryItems = reader[2].ToString() 
         } 
        ); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.Message); 
     } 
     finally 
     { 
      conn.Close(); 
     } 
    } 
    private void textBox1_TextChanged(object sender, TextChangedEventArgs e) 
     { 
      TextBox t = sender as TextBox; 
      SearchText = t.Text.ToString(); 
      MyData.Filter = FilterData; 
     } 

    private bool FilterData(object item) 
    { 
     var value = (Category)item; 
     if (value == null || value.nCateogryID == null) 
      return false; 
     return value.sCategoryDesc.ToLower().StartsWith(SearchText.ToLower()) || value.sCategoryItems.ToLower().StartsWith(SearchText.ToLower()); 
     //return value.Book_Id.ToLower().StartsWith(SearchText.ToLower()) || value.Book_Name.ToLower().StartsWith(SearchText.ToLower()) || value.Author_Name.ToLower().ToString().StartsWith(SearchText.ToLower()) || value.Publisher_Name.ToLower().ToString().StartsWith(SearchText.ToLower().ToString()) || value.Book_Genre.ToLower().ToString().StartsWith(SearchText.ToLower().ToString()) || value.Language.ToLower().ToString().StartsWith(SearchText.ToLower().ToString()) || value.Book_EntryDate.ToLower().ToString().StartsWith(SearchText.ToLower().ToString()); 
    } 
} 

это мой класс категория выглядит следующим образом:

public class Category 
{ 
    public int nCateogryID { get; set; } 
    public int nCategoryMaster { get; set; } 
    public int nCategoryDetail { get; set; } 

    public string sCategoryDesc { get; set; } 
    public string sCategoryItems { get; set; } 
} 

и это мой XAML

<Window x:Class="SearchGrid.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}" 
     Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <DataGrid AutoGenerateColumns="False" Height="258" HorizontalAlignment="Left" Margin="12,0,0,12" Name="dataGrid1" VerticalAlignment="Bottom" Width="479"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding ncategoryID}" Header="No." IsReadOnly="True" Width="30" /> 
      <DataGridTextColumn Binding="{Binding sCategoryDesc}" Header="Nama Kategori" IsReadOnly="True" Width="160" /> 
      <DataGridTextColumn Binding="{Binding sCategoryItems}" Header="Keterangan Kategori" IsReadOnly="True" Width="247" /> 
     </DataGrid.Columns> 
    </DataGrid> 
    <TextBox Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="479" TextChanged="textBox1_TextChanged" /> 
</Grid> 
</Window> 

Я получил эту ошибку:

Object reference not set to an instance of an object.

ответ

6

Вы должны добавить TextChanged событие в XAML как

<TextBox Text="" Width="115" Canvas.Left="210" Canvas.Top="37" Height="23" TextChanged="TextBox_TextChanged" /> 

в вашем сСт файл Ваше событие TextChanged выглядеть

private ICollectionView MyData; 
    string SearchText=string.Empty; 
    private void TextBox_TextChanged(object sender, TextChangedEventArgs e) 
     { 
      TextBox t= sender as TextBox; 
      SearchText=t.Text.ToString(); 
      MyData.Filter = FilterData; 
     } 
    private bool FilterData(object item) 
     { 
     var value = (Book_Information)item; 
     if (value == null || value.Book_Id == null) 
      return false; 
     return value.Book_Id.ToLower().StartsWith(SearchText.ToLower()) || value.Book_Name.ToLower().StartsWith(SearchText.ToLower()) || value.Author_Name.ToLower().ToString().StartsWith(SearchText.ToLower()) || value.Publisher_Name.ToLower().ToString().StartsWith(SearchText.ToLower().ToString()) || value.Book_Genre.ToLower().ToString().StartsWith(SearchText.ToLower().ToString()) || value.Language.ToLower().ToString().StartsWith(SearchText.ToLower().ToString()) || value.Book_EntryDate.ToLower().ToString().StartsWith(SearchText.ToLower().ToString()); 
     } 

MyData Содержит ваш Всего Сбор данных здесь пример

ViewBook=new ObservableCollection<Book_Information>(); 
dataGrid1.ItemsSource=ViewBook; 
MyData=CollectionViewSource.GetDefaultView(ViewBook); 
+0

привет .. я уже могу реализовать свой код .. я могу его использовать .. спасибо btw .. :) но как я могу связать selecteditem из моего datagrid в текстовое поле? Есть идеи? –

+1

означает, что вы хотите связать один выбранный элемент из datagrid в текстовое поле или один элемент из выбранного элемента? –

+1

Вы можете использовать Return_IssueBook book = new Return_IssueBook(); book = (Return_IssueBook) datagrid1.CurrentCell.Item; –

1

Вы можете фильтровать dataGrid, привязывая его к ICollectionView, который обеспечивает поддержку фильтрации по исходной коллекции. Подробности можно найти here и это может help вы тоже.

+0

У вас есть пример этого? потому что его сложно. Благодарю. –

Смежные вопросы