Вариант 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.
Свойство MaximumSize. –
@HansPassant Я не знаю, какую ошибку я совершил, когда я тестирую 'MaximumSize', что сделало меня уверенным, что это не сработает, но, читая ваш комментарий, я дал ему еще одну попытку, и это сработало. Да, установка 'new Size (this.dataGridView1.Width, 0)' полностью работает. –
@HansPassant Но так как использование 'MaximumSize' не очень дружелюбное, когда пользователь хочет изменить ширину сетки, я предпочитаю использовать * Вариант 1 * или * Вариант 2 * в своем ответе. –