我有一个按钮列表...但是我想为列表中的每个按钮创建一个事件-我已经尝试了这段代码
ButtonName.Click += (sender, args) =>
{
Point p = new Point(20 * j, 70);
Product[j].Location = p;
Product[j].Width = 200;
Product[j].Height = 250;
this.Controls.Add(Product[j]);
};
我想做的事件是,当单击任何按钮时,它应该显示一个与此按钮相关的列表框。 每个列表框都有其自己的数据..我要解决的唯一问题是使列表中的每个按钮都发生事件 可能吗??
更新
for (int j = 0; j < Data.BTN_Name.Count; j++)
{
Category[j].Click += (sender, args) =>
{
Point p = new Point(20 * j, 70);
Product[j].Location = p;
Product[j].Width = 200;
Product[j].Height = 250;
this.Controls.Add(Product[j]);
};
答案 0 :(得分:1)
在我看来,您想这样做:
for (int j = 0; j < Data.BTN_Name.Count; j++)
{
Product[j] = new ListBox()
{
Location = new Point(20 * j, 70),
Width = 200,
Height = 250,
Visible = false,
};
this.Controls.Add(Product[j]);
var captured_j = j;
Category[j].Click += (s, ea) => Product[captured_j].Visible = true;
}
您必须捕获j
变量才能在事件处理程序中使用它-因此,代码var captured_j = j;
就在事件处理程序之前。
答案 1 :(得分:-1)
正如我所看到的,您实际上是在尝试将某个按钮绑定到某个列表框。正如@TheGeneral所说,您可以使用button的Tag
属性,但我不喜欢这种方法(尽管它有权利,但这只是习惯问题)。这是我的示例:
public class YourForm : Form
{
private IDictionary<Button, ListBox> _listboxes = new Dictionary<Button, ListBox>();
// use this if you create a button and listbox simultaneously
protected void CreateButtonAndList()
{
var listbox = new ListBox();
// initialize listbox as needed
var button = new Button();
// initialize button as needed
button.Click += ButtonClickHandler;
_listboxes.Add(button, listbox);
}
// use this if you create a button for already existing listbox
protected void CreateButtonFor(ListBox listbox)
{
var button = new Button();
// initialize button as needed
button.Click += ButtonClickHandler;
_listboxes.Add(button, listbox);
}
private void ButtonClickHandler(object sender, EventArgs e)
{
var listbox = _listboxes[sender];
// do what you want with listbox
}
}
还要注意,您可能不需要同时使用CreateButtonAndList()
和CreateButtonFor()
方法。您可能只留下一种适合您的需求。