事件处理程序与C#无法完美配合

时间:2012-02-27 08:19:50

标签: c# asp.net event-handling

我正在动态创建每个选择下拉列表的按钮。

使用以下代码,我将为每个按钮添加一个事件处理程序。

 button.Click += new System.EventHandler(button_Click);

 PlaceHolder1.Controls.Add(button);

 private void button_Click(object sender, EventArgs e)
 {
     //Do something...
     Response.Write("hello");
 }

但不幸的是,它没有触发该事件,并给我一个错误,如下所示

  

button_Click'Index.button_Click(object,System.EventArgs)'是一个'方法',在给定的上下文中无效

我该如何处理?

protected void DropDownList1_SelectedIndexChanged1(object sender, EventArgs e)
{
    ScriptManager.RegisterStartupScript(this, typeof(Page), "Close", "javascript:OpenPopUp1();", true);

    if (Session["filter"] == DropDownList1.SelectedValue)
    {

    }
    else
    {
        if (Session["filter"] == "")
        {
            Session["filter"] = DropDownList1.SelectedValue + ":";
        }
        else
        {
            Session["filter"] = DropDownList1.SelectedValue + ":" + Session["filter"];
        }
    }

    string asd = Session["filter"].ToString();

    string[] split = asd.Split(':');

    DropDownList1.Items.RemoveAt(DropDownList1.SelectedIndex);
    for (int i = 0; i < split.Count(); i++)
    {
        string filter = split[i].ToString();

        Button button = new Button();
        button.Text = split[i].ToString();
        button.ID = split[i].ToString();
        button.Attributes.Add("onclick", "remove(" + split[i].ToString() + ")");
        button.Click += new System.EventHandler(button_Click);
        PlaceHolder1.Controls.Add(button);
    }
}

以上显示了dropdown-selected index的整个代码。

2 个答案:

答案 0 :(得分:0)

 button.Click += new System.EventHandler(button_Click); 
        PlaceHolder1.Controls.Add(button); 

 } // <-- end your current method with a curly brace


 // Now start a new method
  private void button_Click(object sender, EventArgs e) 
    { 
        //do something... 
        Response.Write("hello"); 
    } 

答案 1 :(得分:0)

很难说你要追求的是什么,因为这里有很多问题。由于动态生成的按钮是在下拉列表的SelectedIndexChanged事件处理程序中创建的,因此它们在下一次回发时不会存在,也不会存在事件绑定。这意味着它们可以显示在页面上,但单击它们将不会执行任何操作。
其次,由于您将SelectedValue存储到Session,然后使用该值设置Button ID,因此如果用户返回页面,您将创建具有重复ID的按钮。 (我注意到您在选择后删除列表项,但如果用户刷新页面,它会返回,而会话对象将保持填充。)
最后一个奇怪的是,我无法找到您的特定异常处理的位置,也无法重现它。您编写的是哪个版本的.NET?您是否在代码隐藏的任何地方调用按钮单击事件?
现在,所有人都说,我提供以下修复(或至少改进):

    protected void Page_Init(object sender, EventArgs e)
    {
        CreateButtons();
    }
    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        ScriptManager.RegisterStartupScript(this, typeof(Page), "Close", "javascript:OpenPopUp1();", true);

        if (Session["filter"] == DropDownList1.SelectedValue)
        {

        }
        else
        {
            if (Session["filter"] == "")
            {
                Session["filter"] = DropDownList1.SelectedValue + ":";
            }
            else
            {

                Session["filter"] = DropDownList1.SelectedValue + ":" + Session["filter"];
            }
        }
        DropDownList1.Items.RemoveAt(DropDownList1.SelectedIndex);
        CreateButtons();
    }
    private void CreateButtons()
    {
        PlaceHolder1.Controls.Clear();

        if (Session["filter"] != null)
        {
            string asd = Session["filter"].ToString();

            string[] split = asd.Split(':');

            for (int i = 0; i < split.Count(); i++)
            {
                string filter = split[i].ToString();

                Button button = new Button();
                button.Text = split[i].ToString();
                button.ID = split[i].ToString();
                button.Attributes.Add("onclick", "remove(" + split[i].ToString() + ")");
                button.Click += new System.EventHandler(button_Click);
                PlaceHolder1.Controls.Add(button);
            }
        }
    }
    private void button_Click(object sender, EventArgs e)
    {
        //do something...
        Response.Write("hello");
    }