Проблема с отображением строк после применения фильтра. В DataGridView я использую динамическое обновление.
Описание проблемы: после применения фильтра (по условию Rows.Visible = true
или Rows.Visible = false
) появляются другие строки, при этом отображается не вся новая строка, а толькообновленные ячейки, как на изображении:

Важно отметить, что обновления таблицы не происходят в основном потоке;Обновление происходит с фиксированным интервалом thread_delay_time
.
Код TreeView1_AfterSelect
:
private void TreeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
Classes.TreeViewFilter treeViewFilter = new Classes.TreeViewFilter();
treeViewFilter.Filter(this);
}
Часть класса TreeViewFilter
:
class TreeViewFilter
{
public void Filter(MainForm mainForm)
{
switch (mainForm.TreeView1.SelectedNode.Text)
{
case "Category":
mainForm.dataGridView1.CurrentCell = null;
for (int i = 0; i < mainForm.dataGridView1.Rows.Count; i++)
{
mainForm.dataGridView1.Rows[i].Visible = true;
}
break;
case "MED":
mainForm.dataGridView1.CurrentCell = null;
for (int i = 0; i < mainForm.dataGridView1.Rows.Count; i++)
{
if (Convert.ToInt32(mainForm.dataGridView1.Rows[i].Cells[13].Value) == 1)
mainForm.dataGridView1.Rows[i].Visible = true;
else
mainForm.dataGridView1.Rows[i].Visible = false;
}
break;
case "Air":
mainForm.dataGridView1.CurrentCell = null;
for (int i = 0; i < mainForm.dataGridView1.Rows.Count; i++)
{
if (Convert.ToInt32(mainForm.dataGridView1.Rows[i].Cells[13].Value) == 2)
mainForm.dataGridView1.Rows[i].Visible = true;
}
else
mainForm.dataGridView1.Rows[i].Visible = false;
... и т. Д.
Фильтрациятребуется не только по методу After_Select
, но и динамически (при выбранном узле TreeView
отображается только нужный набор строк). Реализация через метод DataGridView1_CellValueChanged
и новый поток private void ThreeViewMarker()
:
Invoke((MethodInvoker)delegate
{
switch (TreeView1.SelectedNode.Text)
{
case "Category":
dataGridView1.CurrentCell = null;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
CurrencyManager currencyManager = (CurrencyManager)BindingContext[dataGridView1.DataSource];
currencyManager.SuspendBinding();
dataGridView1.Rows[i].Visible = true;
currencyManager.ResumeBinding();
}
break;
case "MED":
dataGridView1.CurrentCell = null;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
if (Convert.ToInt32(dataGridView1.Rows[i].Cells[13].Value) == 1)
{
CurrencyManager currencyManager = (CurrencyManager)BindingContext[dataGridView1.DataSource];
currencyManager.SuspendBinding();
dataGridView1.Rows[i].Visible = true;
currencyManager.ResumeBinding();
}
else
{
CurrencyManager currencyManager = (CurrencyManager)BindingContext[dataGridView1.DataSource];
currencyManager.SuspendBinding();
dataGridView1.Rows[i].Visible = false;
currencyManager.ResumeBinding();
}
}
break;
case "Air":
dataGridView1.CurrentCell = null;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
if (Convert.ToInt32(dataGridView1.Rows[i].Cells[13].Value) == 2)
{
CurrencyManager currencyManager = (CurrencyManager)BindingContext[dataGridView1.DataSource];
currencyManager.SuspendBinding();
dataGridView1.Rows[i].Visible = true;
currencyManager.ResumeBinding();
}
else
{
CurrencyManager currencyManager = (CurrencyManager)BindingContext[dataGridView1.DataSource];
currencyManager.SuspendBinding();
dataGridView1.Rows[i].Visible = false;
currencyManager.ResumeBinding();
}
}
... и т. Д.
Этот метод также работает не так, как следует по аналогии с предыдущим методом.
По-прежнему непонятное поведение формы в целом, проблема при масштабировании окна (появляется первая строка из набора):

В .gif метод с динамическим обновлением DataGridView
отключен ! Результат простого метода After_Select
.
Подскажите пожалуйста, как с этим бороться. Что я не учел?
.gif описание:
Чтобы решить проблему, я попытался использовать это:
string columnName = "type"; // or other column
string filterValue = "2"; // or other value
string rowFilter = string.Format("[{0}] = '{1}'", columnName, filterValue);
(mainForm.dataGridView1.DataSource as DataTable).DefaultView.RowFilter = rowFilter;
Но в этом случае скрытые строки больше не опрашиваются (они, кажется, отсутствуютиз DataSource или что-то в этом роде)
Спасибо за помощь;Я прошу прощения за мой английский ... =)