Treeview - 在放置在 NodeMouseClick 事件上的弹出消息上单击取消时无法恢复之前的选择

Treeview - Unable to restore previous selection on clicking cancel on a message pop up that is placed on a NodeMouseClick event

考虑一个包含多个节点的 TreeView 控件。选择节点时,某些信息会显示在文本框中。可以修改和保存此信息。意外地,如果用户在没有保存的情况下导航到不同的节点,则会显示一个弹出窗口,要求用户保存或取消操作。如果单击取消,选择应保留在先前选择的节点上而不是新节点上。显示弹出的逻辑写在 TreeView 的 NodeMouseClick() 事件中。有什么办法可以做到这一点?下面是示例代码片段。

private void TreeView1_NodeMouseClick(object sender, 
TreeNodeMouseClickEventArgs e)
{
    DialogResult dr = MessageBox.Show("Cancel 
    Clicked......!!!","Information", MessageBoxButtons.OKCancel, 
    MessageBoxIcon.Information);
    if(dr == DialogResult.Cancel)
    {
            //Need to handle previous node selection
    }
}

NodeMouseClick() 事件似乎没有提供任何信息来取消该事件。我已经尝试使用以下代码片段取消 TreeView 的 BeforeSelect() 事件。

 private void TreeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
 {
        e.Cancel = true;
 }

但是上面的代码删除了所有节点上的选择,不能满足需要。有什么办法可以保留之前的选择吗?

您可以在 TreeViewBeforeSelect 活动中执行此操作。

如果您为 BeforeSelect 事件添加了一个事件处理程序,实际上只是 e.Cancel = true 您将永远无法 select 一个节点,因为 selection 会每次都被取消。相反,您需要在 BeforeSelect 事件中显示消息框,并根据消息框的结果设置 e.Cancel

private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
   if (DataIsDirty())
   {
      if (MessageBox.Show(
            "Unsaved changes detected. Press OK to switch nodes and lose the change, or Cancel to stay on the current node.",
            "Unsaved Changes Detected",
            MessageBoxButtons.OKCancel) == DialogResult.Cancel)
      {
          e.Cancel = true;
      }
   }
}