DataView RowFilter не дает должных результатов

Я использую Data Grid View для отображения 1000 строк и 800 столбцов данных (только один символ в ячейке). Также есть столбец Check Box. Я добавил пункт контекстного меню, например «Просмотр выбранных ячеек». При щелчке по этому я пытаюсь показать только проверенные строки. Для этого ранее я устанавливал свойство Visible непроверенных строк в False, перебирая каждую. Это занимает так много времени.

Поэтому я попытался использовать DataView Control, применив RowFilter. Это выглядит несколько быстрее, но. Но некоторые проверенные строки не видны.

например Если у меня есть 10 строк, из них проверяются 5 строк. Тогда видны только 4 строки. На самом деле он должен показать 5 проверенных строк.

Я пробовал эти вещи

  1. dView.RowFilter="CheckBoxCol";
  2. dView.RowFilter="CheckBoxCol=true";

с обеими этими вещами у меня такая же проблема. Может ли кто-нибудь помочь мне в этом?


person user1550623    schedule 22.08.2012    source источник
comment
Существует ли базовый связанный источник данных для вашего элемента управления представлением данных (например, таблица данных, список объектов) или вы заполняете сетку данных вручную?   -  person Holger Brandt    schedule 22.08.2012
comment
Оба варианта, которые вы показываете, должны работать хорошо - я дал ответ, основанный на единственной причине, по которой, как мне кажется, это произошло. Если мое предположение неверно, предоставьте подробную информацию о том, как именно воспроизвести эту проблему. Код позади минимального решения был бы лучшим.   -  person David Hall    schedule 23.08.2012


Ответы (2)


Оба метода, которые вы показали, будут работать как RowFilter в логическом столбце.

Скорее всего, вы столкнулись с проблемой, связанной с тем, как DataGridView обрабатывает изменения — они не фиксируются в базовом источнике данных, пока текущая ячейка редактирования не потеряет фокус, и с наиболее распространенным способом отображения контекстного меню в сетке, ячейка не теряет фокус.

То есть, если вы показываете свое контекстное меню, делая что-то вроде этого:

void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {            
        contextMenuStrip1.Show(dataGridView1, e.Location);
    }
}

Тогда последний измененный вами флажок не будет сбрасывать свое изменение в представление данных.

Решение состоит из двух частей. Сначала вам нужно ввести источник привязки, который находится между представлением данных и сеткой данных.

bindingSource1.DataSource = dView;
dataGridView1.DataSource = bindingSource1;

Затем вам нужно добавить следующий код в обработчик «CurrentCellDirtyStateChanged» в представлении сетки данных:

void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    if (dataGridView1.IsCurrentCellDirty)
    {
        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}

Наконец, в коде, где вы применяете фильтр, вам также нужно вызвать EndEdit в источнике привязки:

private void filterToolStripMenuItem_Click(object sender, EventArgs e)
{
    bs.EndEdit();
    dvSections.RowFilter = "CheckBoxCol";
}

В моем предыдущем опыте источник привязки не был необходим, но я не пробовал с таким сочетанием контекстного меню и представления данных, когда я попытался, я обнаружил, что bs.EndEdit() был необходим.

person David Hall    schedule 22.08.2012

Я думаю, что Дэвид Холл прав (извините, у меня недостаточно очков, чтобы просто комментировать - что я и собираюсь здесь сделать)

Попробуйте Table.AcceptChanges в базовой исходной таблице представления сетки данных, если это возможно.

Это должно зафиксировать любые оставшиеся изменения в таблице, а затем и в DGV.

person Grantly    schedule 11.09.2014