【问题标题】:DataGridView Auto Height - How to AutoSize DataGridView Height?DataGridView 自动高度 - 如何自动调整 DataGridView 高度?
【发布时间】:2016-08-07 16:53:48
【问题描述】:

我正在尝试根据它包含的行数来设置我的 DataGridView AutoSize 的高度。目前,我可以通过以下行来完成此操作:

dataGridView_SearchResults.AutoSize = true;

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

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

【问题讨论】:

  • 设置它的MaximumSize属性。
  • @HansPassant 我不知道我在测试MaximumSize 时犯了什么错误,这让我确信它不会工作,但阅读你的评论我又试了一次,它成功了.是的,设置new Size(this.dataGridView1.Width, 0) 完全有效。
  • @HansPassant 但是由于使用MaximumSize在用户想让网格宽度改变的时候不是那么友好,所以我更喜欢使用Option 1或者Option 2 在我的回答中。

标签: c# winforms datagridview


【解决方案1】:

选项 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 - 设置最大尺寸

同样如 Hans 所说,如果您不想从 DataGridView 派生,可以使用网格的 MaximumSize 属性。你可以设置为new Size(this.dataGridView1.Width, 0):

dataGridView1.MaximumSize = new Size(this.dataGridView1.Width, 0);
dataGridView1.AutoSize = true;

注意

由于使用MaximumSize在用户想要让左右锚点改变网格宽度时不是那么友好,所以我更喜欢使用选项1选项2.

【讨论】:

  • 我需要创建自己的 DataGridView 类来完成这个吗?
  • 哇,感谢您提供如此详细的答案。我选择了选项 2 :)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2011-08-23
    • 2012-08-21
    • 2013-11-12
    相关资源
    最近更新 更多