winforms: datagridview: высота (авторазмер) в зависимости от количества строк - PullRequest
9 голосов
/ 22 февраля 2010

в одной из моих форм в datagridview отображаются данные из базы данных (конечно, количество данных (таким образом, количество строк) может измениться). Соединение с базой данных находится в форме загрузки события. Я просто не могу понять, как автоматически изменяется размер всей сетки данных в зависимости от количества отображаемых строк.

Ответы [ 4 ]

9 голосов
/ 06 февраля 2013

Это то, что мне удалось найти, и пока все работает нормально:

int GetDataGridViewHeight(DataGridView dataGridView)
{
    var sum = (dataGridView.ColumnHeadersVisible ? dataGridView.ColumnHeadersHeight : 0) +
              dataGridView.Rows.OfType<DataGridViewRow>().Where(r => r.Visible).Sum(r => r.Height);

    return sum;
}

Благодаря этому я инкапсулировал свой DataGridView в UserControl, чтобы я мог правильно реализовать AutoSize:

// This is in a user control where the datagrid is inside (Top docked)
protected override void OnResize(EventArgs e)
{
    if (AutoSize)
    {
        var height = this.GetDataGridViewHeight(this.dataBoxGridView);
        this.dataBoxGridView.Height = height;
        this.Height = height +this.Padding.Top + this.Padding.Bottom;
    }
}

Я не пытался (пока) создать пользовательский элемент управления непосредственно из DataGridView для реализации этого.

4 голосов
/ 27 апреля 2010

Если вы установите DataGridView.AutoSize == true, тогда, когда вы добавляете больше строк, сетка становится длиннее. В противном случае вы получите полосы прокрутки. Если вы не установили ScrollBars == Null || Горизонтальный, в этом случае строки просто исчезают из конца.

По какой-то причине DataGridView.AutoSize может быть установлен только программно. И есть некоторые странные поведения, наблюдаемые, когда вы помещаете сетку в автоматически изменяемый элемент управления. Кажется, он не реагирует на размер сетки.

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

1 голос
/ 01 декабря 2011

MSDN говорит: «Это свойство не относится к этому классу.»

MSDN: свойство DataGridView.AutoSize

0 голосов
/ 26 февраля 2018

Вот как я это сделал. чтобы установить высоту DataGridView, вы можете использовать его свойство Set Height. При загрузке формы вы можете использовать этот код, чтобы скрыть представление данных. dataGridViewName.Height = 0;

Тогда, выбирая строки из базы данных. мы можем использовать метод ниже, чтобы получить высоту datagridview в соответствии с количеством строк.

 private int dataGridViewHeight()
    {
        int sum = this.dataGridViewName.ColumnHeadersHeight;

        foreach (DataGridViewRow row in this.dataGridViewName.Rows)
            sum += row.Height + 1; // I dont think the height property includes the cell border size, so + 1

        return sum;
    }
...