6

我正在为我的 C# 项目中的 DataGridView 设置以下属性...

sampleDataGridView.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
sampleDataGridView.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;

但我注意到标题(即标题单元格中的文本由于某种原因略微向左偏移......尽管数据行在中心完美对齐......

这可能是什么原因造成的?

4

5 回答 5

12

这是因为有一个排序字形(小箭头),DataGridView 为其保留了一些空间来显示排序顺序。如果要禁用排序字形,请将列上的 SortMode 设置为 NotSortable,然后您的文本应该居中。

于 2014-09-22T17:57:37.703 回答
5

老话题,

我遇到了这个问题,我发现问题在于我将网格数据源链接到我的东西,并且当创建列时,他们默认设置了 ALLOW SORT ON,这创建了向下箭头按钮进行排序,并且文本被推到左边。对此的小修复是:

private void MyDataGridView_ColumnAdded(object sender, DataGridViewColumnEventArgs e)
{
   e.Column.SortMode = DataGridViewColumnSortMode.NotSortable;
}
于 2019-03-05T20:08:11.863 回答
1

我和你有同样的问题,这似乎是一个框架问题:MS Connect

于 2012-03-05T10:03:41.573 回答
1

计算出字形宽度而没有反射并在超出线时抑制:

在下面的代码中,我在将列宽自动调整为列标题文本宽度时打开和关闭排序。排序开/关之间的宽度差异将显示列排序字形使用的宽度。

当列宽设置为小于自动调整的宽度时,列会丢失字形,我通过插入对称的左右列填充来抑制它。

我还使用字典通过 datagridview 实例存储 ColumnWidth 事件,以便在设置宽度时打开和关闭宽度事件。

我称这个疯狂的代码既可以自动调整初始列宽,也可以在用户拖动列宽时管理列标题填充。

void AdaptColumnHeaderText(DataGridViewColumn column, bool autoSize=false)
{

    //Supress column width events
    if (dataGridViewColumnWidthEventHandlers.ContainsKey(column.DataGridView))
    {
        dataGridView1.ColumnWidthChanged -= dataGridViewColumnWidthEventHandlers[column.DataGridView];
    }

    //Save initial column with as preferred
    var w_preferred = column.Width;

    if (
            column.SortMode.Equals(DataGridViewColumnSortMode.Automatic) &&
            column.HeaderCell.Style.Alignment.Equals(DataGridViewContentAlignment.MiddleCenter))
    {
        //remove all header padding
        column.HeaderCell.Style.Padding = new Padding(0, 0, 0, 0);

        //Fit column width to header text with AND sort glyph
        column.AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;

        //save column width sort enabled
        var w_sort = column.Width;

        //Fit column width to header text with NO sort glyph
        column.SortMode = DataGridViewColumnSortMode.NotSortable;

        //save column width when sort disable
        var w_nosort = column.Width;

        //Calculate width consumed by sort glyph
        var w_glyph = w_sort - w_nosort;

        //Nominal column width if glyph width applied left and right of header text
        var w_nominal = w_glyph + w_nosort + w_glyph;

        //Disable column width autosize
        column.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;

        //Enable column autosorting
        column.SortMode = DataGridViewColumnSortMode.Automatic;

        //If autosize option - ignore preferred width and set to nominal
        if (autoSize)
        {
            w_preferred = w_nominal;       
        }

        //Pad depending on final column width
        if (w_preferred >= w_nominal)
        {
            //Preferred width greater than nominal - pad left of text to balance width used by glyph
            column.HeaderCell.Style.Padding = new Padding(w_glyph, 0, 0, 0);
        }
        else
        {
            //Two symetric glyphs will not fit - pad left and right to supress glyph  
            w_glyph = (w_preferred - w_nosort) / 2;
            column.HeaderCell.Style.Padding = new Padding(w_glyph, 0, w_glyph, 0);
        }
        column.Width = w_preferred;

        Console.WriteLine("name:{0}, glyph:{1}, w_preferred:{2}", column.Name, w_glyph, w_preferred);
    }

    //re-enable column width events
    if (dataGridViewColumnWidthEventHandlers.ContainsKey(column.DataGridView))
    {
        dataGridView1.ColumnWidthChanged += dataGridViewColumnWidthEventHandlers[column.DataGridView];
    }


}
于 2017-09-18T13:17:48.863 回答
0

您可以在列名的开头添加两个空格,以补偿为字形保留的空格。

于 2020-05-17T11:19:04.320 回答