2012-06-15 8 views
1

Я наследую элемент управления DataGridView для элемента управления, который я разрабатываю. Моя цель - сделать каждый цвет строки, представляющий состояние объекта, которое может меняться во время выполнения. В моем объекте реализуется шаблон наблюдаемого шаблона. Итак, я решил разработать свой собственный класс DataGridViewRow, внедряя шаблон Observer и делая свою строку наблюдением за объектом. В этом классе, у меня есть этот метод:Изменение цвета строки datagridview во время выполнения

public void UpdateColors(int state) 
{ 
    DefaultCellStyle.BackColor = m_ETBackColors[state]; 
    DefaultCellStyle.ForeColor = m_ETForeColors[state]; 
} 

Я не могу наблюдать свой объект на данный момент, так, чтобы проверить изменения цвета, я называю свой метод UpdateColors на выбранные строки на событии SelectionChanged.

И вот момент, когда он не работает! Мои ранее выбранные строки остаются синими (например, когда они были выбраны), тексты ячеек слоируются при прокрутке. Я попытался вызвать DataGridView.Refresh(), но это тоже не работает.

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

Может ли кто-нибудь сказать мне, что я делаю неправильно?

========== ========== Update

Это работает:

public void UpdateColors(int state) 
{ 
    DefaultCellStyle.BackColor = System.Drawing.Color.Yellow; 
    DefaultCellStyle.ForeColor = System.Drawing.Color.Black; 
} 

Но это не работает:

public void UpdateColors(int state) 
{ 
    DefaultCellStyle.BackColor = m_ETBackColors[nEtattech]; 
    DefaultCellStyle.ForeColor = m_ETForeColors[nEtattech]; 
} 

с:

System.Drawing.Color[] m_ETBackColors = new System.Drawing.Color[] { }; 
    System.Drawing.Color[] m_ETForeColors = new System.Drawing.Color[] { }; 

Там нет переполнения массива: они являются параметрами конструктора.

ответ

1

Хорошо, нашел ошибку. Цвета, которые я использую были созданы так:

System.Drawing.Color.FromArgb(value) 

Плохо то, что значение является целым числом, представляющим цвет с альфа набора 0.
Благодаря этому сообщению: MSDN social post, я узнал, что стили ячеек дон 't поддерживать цвета ARGB, если альфа не установлена ​​на 255 (они поддерживают только цвета RGB).

Так я закончил использовать это, который работает, но, безусловно, является более элегантным способом:

System.Drawing.Color.FromArgb(255, System.Drawing.Color.FromArgb(value)); 
0

использовать CellFormatting события, чтобы сделать это:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    if (this.dataGridView1.Rows[e.RowIndex].Cells["SomeStuff"].Value.ToString()=="YourCondition") 
    this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red; 
    else 
    this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White; 
} 
+0

Я уже пробовал это, установка пользовательских цветовых свойств для моей строки в UpdateColors и используя событие CellFormatting в моем DataGrid , но он не работает: 'частная пустота DataGridViewEtat_Technique_CellFormatting (объект отправителя, System.Windows.Forms.DataGridViewCellFormattingEventArgs е) { DataGridViewTechnicalStateRow строка = Ряды [e.RowIndex] в качестве DataGridViewTechnicalStateRow; строка.DefaultCellStyle.BackColor = row.BCL; строка.DefaultCellStyle.ForeColor = row.FCL; } ' – Rifu

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