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 работает нормально.Не могли бы вы помочь мне понять, в чем проблема?
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