VB.Net ListView滚动条和ListView.ItemChecked问题

时间:2014-07-21 09:34:08

标签: .net vb.net listview events

我有一个带复选框的列表视图。

我有几个问题我似乎无法找到答案:

  1. 我似乎无法找到任何属性来从左到右更改垂直滚动条?所有其他滚动条默认为右侧 - 但没有?

  2. 我想在ItemChecked事件触发时更新标签,以指示列表中已检查的项目数。我知道当列表填充时会触发ItemChecked事件,但是我已经在我的应用程序的其他地方通过设置' DoEvents'变量为false,直到填充表单 - 并在触发此类事件时检查该变量的状态 - 如下所示:

    Private Sub SpecificUsers_ItemChecked(ByVal sender as System.Object, ByVal e as System.Windows.Forms.ItemCheckedEventArgs) Handles lstSpecificUsers.ItemChecked
        If DoEvents Then
            ' Set standard string
            Dim s as String = "You have currently selected " & lstSpecificUsers.CheckedItems.Count & " users"
            If lstSpecificUsers.CheckedItems.Count = 1 Then
                ' if only 1 selected, show user not users
                s = s.SubString(0, s.Length - 1)
            End If
            lblSpecificUsers.Text = s
        End If
    End Sub
    
  3. 问题是,列表视图位于选项卡中;并且看起来列表在打开选项卡之前实际上并没有实际填充 - 因此DoEvents已经是真的,这意味着它需要一个永恒的加载,因为它执行上述代码几千次。

    列表视图在加载选项卡之前没有填充的任何原因?

    非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

首先,有了这么多项和数据库,DataGridView可能是更好的选择。对于错误的Scroll,您可能将RightToLeft设置为True。如果Form Property为True,我认为它不会让你在孩子身上改变它。

检查的问题是,许多控件仅在需要时进行绘制/更新。如果没有人能看到LV,那么它并没有完成所有包括勾选检查的绘画。要“修复”这个,首先强制它加载填充表单中的表单:

Private Sub Form1_Load(sender etc etc etc
    Dim lvi As ListViewItem

    For n As Integer = 0 To something

        LV.Items.Add(lvi)
        If foo Then
           lvi.Checked = True        ' I assume...

    Next
    ' LV.RedrawItems doesnt work because there is no one looking
    ' force it to scroll
    LV.TopItem = LV.Items(LV.Items.Count - 1)

End Sub

从事件处理程序中删除Handles子句:

Private lvDrawn As Boolean = False
Private Sub LV_ItemChecked(sender As Object, e As ItemCheckedEventArgs) 
               'Handles LV.ItemChecked   REMOVED

    If lvDrawn Then

        ' your code here

    End If
End Sub

使用TabControl:

,在控件可见时将事情搞砸了
Private Sub TabCtrl_Selected(sender As Object, e As TabControlEventArgs) 
       Handles TabControl1.Selected

    If e.TabPage Is tabWithLV Then
        If lvDrawn = False Then
            ' first time thru, so Add the handler
            AddHandler LV.ItemChecked, AddressOf LV_ItemChecked
            ' we left it at the bottom, so reset
            LV.TopItem = LV.Items(0)

            ' set the just_do_this_once flag
            lvDrawn = True
        End If
    End If
End Sub

将TopItem设置为底部会强制加载列表;删除Handles会阻止Check事件触发。然后,只有当Handler变得可见时,才会将Handler挂起。您可以使用LV.VisibleChanged事件而不是TabControl事件 - 这只是我遇到的第一件事。