我正在尝试根据其包含的行数来设置DataGridView AutoSize的高度。目前,我能够通过以下方式完成此任务:
dataGridView_SearchResults.AutoSize = true;
但是这会使水平滚动条消失,DataGridView会被切断。
如何在不丢失水平滚动条的情况下自动调整高度?
答案 0 :(得分:2)
选项1 - 覆盖GetPreferredSize
您可以覆盖DataGridView
的{{3}}方法,并使用新建议的尺寸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
的高度。如果需要,您应该在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 - 设置MaximumSize
同样如Hans所述,如果您不想从DataGridView
派生,则可以使用网格的MaximumSize
属性。您可以将其设置为new Size(this.dataGridView1.Width, 0)
:
dataGridView1.MaximumSize = new Size(this.dataGridView1.Width, 0);
dataGridView1.AutoSize = true;
注意强>
由于当用户想要通过左右锚点改变网格宽度时,使用MaximumSize
不是那么友好,我更喜欢使用选项1 或选项2 < / em>的
答案 1 :(得分:1)
我尝试使用{em> .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即可。