我正试图根据DataGridView所包含的行的数量来确定其高度。现在,我可以用下面这行代码来实现这一点:
dataGridView_SearchResults.AutoSize = true;
字符串然而,这使得水平滚动条消失,DataGridView被切断。如何在不丢失水平滚动条的情况下自动调整高度?
pb3skfrl1#
选项1 -覆盖GetPreferredSize
您可以重写DataGridView的GetPreferredSize方法,并使用新建议的大小new Size(this.Width, proposedSize.Height)调用基本方法。这样,控件的当前宽度将保持不变,而自动调整大小规则将应用于其高度:
DataGridView
GetPreferredSize
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,一些其他事件中设置自动高度:
new Size(0, 0)
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事件中调用方法。
Font
Paint
选项3 -设置MaximumSize
正如Hans所提到的,如果你不想从DataGridView派生,你可以使用网格的MaximumSize属性。您可以将其设置为new Size(this.dataGridView1.Width, 0):
MaximumSize
new Size(this.dataGridView1.Width, 0)
dataGridView1.MaximumSize = new Size(this.dataGridView1.Width, 0); dataGridView1.AutoSize = true;
型
备注
由于使用MaximumSize不是那么友好,当用户想让网格宽度改变左右锚,我更喜欢使用 * 选项1* 或 * 选项2*。
ycl3bljg2#
我使用 .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。
+3
baubqpgj3#
我修改了耶稣的回答
DGV.Height = DGV.Rows.GetRowsHeight(DataGridViewElementStates.Visible) + DGV.ColumnHeadersHeight;
字符串我不使用滚动条,但你可以添加它从耶稣回答
3条答案
按热度按时间pb3skfrl1#
选项1 -覆盖GetPreferredSize
您可以重写
DataGridView
的GetPreferredSize
方法,并使用新建议的大小new Size(this.Width, proposedSize.Height)
调用基本方法。这样,控件的当前宽度将保持不变,而自动调整大小规则将应用于其高度:字符串
选项2 -根据计算的自动尺寸的高度设置高度
如果你不想从
DataGridView
派生,你可以通过调用它的GetPreferredSize
来计算自动大小,传递new Size(0, 0)
,然后将DataGridView
的高度设置为结果的高度,这样你就只改变了DataGridView
的高度。如果需要,您应该在RowsAdded
,RowsRemoved
,一些其他事件中设置自动高度:型
如果你想确保网格中的所有更改,包括更改
Font
,行的高度都会导致调整网格大小,你可以在Paint
事件中调用方法。选项3 -设置MaximumSize
正如Hans所提到的,如果你不想从
DataGridView
派生,你可以使用网格的MaximumSize
属性。您可以将其设置为new Size(this.dataGridView1.Width, 0)
:型
备注
由于使用
MaximumSize
不是那么友好,当用户想让网格宽度改变左右锚,我更喜欢使用 * 选项1* 或 * 选项2*。ycl3bljg2#
我使用 .NET Framework 4.7.2 尝试了Reza Aghaei提出的每个选项。每次我都在最后一行和
DataGridView
底部边框之间获得额外的空间。所以我尝试了一种不同的方法,它的工作!使用您喜欢的事件,编写以下行:字符串
您可以根据所选的样式更改最后一个
+3
。根据您的喜好,将其从+1更改为+5。baubqpgj3#
我修改了耶稣的回答
字符串
我不使用滚动条,但你可以添加它从耶稣回答