捕获右键单击事件

时间:2013-07-01 13:57:16

标签: c# .net winforms

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

2 个答案:

答案 0 :(得分:1)

您可以使用Tag。

,而不是使用EventHandler传递inputElems

E.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();
}