动态添加按钮的事件处理程序

时间:2014-06-18 09:46:24

标签: c# event-handling

代码:

 public partial class Form3 : Form
 {
    ...
    ...
    private void button1_Click(object sender, EventArgs e)
    {
        Panel p = new Panel();
        TextBox diaryName = new TextBox();
        Button b = new Button();
        Label l = new Label();

        diaryName.Font = new Font("Consolas", 12, FontStyle.Bold);
        b.Font = buttonFont;
        l.Font = buttonFont;
        b.BackColor = Color.Wheat;

        l.Text = "Diary Name : ";
        b.Text = "Add Diary";
        Point lbl = l.Location;
        diaryName.Location = new Point(l.Location.X + l.Width + 5, lbl.Y);
        Point txtbox = diaryName.Location;
        b.Location = new Point(txtbox.X + diaryName.Width + 20, txtbox.Y);
        p.Controls.Add(l);
        p.Controls.Add(diaryName);
        p.Controls.Add(b);
        p.Location = new Point(12,272);
        p.Size = new Size(20 + 20 + 20 + diaryName.Width + l.Width + b.Width, diaryName.Height);
        // I need help here..
        // b.Click += new EventHandler(); ???
        this.Controls.Add(p);
        this.Height += 50;
        this.Width += 30;
        this.FormBorderStyle = FormBorderStyle.Fixed3D;

    }
    ...
  }

上面的代码添加了一个面板,其中包含一个标签,一个textBox和一个按钮到表单,这一切都正常,我的问题是我想处理动态添加按钮的点击事件(b) ,在我的事件处理代码中,我应该能够访问动态添加的TextBox( diaryName )以进行验证,但我不知道该怎么做。我尝试在同一个类Form3中添加另一个函数,但由于textbox t是在button1_Click函数中创建的,我无法访问文本框,所以我该如何解决这个问题?

我是c#的新手,我有Java背景,所以在c#中有任何方式来声明像这样的事件处理程序

    button.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e)
    {
        System.out.println("You clicked the button");
    }
});

2 个答案:

答案 0 :(得分:1)

您可以通过这种方式轻松地为按钮事件分配处理程序:

b.Click += new EventHandler(newButtonClick);

其中

protected void newButtonClick(object sender, EventArgs e)
{
    //Access your textbox like this
    var myTextBox = this.Controls.OfType<TextBox>().FirstOrDefault(tb=>tb.Name == "diaryName");
    if(myTextBox!=null)
    {
        //rest of your code here
    }
}

然而,这是一种糟糕的做法。您的按钮将在很大程度上取决于在外部动态创建的对象 - 这会破坏OOP的封装规则。其次 - 您是否认为如果您点击原始按钮(显示处理程序的按钮)两次会发生什么?

编辑:当我开始思考它时,你的方法真的不那么动态。它可以动态创建这些控件,但它们不以任何方式通用 - 它是一段静态代码,它始终产生相同的结果。因此,在这种情况下,我考虑将新的面板,文本框和按钮作为公共项目放在表单中,然后在方法中初始化它们。 在视觉工作室的设计师中创建它们甚至更好,使用Visible属性隐藏它们,然后在button1_Click中,您只能更改它们的大小并显示它们。

答案 1 :(得分:0)

好的,需要添加按钮点击事件,

1)因此,在您创建新Button

之后
          Button b = new Button();

2)接下来为该

添加点击事件
          b.Click += new EventHandler(b_Click);

3)然后在代码中为click事件编写实际的函数体

           void b_Click(object sender, EventArgs e)
               {
                  //Your code for click operation
               }