winforms 如何自动调整DataGridView的高度?

bybem2ql  于 2023-08-07  发布在  其他
关注(0)|答案(3)|浏览(225)

我正试图根据DataGridView所包含的行的数量来确定其高度。现在,我可以用下面这行代码来实现这一点:

dataGridView_SearchResults.AutoSize = true;

字符串
然而,这使得水平滚动条消失,DataGridView被切断。
如何在不丢失水平滚动条的情况下自动调整高度?

pb3skfrl

pb3skfrl1#

选项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*。

ycl3bljg

ycl3bljg2#

我使用 .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。

baubqpgj

baubqpgj3#

我修改了耶稣的回答

DGV.Height = DGV.Rows.GetRowsHeight(DataGridViewElementStates.Visible) + DGV.ColumnHeadersHeight;

字符串
我不使用滚动条,但你可以添加它从耶稣回答

相关问题