所以,我有一个表单,其中所有按钮、文本框和标签都是动态生成的
代码:
private void LoadElements()
{
int Y = 30;
int j = 0;
con.Open();
OleDbCommand populate = new OleDbCommand("SELECT * FROM Users", con);
OleDbDataReader reader = populate.ExecuteReader();
while (reader.Read())
{
b = new Button();
b.Text = "Delete";
b.Name = reader["Username"].ToString();
b.BackColor = Color.DarkOrange;
b.ForeColor = Color.Black;
b.Location = new Point(240, Y);
b.FlatStyle = FlatStyle.Flat;
LB.Add(b);
tb1 = new TextBox();
tb1.Location = new Point(10, Y);
TB1.Add(tb1);
tb1.Text = reader["Username"].ToString();
tb2 = new TextBox();
tb2.Location = new Point(120, Y);
tb2.Text = reader["Password"].ToString();
TB2.Add(tb2);
Y += 30;
j++;
}
foreach (Button BTN in LB) // <- this is a globaly declared List<Button>
{
this.Controls.Add(BTN);
BTN.Click += new EventHandler(BTN_Click);
}
foreach (TextBox text1 in TB1) // <= -||- List<TextBox>
{ this.Controls.Add(text1); }
foreach (TextBox text2 in TB2) // -||-
{ this.Controls.Add(text2); }
// MORE CODE UNDER
}
您可能已经注意到,也可能没有注意到,整个表单是一种“ super 管理员”类型的表单,所有用户和密码都从数据库加载到它上面。我希望能够引用创建的按钮,当单击删除按钮时我希望程序进入数据库并搜索“WHERE [Username] LIKE”+ button.Name +“”(因为按钮名称是实际的用户名);我的代码像这样动态创建元素:[名称] [密码] [删除] [文本框 1] [文本框 2] [按钮] 的形式。问题是每当我单击任何按钮时,它只引用最后创建的按钮,我怎样才能创建事件处理程序以便它可以看到每个按钮各自的 .name?
最佳答案
关键代码在事件处理过程中——你没有显示。查看对象发送者参数,并相应地使用它!
void BTN_Click(object sender, EventArgs e)
{
Button b = sender as Button;
if (b!=null)
{
//that's your button, with the properties created in the loop.
}
}
关于c# - 如何为动态创建的按钮(每个按钮)创建 EventHandler C# VS2010,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22939334/