【问题标题】:How can i get from ContextMenuStrip ItemClicked event the directory i clicked on?如何从 ContextMenuStrip ItemClicked 事件中获取我单击的目录?
【发布时间】:2015-11-03 17:25:16
【问题描述】:

我有一个库类项目,用户控件上有一个用户控件我有像 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不是我选择的目录而是“上传”菜单文本。

我需要的是 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)";
        }

【问题讨论】:

  • 您的“像 Windows 资源管理器一样的资源管理器”使用什么控件/组件类型?换句话说,您右键单击的控件/组件类型是什么?
  • @JasonFaulkner,我认为创建自己的控件...无论如何,以“通用”方式,独立于控件类型,他可以按照我在回答中的建议进行操作。
  • 对,我忘了提到控件,它是 treeView Mouse Up 事件和 After Select 事件。
  • 我现在发现:treeView1.SelectedNode.FullPath;给我选择的目录名称。

标签: c# .net winforms


【解决方案1】:

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

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,则可以改用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[] 类型。

【讨论】:

    【解决方案2】:
          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
            }
         }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多