如何处理动态生成的工具条菜单项

时间:2012-05-05 14:10:34

标签: c# database drop-down-menu toolstripmenu

如何为在FormLoad上生成项目的toolstripmenu dropdownitem编写代码,从数据库表中获取值?

如何在运行程序之前为这些不存在的项编写OnClick方法?

1 个答案:

答案 0 :(得分:0)

控件就像任何其他对象一样。我们只是习惯使用wysiwyg设计器来指定用户界面。

这样的事情:

void AddMenuItems(ToolStripItemCollection itemCollection, DataView view)
{
    foreach (DataRowView rowView in view)
        itemCollection.Add(MakeMenuItem(rowView.Row));
}

ToolStripItem MakeMenuItem(DataRow row)
{
    var item = new ToolStripMenuItem((string)row["Name"]);
    item.Tag = row;
    item.Click += new EventHandler(MenuItem_Click);
    return item;
}

void MenuItem_Click(object sender, EventArgs e)
{
    var row = ((ToolStripItem)sender).Tag as DataRow;
    MessageBox.Show((string)row["HelpText"]);
}

您可能希望使用DataRow以外的其他内容来处理项目数据(例如某种实体),也可能使用完全不同的逻辑来创建项目,但这说明了模式:创建项目就像您创建任何其他项目一样对象,将它们添加到已经根植于表单中的某个菜单中(您也可以动态创建根目录,但很难看到它可能带来什么好处),使用数据标记项目,并从标记中获取数据点击处理程序。

这假设您已经获取了一个数据行表,其中包含两个字符串类型的列Name和HelpText。该名称用作工具条项标签,单击该项时会显示帮助文本。

您可以使用它来创建一个菜单,表示名称以A开头的行:

var view = GetMenuDataSet().Tables[0].DefaultView;
view.RowFilter = "Name LIKE 'A%'";
menu.Items.Clear();
AddMenuItems(menu.Items, view);

这假设GetMenuDataSet返回一个DataSet,其中包含一个包含前面提到的两列的表,并且您在设计时在表单上放置了一些名为“menu”的根菜单(例如ContextMenuStrip)(或以其他方式确保它是在此代码运行时创建的)。

要构建层次结构,您可以调用AddMenuItems并将其传递给某个项目的DropDownItems集合而不是根菜单的“Items” - 两者都是ToolStripItemCollection类型。