Динамически создаваемый DropDownList в списке панелей не позволяет обрабатывать события - PullRequest
0 голосов
/ 24 февраля 2012

Я пытаюсь создать пользовательский интерфейс, который создает строки, которые могут быть динамически заполнены.

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

Кнопка «Удалить» имеет привязку к событию OnClick, что позволяет мне удалить эту конкретную панель.

У меня возникла проблема при попытке привязать SelectedIndexChanged EventHandler к моему DropDownList, которого нет.

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

Я не прошу и не ожидаю простого «Добавить или изменить это в коде». Я действительно хочу понять, где я иду не так, извините, что так много просил! : S

protected void Page_Load(object sender, EventArgs e)
{
    //Showing this for the the poster that asked.
    if (!IsPostBack)
    {
        GetClustersFromDB(user);
        BindGrid();
        BindState();            
    }
    if (Session["persistControls"] != null)
    {
        persistControls = (List<Panel>)Session["persistControls"];
        int count = 0;

        foreach (Panel dynamicControl in persistControls)
        {
            DropDownList list = new DropDownList();
            list.ID = "list" + count;
            list.SelectedIndexChanged += new EventHandler(list_SelectedIndexChanged);
            list.AutoPostBack = true;
            list.Items.Add(new ListItem("", "0"));
            list.Items.Add(new ListItem("Title", "1"));

            dynamicControl.ID = "panel" + count;

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

            myPlaceholder.Controls.Add(dynamicControl);
            myPlaceholder.Controls.Add(btnRemove);
            count++;
        }
    }
}

protected void btnAdd_Click(object sender, EventArgs e)
{
    try
    {
        DropDownList list = new DropDownList();
        list.SelectedIndexChanged += new EventHandler(list_SelectedIndexChanged);
        list.AutoPostBack = true;
        list.Items.Add(new ListItem("", "0"));
        list.Items.Add(new ListItem("Title", "1"));

        Panel panelContainer = new Panel();
        panelContainer.ID = "panel" + persistControls.Count;

        panelContainer.Controls.Add(list);

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

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

protected void list_SelectedIndexChanged(object sender, EventArgs e)
{
    throw new NotImplementedException();
}

//aspx File Snippets
<asp:Button ID="btnAdd" runat="server" Text="Add Control" onclick="btnAdd_Click" />
<asp:Button ID="btnClear" runat="server" Text="Reset" onclick="btnClear_Click"/>
<asp:PlaceHolder ID="myPlaceholder" runat="server"></asp:PlaceHolder>

Ответы [ 2 ]

0 голосов
/ 24 февраля 2012

Не думаю, что это сработает.Если вы создаете выпадающие списки в событии PageLoad, состояние просмотра никогда не будет привязано к нему, и вы никогда не увидите вариант, выбранный пользователем.

Вы должны создать элементы управления OnInit, тогда когда PostBack происходитДанные ViewState будут привязаны к элементу управления, и вы сможете получить к нему доступ.

0 голосов
/ 24 февраля 2012

Поддержание контроля как это - настоящая боль. Вы можете попробовать альтернативный подход:

  1. Создайте (маленький) класс, который инкапсулирует данные, которые вы хотите отобразить на каждой панели.
  2. Поддерживайте List этих объектов в сеансе.
  3. Используйте <asp:Repeater> для отображения элементов, привязав их к вашему списку данных.
  4. В повторителе ItemTemplate вы можете записать свой <asp:Panel>, который может содержать <asp:DropDownList>. Используйте свойство ItemCommand раскрывающегося списка, чтобы связать его с обработчиком событий на стороне сервера. Точно так же вы можете поместить <asp:Button> в шаблон и связать свойство ItemCommand этого с другим обработчиком событий на стороне сервера.
  5. Когда вы нажимаете кнопку Добавить, вы отправляете сообщение обратно на сервер, добавляете его в свой список, сохраняете его в сеансе, повторно привязываете повторитель.
  6. Когда вы нажимаете «Удалить», вы отправляете сообщение обратно на сервер, удаляете элемент из списка, сохраняете его в сеансе, повторно привязываете повторитель.

Таким образом, ASP.Net обрабатывает все создание элемента управления для вас. Однако, если вы действительно хотите сделать все это самостоятельно, тогда обязательно прочитайте эту запись в блоге Infinities Loop .

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