如何垂直自动调整WinForms DataGridView控件的大小,使其行始终可见

8
我有一个显示有限行数的DataGridView,最多不超过5行。这个DataGridView放在了一个DataRepeater控件上,所以通常会在屏幕上显示多次。我想要实现的是,所有网格都根据它们的内容大小调整大小,这样如果其中有4或5个项目,则不会显示滚动条,如果只有1或2个项目,则不会占用额外的垂直空间。

这些网格仅包含文本数据。它们是数据绑定控件,因此如果基础数据源发生更改,它们将需要调整大小(我猜测DataBindingComplete事件可能是合适的)。

我该如何实现这一点?计算行数是最好的选择吗?提前感谢。


3个回答

20

由于您的控件是数据绑定的,我建议在 DataBindingComplete 事件中将 DataGridViewHeight 属性设置为其行高之和(加上一些间距):

private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    var height = 40;
    foreach (DataGridViewRow dr in dataGridView1.Rows) {
        height += dr.Height;
    }

    dataGridView1.Height = height;
}

1
我采用了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;
    }

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接