动态创建的LinkBut​​ton OnClick事件未在PostBack上触发

时间:2015-10-23 23:17:30

标签: c# asp.net

我是ASP的新手,我已经被困在一个问题大约一个星期了。问题可能与Asp页面生命周期有关,但我无法找到如何解决这个问题。问题是当我单击LinkBut​​ton(在第一次页面加载时创建)时,从不调用skipto(..),这意味着LinkBut​​tons不会被渲染。

Sample Code below:

// Code Behind
protected void Page_Load(object sender, EventArgs e)
{
    loadData();
    if (!Page.IsPostBack)
    {           
        skiptof();
    }
}

public void loadData() {
    // Loads from database
}

public void skipto(object sender, EventArgs e)
{
    LinkButton btn = sender as LinkButton;
        if (btn != null)
        {
            if (btn.CommandArgument != null && btn.CommandArgument != "0")
            {
                int currPage = 1;
                int.TryParse(btn.CommandArgument, out currPage);
                skiptof(currPage);
            }
        }
}

 public void skiptof(int currPage = 1)
 {
    int lastPage = // calculate from LoadData()
    string pageDisabled = "";
    // pages
    HtmlGenericControl ul = new HtmlGenericControl("ul");
    while (pageCount <= lastPage)
    {
            // Disable the current page
        pageDisabled = pageCount == currPage ? " class=\"disabled\"" : "";
        HtmlGenericControl pagesli = new HtmlGenericControl("li");
        if (pageDisabled != "")
        {
            pagesli.Attributes.Add("class", "disabled");
        }
        LinkButton pagesPageLink = new LinkButton();
        pagesPageLink.Click += new EventHandler(skipto);
        pagesPageLink.CommandArgument = pageCount.ToString();
        pagesPageLink.Text = pageCount.ToString();
        pagesli.Controls.Add(pagesPageLink);
        ul.Controls.Add(pagesli);
        pageCount += 1;
    }
    pagination.Controls.Add(ul);
 }


 // page 
<asp:ScriptManager ID="ScriptManager1" runat="server"/>
<asp:UpdatePanel runat="server" id="UpdatePanel" UpdateMode="Conditional">
    <ContentTemplate>
        <div id="details" runat="server"></div>
        <div class="pagination text-center" id="pagination" runat="server"></div>
    </ContentTemplate>
</asp:UpdatePanel>

1 个答案:

答案 0 :(得分:1)

你的问题是:

你没有在回发时再次绑定数据,我已经修改了你的代码,有几个问题:

    方法skipof中的
  1. public void skiptof(int currPage = 1) {
        //Clear the controls here then add them again
      pagination.Controls.Clear();
      int lastPage = // calculate from LoadData()
      string pageDisabled = "";
      HtmlGenericControl ul = new HtmlGenericControl("ul");
      while (pageCount <= lastPage) {
          // Disable the current page
          pageDisabled = pageCount == currPage ? " class=\"disabled\"" : "";
          HtmlGenericControl pagesli = new HtmlGenericControl("li");
          if (pageDisabled != "") {
              pagesli.Attributes.Add("class", "disabled");
          }
          LinkButton pagesPageLink = new LinkButton();
            // you can directly assign the method to be called here, there is no need to create a new EventHandler
          pagesPageLink.Click += PagesPageLink_Click;
          pagesPageLink.CommandArgument = pageCount.ToString();
          pagesPageLink.Text = pageCount.ToString();
          pagesli.Controls.Add(pagesPageLink);
          ul.Controls.Add(pagesli);
          pageCount += 1;
      }
      pagination.Controls.Add(ul);
     }
    
    1. 你没有在回发中再次绑定数据,所以我修改了它: 页面加载:
    2.    protected void Page_Load(object sender, EventArgs e) {
              //Remove the Page.IsPostBack checking
            skiptof();
         }
      

      请注意,您动态添加的控件将被清除,您必须在回发时再次添加它以避免数据丢失。

      然后,您将能够获得PagesPageLink_Click事件的值: enter image description here

      整个样本在这里: http://pastie.org/10503291