如何从上下文菜单条项目单击事件中获取我单击的目录

本文关键字:单击 获取 事件 上下文 菜单 项目 | 更新日期: 2023-09-27 18:34:19

我有一个库类项目,在用户控件上有一个用户控件,我有像Windows资源管理器这样的资源管理器,我可以选择一个目录并右键单击我有带有编辑粘贴复制上传的上下文菜单条菜单...

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

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。

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

我正在使用右键单击以选择目录树视图。这是鼠标向上事件:

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和GetDirectory的混合循环访问子目录。

或。。。

如果您使用的是 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[] 类型。

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