c#对象类型转换

时间:2012-01-05 09:13:32

标签: c# winforms type-conversion

我正在尝试创建一个上下文菜单,可以根据需要添加额外的菜单项和附加的子菜单。我一直在尝试这样做,所以我有单独的类来构建每个部分,因此它可以很好地与对象一起编写。

我遇到的问题是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();
    }

}

}

2 个答案:

答案 0 :(得分:1)

ToolStripMenuItem的孩子不能添加除ToolStripMenuItem以外的任何内容。

不要花时间尝试从ChildMenu继承您的ParentItemToolStripMenuItem类。只需添加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事件,否则它们将毫无用处; - )

答案 1 :(得分:0)

为了将您的对象转换为其他类型,例如SystemObject newObject = (SystemObject)myObject,这两种类型将需要彼此具有某种关系。根据具体情况,他们可以拥有共同的Interface或具有一些血统(例如,如果你的类型inherits来自其他类型)。

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

对不起,这不是更好的消息,我希望这可能对你有所帮助:)

重读我的回答

我意识到我可能会教你吮吸鸡蛋而你实际上正在寻找一种方法来使用AddRange和一个与ToolStripMenuItem无关的对象,所以如果是这样的话,请接受我的道歉:)