我正在玩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;
}
}
}
这是我创建按钮的方法,以及当我的条件出现时的点击事件。传递给eventhandler的函数如下所示:
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;}
}
事件的clickpart很好但是每当我点击衍生按钮时,我都会将错误的数据输入gridview。作为示例:循环为我创建了四个按钮,它们在表单上以直线显示。但每当我点击其中一个按钮 - dosnt与其中一个按钮有关时,按钮总是返回最后一个生成按钮的数据。一个更清晰的例子:让我们说列表inputElems看起来像这样:
inputElems [0] .Count - &gt; 2644
inputElems [1] .Count - &gt; 2131
inputElems [2] .Count - &gt; 8467
inputElems [3] .Count - &gt; 5462
当我现在单击第二个按钮时,第二个按钮参数列表的输入应该具有值(发送者,e,2131),对吧?但由于某种原因,最后一个参数与列表中的第4个元素相同,即使我调用了第二个创建的按钮。
我认为它与我有关,总是将最后添加的button_click调用到按钮的事件处理程序,如果是这样,我如何从EventHandler调用不同的点击?
答案 0 :(得分:1)
您可以使用Tag。
,而不是使用EventHandler传递inputElemsE.g。使用方法:
b1.Tag=i;
然后在您的点击事件处理程序中:
public void btn_Click(object sender, EventArgs e)
{
Button button = sender as Button;
DataGridForm window = new DataGridForm(DaysList[int.Parse(button.Tag.ToString())].Elements);
window.Show();
}
答案 1 :(得分:1)
问题是for
循环超出了范围,因此无法为您提供所需的数据。更直接的方法可能是这样的:
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.Tag = DaysList[i].Elements;
b1.Click += btn_Click;
stepCounter += 200;
}
}
}
然后在btn_Click
中,执行此操作:
public void btn_Click(object sender, EventArgs e)
{
Button button = sender as Button;
int inputElems = (List<EventElement>)button.Tag;
DataGridForm window = new DataGridForm(inputElems);
window.Show();
}