Как предотвратить строки в datagrid от мерцания, в то время как приложение работает

В приложении я разрабатываю в данный момент, я использую datagridview для отображения данных. Для заполнения его я должен нажать кнопку, и backgroundworker начнет работать, это заполнит таблицу данных и когда это закончило работать, это будет использовать таблицу данных в качестве источника данных для datagrid. Это хорошо работает, UI остается быстро реагирующим и так далее. Но теперь я реализовал окраску к строкам, в зависимости от их значений (Im, все еще играя вокруг с ним, таким образом, любые предложения приветствуются):

        private void ApplyColoring()
    {
        if (dataGridView1.DataSource != null)
        {
            foreach (DataGridViewRow dataGridRow in dataGridView1.Rows)
            {
                // hardmap a color to a column
                IDictionary<Int32, Color> colorDictionary = new Dictionary<Int32, Color>();
                colorDictionary.Add( 7, Color.FromArgb(194, 235, 211));
                colorDictionary.Add( 8, Color.Salmon);
                colorDictionary.Add( 9, Color.LightBlue);
                colorDictionary.Add(10, Color.LightYellow);
                colorDictionary.Add(11, Color.LightGreen);
                colorDictionary.Add(12, Color.LightCoral);
                colorDictionary.Add(13, Color.Blue);
                colorDictionary.Add(14, Color.Yellow);
                colorDictionary.Add(15, Color.Green);
                colorDictionary.Add(16, Color.White);

                foreach (DataGridViewRow gridRow in dataGridView1.Rows)
                {
                    foreach (DataGridViewCell cell in gridRow.Cells)
                    {
                        if (colorDictionary.Keys.Contains(cell.ColumnIndex))
                        {
                            // standard background 
                            cell.Style.BackColor = Color.FromArgb(194, 235, 211);
                        }
                    }
                }

                IList<String> checkedValues = new List<String>();


                // first we loop through all the rows
                foreach (DataGridViewRow gridRow in dataGridView1.Rows)
                {
                    IDictionary<String, Int32> checkedVal = new Dictionary<String, Int32>();

                    // then we loop through all the data columns
                    int maxCol = dnsList.Count + 7;
                    for (int columnLoop = 7; columnLoop < maxCol; columnLoop++)
                    {
                        string current = gridRow.Cells[columnLoop].Value.ToString();

                        for (int checkLoop = 7; checkLoop < maxCol; checkLoop++)
                        {
                            string check = gridRow.Cells[checkLoop].Value.ToString();

                            if (!current.Equals(check))
                            {
                                if (checkedVal.Keys.Contains(current))
                                {
                                    gridRow.Cells[columnLoop].Style.BackColor = colorDictionary[checkedVal[current]];
                                }
                                else
                                {
                                    gridRow.Cells[columnLoop].Style.BackColor = colorDictionary[columnLoop];
                                    checkedVal.Add(current, columnLoop);
                                }
                            }
                        }
                    }
                }
            }
        }
    }

Это дает мне проблемы. Не потому что окраска не работает, она делает. Но потому что это делает это Хеллой медленный. В первый раз это хорошо работает, но когда я нажимаю кнопку снова, это медленно как ад, и datagrid мерцает. Я хочу это выполнение, как постобрабатывают, таким образом, это (или скорее должен), будьте выполнены после того, как backgroundworker завершается. Но когда я называю applycoloring от события RunWorkerCompleted его просто медленным. Что я должен сделать к prvent это? Как я могу удостовериться, что UI не мерцает в то время как его выполнение нового запроса (НЕ ТЕРЯЯ текущие данные в сетке).

5
задан Henk Holterman 11 January 2010 в 12:55
поделиться

2 ответа

121 --- 3894556-121 --- 3894556

Два предложения:

  1. Попробуйте позвонить SUSPENDLAYOUT () перед циклом и Resumelayout () после цикла. Большинство других элементов управления вызывают эту запись () и endupdate () (ListViews, combobox и т. Д.).
  2. Используйте VirtualMode на DatagridView, если вы имеете дело с большим количеством данные.
6
ответ дан 18 December 2019 в 05:40
поделиться

Попробуйте позвонить в SuspendLayout до ваших обновлений. Не забудьте позвонить в ResumeLayout.

1
ответ дан 18 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: