2012-10-07 56 views
1

我已经将所有数据绑定到我的数据网格中。 现在我想执行搜索。在数据网格上搜索wpf

我想通了,我可以做sql连接搜索。但我只想在我的数据网格上进行搜索。因为我的数据已经绑定到我的数据网格。

这里是PIC enter image description here

在顶部,我有一个文本框。我如何使用文本框进行搜索/过滤? 也许我可以键入'Bahan Baku',它会搜索'Nama Kategori'。或者我也可以输入'Sayur',它会搜索'Keterangan Kategori'。和我输入的内容会影响我的数据网格。

有什么建议吗?谢谢。

编辑

这里是我的代码。

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" /> 

在你的CS文件中为您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

表示您想要将一个selecteditem从datagrid绑定到文本框或来自selecteditem的一个项目? –

+1

您可以使用Return_IssueBook book = new Return_IssueBook(); book =(Return_IssueBook)datagrid1.CurrentCell.Item; –

1

可以过滤dataGrid绑定到ICollectionView它提供了对源集合进行过滤的支持。详情可以找到here,这可能也是help你也是。

+0

你有这样的例子吗?因为它很复杂。谢谢。 –