J'ai une application WinForm qui prend la structure de deux TreeViews et les implémente en tant que dossiers dans le chemin que les utilisateurs ont choisi dans le menu déroulant.
Le menu déroulant obtient actuellement tous les dossiers sélectionnables depuis Z:
Maintenant, mon TreeView loremPath
a le bon lecteur avec Z: mais ipsumPath
devrait aller dans R: mais avec le même menu déroulant - Parce que le deuxième lecteur a la structure de dossiers exacte que Z: donc au lieu de construire un tout nouveau menu déroulant, je dois juste changer le chemin dans ipsumPath
en R: et je peux utiliser un seul menu déroulant pour les deux Treeviews.
Alors j'avais une question précédente sur StackOverflow et on m'a recommandé d'utiliser des chemins codés en dur pour les deux TreeViews, mais je n'arrive pas à comprendre comment implémenter cela.
J'ai essayé quelque chose comme:
var testPath = new DirectoryInfo("R:\\").GetDirectories();
var treeSeperator = ipsumPath.PathSeparator;
var dirSep = Path.DirectorySeparatorChar.ToString();
foreach (var node in GetCheckedNodes(ipsumPath.Nodes))
{
var sPath = Path.Combine(testPath.ToString(), node.FullPath.Replace(treeSeperator, dirSep));
Directory.CreateDirectory(sPath);
}
Mais cela n'a pas du tout fonctionné.
Tout mon code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;
using IWshRuntimeLibrary;
using System.Reflection;
namespace Form1
{
public partial class Form1 : Form
{
[DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
private static extern IntPtr CreateRoundRectRgn
(
int nLeftRect,
int nTopRect,
int nRightRect,
int nBottomRect,
int nWidthEllipse,
int nHeightEllipse
);
public Form1()
{
InitializeComponent();
this.FormBorderStyle = FormBorderStyle.None;
Region = System.Drawing.Region.FromHrgn(CreateRoundRectRgn(0, 0, Width, Height, 20, 20));
foreach (TreeNode tn in loremPath.Nodes)
{
tn.Expand();
}
foreach (TreeNode tn in ipsumPath.Nodes)
{
tn.Expand();
}
ipsumDropDown.Items.AddRange(new[] { "R:\\", "Z:\\" });
loremDropDown.DataSource = new DirectoryInfo($"{ipsumDropDown.SelectedItem}").GetDirectories();
}
private void CreateShortcutToCurrentAssembly(string saveDir)
{
var testPath = loremDropDown.SelectedValue.ToString();
WshShell wshShell = new WshShell();
string fileName = testPath + "\\" + Application.ProductName + ".lnk";
IWshShortcut shortcut = (IWshShortcut)wshShell.CreateShortcut(fileName);
shortcut.TargetPath = Application.ExecutablePath;
shortcut.Save();
}
private void close_Click(object sender, EventArgs e)
{
System.Windows.Forms.Application.Exit();
}
private void loremPath_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Action == TreeViewAction.Unknown) return;
foreach (TreeNode n in e.Node.Children())
n.Checked = e.Node.Checked;
foreach (TreeNode p in e.Node.Parents())
p.Checked = p.Nodes.OfType().Any(n => n.Checked);
}
private IEnumerable GetCheckedNodes(TreeNodeCollection nodeCol)
{
foreach (TreeNode node in nodeCol)
{
if (node.Checked ||
node.Nodes.Cast().Any(n => n.Checked))
{
yield return node;
}
foreach (TreeNode childNode in GetCheckedNodes(node.Nodes))
{
if (childNode.Checked)
yield return childNode;
}
}
}
private void projektordnerGenerieren_Click(object sender, EventArgs e)
{
var destPath = loremDropDown.SelectedValue.ToString();
var treeSep = loremPath.PathSeparator;
var dirSep = Path.DirectorySeparatorChar.ToString();
foreach (var node in GetCheckedNodes(loremPath.Nodes))
{
var sPath = Path.Combine(destPath, node.FullPath.Replace(treeSep, dirSep));
Directory.CreateDirectory(sPath);
}
foreach (var node in GetCheckedNodes(ipsumPath.Nodes))
{
var sPath = Path.Combine(destPath, node.FullPath.Replace(treeSep, dirSep));
Directory.CreateDirectory(sPath);
}
string folder = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
CreateShortcutToCurrentAssembly(folder);
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
this.loremPath.SelectedNode = this.loremPath.Nodes[0];
this.ipsumPath.SelectedNode = this.ipsumPath.Nodes[0];
loremPath.SelectedNode.Text = textBox1.Text;
ipsumPath.SelectedNode.Text = textBox1.Text;
}
private void ipsumPath_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Action == TreeViewAction.Unknown) return;
foreach (TreeNode n in e.Node.Children())
n.Checked = e.Node.Checked;
foreach (TreeNode p in e.Node.Parents())
p.Checked = p.Nodes.OfType().Any(n => n.Checked);
}
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool ReleaseCapture();
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
private void alleErweitern_Click(object sender, EventArgs e)
{
foreach (TreeNode tn in loremPath.Nodes)
{
tn.Expand();
}
foreach (TreeNode tn in ipsumPath.Nodes)
{
tn.Expand();
}
}
private void alleReduzieren_Click(object sender, EventArgs e)
{
foreach (TreeNode tn in loremPath.Nodes)
{
tn.Collapse();
}
foreach (TreeNode tn in ipsumPath.Nodes)
{
tn.Collapse();
}
}
private void minimize_Click(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Minimized;
}
}
static class TreeViewExtensions
{
public static IEnumerable Children(this TreeNode node)
{
foreach (TreeNode n in node.Nodes)
{
yield return n;
foreach (TreeNode child in Children(n))
yield return child;
}
}
public static IEnumerable Parents(this TreeNode node)
{
var p = node.Parent;
while (p != null)
{
yield return p;
p = p.Parent;
}
}
}
}