private void _UpdateFilters() { if (ModList == null) return; // Each time a row in DataGridViewRow is changed, DataGridViewRow updates the view. Which is slow. // To make the filtering process faster, Copy the list of rows. Filter out the hidden and replace t // rows in DataGridView. var rows = new DataGridViewRow[mainModList.full_list_of_mod_rows.Count]; mainModList.full_list_of_mod_rows.CopyTo(rows, 0); // Try to remember the current scroll position and selected mod var scroll_col = Math.Max(0, ModList.FirstDisplayedScrollingColumnIndex); GUIMod selected_mod = null; if (ModList.CurrentRow != null) { selected_mod = (GUIMod) ModList.CurrentRow.Tag; } ModList.Rows.Clear(); foreach (var row in rows) { var mod = ((GUIMod) row.Tag); row.Visible = mainModList.IsVisible(mod); } var sorted = this._SortRowsByColumn(rows.Where(row => row.Visible)); ModList.Rows.AddRange(sorted.ToArray()); // Find and select the previously selected row if (selected_mod != null) { var selected_row = ModList.Rows.Cast<DataGridViewRow>() .FirstOrDefault(row => selected_mod.Identifier.Equals(((GUIMod)row.Tag).Identifier)); if (selected_row != null) { ModList.CurrentCell = selected_row.Cells[scroll_col]; } } }