0

如何为在 FormLoad 上从数据库表中获取值生成项目的工具条菜单下拉项编写代码?

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

4

1 回答 1

0

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

所以是这样的:

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 集合而不是根菜单的“项目”传递给它 - 两者都是 ToolStripItemCollection 类型。

于 2013-01-10T10:01:44.453 回答