【问题标题】:Deselect TreeView Node取消选择 TreeView 节点
【发布时间】:2016-06-15 06:27:33
【问题描述】:

我在 Windows 中做了很多修改,所以我经常访问这个和那个文件夹。手动执行此操作很痛苦。这就是为什么我想创建一个包含一些环境变量的小工具。

我有一个 TreeView。我选择一个节点,工具会打开相应的文件夹。

public static class EnvPaths {
    public static string HomeDrive = Environment.GetEnvironmentVariable("HomeDrive");
    public static string ProgramFiles = Environment.GetEnvironmentVariable("ProgramFiles");
    public static string CommonFiles = Environment.GetEnvironmentVariable("CommonProgramFiles");
    public static string ProgramFilesX86 = Environment.GetEnvironmentVariable("ProgramFiles(x86)");
    public static string CommonFilesX86 = Environment.GetEnvironmentVariable("CommonProgramFiles(x86)");
    public static string ProgramData = Environment.GetEnvironmentVariable("ProgramData");
    public static string User = Environment.GetEnvironmentVariable("HomePath");
    public static string AppData = Environment.GetEnvironmentVariable("AppData");
    public static string QuickLaunch = AppData + @"\Microsoft\Internet Explorer\Quick Launch";
    public static string Temp = Environment.GetEnvironmentVariable("Temp");
    public static string Windows = Environment.GetEnvironmentVariable("WinDir");
    public static string System32 = Windows + @"\system32";
    public static string etc = System32 + @"\drivers\etc";
}

private void WinFoldersTreeView_AfterSelect(object sender, TreeViewEventArgs e)
{
    if (WinFoldersTreeView.SelectedNode != null)
    {
        var selectedFolder = WinFoldersTreeView.SelectedNode.Text;
        switch (selectedFolder)
        {
            case "Home Drive":
                Process.Start(EnvPaths.HomeDrive);
                break;
            case "Program Files":
                Process.Start(EnvPaths.ProgramFiles);
                break;
            case "Common Files":
                Process.Start(EnvPaths.CommonFiles);
                break;
            case "Program Files (x86)":
                Process.Start(EnvPaths.ProgramFilesX86);
                break;
            case "Common Files (x86)":
                Process.Start(EnvPaths.CommonFilesX86);
                break;
            case "ProgramData":
                Process.Start(EnvPaths.ProgramData);
                break;
            case "User":
                Process.Start(EnvPaths.User);
                break;
            case "AppData":
                Process.Start(EnvPaths.AppData);
                break;
            case "Quick Launch":
                Process.Start(EnvPaths.QuickLaunch);
                break;
            case "Temp":
                Process.Start(EnvPaths.Temp);
                break;
            case "Windows":
                Process.Start(EnvPaths.Windows);
                break;
            case "System32":
                Process.Start(EnvPaths.System32);
                break;
            case "etc":
                Process.Start(EnvPaths.etc);
                break;
        }
    }
}

我有一个问题。打开文件夹后,我想取消选择选定的节点。所以如果我打开一个文件夹,关闭它,然后想再次打开它,我不能。我无法再次选择所选节点。我需要选择另一个节点,然后再次选择原始节点。这将打开两个文件夹,而不是一个。

我使用WinFoldersTreeView.SelectedNode = null 取消选择节点。这可行,但会导致另一个问题。由于 TreeView 附加了其AfterSelect 事件,将WinFoldersTreeView.SelectedNode 设置为null 将再次触发AfterSelect 事件。我最终打开了两个文件夹。

  • 我选择“程序文件”
  • Process.Start(EnvPaths.ProgramFiles); 打开文件夹。
  • WinFoldersTreeView.SelectedNode = null; 取消选中节点并再次触发AfterSelect 事件。这还将第一个节点(“Home Drive”)设置为选定节点。
  • 我关闭“Program Files”文件夹(第二个AfterSelect 事件正在进行中),“Home Drive”(C:) 文件夹打开。

如何在不触发AfterSelect事件的情况下取消选中节点?

【问题讨论】:

    标签: c# events treeview


    【解决方案1】:

    您可以捕获 Select 事件并取消它。您显然希望加入一些条件逻辑来决定何时要阻止它以及何时不阻止它,但我已经测试了下面的代码并且它可以工作。

    如果您在取消操作期间不暂停布局,则在屏幕上节点文本似乎被选中(蓝色背景颜色)一秒钟,然后立即恢复为未选中状态(无背景颜色) .真的很烦人。

    private void myTreeView_BeforeSelect(object sender, TreeViewCancelEventArgs e)
    {
        treeViewReallocateTo.SuspendLayout();
        e.Cancel = true;
        treeViewReallocateTo.ResumeLayout();
    }
    

    【讨论】:

      【解决方案2】:

      我认为 NodeMouseClick 会做你想做的事,这意味着你不必取消选择任何东西:

      void WinFoldersTreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
        switch (e.Node.Text) {
          case "Home Drive":
            Process.Start(EnvPaths.HomeDrive);
            break;
          case "Program Files":
            Process.Start(EnvPaths.ProgramFiles);
            break;
          case "Common Files":
            Process.Start(EnvPaths.CommonFiles);
            break;
          // etc...
      

      您应该删除对 AfterSelect 事件的引用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-30
        • 1970-01-01
        • 1970-01-01
        • 2021-04-05
        • 2011-08-23
        • 1970-01-01
        • 2011-07-30
        • 1970-01-01
        相关资源
        最近更新 更多