【问题标题】:how to execute click event on dynamically created button in c#.net如何在c#.net中动态创建的按钮上执行点击事件
【发布时间】:2013-01-20 05:42:30
【问题描述】:

我正在尝试构建一个应用程序,用户可以在其中选择类别并根据它显示其子类别,这些子类别是按钮,是动态创建的。

现在,由于按钮是动态创建的,所以我很困惑如何在 button_click 事件下编写代码,因为我不知道有多少子类别。

那么有什么方法可以执行特定按钮的点击事件,以便执行某些命令?

已编辑

这是我尝试过的代码

Button btnDynamicButton = new Button();

private void btnclick_Click(object sender, EventArgs e)
{
label2.Text = btnDynamicButton.Text;
}
private void btnappetizer_Click(object sender, EventArgs e)
{
 groupBox2.Visible =false;
 DataTable dt = new DataTable();
 dt = itemmasterbl.SelectallrecordFromtblItem(btnappetizer.Text);
 for (int i = 0; i < dt.Rows.Count; i++)
 {
  string name = "Appetizer" + DynamicButtonCount;
  Button btnDynamicButton1 = new Button();
  btnDynamicButton1.Name = name;
  btnDynamicButton1.Text = name;
  btnDynamicButton1.Size =
  new System.Drawing.Size(150, 30);
  btnDynamicButton1.Location =
  new System.Drawing.Point(180, DynamicButtonCount * 30);
  btnDynamicButton1.Click +=new EventHandler(btnclick_Click);<br>
  Controls.Add(btnDynamicButton1);
  DynamicButtonCount++;
  btnDynamicButton = btnDynamicButton1;
  }
 }

一旦我这样做,它会根据 itemmaster DB 中开胃菜下的值的数量创建三个按钮,但是一旦我点击三个按钮中的任何一个,标签只会显示最后一个按钮文本,因为在最后一行我有:

btnDynamicButton = btnDynamicButton1;

哪个按钮信息会持续,但我想要我按下哪个按钮,标签应该显示相应的文本。我怎样才能做到这一点。

【问题讨论】:

  • 这是什么 UI 框架?例如,在 winforms 中有PerformClick()。我还想知道您的意思是“我如何订阅Click 事件?”,而不是“执行点击事件”——在这种情况下,您只需在创建控件后订阅Click 事件我> - newControl.Click += ...。但是,对于复杂的场景,您可能需要使用一些反射
  • 这就是问题我不知道按钮会在那里,所以我该如何编写点击事件?
  • 作为替代方案,您确定这是建模的最佳方法吗?它几乎听起来像是两个列表框的链接集(在第一个列表中选择一个类别,在第二个列表中选择子类别)或树视图。对于大量子类别,您将生成大量按钮,这可能是一个不整洁的界面,也意味着您不能一次对多个子类别执行相同的操作。
  • @Kashif 坦率地说,我怀疑你最好有一个固定的处理程序,并用那个单一的方法做巫术......
  • 很抱歉,它是一个触摸屏应用,所以它就像一个餐厅应用,用户选择开胃菜、主菜、甜点等,其食物菜单显示在它旁边,用户通过点击选择适当的菜单。

标签: c# winforms button


【解决方案1】:

您可以将所有逻辑放入一个处理程序中:

System.Windows.Forms.Button b = new System.Windows.Forms.Button();
b.Click += new EventHandler(b_Click);
//finally insert the button where it needs to be inserted.
...

void b_Click(object sender, EventArgs e)
{
    MessageBox.Show(((System.Windows.Forms.Button)sender).Name + " clicked");
}

您的编辑:

您将按钮的引用存储在字段btnDynamicButton 中。因此,它总是被您创建的最新按钮覆盖。您应该使用字段来引用按钮。单击处理程序的sender 参数包含已单击的按钮元素。参见上面的代码:简单地将sender 转换为Button,你就知道点击了哪个按钮:

private void btnclick_Click(object sender, EventArgs e)
{
   Button btn = (Button)sender
   label2.Text = btn.Text;
}

【讨论】:

  • 我认为它会起作用,只是通过示例对其进行了测试,一旦执行将发布实际应用程序。谢谢
猜你喜欢
  • 2011-09-05
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 2014-01-26
相关资源
最近更新 更多