如何为在FormLoad上生成项目的toolstripmenu dropdownitem编写代码,从数据库表中获取值?
如何在运行程序之前为这些不存在的项编写OnClick方法?
答案 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类型。