Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataGridView自动高度-如何自动调整DataGridView高度?_C#_Winforms_Datagridview - Fatal编程技术网

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

C# DataGridView自动高度-如何自动调整DataGridView高度?,c#,winforms,datagridview,C#,Winforms,Datagridview,我试图根据DataGridView包含的行数自动调整其高度。目前,我能够通过以下几行实现这一点: dataGridView_SearchResults.AutoSize = true; dataGridView1.Height = DataGridView1.Rows.GetRowsHeight(DataGridViewElementStates.Visible) + (dataGridView1.ScrollBars.HasFlag(ScrollBars.Horizontal) ? S

我试图根据DataGridView包含的行数自动调整其高度。目前,我能够通过以下几行实现这一点:

dataGridView_SearchResults.AutoSize = true;
dataGridView1.Height = DataGridView1.Rows.GetRowsHeight(DataGridViewElementStates.Visible)
   + (dataGridView1.ScrollBars.HasFlag(ScrollBars.Horizontal) ? SystemInformation.HorizontalScrollBarHeight : 0)
   + 3;
然而,这会使水平滚动条消失,DataGridView被切断


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

选项1-覆盖GetPreferredSize

您可以覆盖
DataGridView
的方法,并使用新的建议大小
新大小(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
传递
新大小(0,0)
来计算自动大小,然后将
DataGridView
的高度设置为结果的高度,这样您只需更改
DataGridView
的高度。如果需要,您应该在
RowsAdded
RowsRemoved
、一些其他事件中设置自动高度:

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
属性。您可以将其设置为新大小(this.dataGridView1.Width,0):

注意


由于当用户希望通过左锚和右锚更改网格宽度时,使用
MaximumSize
并不友好,因此我更喜欢使用选项1或选项2。

选项1-覆盖GetPreferredSize

您可以覆盖
DataGridView
的方法,并使用新的建议大小
新大小(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
传递
新大小(0,0)
来计算自动大小,然后将
DataGridView
的高度设置为结果的高度,这样您只需更改
DataGridView
的高度。如果需要,您应该在
RowsAdded
RowsRemoved
、一些其他事件中设置自动高度:

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
属性。您可以将其设置为新大小(this.dataGridView1.Width,0):

注意


由于当用户希望通过左锚和右锚更改网格宽度时,使用
MaximumSize
并不友好,因此我更喜欢使用选项1或选项2。

我尝试了使用.NET Framework 4.7.2提出的所有选项。一直以来,我在最后一行和
DataGridView
下边框之间都有一个额外的空间。所以我尝试了一种不同的方法,它是有效的! 使用您喜欢的事件,写出以下行:

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

您可以根据您选择的样式更改最后一个
+3
。根据您的喜好将其从+1更改为+5。

我尝试了使用.NET Framework 4.7.2提出的所有选项。一直以来,我在最后一行和
DataGridView
下边框之间都有一个额外的空间。所以我尝试了一种不同的方法,它是有效的! 使用您喜欢的事件,写出以下行:

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

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

我是否需要创建自己的DataGridView类来完成此任务?哇,感谢您提供如此详细的答案。我选择了选项2:)我需要创建自己的DataGridView类来完成这个任务吗?哇,谢谢你给出了这么详细的答案。我选择了选项2:)设置它的MaximumSize属性。@HansPassant我不知道我在测试
MaximumSize
时犯了什么错误,这让我确信它不起作用,但读了你的评论,我又试了一次,它起了作用。是的,设置
新大小(this.dataGridView1.Width,0)
完全有效。@HansPassant但由于当用户希望更改网格宽度时,使用
最大大小
并不友好,我更喜欢在回答中使用选项1或选项2。设置它的MaximumSize属性。@HansPassant我不知道我在测试
MaximumSize
时犯了什么错误,这让我确信它不起作用,但读了你的评论后,我又尝试了一次,它起了作用。是的,设置
新大小(this.dataGridView1.Width,0)
完全有效。@HansPassant但由于当用户希望更改网格宽度时,使用
最大大小
不是很友好,我更喜欢在回答中使用选项1或选项2。