【问题标题】:Capture the right button click event捕获右键单击事件
【发布时间】:2013-06-28 16:17:32
【问题描述】:

我正在使用 Winforms 及其控件,并且刚刚发现了如何进行自定义按钮单击。但是,有一个问题。我有一个循环,它在元素列表中循环,如果出现条件 - 我正在创建一个会弹出网格视图的按钮。

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

【问题讨论】:

  • 在我看来,问题出在ctor for DataGridForm,那代码在哪里?
  • 问题在于 inputElems 没有得到正确的值,而不是在 datagrid 中
  • 那么究竟是什么意思?它是错误的值吗?如果是这样,请使用您获得的价值与您期望的价值来编辑您的问题。瞧,这类信息实际上有助于解决问题。
  • 会做!,增加例子
  • 更新了,更好了吗?或者您需要更多?

标签: c# .net winforms


【解决方案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();
    }

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多