Выравнивание заголовка DataGridView немного влево даже после установки его в MiddleCenter - PullRequest
4 голосов
/ 05 марта 2012

Я устанавливаю следующие свойства для DataGridView в моем проекте C # ...

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

Но я замечаю, что заголовок (то есть текст в ячейке заголовка почему-то немного смещен влево). Хотя строки данных идеально выровнены по центру ...

Что может быть причиной этого?

Ответы [ 4 ]

9 голосов
/ 22 сентября 2014

Это потому, что существует сортировочный глиф (маленькая стрелка), для которого DataGridView резервирует некоторое пространство для отображения порядка сортировки. Если вы хотите отключить глиф сортировки, установите для параметра SortMode в столбце значение NotSortable, после чего текст должен быть отцентрирован.

2 голосов
/ 05 марта 2019

Старая тема,

У меня была эта проблема, и я обнаружил, что проблема заключалась в том, что у меня был источник данных сетки, связанный с моими вещами, и когда столбцы, которые создавались, по умолчанию включали РАЗРЕШЕНИЕ НА РАЗРЕШЕНИЕ, что создавало кнопку со стрелкой вниз для сортировка, и текст будет сдвинут влево. Небольшое исправление для этого:

private void MyDataGridView_ColumnAdded(object sender, DataGridViewColumnEventArgs e)
{
   e.Column.SortMode = DataGridViewColumnSortMode.NotSortable;
}
1 голос
/ 05 марта 2012

У меня была та же проблема, что и у вас, и, похоже, проблема с фреймворком: MS Connect

0 голосов
/ 18 сентября 2017

Определить ширину глифа без повторной обработки и подавить, когда вне строки:

В следующем коде я включаю и выключаю сортировку при автоматической настройке ширины столбца по ширине текста заголовка столбца.Разница в ширине между сортировкой вкл / выкл покажет ширину, используемую глифом сортировки столбца.

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

Я также использую словарь для хранения событий ColumnWidth экземпляром datagridview, чтобы включать и выключать события width при настройке ширины.

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

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];
    }


}
...