我正在使用 winforms 及其控件进行游戏,并且刚刚发现了如何进行自定义按钮点击。但是,有一个问题。我有一个循环,它在元素列表中循环,如果出现条件 - 我正在创建一个会弹出 gridview 的按钮。
public void draw(ref Panel inputPanel) //draws the eventline
{
int stepCounter = 0;
for (int i = 0; i < DaysList.Count-1; i++)
{
Button b1;
if (DaysList[i].Elements.Count > max)
{
b1 = new Button(); //Create the box
b1.Width = 120;
b1.Height = 40; //Set width and height
b1.Location = new Point(stepCounter + 35, 70); //Location
inputPanel.Controls.Add(b1); //
b1.Text = "Check event date in grid";
b1.Show();
b1.BringToFront();
b1.Click += new EventHandler((sender, e) => btn_Click(sender, e, DaysList[i].Elements));
stepCounter += 200;
}
}
}
那是我创建按钮的方法和我的条件出现时的单击事件。传递给事件处理程序的函数如下所示:
public void btn_Click(object sender, EventArgs e, List<EventElement> inputElems)
{
Button button = sender as Button;
DataGridForm window = new DataGridForm(inputElems);
window.Show();
}
public class EventElement
{
public EventElement()
{
}
public int Count{get;set;}
public string Date{get;set;}
}
事件的点击部分很好,但每当我点击生成的按钮时,我都会将错误的数据输入到 gridview 中。举个例子:循环为我创建了四个按钮,它们显示在表单上的一条直线上。但是,每当我单击其中一个按钮时——不管是哪个按钮,该按钮总是返回最后一个生成按钮的数据。一个更清楚的例子:假设我们的列表 inputElems 看起来像这样:
inputElems[0].Count -> 2644
inputElems[1].Count -> 2131
inputElems[2].Count -> 8467
inputElems[3].Count - > 5462
当我现在单击第二个按钮时,第二个按钮参数列表的输入应该具有值(发件人,e,2131),对吗?但由于某种原因,最后一个参数与列表中的第 4 个元素相同,即使我调用了第二个创建的按钮。
我认为这与我总是将最后添加的 button_click 调用到按钮的事件处理程序有关,如果是这样,我如何从 EventHandler 调用不同的点击?