DataGridView自动高度 - 如何自动调整DataGridView高度?

时间:2016-08-07 16:53:49

标签: c# winforms datagridview

我正在尝试根据其包含的行数来设置DataGridView AutoSize的高度。目前,我能够通过以下方式完成此任务:

dataGridView_SearchResults.AutoSize = true;

但是这会使水平滚动条消失,DataGridView会被切断。

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

2 个答案:

答案 0 :(得分:2)

选项1 - 覆盖GetPreferredSize

您可以覆盖DataGridView的{​​{3}}方法,并使用新建议的尺寸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 < / em>的

答案 1 :(得分:1)

我尝试使用{em> .NET Framework 4.7.2 Reza Aghaei提出的每个选项。一直以来,我在最后一行和DataGridView底部边框之间都有多余的空间。所以我尝试了一种不同的方法,并且有效! 使用您喜欢的事件,编写以下行:

dataGridView1.Height = DataGridView1.Rows.GetRowsHeight(DataGridViewElementStates.Visible)
   + (dataGridView1.ScrollBars.HasFlag(ScrollBars.Horizontal) ? SystemInformation.HorizontalScrollBarHeight : 0)
   + 3;

您将根据自己选择的样式更改最后一个+3。只需将其从+1更改为+5即可。