views:

289

answers:

2

I have a DataGridView in a Winforms app that has about 1000 rows (unbound) and 50 columns. Hiding a column takes a full 2 seconds. When I want to hide about half the rows, this becomes a problem.

    private void ShowRows(string match)
    {
        this.SuspendLayout();
        foreach (DataGridViewRow row in uxMainList.Rows)
        {
            if (match == row.Cells["thisColumn"].Value.ToString()))
            { row.Visible = false; }
            else
            { row.Visible = true; }
        }
        this.ResumeLayout();
    }

I did some testing by adding by addingConsole.WriteLine(DateTime.Now)around the actions, androw.Visible = falseis definitely the slow bit. Am I missing something obvious, like setting IsReallySlow = false? Or do I have to go ahead and enable Virtual Mode and code up the necessary events?

A: 

Just a question.. Is it possible to pass that match parameter to the database query or procedure and get the rows which are not matching the records. That way you just dont have to worry about showing/hiding and It would be faster as well as you will no longer be looping. This would also work as the number of records increase with time..

Just a thought which may not be applicable for you..let me know.

ydobonmai
+2  A: 

It looks to me like you should be using row filters instead.

Try using a DataView as your binding source and use DataView.RowFilter to hide rows or show rows of your choosing.

DataGridView myGridView = new DataGridView();
DataView myDataView = myTable.DefaultView;
myGridView.DataSource = myDataView; // DataView that allows row filtering

myDataView.RowFilter = string.Format("thisColumn <> '{0}'",match);  // this will hide all rows where "thisColumn" = match
galford13x
This is what I ended up doing and it worked great. Thanks!
Ed Schwehm