1

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

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

这是图片 在此处输入图像描述

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

有什么建议吗?谢谢。

编辑

这是我的代码。

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>

我收到了这个错误:

你调用的对象是空的。

4

2 回答 2

6

您必须在 xaml 中添加 TextChanged 事件,例如

<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);
于 2012-10-07T18:45:11.273 回答
1

您可以通过将 dataGrid 绑定到它来过滤它,ICollectionView它提供对源集合过滤的支持。可以在此处找到详细信息,这也可能对您有所帮助

于 2012-10-07T11:35:37.080 回答