选项 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 - 设置最大尺寸
同样如 Hans 所说,如果您不想从 DataGridView 派生,可以使用网格的 MaximumSize 属性。你可以设置为new Size(this.dataGridView1.Width, 0):
dataGridView1.MaximumSize = new Size(this.dataGridView1.Width, 0);
dataGridView1.AutoSize = true;
注意
由于使用MaximumSize在用户想要让左右锚点改变网格宽度时不是那么友好,所以我更喜欢使用选项1或选项2.