Ведение списка панелей, содержащих элементы управления. Потеря обработчиков событий - PullRequest
1 голос
/ 29 февраля 2012

В верхней части моей страницы есть две кнопки «Добавить элемент управления» и «Очистить элементы управления».

При нажатии кнопки «Добавить» запускается функция, которая создает новую панель и новый DropDownList.

Я назначаю DropDownList обработчик событий для SelectedIndexChanged.

Идея состоит в том, что в зависимости от выбора в моем DropDownList я создам еще один элемент управления на этой панели.

Со временем панель будет содержать некоторые поля, которые я могу выдать в качестве параметров для моего запроса.

Я храню панели в списке панелей, которые воссоздаются при каждой обратной передаче.

Проблема, с которой я столкнулся, заключается в том, что я могу добавить панели, удалить панели и удалить все панели из своего списка, но я НЕ МОГУ, кажется, когда-либо получить срабатывание триггера SelectedIndexChanged ... он никогда не назначается или теряется при каждой обратной передаче.

Я исчерпал свой опыт поиска в Google, и я очень разочарован собой. Я открыт для предложений / исправлений.

Спасибо.

List<Panel> persistControls = new List<Panel>();

protected override void OnInit(EventArgs e)
{
    if (Session["persistControls"] != null)
    {
        persistControls = (List<Panel>)Session["persistControls"];
        int count = 0;

        foreach (Panel dynamicControl in persistControls)
        {
            AddQuestionTypeDropDownList(count);
            dynamicControl.ID = "panel" + count;

            Button btnRemove = new Button();
            btnRemove.Click += new EventHandler(btnDelete_Click);
            btnRemove.Text = "Remove";
            btnRemove.CommandArgument = count.ToString();

            // Pushing to Placeholder
            myPlaceholder.Controls.Add(dynamicControl);
            myPlaceholder.Controls.Add(btnRemove);
            count++;
        }
    }
    base.OnInit(e);
}

// Calls three functions responsible for pulling from the Database and binding the Datagrid.
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        GetClustersFromDatabase(userid);
        BindGrid();
        BindState();            
    }
}

private DropDownList AddQuestionTypeDropDownList(int count)
{
    DropDownList list = new DropDownList();

    list.ID = "list" + count;    
    list.Items.Add(new ListItem("--Select One--", ""));
    list.Items.Add(new ListItem("Title", "1"));
    list.Items.Add(new ListItem("Contact", "2"));
    list.Items.Add(new ListItem("Date Created", "3"));
    list.SelectedIndexChanged += new EventHandler(list_SelectedIndexChanged);
    list.AutoPostBack = true;

    return list;
}

private DropDownList AddQuestionTypeDropDownList()
{
    DropDownList list = new DropDownList();
    list.Items.Add(new ListItem("--Select One--", ""));
    list.Items.Add(new ListItem("Title", "1"));
    list.Items.Add(new ListItem("Contact", "2"));
    list.Items.Add(new ListItem("Date Created", "3"));
    list.SelectedIndexChanged += new EventHandler(list_SelectedIndexChanged);
    list.AutoPostBack = true;

    return list;
}

protected void btnAdd_Click(object sender, EventArgs e)
{
    try
    {
        Panel panelContainer = new Panel();
        panelContainer.ID = "panel" + persistControls.Count;

        panelContainer.Controls.Add(AddQuestionTypeDropDownList());

        Button btnRemove = new Button();
        btnRemove.Click += new EventHandler(btnDelete_Click);
        btnRemove.Text = "Remove";
        btnRemove.CommandArgument = persistControls.Count.ToString();

        myPlaceholder.Controls.Add(panelContainer); // Pushes the Panel to the page.
        persistControls.Add(panelContainer);// Adds our Panel to the Control list

        myPlaceholder.Controls.Add(btnRemove); // Pushes our Button to the page.
        Session["persistControls"] = persistControls; // put it in the session
    }
    catch
    {
        throw;
    }
}

private void list_SelectedIndexChanged(object sender, EventArgs e)
{
    //I have no code here but thats because I currently can't even get it to fire.
    try
    {

    }
    catch
    {
        throw;
    }
}

protected void btnClear_Click(object sender, EventArgs e)
{
    try
    {
        Session["persistControls"] = null;
        Response.Redirect(Request.Url.ToString());
    }
    catch
    {
        throw;
    }
}

protected void btnDelete_Click(object sender, EventArgs e)
{
    try
    {
        int deleteThisOne = int.Parse(((Button)sender).CommandArgument);
        persistControls.Remove(persistControls[deleteThisOne]);
        Session["persistControls"] = persistControls;          
        Response.Redirect(Request.Url.ToString());
    }
    catch
    {
        throw;
    }
}    

1 Ответ

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

Я смог решить эту проблему, просматривая список панелей с помощью foreach и имея вложенный foreach для перебора каждого элемента управления в этой панели. Я проверяю тип элемента управления и фиксирую обработчик событий при каждой обратной передаче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...