(DataGridView + Binding) Как закрасить линию в зависимости от объекта, на который она наложена? - PullRequest
4 голосов
/ 12 ноября 2008

Я хотел бы добавить задний цвет для конкретной строки в зависимости от свойства связанного объекта.

Решение, которое у меня есть (и оно работает), состоит в том, чтобы использовать Событие DataBindingComplete, но я не думаю, что это лучшее решение.

Вот событие:

    private void myGrid_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
    {

        for (int i = 0; i < this.myGrid.Rows.Count; i++)
        {
            if((this.myGrid.Rows[i].DataBoundItem as MyObject).Special)
            {
                this.myGrid.Rows[i].DefaultCellStyle.BackColor = Color.FromArgb(240, 128, 128);
            }
        }
    }

Любой другой вариант, который был бы лучше?

Ответы [ 4 ]

7 голосов
/ 12 ноября 2008

Вы также можете прикрепить обработчик событий к RowPostPaint:

dataGridView1.RowPostPaint += OnRowPostPaint;

void OnRowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
    MyObject value = (MyObject) dataGridView1.Rows[e.RowIndex].DataBoundItem;
    DataGridViewCellStyle style = dataGridView1.Rows[e.RowIndex].DefaultCellStyle;

    // Do whatever you want with style and value
    ....
}
1 голос
/ 12 ноября 2008

Я бы предложил несколько вещей:

  • посмотрите на изменение ваших строк в _OnRowDatabound
  • Не устанавливайте цвет в вашем коде !!! Это было бы большой ошибкой. Используйте свойство attribute и установите cssclass. Виляние пальцем людям, которые все еще делают это.

Дайте мне знать, если вы будете бороться с реализацией, и я опубликую фрагмент.

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

Я не очень много работаю с WinForms, но в ASP вы бы использовали метод ItemDataBound. Есть ли что-то подобное в окнах форм для DataGrid?

Если это так, в этом методе аргументы события будут содержать элемент с привязкой к данным вместе со строкой DataGrid. Таким образом, общий код будет выглядеть примерно так (синтаксис, вероятно, выключен):

if(((MyObject)e.Item.DataItem).Special)
   e.Item.DefaultCellStyle.BackColor = Color.FromArgb(240, 128, 128);
0 голосов
/ 20 ноября 2018
private void myGrid_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{

    foreach (DataGridViewRow row in myGrid.Rows)
    {
        if((row.DataBoundItem as MyObject).Special)
        {
            row.DefaultCellStyle.BackColor = Color.FromArgb(240, 128, 128);
        }
    }
}
...