Столбец Datagridview Авторазмер - PullRequest
       5

Столбец Datagridview Авторазмер

0 голосов
/ 06 сентября 2018

У меня есть сетка данных со многими столбцами, AutoSizeColumnsMode установлено на AllCells .Теперь мой вопрос: почему так много пустого пространства рядом с большинством заголовков столбцов?Например, пустое пространство для заголовка столбца с «HBW 5/250» почти такое же, как и для текста.Есть ли причина этого?У меня проблема в том, что весь набор данных должен быть виден на одном экране (24 дюйма), и я не знаю, как сделать так, чтобы эти столбцы были такими же большими, как самый длинный текст.

ЭтоПриложение C # WinForms.

Я также рассмотрел все другие параметры свойства AutoSizeColumnsMode, но у меня ничего не получалось.

Datagridview

С наилучшими пожеланиями.

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

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

dataGridView1.Columns[0].SortMode = DataGridViewColumnSortMode.NotSortable;

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

dataGridView1.Columns[0].HeaderText = "HBW 2,5/62,5";
dataGridView1.Columns[0].HeaderText = "HBW\n2,5/62,5"; //White space gone
0 голосов
/ 06 сентября 2018

Для более точного и быстрого способа автоматического определения размера ячеек в datagridview я нашел где-то (не знаю, где) и изменил некоторую функцию, вот как это выглядит сейчас:

public static void FastAutoSizeColumns(this DataGridView targetGrid)
{
    //If targeted datagridview doesn't have rows just return
    if (targetGrid.Columns.Count < 1)
        return;
    var gridTable = new DataTable();

    // Cast out a DataTable from the target grid datasource.
    // We need to iterate through all the data in the grid and a DataTable supports enumeration.
    gridTable = (DataTable)targetGrid.DataSource;

    targetGrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
    // Create a graphics object from the target grid. Used for measuring text size.
    using (var gfx = targetGrid.CreateGraphics())
    {
        // Iterate through the columns.
        for (int i = 0; i < gridTable.Columns.Count; i++)
        {
            // Leverage Linq enumerator to rapidly collect all the rows into a string array, making sure to exclude null values.
            string[] colStringCollection = gridTable.AsEnumerable().Where(r => r.Field<object>(i) != null).Select(r => r.Field<object>(i).ToString()).ToArray();

            // Sort the string array by string lengths.
            colStringCollection = colStringCollection.OrderBy((x) => x.Length).ToArray();

            if (colStringCollection.Length > 0)
            {
                // Get the last and longest string in the array.
                string longestColString = colStringCollection.Last();

                // Use the graphics object to measure the string size.
                var colWidth = gfx.MeasureString(longestColString, targetGrid.Font);

                // If the calculated width is larger than the column header width, set the new column width.
                if (colWidth.Width > targetGrid.Columns[i].HeaderCell.Size.Width)
                {
                    targetGrid.Columns[i].Width = (int)colWidth.Width;
                }
                else // Otherwise, set the column width to the header width.
                {
                    targetGrid.Columns[i].Width = targetGrid.Columns[i].HeaderCell.Size.Width;
                }
            }
            else
            {
                targetGrid.Columns[i].Width = targetGrid.Columns[i].HeaderCell.Size.Width;
            }
        }
    }
}

Импортируйте эту функцию куда-нибудьв файле (я использую отдельный файл для пользовательских расширений) и просто вызываю его с помощью:

yourDataGridView.FastAutoSizeCoulmns();

Важное примечание: DataSource должен быть типом DataTable (поэтому это не может быть IList или что-то другое, поэтому при привязке источника данных сначалапреобразовать в datatable или немного изменить эту функцию)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...