2016-09-12 2 views
1

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

Однако, когда я нажимаю на сгенерированный элемент управления, вместо того, чтобы фактически запускать триггер, моя страница делает обратную передачу и никогда не попадает в точку останова, которую я ожидал бы, вместо этого она запускает только события загрузки страницы/страницы.

Что мне не хватает?

default.aspx

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Test._Default" %> 

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server"> 

    <asp:Button ID="add" Text="add" runat="server" OnClick="add_Click"/> 
    <asp:updatepanel runat="server" id="test" ChildrenAsTriggers ="false" UpdateMode="Conditional"> 
     <ContentTemplate></ContentTemplate> 

    </asp:updatepanel> 

</asp:Content> 

Default.aspx.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace Test 
{ 
    public partial class _Default : Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     protected void add_Click(object sender, EventArgs e) 
     { 
      var container = test.ContentTemplateContainer; 
      container.Controls.Clear(); 


      Literal literal = new Literal(); 
      literal.Text = DateTime.Now.ToString(); 
      literal.ID = DateTime.Now.Ticks.ToString(); 
      container.Controls.Add(literal); 

      Button btn = new Button(); 
      btn.Text = "123"; 
      btn.Click += new EventHandler(btnClick); 
      container.Controls.Add(btn); 

      AsyncPostBackTrigger trigger = new AsyncPostBackTrigger(); 
      trigger.ControlID = btn.UniqueID; 
      trigger.EventName = "Click"; 
      test.Triggers.Add(trigger); 


     } 

     protected void btnClick(object sender, EventArgs e) { 
      System.Diagnostics.Debugger.Break(); //never gets hit 
      var abc = 16; 
     } 
    } 
} 

ответ

2

Кнопка никогда не попадает btnClick, потому что кнопка не существует. Вы создаете кнопку при нажатии кнопки, но она потеряна в PostBack.

Добавленные элементы управления Dynamicly всегда должны быть добавлены снова для каждого действия PostBack в обработчике событий Page_Load или они исчезнут со страницы. Но поскольку вы используете UpdatePanel, все еще выглядит, что они присутствуют.

Попробуйте это ниже, и вы увидите, что на этот раз нажатие кнопки действительно работает.

protected void Page_Load(object sender, EventArgs e) 
    { 
     var container = testje.ContentTemplateContainer; 
     container.Controls.Clear(); 

     Button btn = new Button(); 
     btn.Text = "123"; 
     btn.Click += new EventHandler(btnClick); 
     container.Controls.Add(btn); 
    } 

Если вы хотите добавить более чем один набор литералов и кнопки с add_Click вам нужно сохранить количество кликов в ViewState и создать функцию, которая закругляется счетчик в ViewState при перезагрузке страницы.

Вот пример того, как он должен работать.

//declare global integer 
    int controlCount = 0; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     //check if the viewstate exists 
     if (ViewState["controlCount"] != null) 
     { 
      try 
      { 
       //convert viewstate to int 
       controlCount = Convert.ToInt32(ViewState["controlCount"]); 
      } 
      catch 
      { 
      } 
     } 
     //call the funcion to add the controls on every page load 
     addControls(); 
    } 


    protected void add_Click(object sender, EventArgs e) 
    { 
     //pretty obvious what this does... 
     controlCount++; 
     addControls(); 
    } 


    private void addControls() 
    { 
     var container = testje.ContentTemplateContainer; 
     container.Controls.Clear(); 

     //loop the currect control count 
     for (int i = 0; i < controlCount; i++) 
     { 
      Literal literal = new Literal(); 
      literal.Text = "Literal " + i; 
      literal.ID = "myLiteral_" + i; 
      container.Controls.Add(literal); 

      Button btn = new Button(); 
      btn.Text = "Button " + i; 
      btn.ID = "myButton_" + i; 
      btn.Click += new EventHandler(btnClick); 
      container.Controls.Add(btn); 
     } 

     //set the viewstate again with the new control count 
     ViewState["controlCount"] = controlCount; 
    } 


    protected void btnClick(object sender, EventArgs e) 
    { 
     //cast the sender as a button 
     Button btn = sender as Button; 

     //split the ID to get the count 
     string [] btnNr = btn.ID.Split('_'); 

     //find the literal that goes with the clicked button 
     Literal literal = testje.FindControl("myLiteral_" + btnNr[1]) as Literal; 

     //alert the literal text 
     ScriptManager.RegisterStartupScript(Page, Page.GetType(), "doPopup", "alert('" + literal.Text + "')", true); 
    } 
Смежные вопросы