'Searching in datagridview using c#

After loading a table in datagridview I'm generating a combobox's items from the datagrid column headers. From the combobox I am selecting the column and I have a textbox for the search value given by user. I'm using the following code:

        string searchForText = txtCrudSearch.Text;
        dgvLoadTable.ClearSelection();
        dgvLoadTable.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        try
        {
            foreach (DataGridViewRow row in dgvLoadTable.Rows)
            {
                if (row.Cells[cboCrudSearchColumn.SelectedIndex].Value.ToString().Equals(searchForText))
                {
                    row.Selected = true;
                    //if I use break here the code doesn't give exception 
                    //but highlights only one row. I want to return all rows that
                    // match with the search string
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

Now , the problems are:

  1. I get all matched rows highlighted with the exception "Object reference not set to an instance of the object"
  2. How can I return all the matching rows only in the datagrid instead of highlighting them?
  3. The search is case sensitive, how to make it work for all types?

Any help will be appreciated, thanks.



Solution 1:[1]

I figured it out. In case anyone needs the solution, the code is as follows:

 private void btnCrudSearch_Click(object sender, EventArgs e)
    {

        dgvLoadTable.CurrentCell = null;
        dgvLoadTable.AllowUserToAddRows = false;
        dgvLoadTable.ClearSelection();
        dgvLoadTable.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        dgvLoadTable.ReadOnly = true;

        try
        {
            foreach (DataGridViewRow row in dgvLoadTable.Rows)
            {
                var cellValue = row.Cells[cboCrudSearchColumn.SelectedIndex].Value;
                if (cellValue != null && cellValue.ToString() == txtCrudSearch.Text.ToUpper())
                {
                    row.Selected = true;
                    row.Visible = true;
                }
                else
                    row.Visible = false;

            }
        }
        catch (Exception exc)
        {
            MessageBox.Show(exc.Message);
        }

    }

Solution 2:[2]

private void txtSearch_TextChanged(object sender, EventArgs e)
{
     string searchValue = txtSearch.Text;
     for (var i = 0; i <= dgvList.RowCount; i++)
     {
          for (var j = 0; j <= dgvList.ColumnCount; j++)
          {
               if ((dgvList.Item(j, i).FormattedValue.ToString.ToLower).ToString.Contains(searchValue.ToString.ToLower))
               {
                    Console.Writeline("found");
                    dgvList.Item(j, i).Selected = true;
                    return;
               }
          }
     }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 feather
Solution 2 Manoj Babu