Ree*_*iie 3 c# datagridview winforms
我试图根据 DataGridView AutoSize 包含的行数来调整其高度。目前,我可以通过以下行来完成此任务:
dataGridView_SearchResults.AutoSize = true;
Run Code Online (Sandbox Code Playgroud)
然而,这使得水平滚动条消失,DataGridView 被切断。
如何在不丢失水平滚动条的情况下自动调整高度?
选项 1 - 重写 GetPreferredSize
您可以使用新建议的 size 覆盖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));
}
}
Run Code Online (Sandbox Code Playgroud)
选项 2 - 根据计算的自动调整大小的高度设置高度
如果您不想从 派生,您可以通过调用其传递DataGridView来计算自动大小,然后将 的高度设置为结果的高度,这样您只需更改 的高度。如果需要,您应该在、 、其他一些事件中设置自动高度:GetPreferredSizenew Size(0, 0)DataGridViewDataGridViewRowsAddedRowsRemoved
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;
}
Run Code Online (Sandbox Code Playgroud)
如果您想确保网格中的所有更改(包括更改行Font高)都会导致网格大小调整,您可以调用Paint事件中的方法。
选项 3 - 设置 MaximumSize
另外,正如 Hans 所提到的,如果您不想从 派生DataGridView,您可以使用MaximumSize网格的属性。您可以将其设置为new Size(this.dataGridView1.Width, 0):
dataGridView1.MaximumSize = new Size(this.dataGridView1.Width, 0);
dataGridView1.AutoSize = true;
Run Code Online (Sandbox Code Playgroud)
笔记
由于MaximumSize当用户想要让网格宽度通过左右锚点改变时使用起来不太友好,所以我更喜欢使用选项 1或选项 2。