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

Jam*_*mes 4 c# treeview treenode collapse winforms

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

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

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

我试过了:

  • 挂钩TreeView的BeforeCollapse事件并引发e.CancelAction标志.

  • 手动扩展TreeView的AfterSelect事件中的所有节点.(这可以作为一个实验,但我不打算
    完全禁止节点崩溃!)

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

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


更新:

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

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

如何避免这种情况?

Han*_*ant 10

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

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

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

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

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