我有DataGridView
,显示的行数有限,且不超过5. DataGridView
位于DataRepeater
控件上,因此通常会在屏幕上显示多次。我想要实现的是所有网格都调整到其内容的大小,因此如果其中有4或5个项目它们不显示滚动条,或者如果只有1或2个项目则占用额外的垂直空间。
网格仅包含文本数据。它们是数据绑定控件,因此如果底层数据源发生更改,它们将需要调整大小(我猜DataBindingComplete
事件是合适的。)
我怎么能实现这个目标?计数行是最佳选择吗?提前谢谢。
答案 0 :(得分:16)
由于您的控件是数据绑定的,我会将DataGridView上的Height
属性设置为DataBindingComplete
事件中其行高(加上一些边距)的总和:
private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
var height = 40;
foreach (DataGridViewRow dr in dataGridView1.Rows) {
height += dr.Height;
}
dataGridView1.Height = height;
}
答案 1 :(得分:0)
此值可以是任何值。您应该在网格中进行测试,以发现设置高度的最佳值。
var height = 40;
编辑:
要查找高度的实际值,您需要添加网格位置和标题高度。这样的事情。
int height = dgv.Location.Y + dgv.ColumnHeadersHeight;
foreach (DataGridViewRow dr in dgv.Rows) {
height += dr.Height; // Row height.
}
dgv.Height = height;
答案 2 :(得分:0)
我接受了hmqcnoesy的回答并对其进行了扩展,并创建了一个包含宽度的函数。并在任何网格上使用。
注意:在网格上设置AutoSizeCells = AllCells。
public static DataGridView SetGridHeightWidth(DataGridView grd, int maxHeight, int maxWidth)
{
var height = 40;
foreach (DataGridViewRow row in grd.Rows)
{
if(row.Visible)
height += row.Height;
}
if (height > maxHeight)
height = maxHeight;
grd.Height = height;
var width = 60;
foreach (DataGridViewColumn col in grd.Columns)
{
if (col.Visible)
width += col.Width;
}
if (width > maxWidth)
width = maxWidth;
grd.Width = width;
return grd;
}