为什么我的ColumnHeadersDefaultCellStyle会继续在Visual Studio设计器中重置?

时间:2012-07-11 18:46:04

标签: winforms visual-studio visual-studio-2008 datagridview

我试图在Visual Studio 2008中使我的DataGridView的列标题变为粗体。

每次我将ColumnHeadersDefaultCellStyle更改为Calibri 9.75pt粗体时,使用属性框,下次重新打开保存的表单时,ColumnHeadersDefaultCellStyle已恢复为Calibri 9.75而不加粗体。

我的表单的字体是没有粗体的Calibri 9.75,我的默认单元格样式,但我应该能够使用我的ColumnHeader样式覆盖默认的单元格样式吗?

我可以通过在显示表单时设置样式来以编程方式解决此问题,但我们希望Visual Studio设计器显示粗体标题,因此我们可以适当地布置列以用粗体标题文本占用的空间

此外,实际的设计器文件指定ColumnHeadersDefaultCellStyle是粗体,即使设计器界面显示它不是粗体。

dataGridViewCellStyle1.Font = new System.Drawing.Font("Calibri", 9.75F,  
    System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;

this.receiptDetailView.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1;

13 个答案:

答案 0 :(得分:20)

您是否尝试过检查 EnableHeadersVisualStyles 值?

根据MSDN

  

如果启用了视觉样式并且EnableHeadersVisualStyles设置为   true,除了TopLeftHeaderCell之外的所有标题单元格都是使用绘制的   当前主题和ColumnHeadersDefaultCellStyle值是   忽略。

答案 1 :(得分:18)

这是一个错误,尽管微软可能会尝试将其称为一项功能。仅当EnableHeadersVisualStyles设置为TRUE时,DataGridView标头单元才应继承当前主题,如果为false,则使用ColumnHeaderDefaultCellStyles中的设置。但是DGV忽略了EnableHeadersVisualStyles并且总是继承它所在的父容器的字体。

rutlean和Nico Engler的建议都有效。以下是我一直做的标准做法:将DGV放在一个面板中(根据您的应用程序,您可能需要设置Dock属性来填充。然后将Panel的字体设置为您想要的设置。您的DGV现在将始终继承那个设置。

答案 2 :(得分:2)

似乎这是一个错误,但我不确定它为什么会发生。我已经以各种可能的方式对其进行了测试,并且该值被父控件值覆盖,无论它是否被设置。这与其他所有WinForms(或任何其他UI框架)控件的工作方式相反,并且没有任何意义。我还测试过各种其他控件,但没有找到另一种情况。

ColumnHeadersDefaultCellStyle字体仅在父控件(在本例中为窗体)上未设置Font属性时才重要。

我正在给予最值得赞赏的答案,但这不是正在发生的事情。

我一直在使用的“解决方案”是在表单加载事件中再次设置字体,但这不是一个完美的解决方案,因为这样的代码不属于那里。

答案 3 :(得分:2)

我遇到了同样的问题。但是,我的dataGridView位于一个组框中。在重新启动VS 2010时,dataGridView字体将始终是groupBox设置的任何内容。绝对是我想要的错误。

答案 4 :(得分:2)

我通过添加框架解决了这个问题。对我来说,datagridview位于一个组框内(尽管其他一些容器类型也是如此)。

通过将一个面板放在groupbox中,将相应的字体设置到该面板,将datagridview放在该面板中,默认情况下它继承了这些字体。

我正在使用VS2010

答案 5 :(得分:1)

我找到了一种解决方法,只需使用以下代码编辑XXXX.Designer.cs即可。

this.receiptDetailView.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1;
this.receiptDetailView.ColumnHeadersDefaultCellStyle.Font = new System.Drawing.Font("Calibri", 9.75F, System.Drawing.FontStyle.Bold);

答案 6 :(得分:1)

答案实际上很简单。

您将字体样式设置为Form1 [Arial; 8,25pt。 让我们看看设计师:

private void InitializeComponent()
    {
        System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
        this.dataGridView1 = new System.Windows.Forms.DataGridView();
        this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
        this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
        this.Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn();
        ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
        this.SuspendLayout();
        // 
        // dataGridView1
        // 
        dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
        dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control;
        dataGridViewCellStyle1.Font = new System.Drawing.Font("Calibri", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
        dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText;
        dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
        dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
        dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
        this.dataGridView1.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1;
        this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
        this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
        this.Column1,
        this.Column2,
        this.Column3});
        this.dataGridView1.EnableHeadersVisualStyles = false;
        this.dataGridView1.Location = new System.Drawing.Point(49, 62);
        this.dataGridView1.Name = "dataGridView1";
        this.dataGridView1.Size = new System.Drawing.Size(443, 309);
        this.dataGridView1.TabIndex = 0;
        // 
        // Column1
        // 
        this.Column1.HeaderText = "Column1";
        this.Column1.Name = "Column1";
        // 
        // Column2
        // 
        this.Column2.HeaderText = "Column2";
        this.Column2.Name = "Column2";
        // 
        // Column3
        // 
        this.Column3.HeaderText = "Column3";
        this.Column3.Name = "Column3";
        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 14F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(546, 457);
        this.Controls.Add(this.dataGridView1);
        this.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
        this.Name = "Form1";
        this.Text = "Form1";
        this.Load += new System.EventHandler(this.Form1_Load);
        ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
        this.ResumeLayout(false);

    }

现在,您可以看到,Datagridview标头的字体设置已保存。 但是,之后会出现表单的字体设置,最终会覆盖Datagridview字体设置。

我的建议是将表单字体设置恢复为默认值。

答案 7 :(得分:1)

使用此代码

dataGridView1.EnableHeadersVisualStyles = false;
dataGridView1.SelectionBackColor = System.Drawing.SystemColors.Highlight;

答案 8 :(得分:0)

今天我遇到了同样的问题,似乎DataGridView的ColumnHeadersDefaultCellStyle被它所属的表单的字体样式覆盖。

作为解决方案,我将表单字体的GdiCharSet参数设置为0.完成后,不会覆盖ColumnHeadersDefaultCellStyle的字体。

我在VS 2010和Window 8上。

答案 9 :(得分:0)

试试这个:

DataGridView1.ColumnHeadersDefaultCellStyle.Font = new Font("Calibri", 9.75F, FontStyle.Bold);       

答案 10 :(得分:0)

我知道这个话题很老,但我在VS 2015中遇到了同样的问题,ColumnDefaultHeadersCellStyle字体大小总是恢复到10pt(我需要它是14pt)。我能够通过首先更改字体本身来解决这个问题,然后允许我更改字体大小。

我最初使用的字体是SEGOE UI SEMIBOLD,我更改为SEGOE UI并且能够更改大小。我没有调查过为什么使用semibold版本阻止我改变大小。此外,此方法对我启用了VisualStyles,并且EnableHeadersVisualStyles设置为true。

如果有人仍然遇到此问题,我的建议是尝试更改为其他字体。

答案 11 :(得分:0)

这是一个错误,即使在.net 4.6中也仍然存在,问题是 ColumnHeadersDefaultCellStyle 字体始终被其 Parent 字体覆盖,因此我想出了一个解决方案这个:

首先,您需要将 DataGridView 添加到自己的 Panel ,Panel将在此处用作屏蔽,我相信您需要设置DataGridView的Dock属性填充。

第二,您需要将以下代码添加到 ColumnHeadersDefaultCellStyleChanged 事件中。

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 12 :(得分:0)

你可以试试;

Private Sub DgvListeFt_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles DgvListeFt.CellPainting
    Call KolonBaslikDGV(sender, e)
End Sub
Sub KolonBaslikDGV(ByVal S As Object, ByVal E As DataGridViewCellPaintingEventArgs)
    E.PaintBackground(E.CellBounds, True)
    If E.RowIndex = -1 Then
        If E.Value Is Nothing Then
            E.Handled = True
            Return
        End If
        E.Handled = True

        Dim headerFont = New Font("Ariel", 9, FontStyle.Regular)
        Dim myBounds As Rectangle = E.CellBounds
        myBounds.X = E.CellBounds.X + 4
        Dim sf = New StringFormat With {.Alignment = StringAlignment.Near,
                                        .LineAlignment = StringAlignment.Center}
        E.Graphics.DrawString(E.Value.ToString, headerFont, Brushes.MediumVioletRed, myBounds, sf)
        headerFont.Dispose()
        sf.Dispose()
    End If
End Sub