事件处理程序依赖于调用顺序

Event handler has dependency on call order

WinForm 上有 TreeView 控件。

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

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

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

  1. DeleteFolder(selectedFolder) // selectedFolder OK
  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. 的调用顺序。

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