代码:
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");
}
});
答案 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
}