WinForms - озадачен - Как обрабатывать некоторые элементы управления динамически - правильно - PullRequest
0 голосов
/ 02 мая 2009

У меня есть класс System.Windows.Form (мой основной класс). Есть объект RootMenu. Это мой собственный объект. Я пытаюсь перебрать объект RootMenu и на каждом проходе добавлять ToolStripMenuItem в ContextMenuStrip (который я назвал ContextMenu). Объект 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 в ToolTipText? В дни VB6 все элементы управления имели свойство «tag». Раньше у вас была возможность добавлять дополнительные элементы управления, которые вам понадобятся позже. Я не хочу использовать всплывающую подсказку для этого, но каковы мои альтернативы? Хранить все URL в хэше / словаре, используя имя в качестве ключа? У меня не всегда могут быть уникальные имена, поэтому я бы хотел избежать этого маршрута. Как правильно обращаться с этим в .NET? Может быть, мне не хватает какой-то базовой концепции, с которой я никогда не сталкивался.

Ответы [ 3 ]

4 голосов
/ 02 мая 2009

ToolStripMenuItem имеет Tag свойство:

tsmi.Tag = lnk.Url;

На самом деле, довольно много элементов управления Windows Forms имеют его.

3 голосов
/ 02 мая 2009

Просто наследуйте старый класс и вставьте туда свойство Tag:

public class myToolStripMenuItem : ToolStripMenuItem
{
    public object myTag { get; set; }
}
2 голосов
/ 02 мая 2009

Создайте свой собственный объект, наследующий от 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; }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...