Как я могу получить из события ContextMenuStrip ItemClicked каталог, на который я нажал?

У меня есть проект класса библиотеки с пользовательским элементом управления на пользовательском элементе управления. У меня есть проводник, такой как проводник Windows. Я могу выбрать каталог и щелкнуть правой кнопкой мыши. У меня есть меню ContextMenuStrip с Edit Paste Copy Upload...

Когда я нажимаю «Загрузить», мне нужно получить из элемента (каталога), я нажал на все подкаталоги каталога и все файлы. Я пытался сделать это так:

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

person Jorge Hyyest    schedule 14.12.2014    source источник
comment
Какой тип элемента управления/компонента вы используете для своего проводника, такого как проводник Windows? Другими словами, какой тип элемента управления/компонента вы щелкаете правой кнопкой мыши?   -  person Jason Faulkner    schedule 14.12.2014
comment
@JasonFaulkner, я думаю, создать свой собственный элемент управления ... В любом случае, в общем случае, независимо от типа элемента управления, он может делать то, что я предлагаю в своем ответе.   -  person Jauch    schedule 14.12.2014
comment
Правильно, я забыл упомянуть элемент управления, а также событие TreeView Mouse Up и событие After Select.   -  person Jorge Hyyest    schedule 14.12.2014
comment
И теперь я обнаружил, что: treeView1.SelectedNode.FullPath; дайте мне выбранное имя каталога.   -  person Jorge Hyyest    schedule 14.12.2014


Ответы (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 вернет ТОЛЬКО файлы. Он не вернет подкаталоги. Вы можете восстановить каталоги из пути, но если есть пустые каталоги, у вас не будет их в списке.

Таким образом, в любом случае лучше всего просто передать «рабочему» путь и позволить рабочему выполнять итерацию по подкаталогам, используя сочетание 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 на Информация о файловой системе[].

person Jauch    schedule 14.12.2014