【问题标题】:Event handler has dependency on call order事件处理程序依赖于调用顺序
【发布时间】:2026-02-20 01:40:01
【问题描述】:

WinForm 上有TreeView 控制。

AfterSelect 事件中,私有字段selectedFolder 已更新。

对于事件OnKeyDown 对于Delete,键是实现了与数据访问层交互的事件处理程序:selectedFolder 作为参数传递给方法DeleteFolderTreeView选中节点也被删除了

代码存在以下问题:只有在首先调用DeleteFolder 时才能正常工作:

  1. DeleteFolder(selectedFolder) // selectedFolder 没问题
  2. #.SelectedNode.Remove

如果我尝试:

  1. #.SelectedNode.Remove // AfterSelect 被调用。 selectedFolder 现在是父节点
  2. DeleteFolder(selectedFolder) // selectedFolder 错误

正如我提到的,这段代码有难闻的气味。不是吗?

我是否应该将 Pull down 重构为 selectedFolder 局部变量。 AfterSelect 事件处理程序应该 删除

  1. 根据所选节点填充selectedFolder本地变量(代码来自AfterSelect事件处理程序)
  2. #.SelectedNode.Remove
  3. DeleteFolder(selectedFolder)

在这种情况下,不依赖于2.3.的调用顺序。

【问题讨论】:

  • 我不确定是否有人能理解您的问题并给出答案。请发布一些代码来解释它有什么问题。

标签: c# winforms treeview refactoring anti-patterns


【解决方案1】:

KeyDown 事件处理程序中,您在删除节点时已经访问了TreeView,所以是的,我肯定会在执行其他两个操作之前从节点中获取文件夹名称,即使调用顺序确实如此一开始没关系

【讨论】: