2009-07-21 57 views
4

除了調用TreeNode上的.Collapse()方法或TreeView的.CollapseAll()方法外,什麼會導致TreeView崩潰?爲什麼TreeView會在WinForms中意外崩潰?

在我正在開發的應用程序中,TreeView將無法正常工作。 TreeView只維護兩個級別。當選擇父節點的子節點時,所有其他節點立即崩潰。但是,我的代碼中沒有.Collapse()或.CollapseAll()方法調用!

除了設置爲true的.LabelEdit屬性外,TreeView的所有屬性都保留默認值。在一個簡單的驗證/ MessageBox例程中,TreeView在AfterLabelEdit事件中有一些關聯的代碼。

我曾嘗試:

  • 掛鉤 TreeView中的BeforeCollapse事件,提高 e.CancelAction標誌。

  • 在TreeView的AfterSelect 事件中手動擴展所有節點 。 (這工作得很好作爲 實驗,但我不打算 不允許節點崩潰
    乾脆!)

在代碼中的許多點,我通過TreeView控件由節點迭代,節點,以檢查屬性。但是,不會添加或刪除節點。用戶進行選擇時修改的唯一TreeNode屬性是.ImageIndex和.SelectedImageIndex。

除了上述兩個解決方案之外,我不知道可能會導致此錯誤的原因。即使沒有解決方案可以實現,任何人都可以有一個想法,以適當的方式去陷阱崩潰? (我已經嘗試設置BeforeCollapse事件中斷點,但它不會觸發,除非用戶明確地摺疊通過鼠標或鍵盤的節點。)


UPDATE:

的問題是由於換款的.SelectedImageIndex屬性在任何TreeNode上。更改此屬性會導致所有其他節點崩潰。

我嘗試過使用.BeginUpdate()和.EndUpdate()調用無效的.SelectedImageIndex屬性修改代碼。

這怎麼可以避免?

回答

10

這是Windows本機窗口工作方式的一個副作用。許多窗口選項由CreateWindowEx()調用中的樣式標誌指定。基本的東西,比如邊框在窗體上的樣子。 ListView應具有哪種類型的視圖。 TreeView是否應顯示覆選框。

這些樣式暴露爲控件上的屬性。但是有一個問題。更改這種屬性需要重新創建窗口,以便可以在CreateWindowEx()調用中指定新的樣式標誌。這有副作用,窗口得到完全重新創建,因此它失去了以前的所有狀態。

Windows窗體在使這個外觀平滑時做得相當不錯,在重新創建窗口後恢復以前的狀態。但是這裏和那裏都有泄漏。還有幾個直接的錯誤。 TreeView中的一個泄漏是其中哪些節點崩潰而哪些不是的確切狀態。跟蹤這一點並不實際。

通過將TreeView的Handle屬性放置在監視窗口中進行診斷。如果你看到它發生了變化,你已經找到了這個屬性。樣式標誌列表可用here,您可以將其名稱映射到其相應的屬性。

也許很明顯,除了避免更改該屬性外,對於此問題沒有很好的解決方法。像這樣的麻煩是WPF的生長。

+0

感謝您的全面回答!我能夠精確定位導致樹被重新創建的屬性,並避免在初始化過程中使用它。樹不再忘記節點狀態。 – James 2009-07-22 13:49:05

+0

@HansPassant我知道你爲什麼回滾我的編輯?謝謝 – 2017-11-15 19:14:07