取消选择 TreeView 节点
Deselect TreeView Node
我在 Windows 中做了很多修改,所以我经常访问这个和那个文件夹。手动执行此操作很痛苦。这就是为什么我考虑创建一个包含一些环境变量的小工具。
我有一个 TreeView。我select一个节点,工具打开相应的文件夹。
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;
}
}
}
不过我有一个问题。打开文件夹后,我想取消 select selected 节点。所以如果我打开一个文件夹,关闭它,然后想再次打开它,我做不到。我无法再次 select selected 节点。我需要 select 另一个节点,然后再次 select 原始节点。这将打开两个文件夹,而不是一个。
我已经使用 WinFoldersTreeView.SelectedNode = null
去 select 节点。这有效但会导致另一个问题。由于 TreeView 附加了 AfterSelect
事件,将 WinFoldersTreeView.SelectedNode
设置为 null
会再次触发 AfterSelect
事件。我最终打开了两个文件夹。
- 我select"Program Files"
Process.Start(EnvPaths.ProgramFiles);
打开文件夹。
WinFoldersTreeView.SelectedNode = null;
deselects selected 节点并再次触发 AfterSelect
事件。这还将第一个节点 ("Home Drive") 设置为 selected 节点。
- 我关闭 "Program Files" 文件夹(第二个
AfterSelect
事件正在进行中)并且 "Home Drive" (C:) 文件夹打开。
如何在不触发 AfterSelect
事件的情况下删除select selected 节点?
我认为 NodeMouseClick 会做你想做的事,这意味着你不必去 select 任何东西:
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 事件的引用。
您可以捕获 Select 事件并将其取消。您显然希望加入一些条件逻辑来决定何时阻止它,何时不阻止它,但我已经测试了下面的代码并且它有效。
如果您在取消操作期间不暂停布局,则在屏幕上节点文本似乎被选中(蓝色背景色)几分之一秒,然后立即恢复为未选中状态(无背景)颜色)。真的很烦人。
private void myTreeView_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
treeViewReallocateTo.SuspendLayout();
e.Cancel = true;
treeViewReallocateTo.ResumeLayout();
}
我在 Windows 中做了很多修改,所以我经常访问这个和那个文件夹。手动执行此操作很痛苦。这就是为什么我考虑创建一个包含一些环境变量的小工具。
我有一个 TreeView。我select一个节点,工具打开相应的文件夹。
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;
}
}
}
不过我有一个问题。打开文件夹后,我想取消 select selected 节点。所以如果我打开一个文件夹,关闭它,然后想再次打开它,我做不到。我无法再次 select selected 节点。我需要 select 另一个节点,然后再次 select 原始节点。这将打开两个文件夹,而不是一个。
我已经使用 WinFoldersTreeView.SelectedNode = null
去 select 节点。这有效但会导致另一个问题。由于 TreeView 附加了 AfterSelect
事件,将 WinFoldersTreeView.SelectedNode
设置为 null
会再次触发 AfterSelect
事件。我最终打开了两个文件夹。
- 我select"Program Files"
Process.Start(EnvPaths.ProgramFiles);
打开文件夹。WinFoldersTreeView.SelectedNode = null;
deselects selected 节点并再次触发AfterSelect
事件。这还将第一个节点 ("Home Drive") 设置为 selected 节点。- 我关闭 "Program Files" 文件夹(第二个
AfterSelect
事件正在进行中)并且 "Home Drive" (C:) 文件夹打开。
如何在不触发 AfterSelect
事件的情况下删除select selected 节点?
我认为 NodeMouseClick 会做你想做的事,这意味着你不必去 select 任何东西:
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 事件的引用。
您可以捕获 Select 事件并将其取消。您显然希望加入一些条件逻辑来决定何时阻止它,何时不阻止它,但我已经测试了下面的代码并且它有效。
如果您在取消操作期间不暂停布局,则在屏幕上节点文本似乎被选中(蓝色背景色)几分之一秒,然后立即恢复为未选中状态(无背景)颜色)。真的很烦人。
private void myTreeView_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
treeViewReallocateTo.SuspendLayout();
e.Cancel = true;
treeViewReallocateTo.ResumeLayout();
}