1

我正在使用 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 调用不同的点击?

4

2 回答 2

1

您可以使用 Tag,而不是使用 EventHandler 传递 inputElems。

例如使用:

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();
    }
于 2013-07-01T14:22:49.230 回答
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();
}
于 2013-07-01T14:24:51.653 回答