【问题标题】:Search button in DataGridView with textboxchangedDataGridView 中带有 textboxchanged 的​​搜索按钮
【发布时间】:2019-05-29 19:53:09
【问题描述】:

我想在 DataGridView 中做搜索按钮。我用这段代码读取了我的数据:

private void button1_Click_1(object sender, EventArgs e)
                {
                    FileStream f1 = new FileStream("zapis.dat", FileMode.Open);
                    BinaryReader br = new BinaryReader(f1);
                    int а = 0;
                    while (f1.Position < f1.Length)
                    {
                        string data = br.ReadString();
                        string sing = br.ReadString();
                        string avtor = br.ReadString();
                        string zagl = br.ReadString();
                        string janr = br.ReadString();
                        string ezik = br.ReadString();
                        dataGridView1.Rows.Add(++а, ezik, zagl, avtor, janr, sing, data);
                    }
                    f1.Close();
                }

我试图用代码做按钮:

private void textBox1_TextChanged(object sender, EventArgs e)

  if (string.IsNullOrEmpty(textBox1.Text))
        {
            (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Empty;
        }
        else
        {
            (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Format("Name='{0}'", textBox1.Text);
        }
    }

但是当我开始时,我得到了错误: System.NullReferenceException: '对象引用未设置为对象的实例。'

(... as System.Data.DataTable) returned null.

开:

else
                                {
                                    (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Format("Name='{0}'", textBox1.Text);

我该如何解决?

【问题讨论】:

    标签: c# winforms search datagridview binary-search-tree


    【解决方案1】:

    您没有使用DataTable 作为DataGridView 的数据源。

    使用一个类来表示你的数据,那么你就可以在没有“重”数据表的情况下完成这项工作。

    public class Item
    {
        public string Data { get; set; }
        public string Sing { get; set; }
        public string Avtor { get; set; }
        // and so on ...
    }
    
    // Save data into private class member
    private List<Item> _loadedData = new List<Item>();
    
    private void button1_Click_1(object sender, EventArgs e)
    {
        using (var stream  = new FileStream("zapis.dat", FileMode.Open))
        using (var reader = new BinaryReader(stream))
        {
            var data = new List<Item>();
            while (stream.Position < stream.length)
            {
                var item = new Item
                {
                    Data = reader.ReadString(),
                    Sing = reader.ReadString(),
                    Avtor = reader.ReadString()
                };
                data.Add(item)
            }
    
            // update private member with newly loaded data
            _loadedData = data;
        }
    
        // Bind loaded data to the DataGridView
        datagridview1.DataSource = _loadedData;
    }
    

    可以使用简单的Where 方法对_loadedData 集合进行过滤。

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        var filtered = _loadedData.Select(item => item);
        if (string.IsNullOrEmpty(textBox1.Text) == false)
        {
            filtered = filtered.Where(item => item.Avtor == textBox1.Text);
        }
    
        datagridview1.DataSource = filtered.ToList();
    }
    

    【讨论】:

    • 我按照你告诉我的做了一切,但是当我启动程序并在文本框上写字时,我什么也没有显示。你知道为什么吗?
    • 按下按钮时 datagridview 是否会填充数据?
    • 是的,首先我按下一个按钮并向我显示包含数据的表格,然后我在隐藏表格的文本框中写入数据,但什么也不显示。
    • 调试和检查是textBox1_TextChanged 被执行。
    • 它告诉我“名称'$exception'在当前上下文中不存在”
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多