2014-12-20 4 views
0

У меня есть форма с только docked.full 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 и правильно установить высоту формы с этим значением?

ответ

4

Показатели 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.

+0

Спасибо Hans, на мой windows7 это работает хорошо. Я отрегулирую дополнительное пространство, если потребуется в других окнах. –

1

Попробуйте следующий код

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 
+0

Привет, Дэвид, спасибо за ваш ответ, но все еще здесь что-то не хватает. –

Смежные вопросы