Динамическое добавление ToolStripMenuItems в MenuStrip (C# / Winforms)
У меня есть мое решение реализовано (основное решение), и я счастлив.
проблема в том, что когда я добавляю новые элементы в ToolStripItemCollection с помощью метода "Add", я получаю несколько перегрузок ... значимым является строковый параметр, параметр изображения и параметр EventHandler.
поскольку мой выпадающий список будет служить динамической историей во время выполнения, это означает, что он будет пуст во время компиляции. Это значит, что я не могу добавить обработчик событий через стандартный маршрут использования поверхности конструктора (по клику). Я вынужден использовать описанную выше перегрузку.
I image бесполезен для меня, но динамическое добавление обработчика событий-это то, что меня интересует и нуждается в помощи.
URL:http://msdn.microsoft.com/en-us/library/bxdt0s8t.aspx
нет никакой другой перегрузки, чтобы помочь мне, поэтому я должен использовать изображение ... у кого-нибудь есть идеи, чтобы обойти это и показать мне, как полностью удовлетворить это перегруженная версия метода add.
ТИА.
UPDATE: я сделал это снова в текущем проекте, но используя больше кода slicker, но принцип тот же, добавьте обработчики событий динамически во время выполнения. Я обновлю это с некоторым образцом кода, когда вернусь домой.
4 ответов
способ, которым я это делаю, - создать массив ToolStripMenuItems
и заполните этот массив элементами, которые я добавляю. Я создаю один метод для обработки событий click и проверяю что-то уникальное в каждом элементе, который я создаю во время выполнения. Вы можете попробовать использовать 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
}
Что случилось с:
ToolStripItem item = toolStripItems.Add("MyItem");
item.Click += new EventHandler(....);
Я что-то пропустила?
у меня были похожие проблемы, как Филип Уоллес. Важно отметить разницу между ToolStripItem и ToolStripMenuItem. Я добавлял ToolStripItems в DropDownItems ToolStripMenuItem, и они будут отображаться, и все свойства установлены правильно и доступны в коде, но они не будут показывать текст! Переход на ToolStripMenuItem решил это.
что касается исходного вопроса, я использую пустой конструктор и устанавливаю поля I необходимый. (Я в 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