DataGridView не будет перекрашиваться при обновлении из другого потока - PullRequest
3 голосов
/ 04 октября 2011

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

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

partially drawn row

Как видите, последняя видимая строка частично прорисована и 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 Ответ

2 голосов
/ 04 октября 2011

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

Может быть, установить свойство только для чтения вместо dataGridView1.Enabled = true ;?

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

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

dataGridView1.Rows.Add (файл);

с

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...