изменение левого заполнения DataGridViewRow

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

Как это может быть сделано?


person bobek    schedule 24.08.2011    source источник
comment
Это может быть возможно путем обработки событий рисования ячеек и строк. Вы должны освоиться с использованием класса Graphics.   -  person Igby Largeman    schedule 25.08.2011
comment
Да, я думаю, что смогу как-то различить родителей и детей графически. Например, представление разных цветов может быть решением. Я надеялся немного сдвинуть ряд; это было бы действительно хорошим представлением архитектуры. Если я найду решение, я опубликую его здесь.   -  person bobek    schedule 25.08.2011
comment
Если вы решите просто изменить цвет строки, я могу опубликовать и ответить, как лучше всего это сделать. Дайте мне знать, если хотите.   -  person Igby Largeman    schedule 26.08.2011
comment
Я, вероятно, изменю, например, если parentID != 0, изменю цвет фона на серый, а цвет шрифта на белый для всей строки.   -  person bobek    schedule 26.08.2011


Ответы (1)


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

Обработайте событие RowPrePaint DataGridView:

private void dataGrid_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
    // use whatever your row data type is here
    MyDataType item = (MyDataType)(dataGrid.Rows[e.RowIndex].DataBoundItem);

    // only highlight children
    if (item.parentID != 0)
    {
        // calculate the bounds of the row
        Rectangle rowBounds = new Rectangle(
            dataGrid.RowHeadersVisible ? dataGrid.RowHeadersWidth : 0, // left
            e.RowBounds.Top, // top
            dataGrid.Columns.GetColumnsWidth(DataGridViewElementStates.Visible) - dataGrid.HorizontalScrollingOffset + 1, // width 
            e.RowBounds.Height // height
        ); 


        // if the row is selected, use default highlight color
        if (dataGrid.Rows[e.RowIndex].Selected)
        {
            using (Brush brush = new SolidBrush(dataGrid.DefaultCellStyle.SelectionBackColor))
                e.Graphics.FillRectangle(brush, rowBounds);
        }
        else // otherwise use a special color
            e.Graphics.FillRectangle(Brushes.PowderBlue, rowBounds);


        // prevent background from being painted by Paint method
        e.PaintParts &= ~DataGridViewPaintParts.Background;     
    }   
}

Обычно я предпочитаю использовать градиентную кисть для особого выделения:

using (Brush brush = new LinearGradientBrush(rowBounds, color1, color2,  
       LinearGradientMode.Horizontal))
{
    e.Graphics.FillRectangle(brush, rowBounds);
}

Где color1 и color2 будут любыми цветами, которые вы выберете.

person Igby Largeman    schedule 26.08.2011