Обработчик событий не работает идеально с C # - PullRequest
0 голосов
/ 27 февраля 2012

Я динамически создаю кнопки, каждый выбор из выпадающего списка.

С помощью следующего кода я добавляю обработчик событий для каждой кнопки.

 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);
    }
}

Выше показан весь код выпадающего списка.

Ответы [ 2 ]

0 голосов
/ 03 марта 2012

Трудно сказать, что вы собираетесь делать, потому что здесь происходит ряд проблем.Так как ваши динамически сгенерированные кнопки создаются в обработчике событий SelectedIndexChanged вашего выпадающего меню, они не будут существовать и не будут привязываться к событиям при следующей обратной передаче.Это означает, что они могут отображаться на странице, но нажатие на них ничего не изменит.Во-вторых, поскольку вы сохраняете SelectedValue в Session, а затем используете это значение для установки идентификаторов кнопок, вы будете создавать кнопки с дублирующимися идентификаторами, если пользователь когда-нибудь вернется на страницу.(Я заметил, что вы удаляете элемент списка после его выбора, но он вернется, если пользователь обновит страницу, а объект сеанса останется заполненным.)Последняя странность, я не смог найти, где обрабатывается ваше конкретное исключение, и не смог воспроизвести его.Против какой версии .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");
    }
0 голосов
/ 27 февраля 2012
 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"); 
    } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...