2014-07-21 103 views
0

我有一個listview與複選框。VB.Net ListView滾動條和ListView.ItemChecked問題

我有幾個問題我似乎沒有能夠找到答案:

  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已經是真實的,這意味着它需要永久加載,因爲它執行上述代碼幾千次。

爲什麼listview不會填充直到加載標籤?

任何幫助將不勝感激!

+0

LV中有多少物品大致在哪裏填充? – Plutonix

+0

@Plutonix列表中約有1,500件商品。將數據從數據庫中收集到數據集中,然後填充列表視圖 - 所有這些都在form_load事件上 - 但只有當您第一次單擊包含列表視圖的選項卡時,數據實際上纔會填充(並且該項目檢查的事件在該點觸發每個項目) –

+0

不,LV實際上是在添加項目時填充的(設置斷點並輪詢項目數量);只是某些東西不會畫第一次,直到它們顯示給用戶。對於滾動條,將RightToLeft道具更改爲FALSE。 – Plutonix

回答

0

首先,有了那麼多的項目和一個數據庫,DataGridView可能是更好的選擇。對於滾動錯誤的一面,您可能將RightToLeft設置爲True。如果表單屬性爲True,我不認爲它會讓你改變它的孩子。

檢查的問題是,許多控件僅在需要時才繪製/更新。如果沒有人能看到LV,它不會做所有的繪畫,包括勾選支票。 「修理」這一點,首先迫使它加載的東西,在窗體加載,你來填充它:

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 

鉤東西時控:

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子句使用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事件 - 這只是我發生的第一件事。

+0

感謝您的回覆。我遇到的問題是我有其他選項卡具有不同的控件,並且在加載完所有內容後設置了「DoEvents」。這個解決方案意味着,如果用戶從不加載帶有列表視圖的選項卡,DoEvents從不會設置爲true,這意味着在表單的其他地方會出現問題....實際上剛剛發佈的時候,我可以有第二個「DoEvents」變量。衛生署! –

+0

多數民衆贊成在(部分)爲什麼我用了一個不同的名稱 - 意味着服務於這種情況,而不是干擾其他東西 – Plutonix