C#自动生成EventHandler

时间:2013-03-03 16:32:46

标签: c# event-handling

我有一个逐行读取文件的程序,并将该字符串放在tableLayoutPanel中,但是如何为tableLayoutPanel中的每个标签创建一个eventHandler?

以下是我正在使用的代码:

Label label = new Label();
label.Name = "MyNewLabel";
label.ForeColor = Color.Red;
label.Text = line;
tableLayoutPanel1.RowCount++;
tableLayoutPanel1.RowStyles.Add(new RowStyle());
tableLayoutPanel1.Controls.Add(label, 0, tableLayoutPanel1.RowCount + 1);

每个标签都需要打开一个网页,网址必须是自己的文字。

我已经尝试过了:

foreach (Control x in panel1.Controls)
{
label.Click += HandleClick;
}

private void HandleClick(object sender, EventArgs e)
{
messageBox.Show("Hello World!");
}

它不起作用。


新问题:

Jay Walker解决了主要问题,但现在我遇到了另一个问题。并非所有标签都适用于eventHandler。这是主要代码:

string line;
System.IO.StreamReader file = new System.IO.StreamReader("research.dat");
while ((line = file.ReadLine()) != null)
{
    Label label = new Label();
    label.Name = "MyNewLabel";
    label.ForeColor = Color.Red;
    label.Text = line;

    label.Click += HandleClick;

    tableLayoutPanel1.RowCount++;
    tableLayoutPanel1.RowStyles.Add(new RowStyle());
    tableLayoutPanel1.Controls.Add(label, 0, tableLayoutPanel1.RowCount + 1);
}

结合:

    private void HandleClick(object sender, EventArgs e)
    {
        ((Control)sender).BackColor = Color.White;
    }

某些标签背景更改为白色,而相同则不会。

3 个答案:

答案 0 :(得分:2)

为什么不在创建标签时添加处理程序,而不是稍后通过控件循环(您可能应该引用x而不是label

Label label = new Label();
label.Name = "MyNewLabel";
label.ForeColor = Color.Red;
label.Text = line;
// add the handler here
label.Click += HandleClick;
tableLayoutPanel1.RowCount++;
tableLayoutPanel1.RowStyles.Add(new RowStyle());
tableLayoutPanel1.Controls.Add(label, 0, tableLayoutPanel1.RowCount + 1);

答案 1 :(得分:0)

执行

label.Click += Eventhandler;

创建标签后

答案 2 :(得分:0)

如果你真的希望它在foreach循环中做:

foreach (Control c in panel1.Controls) {
    if (c.Type ==  typeof(Label)) { //or something like that...
          c.Click += HandleClick;
    }
}