преобразование типа объекта c # - PullRequest
1 голос
/ 05 января 2012

Я пытаюсь создать контекстное меню, в которое можно будет добавлять дополнительные пункты меню с вложенным дочерним меню, если это необходимо. Я пытался сделать это, поэтому у меня есть отдельные классы, создающие каждую часть, чтобы она могла быть красиво написана с объектами.

Проблема, с которой я столкнулся, заключается в том, что метод AddRange для ContextMenuStrip не имеет конструктора для работы с моим объектом. Я пытался преобразовать его в тип ToolStripMenuItem с операторами, которые не работали, как я подозревал, что это не будет.

Я уверен, что это может быть достигнуто, поэтому я предполагаю, что я что-то подумал неправильно. Есть ли способ обойти это, или я ударился головой о стену с моей нынешней структурой?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Context
{
class TestMenu
{
    public TestMenu()
    {
        ContextMenuStrip filesToUploadContext = new System.Windows.Forms.ContextMenuStrip();

        // Hot Folder Header
        ToolStripMenuItem hotHead = new System.Windows.Forms.ToolStripMenuItem();
        // Holder for files in Hot Folder
        ParentItem hotFile; // foreach

        // Dropped Files Header
        ToolStripMenuItem dropHead = new System.Windows.Forms.ToolStripMenuItem();
        // Holder for files that have been dragged and dropped in
        ParentItem dropFile; // foreach

        ToolStripSeparator toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
        ToolStripSeparator toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();

        filesToUploadContext.Items.AddRange(new ToolStripItem[] {
            hotHead,
            toolStripSeparator1,
            hotFile, // Not a toolStrip item

            dropHead,
            toolStripSeparator2,
            dropFile // also not a toolStrip item
            });

        //// Testing stuff vv
        //// Hot Folder
        //hotFile.DropDownItems.AddRange(new ToolStripItem[]
        //    {
        //        viewHot,
        //        deleteHotFile
        //    });

        //// Dropped Items Folder
        //dropFile.DropDownItems.AddRange(new ToolStripItem[]
        //    {
        //        viewDrop,
        //        removeDropFile
        //    });

        //// Hot Folder Section Heading
        //hotHead.Name = "hotHead";
        //hotHead.Text = "Hot Folder Files";
        //hotHead.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold);

        //// Drop Folder Section Heading
        //dropHead.Name = "dropHead";
        //dropHead.Text = "Dropped Files";
        //dropHead.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold);
    }

    class ParentItem
    {
        // MenuItem to be used for found files
        // Options will contain child items
        public ToolStripMenuItem name = new ToolStripMenuItem();
        public ChildMenu options { get; set; }
        public ParentItem();
    }

    class ChildMenu
    {
        // Options available for specific files at end of menu tree
        public ToolStripMenuItem view = new ToolStripMenuItem("View File");
        public ToolStripMenuItem delete = new ToolStripMenuItem("Delete File");
        public ToolStripMenuItem remove = new ToolStripMenuItem("Remove File");
        public ChildMenu();
    }

}

}

Ответы [ 2 ]

1 голос
/ 05 января 2012

Вы не можете добавить ничего, кроме ToolStripMenuItem, в качестве потомка ToolStripMenuItem.

Не тратьте время на попытки унаследовать классы ChildMenu и ParentItem от ToolStripMenuItem. Просто добавьте ToolStripMenuItems и отбросьте эти классы.

EDIT

Я бы сделал что-то вроде следующего (на самом деле компилирует):

public void PopulateMenu(string fileName, ContextMenuStrip parent)
    {
        ToolStripMenuItem newMenu = new ToolStripMenuItem(fileName);
        newMenu.DropDownItems.Add(new ToolStripMenuItem("View File"));
        newMenu.DropDownItems.Add(new ToolStripMenuItem("Delete File"));
        newMenu.DropDownItems.Add(new ToolStripMenuItem("Remove File"));

        parent.Items.Add(newMenu);
    }

Тогда для каждого вашего файла:

this.PopulateMenu(the_file_name, the_parent_menu);

Также не забудьте присоединить обработчики к событию Click вашего меню, иначе они будут бесполезны; -)

0 голосов
/ 05 января 2012

Чтобы преобразовать ваш объект в другой тип, например SystemObject newObject = (SystemObject)myObject, эти два типа должны иметь какое-то отношение друг к другу. В зависимости от обстоятельств они могут иметь общий интерфейс или иметь некоторое происхождение (например, если ваш тип наследует от другого типа).

В вашем конкретном примере ваш объект должен быть унаследован от объекта ToolStripMenuItem, чтобы быть преобразованным в один.

Извините, это не лучшая новость, надеюсь, это может немного вам помочь:)

Перечитав мой ответ

Я понимаю, что могу научить вас сосать яйца, и вы на самом деле ищете способ использовать AddRange и объект без отношения к ToolStripMenuItem, поэтому, пожалуйста, примите мои извинения, если это так:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...