为什么TreeView会在WinForms中意外崩溃?

时间:2009-07-21 18:34:16

标签: c# winforms treeview treenode collapse

除了在TreeNode上调用.Collapse()方法或TreeView的.CollapseAll()方法之外,什么会导致TreeView崩溃?

在我正在开发的应用程序中,TreeView将无法正常运行。 TreeView仅维护两个级别。选择父节点的子节点时,所有其他节点立即崩溃。但是,我的代码中没有.Collapse()或.CollapseAll()方法调用!

除了.LabelEdit属性(设置为true)之外,TreeView的所有属性都保留其默认值。对于简单的验证/ MessageBox例程,TreeView在AfterLabelEdit事件中有一些相关的代码。

我试过了:

  • 挂钩BeforeCollapse事件 TreeView和提升 e.CancelAction flag。

  • 手动展开所有节点 在TreeView的AfterSelect中 事件。 (这可以正常工作 实验,但我不打算 禁止节点崩溃
    共!)

在代码中的许多点上,我逐个节点地迭代TreeView来检查属性。但是,不会发生节点的添加或删除。用户进行选择时修改的唯一TreeNode属性是.ImageIndex和.SelectedImageIndex。

除了上面的两个解决方案,我没有任何线索可能导致此错误。即使没有任何解决方案可以实现,也许任何人都有关于正确处理崩溃的正确方法的想法? (我尝试在BeforeCollapse事件中设置断点,但除非用户通过鼠标或键盘明确地折叠节点,否则不会触发断点。)


更新:

问题是由于在任何TreeNode上查找.SelectedImageIndex属性。更改此属性会导致所有其他节点崩溃。

我试图用.BeginUpdate()和.EndUpdate()调用无法使用.SelectedImageIndex属性修改代码。

如何避免这种情况?

1 个答案:

答案 0 :(得分:10)

这是本机Windows在Windows中工作方式的副作用。许多窗口选项由CreateWindowEx()调用中的样式标志指定。基本的东西,比如边框在表单上的样子。 ListView应具有哪种视图。 TreeView是否应显示复选框。

这些样式作为控件的属性公开。但是有一个问题。更改此类属性需要从头开始重新创建窗口,以便可以在CreateWindowEx()调用中指定新样式标志。这有副作用,窗口完全重建,所以它失去了所有以前的状态。

Windows Forms可以很好地使这看起来很流畅,在重新创建窗口后恢复以前的状态。但是这里和那里都有泄漏。还有一些彻头彻尾的错误。 TreeView中的一个泄漏是节点折叠的确切状态,哪些不是。跟踪这一点是不切实际的。

通过将TreeView的Handle属性放在监视窗口中来诊断它。如果你看到它改变了,你就找到了这个属性。样式标志列表可用here,,您可以将它们的名称映射到相应的属性。

也许很明显,除了避免更改该属性之外,此问题没有很好的解决方法。像这样的麻烦是生成WPF的原因。