簡體   English   中英

VB.Net ListView滾動條和ListView.ItemChecked問題

[英]VB.Net ListView scrollbar and ListView.ItemChecked issues

我有一個帶復選框的列表視圖。

我有幾個問題,似乎無法找到答案:

  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 

問題是,列表視圖在選項卡中; 並且似乎在打開選項卡之前實際上並沒有實際填充列表-因此DoEvents已經為true,這意味着需要花費很長時間才能加載,因為它執行了上述代碼數千次。

加載選項卡之前,為什么不會填充listview的任何原因?

任何幫助將不勝感激!

首先,有那么多項目和一個數據庫,DataGridView可能是一個更好的選擇。 對於錯誤一側的Scroll,您可能已將RightToLeft設置為True。 如果Form屬性為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設置為底部會強制加載列表。 卸下手柄可防止觸發Check事件。 然后,僅在處理程序可見時才將其掛起。 您也許可以使用LV.VisibleChanged事件而不是TabControl事件-這只是發生在我身上的第一件事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM