Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从ContextMenuStrip ItemClicked事件获取我单击的目录?_C#_.net_Winforms - Fatal编程技术网

C# 如何从ContextMenuStrip ItemClicked事件获取我单击的目录?

C# 如何从ContextMenuStrip ItemClicked事件获取我单击的目录?,c#,.net,winforms,C#,.net,Winforms,我有一个库类项目,在用户控件上有一个用户控件我有类似windows资源管理器的资源管理器我可以选择一个目录,然后右键单击我有ContextMenuStrip菜单和编辑粘贴复制上载 当我点击上传时,我需要从我点击的所有目录子目录和所有文件的项目(目录)中获取。我试着这样做: private void menuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { if (e.Cl

我有一个库类项目,在用户控件上有一个用户控件我有类似windows资源管理器的资源管理器我可以选择一个目录,然后右键单击我有ContextMenuStrip菜单和编辑粘贴复制上载

当我点击上传时,我需要从我点击的所有目录子目录和所有文件的项目(目录)中获取。我试着这样做:

private void menuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            if (e.ClickedItem.Text == "Upload")
            {
                AllFiles = System.IO.Directory.GetFiles(e.ClickedItem.Text, "*.*", System.IO.SearchOption.AllDirectories);
                Bgw.RunWorkerAsync();
            }
        }
但是e.ClickedItem.Text不是我选择的目录,而是“上传”菜单文本

我需要的是,所有文件(字符串[])将包含所有子目录和所有文件,以便我以后在form1中使用它。 一般来说,在form1中,我希望将整个完整的选定目录以及所有子目录和文件上载到我的ftp

我只需要找到如何得到这一切

我使用右键单击来选择目录treeView。 这是鼠标向上移动事件:

void treeView1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y);

                if (treeView1.SelectedNode != null)
                {
                    menuStrip.Show(treeView1, e.Location);
                }
            }
        }
以及选择事件之后的事件:

void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            AddDirectories(e.Node);
            AddFiles(e.Node.FullPath.ToString());
            statusBar1.Text = iDirectories.ToString() + " Folder(s)  " + iFiles.ToString() + " File(s)";
        }

由于你没有提供太多的信息,我将是“通用的”。 考虑您的事件处理程序:

private void menuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    if (e.ClickedItem.Text == "Upload")
    {
        //do something
    }
}
您的问题是如何从用户控件中恢复所需的信息以有效地“做某事”。 您可以执行以下操作:

private void menuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    if (e.ClickedItem.Text == "Upload")
    {
        var contextMenu = sender as ContextMenuStrip;
        var yourControl = contextMenu.SourceControl as TypeOfYourControl;
        //Get information from your control and "do something"
    }
}
假设控件具有名为SelectedDirectory的公共字符串属性,该属性包含用户选择,则可以执行以下操作

private void menuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    if (e.ClickedItem.Text == "Upload")
    {
        var contextMenu = sender as ContextMenuStrip;
        var yourControl = contextMenu.SourceControl as TypeOfYourControl;
        AllFiles = System.IO.Directory.GetFiles(yourControl.SelectedDirectory, "*.*", System.IO.SearchOption.AllDirectories);
        Bgw.RunWorkerAsync();
    }
}
但在这里我必须指出,“GetFiles将只返回文件,而不会返回子目录。您可以从路径恢复目录,但如果目录为空,则列表中不会有这些目录

因此,在任何情况下,最好只将路径传递给“worker”,让worker使用GetFiles和GetDirectories的组合遍历子目录

或者

如果您使用的是DotNet>=4.0,则可以改用:


在这种情况下,您必须将AllFiles类型更改为[]类型。

对于“类似windows资源管理器的资源管理器”,您使用的控件/组件类型是什么?换句话说,您右键单击的控件/组件类型是什么?@JasonFaulkner,我想创建他自己的控件…在任何情况下,都是“通用”类型“这样,不管控件类型如何,他都可以按照我在回答中的建议去做。对,我忘了提到控件,它是treeView鼠标向上事件和Select事件之后。现在我发现:treeView w1.SelectedNode.FullPath;给我选择的目录名。
private void menuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    if (e.ClickedItem.Text == "Upload")
    {
        var contextMenu = sender as ContextMenuStrip;
        var yourControl = contextMenu.SourceControl as TypeOfYourControl;
        AllFiles = System.IO.Directory.GetFileSystemInfos(yourControl.SelectedDirectory, System.IO.SearchOption.AllDirectories);
        Bgw.RunWorkerAsync();
    }
}
      private void dgv1_MouseClick(object sender, MouseEventArgs e)
       {
           if (e.Button == MouseButtons.Right)
            {
               ContextMenuStrip m = new ContextMenuStrip();
               m.Items.Add("Add");
               m.Items.Add("Delete");
               m.Show(dgv1, new Point(e.X, e.Y));

               m.ItemClicked += new ToolStripItemClickedEventHandler(Item_Click);

       }
     }
     private void Item_Click(object sender, ToolStripItemClickedEventArgs e)
     {
        if (e.ClickedItem.Text == "Delete")
        {
            //Codes Here
        }
        else
        {
           //Codes Here
        }
     }