2

私は Winform datagridview を使用しており、背景色を変更してヘッダーをカスタマイズしようとしています。色を変更できるようにするには、EnableHeadersVisualStylesプロパティを false に設定する必要があります。

しかし、このプロパティを設定すると、デフォルトの 3D テーマが失われます。3D スタイルを保存してヘッダーに色を付けるための回避策があるかどうか知っていますか?

私のコード:

dataGridTaxes.EnableHeadersVisualStyles = false;
dataGridTaxes.ColumnHeadersDefaultCellStyle = BlueDataGridHeaderStyle.GetInstance();

BlueDataGridHeaderStyle は、新しい BackColor を使用した単なる基本的なスタイルです

4

1 に答える 1

5

をカスタマイズする必要がありますDataGridView。ここに、私が作成したサンプル コードを示します。のデフォルトの 3D スタイルと比較すると非常に見栄えが良いですが、および をColumnHeaderサポートしています。BackColorHover backcolor

    //CellPainting event handler for your dataGridView1
    private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e){
        if (e.RowIndex == -1 && e.ColumnIndex > -1){
            e.PaintBackground(e.CellBounds, true);
            RenderColumnHeader(e.Graphics, e.CellBounds, e.CellBounds.Contains(hotSpot) ? hotSpotColor : backColor);
            RenderColumnHeaderBorder(e.Graphics, e.CellBounds, e.ColumnIndex);
            using (Brush brush = new SolidBrush(e.CellStyle.ForeColor)){
                using (StringFormat sf = new StringFormat() {LineAlignment = StringAlignment.Center, Alignment = StringAlignment.Center}) {
                    e.Graphics.DrawString(e.Value.ToString(), e.CellStyle.Font, brush, e.CellBounds, sf);                        
                }
            }
            e.Handled = true;
        }
    }
    Color hotSpotColor = Color.LightGreen;//For hover backcolor
    Color backColor = Color.LimeGreen;    //For backColor    
    Point hotSpot;
    private void RenderColumnHeader(Graphics g, Rectangle headerBounds, Color c) {
        int topHeight = 10;
        Rectangle topRect = new Rectangle(headerBounds.Left, headerBounds.Top+1, headerBounds.Width, topHeight);
        RectangleF bottomRect = new RectangleF(headerBounds.Left, headerBounds.Top+1 + topHeight, headerBounds.Width, headerBounds.Height- topHeight-4);            
        Color c1 = Color.FromArgb(180, c);            
        using (SolidBrush brush = new SolidBrush(c1)) {
            g.FillRectangle(brush, topRect);
            brush.Color = c;
            g.FillRectangle(brush, bottomRect);
        }
    }
    private void RenderColumnHeaderBorder(Graphics g, Rectangle headerBounds, int colIndex) {            
        g.DrawRectangle(new Pen(Color.White, 0.1f), headerBounds.Left + 0.5f, headerBounds.Top + 0.5f,headerBounds.Width-1f,headerBounds.Height-1f);
        ControlPaint.DrawBorder(g, headerBounds, Color.Gray, 0, ButtonBorderStyle.Inset,
                                               Color.Gray, 0, ButtonBorderStyle.Inset,
                                             Color.Gray, colIndex != dataGridView1.ColumnCount - 1 ? 1 : 0, ButtonBorderStyle.Inset,
                                           Color.Gray, 1, ButtonBorderStyle.Inset);
    }
    //MouseMove event handler for your dataGridView1
    private void dataGridView1_MouseMove(object sender, MouseEventArgs e){
        hotSpot = e.Location;
    }
    //MouseLeave event handler for your dataGridView1
    private void dataGridView1_MouseLeave(object sender, EventArgs e){
        hotSpot = Point.Empty;
    }

ここに画像の説明を入力

RenderColumnHeaderBorder代わりに次のように実装できますControlPaint.DrawBorder3D。はるかに簡単です。

private void RenderColumnHeaderBorder(Graphics g, Rectangle headerBounds, int colIndex)
{
    ControlPaint.DrawBorder3D(g, headerBounds, Border3DStyle.Raised, Border3DSide.All & ~Border3DSide.Middle);
}

ここに画像の説明を入力

private void RenderColumnHeaderBorder(Graphics g, Rectangle headerBounds, int colIndex)
{
    ControlPaint.DrawBorder3D(g, headerBounds, Border3DStyle.RaiseInner, Border3DSide.All & ~Border3DSide.Middle);
}

ここに画像の説明を入力

private void RenderColumnHeaderBorder(Graphics g, Rectangle headerBounds, int colIndex)
{
    ControlPaint.DrawBorder3D(g, headerBounds, Border3DStyle.RaiseOuter, Border3DSide.All & ~Border3DSide.Middle);
}

ここに画像の説明を入力

于 2013-10-10T14:10:14.087 に答える