如何从ContextMenuStrip中获取ItemClicked事件我点击的目录?

时间:2014-12-14 13:56:39

标签: c# .net winforms

我有一个带有用户控件的用户控件的库类项目我有像浏览器一样的浏览器我可以选择一个目录,然后右键单击我有带编辑粘贴复制上传的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不是我选择的目录,而是“上传”菜单文本。

我需要的是AllFiles(String [])将包含所有子目录和所有文件,以便我稍后可以在form1上使用它。 一般来说,在form1中我想将整个完整的选定目录以及所有子目录和文件上传到我的ftp。

我只需要找到如何完成所有工作。

我正在使用右键单击选择目录treeView。 这是Mouse Up事件:

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);
                }
            }
        }

After Select事件:

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)";
        }

2 个答案:

答案 0 :(得分:2)

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

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将仅返回文件。它不会返回子目录。您可以从路径中恢复目录,但如果有空目录,则列表中不会包含这些目录。” / p>

因此,在任何情况下,最好的方法是将路径传递给“worker”,让工作人员使用GetFiles和GetDirectories的混合来遍历子目录。

... OR

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

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();
    }
}

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

答案 1 :(得分:0)

      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
        }
     }