Изменение свойств DataGridViewRow в другом потоке - PullRequest
1 голос
/ 03 ноября 2008

Хорошо, поэтому я связываю DataGridView с BindingSource в фоновом потоке, в то время как небольшое окно модели «Пожалуйста, подождите» развлекает пользователя. Нет проблем.

Однако мне нужно изменить некоторые цвета фона строк в зависимости от типа элемента данных строки. Как это:

for (int i = 0; i < dgItemMaster.Rows.Count; i++)
{
  if (dgItemMaster.Rows[i].DataBoundItem.GetType().Name == "Package")
  {
   dgItemMaster.Rows[i].DefaultCellStyle.BackColor = Color.PowderBlue;                    
  }
}

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

Вот что я делаю сейчас:

void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            dgItemMaster.DataSource = products;
            dgItemMaster.BeginInvoke((Action)(() =>
            {
                for (int i = 0; i < dgItemMaster.Rows.Count; i++)
                {
                    if (dgItemMaster.Rows[i].DataBoundItem.GetType().Name == "Package")
                    {
                        dgItemMaster.Rows[i].DefaultCellStyle.BackColor = Color.PowderBlue;
                    }
                    else if (dgItemMaster.Rows[i].DataBoundItem.GetType().Name == "PackageKit")
                    {
                        dgItemMaster.Rows[i].DefaultCellStyle.BackColor = Color.Pink;
                    }
                }
            }));
        }

Ответы [ 2 ]

1 голос
/ 04 ноября 2008

Какой здесь объем данных? Чтобы он повесил пользовательский интерфейс, он должен быть нетривиальным. Одним из крайних ответов было бы переключиться на виртуальный режим - но это много работы.

Если вы просто не хотите вешать пользовательский интерфейс, возможно, просто сделайте первые x (20? 50?) Строки сразу, а оставшуюся часть в пакетах - по сути эмулируя DoEvents, просто без кода-запаха DoEvents ...

(непроверенные)

        int startIndex = 0;
        Action action = null;
        action = () =>
        {   // only processes a batch of 50 rows, then calls BeginInvoke
            // to schedule the next batch
            int endIndex = startIndex + 50;
            if (endIndex > dgItemMaster.Rows.Count) endIndex = dgItemMaster.Rows.Count;

            if (startIndex > endIndex)
            {
                for (int i = startIndex; i < endIndex; i++)
                {
                    // process row i
                }

                startIndex = endIndex;
                this.BeginInvoke(action); // next iteration
            }                
        };

        // kick it off
        this.BeginInvoke(action);
1 голос
/ 04 ноября 2008

Я бы попробовал запустить код, который изменяет фоновый цвет в событии RowAdded, он будет запущен для каждой строки при добавлении в Grid, и нет необходимости повторять весь список снова.

http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.rowsadded.aspx

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...