0
votes

I want to do search button in DataGridView. I read my data with this code:

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();
                }

I trying to do button with code:

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

but when I started, I get error: System.NullReferenceException: 'Object reference not set to an instance of an object.'

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

on:

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

How I can fix it?

1

1 Answers

0
votes

You are not using DataTable as datasource for DataGridView.

Use a class to represent your data, then you will be able to do the job without "heavy" DataTable.

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;
}

Filtering can be done with simple Where method for _loadedData collection.

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();
}