繁体   English   中英

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

[英]Event handler for a dynamically added button

代码:

 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;

    }
    ...
  }

上面的代码向表单添加了一个包含标签,文本框和按钮的面板,一切正常,我的问题是我想处理动态添加的按钮(b)的click事件,在我的事件处理代码中应该可以访问为验证目的而动态添加的TextBox( diaryName ),但是我不知道该怎么做。 我尝试在同一类Form3中添加另一个函数,但是由于文本框t是在button1_Click函数中创建的,因此我无法访问该文本框,那么如何解决这个问题?

我是c#的新手,我有Java背景,所以c#中有什么方法可以声明这样的事件处理程序

    button.addActionListener(new ActionListener() {

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

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

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的封装规则。 其次-您是否认为两次单击原始按钮(向您的处理程序显示的那个按钮)会发生什么?

编辑:当我开始考虑它时,您的方法实际上并不是那么动态。 它可以即时创建这些控件,但是它们绝不是通用的-它是一段静态代码,可以始终产生相同的结果。 因此,在这种情况下,我考虑将新的面板,文本框和按钮作为公共项放在窗体中,然后在方法中对其进行初始化。 最好已经在Visual Studio的设计器中创建它们,使用Visible属性将其隐藏,然后在button1_Click只能更改它们的大小并显示它们。

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

1)因此,在创建新的按钮之后

          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
               }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM