2012-01-05 3 views
1

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

Проблема, с которой я столкнулась, заключается в том, что метод 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(); 
    } 

} 

}

+1

Очень много кода, но где линия, которая не работает? –

ответ

1

Вы не можете больше ничего добавить, чем 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

Спасибо, Кен, это очень полезно! – negligible

0

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

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

Мне очень жаль, что это не хорошая новость, я надеюсь, что может помочь вам немного, хотя :)

На Перечитывая мой ответ

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

Смежные вопросы