Vb.net 根据listview高度调整窗体大小

Vb.net 根据listview高度调整窗体大小,vb.net,Vb.net,我的表单上只有停靠的。完整列表视图。Listview显示计算机驱动器,使其内容在运行时可更改。在listview上,列标题始终可见。 我想使用listview调整我的表单大小,以确定已填充项目的数量 这是我的代码: Dim rc As Rectangle = lvDriveInfo.Items(0).GetBounds(ItemBoundsPortion.Entire) Me.Height = (rc.Height * lvDriveInfo.Items.Count) +

我的表单上只有停靠的。完整列表视图。Listview显示计算机驱动器,使其内容在运行时可更改。在listview上,列标题始终可见。
我想使用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的信息,并使用此值正确设置表单的高度?

列表视图指标非常复杂,您要做的绝对不容易。您忽略的一点是列标题所需的空间。然而,这还不够,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是难点,我不能保证它可以在每个视频DPI的每个Windows版本上运行。这是独立于项目的高度,所以这是令人鼓舞的。但测试需要确定。如果您可以保证列表中不会有太多的项目,那么您可以通过将列表视图的滚动属性设置为False来避免问题。

列表视图指标非常复杂,您要做的绝对不容易。您忽略的一点是列标题所需的空间。然而,这还不够,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是难点,我不能保证它可以在每个视频DPI的每个Windows版本上运行。这是独立于项目的高度,所以这是令人鼓舞的。但测试需要确定。如果可以保证列表中的项目不会太多,则可以通过将列表视图的滚动属性设置为False来避免问题。

尝试以下代码

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
请尝试以下代码

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

谢谢汉斯,在我的windows7上,这很好用。如果其他窗口需要,我会调整一些额外的空间。谢谢Hans,在我的windows7上这很好用。如果其他窗口需要,我会调整一些额外的空间。嗨,大卫,谢谢你的回答,但这里仍然缺少一些内容。嗨,大卫,谢谢你的回答,但这里仍然缺少一些内容。