使用c.Click + = handle_click时创建异常;

时间:2016-04-04 19:43:02

标签: c#

我正在使用此代码:

foreach (Control c in this.Controls)
{
  Button btn = c as Button;
  {
  if (c == null)
    continue;

  c.Click += handle_click;
  }

void handle_click(object sender, EventArgs e)
{
  Form1 ss = new Form1();
  ss.label1.Text = (sender as Button).Text;
  ss.ShowDialog();
}

但代码会影响我的所有Form元素。示例我的所有按钮。如何为一个按钮创建例外?我通过创建一个面板并将我的按钮放在里面来管理它,但是当我点击面板时,我收到以下错误消息:

" NullReferenceExeption未处理" "对象引用未设置为对象的实例"

为什么会这样?

1 个答案:

答案 0 :(得分:4)

一个问题在这里:

  Button btn = c as Button;
  {
  if (c == null)  <-- should be if(btn == null)
    continue;

因此,您要将事件处理程序分配给每个控件,而不仅仅是按钮。然后,当您尝试将发件人转发到事件处理程序中的Button时,您将获得一个空值。

您还可以在事件处理程序中支持事件处理:

void handle_click(object sender, EventArgs e)
{
  var button = (sender as Button);
  if(button == null)
  {
      //throw an exception?  Show an error message? Ignore silently?
  }
  Form1 ss = new Form1();
  ss.label1.Text = button.Text;
  ss.ShowDialog();
}