CheckedChanged EventHandler динамически добавленных флажков, не запускаемых внутри UpdatePanel ретранслятора - PullRequest
2 голосов
/ 15 июля 2010

Я прочитал большинство постов здесь, но не могу понять, почему событие "CheckedChanged" не запускается.Вот моя ситуация.

Я использую повторитель для создания элементов из базы данных.Каждый ReapeaterItem должен включать UpdatePanel, потому что я должен обновить элементы управления внутри UpdatePanel и не хочу перезагрузить всю страницу.Внутри этих динамически генерируемых UpdatePanels (у каждого RepeaterItem есть один) я динамически добавляю до трех флажков (на основе базы данных).Эти флажки должны запускать событие «CheckedChanged», потому что в некоторых случаях я хочу включить / отключить / проверить / снять флажок флажок 1, 2 или 3 на основе бизнес-логики.... Надеюсь, вы дошли до этого.Я добавляю все элементы управления и добавляю EventHandler.Но сгенерированный код не отражает обработчик событий.Я пытался OnItemDataBound, OnItemCreated, PreRender, ... События, чтобы добавить Eventhandler тоже, но я не смог найти CheckBox-Control с идентификатором.

Я полностью потерян с этим и в путииспользовать кнопки вместо флажков.Из того, что я до сих пор читал, является то, что с помощью кнопок я могу использовать CommandName от кнопки и ItemCommand-событие от повторителя, чтобы получить обходной путь, но затем мне нужно каким-то образом отразить «проверку» на странице.

Кстати, каждый Repeater (8) находится внутри элемента управления ajaxtoolkit-accordion.

Здесь я даю код:

aspx-Page

<asp:Repeater ID="RepeaterAccordionPane2" runat="server">
     <ItemTemplate>
          HTML Stuff<%# DataBinder.Eval(Container.DataItem, "Header")%>HTML Stuff<%# DataBinder.Eval(Container.DataItem, "Beschreibung")%></td>
                <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode=Conditional>
                       <ContentTemplate>
                       </ContentTemplate>
                 </asp:UpdatePanel>
                 HTML Stuff
     </ItemTemplate>
</asp:Repeater>

Вот часть Page_Load

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            dvAlleArtikel = new System.Data.DataView(...Database...);

            [... some other code here ...]
            RepeaterAccordionPane2.DataSource = dvAlleArtikel;
            //RepeaterAccordionPane2.ItemCreated +=new RepeaterItemEventHandler(RepeaterAccordionPane2_ItemCreated);
            //RepeaterAccordionPane2.PreRender +=new EventHandler(RepeaterAccordionPane2_PreRender);
            RepeaterAccordionPane2.DataBind();

            int nUpdatePanelIndex = 0;
            foreach (Control crInRepeater in RepeaterAccordionPane2.Controls)
            {
                if (crInRepeater.GetType() == typeof(RepeaterItem))
                {
                    foreach (Control crInRepeaterItem in crInRepeater.Controls)
                    {
                        if (crInRepeaterItem.GetType() == typeof(UpdatePanel))
                        {
                            LiteralControl litTabelleBeginn = new LiteralControl("<table width=\"100%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">");
                            ((UpdatePanel)crInRepeaterItem).ContentTemplateContainer.Controls.Add(litTabelleBeginn);

                            if (dvAlleArtikel[nUpdatePanelIndex]["ArtNr1"].ToString() != "0")
                            {
                                CheckBox CheckBox1 = new CheckBox();
                                CheckBox1.ID = dvAlleArtikel[nUpdatePanelIndex]["ArtNr1"].ToString();
                                CheckBox1.Text = (dvAlleArtikel[nUpdatePanelIndex]["CheckBoxLbl1"].ToString() == "" ? "leer" : dvAlleArtikel[nUpdatePanelIndex]["CheckBoxLbl1"].ToString());
                                CheckBox1.AutoPostBack = true;
                                CheckBox1.CheckedChanged +=new EventHandler(CheckBox1_CheckedChanged);

                                LiteralControl litNeueTabellenZeileBeginn = new LiteralControl("<tr><td width=10><img src=\"images/helper/spacer.gif\" width=\"10\"></td><td height=\"20\">");
                                LiteralControl litNeueTabellenZeileEnde = new LiteralControl("</td><td width=\"100\" height=\"20\">" + dvAlleArtikel[nUpdatePanelIndex]["ArtPrice1"].ToString() + " &euro; </td></tr>");

                                ((UpdatePanel)crInRepeaterItem).ContentTemplateContainer.Controls.Add(litNeueTabellenZeileBeginn);
                                ((UpdatePanel)crInRepeaterItem).ContentTemplateContainer.Controls.Add(CheckBox1);
                                ((UpdatePanel)crInRepeaterItem).ContentTemplateContainer.Controls.Add(litNeueTabellenZeileEnde);
                            }

                            [... some other code here...]

                            LiteralControl litTabelleEnde = new LiteralControl("</table>");
                            ((UpdatePanel)crInRepeaterItem).ContentTemplateContainer.Controls.Add(litTabelleEnde);
                            nUpdatePanelIndex++;
                        }
                    }
                }
            }

Этот код никогда не достигается:

    protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
    {
        int foo = 0;
    }

Это сгенерированный код CheckBox:

<input id="AccordionPane2_content_RepeaterAccordionPane2_ctl00_6200" type="checkbox" name="AccordionPane2_content$RepeaterAccordionPane2$ctl00$6200" onclick="javascript:setTimeout('__doPostBack(\'AccordionPane2_content$RepeaterAccordionPane2$ctl00$6200\',\'\')', 0)" />

Событие генерируется, но когда я нажимаю флажок, все содержимое UpdatePanel исчезает и CheckedChanged-EventHandler не запускается.

Что я делаю не так?

Спасибо всем советам, я действительнозастрял.

мк

1 Ответ

4 голосов
/ 15 июля 2010

При первой загрузке страницы вы добавляете все флажки в коллекцию Controls, и они отображаются.Когда вы выполняете обратную передачу (через AutoPostBack CheckBox), вы получаете чек if(!IsPostBack), который не позволяет добавлять флажки в коллекцию Controls при обратной передаче.Из-за этого вы не увидите элементы управления и страницу, и когда жизненный цикл страницы пытается вызвать события (что происходит ПОСЛЕ Page_Load), элементы управления, которые создали события, больше не существуют.

Вам нужно будет провести рефакторинг вашего метода Page_Load, чтобы он выполнял две вещи - 1, независимо от значения IsPostBack, связывал повторители и создавал динамические элементы управления.2, если IsPostBack==false, то есть начальная загрузка, то установите значения динамических элементов управления.Вы не хотите устанавливать значения динамических элементов управления, когда IsPostBack==true, потому что тогда вы потеряете значения, введенные пользователем.

также, просто примечание:

if (crInRepeater.GetType() == typeof(RepeaterItem))

можетпереписать как:

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