我想根据它包含的行数量来使我的DataGridView AutoSize的高度。目前,我可以使用以下行来实现:DataGridView自动高度 - 如何自动调整DataGridView高度?
然而,这使得水平滚动条消失,在DataGridView被切断。
如何在不丢失水平滚动条的情况下自动调整高度?
我想根据它包含的行数量来使我的DataGridView AutoSize的高度。目前,我可以使用以下行来实现:DataGridView自动高度 - 如何自动调整DataGridView高度?
然而,这使得水平滚动条消失,在DataGridView被切断。
如何在不丢失水平滚动条的情况下自动调整高度?
选项1 - 覆盖的getPreferredSize
您可以覆盖的DataGridView
GetPreferredSize
方法和使用新建议的大小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 - 基于计算的自动大小的高度设置高度
如果您不想从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'时犯了什么错误,这使我确信它不会工作,但是阅读您的评论后,我再次尝试了它,并发挥了作用。是的,设置'新大小(this.dataGridView1.Width,0)'是完全可行的。 –
@HansPassant但是由于当用户想要改变网格宽度时,使用'MaximumSize'不太友好,我更喜欢在我的答案中使用* Option 1 *或* Option 2 *。 –