2016-08-07 403 views
1

我想根据它包含的行数量来使我的DataGridView AutoSize的高度。目前,我可以使用以下行来实现:DataGridView自动高度 - 如何自动调整DataGridView高度?

然而,这使得水平滚动条消失,在DataGridView被切断。

如何在不丢失水平滚动条的情况下自动调整高度?

+2

设置其MaximumSize属性。 –

+0

@HansPassant我不知道我在测试'MaximumSize'时犯了什么错误,这使我确信它不会工作,但是阅读您的评论后,我再次尝试了它,并发挥了作用。是的,设置'新大小(this.dataGridView1.Width,0)'是完全可行的。 –

+0

@HansPassant但是由于当用户想要改变网格宽度时,使用'MaximumSize'不太友好,我更喜欢在我的答案中使用* Option 1 *或* Option 2 *。 –

回答

3

选项1 - 覆盖的getPreferredSize

您可以覆盖的DataGridViewGetPreferredSize方法和使用新建议的大小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的高度。你应该设置自动高度RowsAddedRowsRemoved,一些其他活动,如果你需要:

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

哇谢谢你这样详细的回答。我选择了2 :) – Reeggiie