Динамическое добавление ToolStripMenuItems в MenuStrip (C # / Winforms) - PullRequest
19 голосов
/ 18 ноября 2009

У меня реализовано решение (базовое решение), и я счастлив.

Проблема в том, что когда я добавляю новые элементы в коллекцию ToolStripItemCollection с использованием метода «Add», я получаю несколько перегрузок ... значимой из них является строковый параметр, параметр изображения и параметр EventHandler.

Поскольку мой выпадающий список будет служить динамической историей в RunTime, это означает, что он будет пустым во время компиляции. Это означает, что я не могу добавить обработчик событий по стандартному маршруту использования поверхности конструктора (при нажатии). Я вынужден использовать описанную выше перегрузку.

Мне изображение бесполезно, но динамическое добавление обработчика событий - вот что меня интересует, и мне нужна помощь.

URL: http://msdn.microsoft.com/en-us/library/bxdt0s8t.aspx

Больше нет никакой перегрузки, чтобы помочь мне, поэтому я должен использовать Image ... у кого-нибудь есть идеи, чтобы обойти это и показать мне, как полностью удовлетворить эту перегруженную версию метода add.

ТИА.

ОБНОВЛЕНИЕ: я сделал это снова в текущем проекте, но с использованием более изящного кода, но принцип тот же, динамически добавляйте обработчики событий во время выполнения. Когда я вернусь домой, я обновлю это с помощью некоторого примера кода.

Ответы [ 4 ]

33 голосов
/ 18 ноября 2009

То, как я это делаю, - это создание массива ToolStripMenuItems и заполнение этого массива элементами, которые я добавляю. Я создаю один метод для обработки событий щелчка и проверяю что-то уникальное для каждого элемента, который я создаю во время выполнения. Вы можете попробовать использовать Name или Tag свойства каждого ToolStripMenuItem. Затем используйте AddRange в том месте меню, к которому вы добавляете. Поэтому ваш код может выглядеть примерно так:

private void BuildMenuItems()
{
    ToolStripMenuItem[] items = new ToolStripMenuItem[2]; // You would obviously calculate this value at runtime
    for (int i = 0; i < items.Length; i++)
    {
        items[i] = new ToolStripMenuItem();
        items[i].Name = "dynamicItem" + i.ToString();
        items[i].Tag = "specialDataHere";
        items[i].Text = "Visible Menu Text Here";    
        items[i].Click += new EventHandler(MenuItemClickHandler);
    }

    myMenu.DropDownItems.AddRange(items);
}

private void MenuItemClickHandler(object sender, EventArgs e)
{
    ToolStripMenuItem clickedItem = (ToolStripMenuItem)sender;
    // Take some action based on the data in clickedItem
}
1 голос
/ 19 ноября 2009

Что не так с:

ToolStripItem item = toolStripItems.Add("MyItem");
item.Click += new EventHandler(....);

Я что-то упустил?

0 голосов
/ 15 ноября 2016

Вы можете просто передать null для изображения.

Menu.DropDownItems.Add(Text, null, EventHandler);
0 голосов
/ 29 марта 2013

У меня были такие же проблемы, как у Филиппа Уоллеса. Важно отметить разницу между ToolStripItem и ToolStripMenuItem. Я добавлял ToolStripItems в DropDownItems ToolStripMenuItem, и они будут отображаться, и все свойства будут установлены правильно и доступны в коде, но они не будут отображать текст! Переход на ToolStripMenuItem решил эту проблему.

Что касается исходного вопроса, я использую пустой конструктор и задаю нужные мне поля. (Я нахожусь на vb.net с .net 4.0, и он не позволяет мне вызывать New ToolStripMenuItem(), поскольку у него есть тег MustInherit, поэтому я создал этот класс:

Public Class DynamicToolStripMenuItem
    Inherits ToolStripMenuItem

    Public Sub New(value As Integer, text As String, handler As System.EventHandler)
        MyBase.New()
        Me.Text = text
        Me.Visible = True
        Me.Tag = value
        AddHandler Me.Click, handler
    End Sub
End Class
...