2013-07-01 106 views
1

我正在玩winform及其控件,只是发现如何做custommade buttonclicks。但是,有一个问题。我有一个循环,循环遍历元素列表,如果出现一个条件 - 我创建一个按钮,将弹出一个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;} 
} 

事件的clickpart是不错,但每当我点击按钮人丁,我得到了错误的数据到GridView控件。作为示例:该循环为我创建了四个按钮,并且它们呈现在表单上的一条直线上。但是每当我点击其中一个按钮时 - dosnt就会关注其中的哪一个按钮,该按钮总是会返回最后一个产生的按钮的数据。更明显的例子:假设我们已经列表inputElems看起来是这样的:
inputElems [0] .Count之间 - > 2644
inputElems [1] .Count之间 - > 2131
inputElems [2] .Count之间 - > 8467
inputElems [3] .Count - > 5462
当我现在单击第二个按钮时,第二个按钮参数列表的输入应该具有值(sender,e,2131),对不对?但由于某种原因,最后一个参数与列表中的第4个元素相同,即使我调用第二个创建的按钮。

我觉得它跟我总是调用最后一个添加的button_click到按钮的事件处理程序,如果是的话,我怎样从EventHandler调用不同的点击?

+0

在我看来,这个问题是在'ctor'为'DataGridForm',代码在哪里? –

+0

问题出在inputElems没有得到正确的值,而不是在datagrid中 –

+0

这是什么***你的意思是?这是错误的价值吗?如果是这样,编辑你的问题,你得到什么价值与你期望的价值。看,那种信息对帮助解决问题实际上是有用的。 –

回答

1

您可以使用标记,而不是使用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(); 
    } 
+0

是的,这工作! –

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