8

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

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

我怎样才能做到这一点?计算行数是最好的选择吗?提前致谢。

4

3 回答 3

19

由于您的控件是数据绑定的,因此我会将HeightDataGridView 上的属性设置为事件中其行高的总和(加上一些边距)DataBindingComplete

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

    dataGridView1.Height = height;
}
于 2012-07-26T13:14:23.793 回答
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;
    }
于 2016-12-06T19:54:03.680 回答
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;
于 2013-03-12T17:52:22.000 回答