【问题标题】:Programmatically resize DataGridView to remove scroll bars以编程方式调整 DataGridView 的大小以删除滚动条
【发布时间】:2011-07-11 14:16:44
【问题描述】:

我有一个 DataGridView,其中包含用户可定义的列数(从 ~6 到 60 列)的数值数据。在较高端,网格中的数据量超过了一次可以在屏幕上显示的数据量。我有一个与数据相关的图表。我想让两者保持同步,以便图表上的特定时间 T 与网格中的同一时间垂直对齐。

为此,我想让 DGV 的宽度刚好足以避免出现水平滚动条,让图形具有同样的宽度,然后将滚动卸载到容器控件上。但是,我找不到直接获取设置 DGV 所需的宽度以便从中删除滚动条的方法。

【问题讨论】:

    标签: c# winforms datagridview


    【解决方案1】:

    要防止 DataGridView 显示其水平滚动条,您需要确保 DGV 的宽度不小于其列的宽度加上行标题的宽度。当控件的BorderStyle 属性不是None 时,您还需要调整添加到控件宽度(和高度)的两个像素。

    这是一个方法,它将返回给定 DataGridView 的最小值:

    /// <summary>
    /// Return the minimum width in pixels a DataGridView can be before the control's vertical scrollbar would be displayed.
    /// </summary>
    private int GetDgvMinWidth(DataGridView dgv) {
        // Add two pixels for the border for BorderStyles other than None.
        var controlBorderWidth = (dgv.BorderStyle == BorderStyle.None) ? 0 : 2;
    
        // Return the width of all columns plus the row header, and adjusted for the DGV's BorderStyle.
        return dgv.Columns.GetColumnsWidth(DataGridViewElementStates.Visible) + dgv.RowHeadersWidth + controlBorderWidth;
    }
    

    【讨论】:

    • 在我的情况下,垂直滚动条不是问题,但是通过将行的垂直高度等相加,并对照控件进行检查,这不能比子类更痛苦吗身高?
    • @Dan,我相信我误解了你的问题。是否要设置 DGV 的高度,使其从不显示垂直滚动条?
    • 不完全是,我想要设置它的宽度,这样它就不会显示水平滚动条。
    • 行数是固定的,所以我可以确保它总是足够高以避免垂直滚动。
    • 对此进行了测试,不幸的是,在添加列时检查 DataGridViewElementStates.Displayed 不起作用。新列将不会显示,因为较旧的较窄网格会将它们隐藏在右侧,直到滚动。因此,此方法不会调整网格的大小以显示它们。
    【解决方案2】:

    这将调整列的大小以适应它们所提供的空间,并将移除水平滚动条。

    dgv.AutoSizeColumnsMode  = DataGridViewAutoSizeColumnsMode.Fill;
    

    这将调整列的大小以使其成为可能的最小宽度,并且仍然保持单元格上的值可见,并且它会自动调整 datagridview 的大小以适应列,但是如果表单不够大,可能会出现水平滚动条。在这种情况下,您将不得不调整表单的宽度。

    dgv.AutoSizeColumnsMode  = DataGridViewAutoSizeColumnsMode.AllCells;
    

    【讨论】:

    • 这也会导致可变宽度的列,这是不可接受的,因为它们需要匹配图形水平刻度的间距。
    猜你喜欢
    • 2019-03-31
    • 2011-09-29
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    相关资源
    最近更新 更多