为什么TreeView会在WinForms中意外折叠?

0s7z1bwu  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(131)

除了调用TreeNode上的.Collapse()方法或TreeView的.CollapseAll()方法之外,还有什么会导致TreeView折叠?
在我正在开发的应用程序中,TreeView将无法正常运行。TreeView仅维护两个级别。当选择父节点的子节点时,所有其他节点将立即折叠。但是,在我的代码中没有.Collapse()或.CollapseAll()方法调用!
TreeView的所有属性都保留其默认值,但.LabelEdit属性除外,该属性设置为true。TreeView在AfterLabelEdit事件中具有一些关联的代码,用于简单的验证/MessageBox例程。
我试过:

  • 挂接TreeView的BeforeCollapse事件并引发e.CancelAction标志。
  • 手动展开TreeView的AfterSelect事件中的所有节点。(作为一个实验,这很好,但我并不打算禁止节点折叠

一起!)
在程式码中的许多地方,我会逐一查看TreeView的节点,以检查属性。但是,并不会新增或删除节点。当使用者进行选取时,唯一会修改的TreeNode属性是.ImageIndex和. SelectedImageIndex。
除了上面的两个解决方案,我不知道是什么导致了这个错误。即使没有解决方案可以实现,有没有人知道捕获折叠的正确方法?(我尝试在BeforeCollapse事件中设置断点,但是它没有被触发,除非用户通过鼠标或键盘显式折叠节点。)
我发现问题是由于更改了任何TreeNode上的.SelectedImageIndex属性。更改此属性会导致所有其他节点折叠。
我尝试使用.BeginUpdate()和.EndUpdate()调用来包围.SelectedImageIndex属性修改代码,但没有效果。
如何避免这种情况?

vu8f3i0k

vu8f3i0k1#

这是Windows原生 windows 运作方式的副作用。许多 windows 选项是由CreateWindowEx()呼叫中的样式旗标所指定。基本的内容,例如表单上的框缐外观。ListView应该有什麽样的检视。TreeView是否应该显示核取方块。
这些样式会公开为控件上的属性。但有一个问题。变更这样的属性需要从头重新建立 windows ,以便在CreateWindowEx()呼叫中指定新的样式旗标。这会有副作用, windows 会完全重新建立,因此会遗失所有先前的状态。
Windows窗体在使其看起来平滑方面做得很好,在重新创建窗口后恢复了以前的状态。但是它到处都有漏洞。还有一些明显的错误。TreeView中的一个漏洞是哪些节点被折叠,哪些节点没有被折叠的确切状态。跟踪这一点是不实际的。
通过将TreeView的Handle属性放在监 windows 口中来诊断此问题。如果您看到它发生变化,则说明您已经找到了该属性。样式标志列表可用here,,您可以将它们的名称Map到相应的属性。
也许很明显,除了避免更改属性之外,没有很好的解决方法来解决这个问题。

相关问题