2009-09-16 2 views
1

Я прочитал ряд примеров использования объектов BackgroundWorker для обработки выполняющихся задач с большим количеством времени, которые генерируют результаты, которые используются для заполнения DataGridView. Однако в моем случае кажется, что актом заполнения DataGridView является то, что занимает больше всего времени. Мне интересно, если это необходимо, потому что мне нужно отформатировать результаты (скрыть определенные столбцы, проверить определенные флаги в каждой строке, чтобы установить цвет/шрифт и т. Д.).Многопоточность форматирования строк datagridview?

Пример:

DataTable results_table; 
DataGridView my_grid; 
DataView my_view; 

private void fillTable() 
{ 
    // Generate the results 
    ... 


    // Bind the data. 
    my_view.Table = results_table; 
    my_grid.DataSource = my_view 


    // Format the results 
    my_grid.Columns[0].Visible = false; 
    my_grid.Columns[1].Visible = false; 

    my_grid.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; 
    my_grid.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; 

    foreach (DataGridViewRow row in my_grid.Rows) 
    { 
     // Check for flags and format necessary rows. 
    } 
} 

Является ли это правильный путь идти об этом, или есть какой-то другой способ форматирования результатов без перебора каждой строки?

ответ

5

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

+0

Как указал Фредрик, использование свойства «AutoSizeMode» (особенно когда оно было установлено на «AllCells») вызывало самую большую задержку. Теперь все столбцы настроены на «Заполнить», и даже с форматированием строки за строкой (выделение жирным шрифтом, подчеркивание и т. Д.) Поражение производительности значительно менее значимо. – themarshal

1

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

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

0

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

0

Как уже упоминалось, вы можете обновлять свой интерфейс только из потока графического интерфейса. Но, что вы можете сделать, это переместить код, который создает my_view в отдельном потоке.

Смежные вопросы