Подтвердить что ты не робот

Динамическое добавление ToolStripMenuItems в MenuStrip (С#/Winforms)

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

Проблема заключается в том, когда я добавляю новые элементы в ToolStripItemCollection с помощью метода "Добавить", я получаю несколько перегрузок... значимый - это строковый параметр, параметр изображения и параметр EventHandler.

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

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

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

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

ТИА.

UPDATE: я повторил это снова в текущем проекте, но с использованием большего количества кода slicker, но принцип тот же, добавьте обработчики событий динамически во время выполнения. Я обновлю это с некоторым примером кода, когда вернусь домой.

4b9b3361

Ответ 1

Я делаю это, чтобы создать массив 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
}

Ответ 2

Что не так:

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

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

Ответ 3

У меня были похожие проблемы, такие как Филипп Уоллес. Важно отметить разницу между ToolStripItem и ToolStripMenuItem. Я добавлял ToolStripItems в ToolStripMenuItem DropDownItems, и они появлялись, и все свойства были установлены правильно и доступны в коде, но они не отображали текст! Переключение на 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

Ответ 4

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

Menu.DropDownItems.Add(Text, null, EventHandler);