C# DataGridView自动高度-如何自动调整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_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。