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

Ree*_*iie 3 c# datagridview winforms

我试图根据 DataGridView AutoSize 包含的行数来调整其高度。目前,我可以通过以下行来完成此任务:

dataGridView_SearchResults.AutoSize = true;
Run Code Online (Sandbox Code Playgroud)

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

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

Rez*_*aei 5

选项 1 - 重写 GetPreferredSize

您可以使用新建议的 size 覆盖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));
    }
}
Run Code Online (Sandbox Code Playgroud)

选项 2 - 根据计算的自动调整大小的高度设置高度

如果您不想从 派生,您可以通过调用其传递DataGridView来计算自动大小,然后将 的高度设置为结果的高度,这样您只需更改 的高度。如果需要,您应该在、 、其他一些事件中设置自动高度:GetPreferredSizenew Size(0, 0)DataGridViewDataGridViewRowsAddedRowsRemoved

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;
}
Run Code Online (Sandbox Code Playgroud)

如果您想确保网格中的所有更改(包括更改行Font高)都会导致网格大小调整,您可以调用Paint事件中的方法。

选项 3 - 设置 MaximumSize

另外,正如 Hans 所提到的,如果您不想从 派生DataGridView,您可以使用MaximumSize网格的属性。您可以将其设置为new Size(this.dataGridView1.Width, 0)

dataGridView1.MaximumSize = new Size(this.dataGridView1.Width, 0);
dataGridView1.AutoSize = true;
Run Code Online (Sandbox Code Playgroud)

笔记

由于MaximumSize当用户想要让网格宽度通过左右锚点改变时使用起来不太友好,所以我更喜欢使用选项 1选项 2