我正在尝试根据它包含的行数使我的 DataGridView 的高度自动调整。目前,我能够通过以下行完成此操作:
dataGridView_SearchResults.AutoSize = true;
然而,这会使水平滚动条消失,DataGridView 被切断。
如何在不丢失水平滚动条的情况下自动调整高度?
最佳答案
选项 1 - 覆盖 GetPreferredSize
您可以覆盖 GetPreferredSize
DataGridView
的方法,并使用新提议的大小 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;
}
如果要确保网格中的所有更改包括更改字体
、行高都会导致调整网格大小,您可以在Paint
事件中调用该方法。
选项 3 - 设置 MaximumSize
另外正如 Hans 所提到的,如果您不想从 DataGridView
派生,您可以使用网格的 MaximumSize
属性。您可以将其设置为 new Size(this.dataGridView1.Width, 0)
:
dataGridView1.MaximumSize = new Size(this.dataGridView1.Width, 0);
dataGridView1.AutoSize = true;
注意
由于使用MaximumSize
在用户想让网格宽度通过左右 anchor 变化时不太友好,所以我更喜欢使用选项1或选项 2。
关于c# - DataGridView 自动高度 - 如何自动调整 DataGridView 高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38816425/