DataGridView не будет перерисовываться при обновлении из другого потока



У меня проблема с обновлением DataGridView из другого потока. Позвольте мне объяснить. Когда пользователь нажимает кнопку на форме, мне нужно заполнить сетку несколькими строками. Этот процесс занимает некоторое время, поэтому я делаю это в отдельном потоке. Перед запуском потока я устанавливаю свойство DataGridView.Enabled в false, чтобы запретить пользователю редактировать элементы во время их добавления, а непосредственно перед окончанием рабочего потока я устанавливаю Enabled обратно в true.



Проблема в том, что DataGridView не обновит свое содержимое правильно, если полосы прокрутки нужно, чтобы его показали. Я проиллюстрирую это скриншотом:



частично нарисованный ряд



Как вы можете видеть, последняя видимая строка частично нарисована, и DataGridView не будет прокручиваться вниз. Если я изменяю размер сетки, заставляя ее перекрашиваться, все строки отображаются нормально.

Вот какой код:



    private void button1_Click(object sender, EventArgs e)
{
string[] fileNames = new string[] { "file1", "file2", "file3" };
Thread AddFilesToListThread = new Thread(ThreadProcAddRowsToGrid);
dataGridView1.Enabled = false;
AddFilesToListThread.Start(fileNames);
}

delegate void EmptyDelegate();

private void ThreadProcAddRowsToGrid(object fileNames)
{
string[] files = (string[])fileNames;
foreach (string file in files)
{
EmptyDelegate func = delegate
{
dataGridView1.Rows.Add(file);
};
this.Invoke(func);
}

EmptyDelegate func1 = delegate
{
dataGridView1.Enabled = true;
};
this.BeginInvoke(func1);
}


Я также заметил, что только свойство Enabled вызывает это странное поведение. Изменение, например, BackgroundColor работает нормально.

Не могли бы вы помочь мне понять, в чем проблема?
765   1  

1 ответ:

Вы пробовали DataGridView.Refresh()

Возможно, установка свойства readonly вместо dataGridView1.Enabled = true;?

В качестве альтернативы, я думаю, что это можно решить, отделив ваши данные от пользовательского интерфейса.

Мне кажется, что это упрощенный пример для SO здесь, но если вы можете, я бы предложил заменить эквивалентную строку;

DataGridView1.Строки.Добавить (файл);

С

DataTable table = getData(); //In your snippet (file)
BindingSource source = new BindingSource();
source.DataSource = table
dataGridView1.Datasource = source;

Затем вы также можете обновить данные, используя ResetBindings на BindingSource;

table = getData();; //Update your data object
source.ResetBindings(false);

Comments

    Ничего не найдено.