C# WinForms-困惑-如何动态处理某些控件-正确

C# WinForms-困惑-如何动态处理某些控件-正确,c#,.net,winforms,C#,.net,Winforms,我有一个System.Windows.Form类作为我的主类。有一个根菜单对象。这是我自己的自定义对象。我试图循环遍历RootMenu对象,并在每次传递时将ToolStripMenuItem添加到我命名为ContextMenuStrip的ContextMenuStrip。RootMenu对象包含一个列表。链接的名称和URL都是字符串 当窗体加载我的工厂类时,会加载一个RootMenu对象,然后将其传递到ProcessMenu方法中 代码摘录如下: private void Process

我有一个System.Windows.Form类作为我的主类。有一个根菜单对象。这是我自己的自定义对象。我试图循环遍历RootMenu对象,并在每次传递时将ToolStripMenuItem添加到我命名为ContextMenuStrip的ContextMenuStrip。RootMenu对象包含一个列表。链接的名称和URL都是字符串

当窗体加载我的工厂类时,会加载一个RootMenu对象,然后将其传递到ProcessMenu方法中

代码摘录如下:

    private void ProcessMenu(RootMenu rm)
    {
        foreach (var lnk in rm.Links)
        {
            var tsmi = new ToolStripMenuItem(lnk.Name, null, new EventHandler(Navigate));
            tsmi.ToolTipText = lnk.Url;
            ContextMenu.Items.Add(tsmi);
        }
    }
    private void Navigate(object sender, EventArgs e)
    {
        var tsmi = (ToolStripMenuItem) sender;
        System.Diagnostics.Process.Start(tsmi.ToolTipText);
    }
你知道我必须如何在ToolTipText中存储lnk.Url吗?在VB6中,所有控件都具有tag属性。您过去可以在控件中添加额外的内容,以供以后使用。我不想为此使用工具提示,但我的替代方案是什么?使用名称作为键将所有URL存储在哈希/字典中?我可能不总是有唯一的名字,所以我想避免这条路线。在.NET中处理此问题的正确方法是什么?也许我遗漏了一些我从未接触过的基本概念。

ToolStripMenuItem有一个标记属性:

tsmi.Tag = lnk.Url;

事实上,很多Windows窗体控件都有它。

只需继承旧类并在其中粘贴标记属性即可:

public class myToolStripMenuItem : ToolStripMenuItem
{
    public object myTag { get; set; }
}

创建从ToolStripMenuItem继承的自己的对象,并添加任何自定义属性

    private void ProcessMenu(RootMenu rm)
    {
        foreach (var lnk in rm.Links)
        {
            var tsmi = new UrlToolStripMenuItem(lnk.Name, null, new EventHandler(Navigate))
            {
                Url = lnk.Url,
            };
            ContextMenu.Items.Add(tsmi);
        }
    }
    private void Navigate(object sender, EventArgs e)
    {
        var tsmi = (UrlToolStripMenuItem)sender;
        System.Diagnostics.Process.Start(tsmi.Url);
    }

    public class UrlToolStripMenuItem : ToolStripMenuItem
    {
        public UrlToolStripMenuItem(string text, Image image, EventHandler onClick) : base(text, image, onClick)
        {
        }

        public string Url { get; set; }
    }

你能更好地解释一下你想要什么吗?我正在构建一个系统,其中一组链接和子菜单被序列化为一个XML文件。我读了这个文件。以及构建菜单。这些菜单将展开以显示链接或子菜单。我怎么会错过这些。。。这是解决这个问题的最佳模式吗?我在回家的路上想到了这一点。虽然不理想,但确实有效+1和我对比尔的评论一样+1这可能是最好的选择,而不是将信息塞进标签中。您可以更详细地描述额外属性包含的内容,如果需要存储更多数据,则添加另一个属性比序列化/取消序列化标记中的数据更容易、更快