【问题标题】:Resize form on listview height在列表视图高度上调整表单大小
【发布时间】:2014-12-20 21:52:53
【问题描述】:

我的表单上只有 docked.full 列表视图。 Listview 显示计算机驱动器,因此它的内容在运行时是可变的。在列表视图中,列标题始终可见。
我希望我的表单可以使用列表视图调整填充项目的大小。

这是我的代码:

Dim rc As Rectangle = lvDriveInfo.Items(0).GetBounds(ItemBoundsPortion.Entire)           
Me.Height = (rc.Height * lvDriveInfo.Items.Count) +
             SystemInformation.CaptionHeight +
             SystemInformation.BorderSize.Height

但这里有一些遗漏或不正确。
如何使用关于 items.count 的标题获取列表视图的确切高度并使用此值正确设置表单的高度?

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    ListView 指标相当复杂,您要做的绝对不容易。您忽略的一件事是列标题所需的空间。然而这还不够,ListView 还需要在底部留出一点额外的肘部空间以避免显示滚动条。

    在我的机器上运行的最直接的代码是:

    Private Sub ResizeView()
        If ListView1.Items.Count = 0 Then Exit Sub
        Dim last = ListView1.Items(ListView1.Items.Count - 1)
        Me.ClientSize = New Size(Me.ClientSize.Width, _
                                 ListView1.Top + last.Bounds.Bottom + 4)
    End Sub
    

    +4 是个问题,我不能保证这将适用于每个 Windows 版本的每个视频 DPI。它与项目高度无关,因此令人鼓舞。但测试需要确定。如果您可以保证列表中的项目永远不会太多,那么您可以通过将列表视图的 Scrollable 属性设置为 False 来避免该问题。

    【讨论】:

    • 谢谢汉斯,在我的 windows7 上这很好用。如果其他窗口需要,我会调整一些额外的空间。
    【解决方案2】:

    试试下面的代码

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        lvDriveInfo.BorderStyle = BorderStyle.None
        lvDriveInfo.Dock = DockStyle.Fill
    
        With lvDriveInfo
            .View = View.Details
            .GridLines = True
            .Columns.Add("Drive")
        End With
    
        SetFormHeight()
    End Sub
    
    Private Sub SetFormHeight()
        lvDriveInfo.Items.Clear()
    
        For Each Drive In IO.DriveInfo.GetDrives
            lvDriveInfo.Items.Add(Drive.Name)
        Next
    
        Dim ListViewHeaderHeight As Integer = lvDriveInfo.Items(0).Bounds.Top
        Dim ListViewRowHeight As Integer = lvDriveInfo.Items(0).Bounds.Height
        Dim ListViewRowsCount As Integer = lvDriveInfo.Items.Count
        Dim NewHeight As Integer = ListViewHeaderHeight + (ListViewRowHeight * ListViewRowsCount)
    
        Me.ClientSize = New Size(Me.ClientSize.Width, NewHeight)
    End Sub
    

    【讨论】:

    • 嗨大卫,感谢您的回答,但这里仍然缺少一些东西。
    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 2015-09-17
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多