[英]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.