[VB2005] ListView 初始化與 ItemChecked 事件

因為有個程式是動態產生 ListView 在 TabPage 頁籤裡,我在 ItemChecked 事件裡面要計算對應的值並累計,一直發生不正確的結果,除錯只知道 ItemChecked 事件多跑了,又過濾不出原因來,只好乖乖的寫個測試專案來查問題。
首先先查詢線上手冊,跟網路既有討論,完全沒有相關事件引發順序,到是發現了 ListView 線上手冊索引有錯,順便回報給 Moli :
因為實在找不到,弄個測試專案畫面如上,TabPage1 是空的,只是為了測試 ListView ,然後針對每個事件輸出到除錯視窗,最後再來整理。
ListView 事件引發的順序:
ParentChanged -> VisibleChanged -> DockChanged -> Move -> LocationChanged -> Layout -> Resize -> SizeChanged -> ClientSizeChanged -> StyleChanged -> Layout -> Layout -> BindingContextChanged
(視窗顯示出來) TabPage2_Click (按下 TabPage 頁籤)
HandleCreated -> Invalidated -> ItemChecked -> ItemCheck -> ItemChecked -> ItemChecked -> ItemCheck -> ItemChecked -> ColumnWidthChanged -> BindingContextChanged -> VisibleChanged
亦即在顯示TabPage2 時,ListView 才會開始初始化,設定 Item A/B/C 的初值。
其中,TabPage2_Click 後,才發生 HandleCreated ,讓我聯想到上個月的一個測試結果:
所以我加上 Form_Load 事件:

Private Sub fListView_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

   Dim p As IntPtr = ListView1.Handle

End Sub

再來測試 ListView 事件引發的順序:
ParentChanged -> VisibleChanged -> DockChanged -> Move -> LocationChanged -> Layout -> Resize -> SizeChanged -> ClientSizeChanged -> StyleChanged -> Layout -> Layout -> BindingContextChanged -> HandleCreated -> Invalidated -> ItemChecked -> ItemCheck -> ItemChecked -> ItemChecked -> ItemCheck -> ItemChecked -> ColumnWidthChanged -> BindingContextChanged -> VisibleChanged
(視窗顯示出來) TabPage2_Click (按下 TabPage 頁籤)
VisibleChanged -> BindingContextChanged -> VisibleChanged -> BindingContextChanged -> VisibleChanged
註:將 ListView 放在 TabPage1 直接顯示時,即使不加 Form_Load 事件,也是如同上面這段一樣。
讚~
ItemChecked 事件已經移到顯示頁籤之前,馬上把原先程式碼改過來:

With nowListView

     .SuspendLayout()

     .Dock = DockStyle.Fill

     .CheckBoxes = True

     .View = View.Details

[略]

     pListView = .Handle

     .ResumeLayout(True)

     .PerformLayout()

     AddHandler .ItemChecked, eh

EndWith

讓事件在強制取得控制項 Handle 之後才設定,終於順利跳過事件的問題。

這樣看起來,上次這篇:

[VBNET]ComboBox 的事件觸發討論

應該也是 Handle 尚未建立造成的問題。

廣告
Categories: 技術分享 | 發表留言

文章分頁導航

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

在 WordPress.com 建立免費網站或網誌.

%d 位部落客按了讚: