2012-01-05 247 views
1

我正在尝试创建一个上下文菜单,该菜单可以根据需要添加额外的菜单项以及附加的子菜单。我一直在努力做到这一点,所以我有单独的类建立每个部分,所以它可以很好地写入对象。c#对象类型转换

我遇到的问题是ContextMenuStrip的AddRange方法没有处理我的对象的构造函数。我试图将其转换为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

非常多的代码,但哪里不行? – 2012-01-05 09:21:04

回答

1

不能超过ToolStripMenuItem添加任何其他作为ToolStripMenuItem的孩子。

不要把时间花在试图从ToolStripMenuItem继承你ChildMenuParentItem类。只需添加ToolStripMenuItems并删除这些类。

编辑

我会做类似以下(实际上编译):

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

谢谢Ken,这非常有帮助! – negligible 2012-01-05 10:07:52

0

为了你的对象转换为不同的类型,比如SystemObject newObject = (SystemObject)myObject这两种类型都需要有一定的关系彼此。根据情况,他们可以有一个共同的Interface或有一些祖先(例如,如果您的类型inherits来自其他类型)。

在您的具体示例中,您的对象需要继承ToolStripMenuItem对象才能转换为一个对象。

对不起,这不是好消息,我希望可以帮助你有点虽然:)

重读我的回答

我意识到我可能会教你班门弄斧,你“再实际上是寻找一种方式来使用的AddRange和对象没有关系ToolStripMenuItem,所以请接受我的道歉,如果是这样的话:)