2016-08-07 4 views
1

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

Однако это делает Горизонтальная полоса прокрутки исчезает, тем DataGridView получает отрезаны.

Как я могу авторизовать высоту без потери горизонтальной полосы прокрутки?

+2

Свойство MaximumSize. –

+0

@HansPassant Я не знаю, какую ошибку я совершил, когда я тестирую 'MaximumSize', что сделало меня уверенным, что это не сработает, но, читая ваш комментарий, я дал ему еще одну попытку, и это сработало. Да, установка 'new Size (this.dataGridView1.Width, 0)' полностью работает. –

+0

@HansPassant Но так как использование 'MaximumSize' не очень дружелюбное, когда пользователь хочет изменить ширину сетки, я предпочитаю использовать * Вариант 1 * или * Вариант 2 * в своем ответе. –

ответ

3

Вариант 1 - Перекрытие GetPreferredSize

Вы можете переопределить GetPreferredSize метод DataGridView и вызвать метод базового используя новый предлагаемый размер new Size(this.Width, proposedSize.Height). Таким образом, текущая ширина контроля останется нетронутой, а правила автоматического размера будут применяться на его высоту:

using System.Drawing; 
using System.Windows.Forms; 
public class MyDataGridView : DataGridView 
{ 
    public override Size GetPreferredSize(Size proposedSize) 
    { 
     return base.GetPreferredSize(new Size(this.Width, proposedSize.Height)); 
    } 
} 

Вариант 2 - Установка высоты на основе Высоты Рассчитано Авто-Size

Если вы не хотите получать от DataGridView, вы можете вычислить авторазмер, позвонив по номеру GetPreferredSize, пройдя new Size(0, 0), затем установите высоту DataGridView в зависимости от высоты, поэтому вы можете только изменить высоту DataGridView. Вы должны установить автоматическую высоту в RowsAdded, RowsRemoved некоторые другие события, если вам нужно:

void AutoHeightGrid(DataGridView grid) 
{ 
    var proposedSize = grid.GetPreferredSize(new Size(0, 0)); 
    grid.Height = proposedSize.Height; 
} 
private void Form1_Load(object sender, EventArgs e) 
{ 
    dataGridView1.RowsAdded += (obj, arg) => AutoHeightGrid(dataGridView1); 
    dataGridView1.RowsRemoved += (obj, arg) => AutoHeightGrid(dataGridView1); 
    //Set data source 
    //dataGridView1.DataSource = something; 
} 

Если вы хотите, чтобы убедиться, что все изменения в сетке, включая изменение Font, высота строк будет вызывать изменение размера сетки, вы может вызвать метод в событии Paint.

Вариант 3 - Установка MaximumSize

Кроме того, как упомянуто Hans, если вы не хотите, чтобы извлечь из DataGridView, вы можете использовать MaximumSize свойство сетки. Вы можете установить его в new Size(this.dataGridView1.Width, 0):

dataGridView1.MaximumSize = new Size(this.dataGridView1.Width, 0); 
dataGridView1.AutoSize = true; 

Примечания

С помощью MaximumSize не так дружелюбно, когда пользователь хочет, чтобы изменение ширины сетки по левым и правым якорям, я предпочитаю использовать вариант 1 или Вариант 2.

+0

Должен ли я создать свой собственный класс DataGridView для этого? – Reeggiie

+0

wow спасибо за такой подробный ответ. Я пошел с опцией 2 :) – Reeggiie

Смежные вопросы