代码之家  ›  专栏  ›  技术社区  ›  BuddyJoe

winforms-困惑-如何动态正确地处理某些控件

  •  0
  • BuddyJoe  · 技术社区  · 15 年前

    我有一个system.windows.form类(我的主类)。有一个rootmenu对象。这是我自己的自定义对象。我试图循环遍历rootmenu对象,并在每次传递时向contextmenustrip(我将其命名为contextmenu)添加一个toolstripmenuitem。rootmenu对象包含一个列表。链接有名称和url(两个字符串)。

    当窗体加载我的“factory”类时,会加载一个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);
        }
    

    你知道我该如何在工具文本中存储lnk.url吗?在vb6中,所有控件都具有“tag”属性。你以前可以把额外的东西塞进控件中,以后就需要了。我不想使用工具提示,但我有什么选择?将所有url存储在一个散列/字典中,并使用名称作为密钥?我可能不总是有唯一的名字,所以我想避免这条路线。在.net中处理此问题的正确方法是什么?也许我遗漏了一些我从未接触过的基本概念。

    3 回复  |  直到 12 年前
        1
  •  4
  •   Jeff MattfieldJeff Mattfield    15 年前

    ToolStripMenuItem 有一个 Tag 属性:

    tsmi.Tag = lnk.Url;
    

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

        2
  •  3
  •   anonymous coward    15 年前

    继承旧阶级,坚持 Tag 里面的财产:

    public class myToolStripMenuItem : ToolStripMenuItem
    {
        public object myTag { get; set; }
    }
    
        3
  •  2
  •   Bill    15 年前

    创建您自己的从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; }
        }