【问题标题】:Dynamically created LinkButton OnClick Event not firing on PostBack动态创建的 LinkBut​​ton OnClick 事件未在 PostBack 上触发
【发布时间】:2015-10-24 14:45:52
【问题描述】:

我对 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>

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    你的问题是:

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

    1. 在方法skipof中:
    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. 你没有在回发中再次绑定数据,所以我修改了一下: 页面加载:
       protected void Page_Load(object sender, EventArgs e) {
            //Remove the Page.IsPostBack checking
          skiptof();
       }
    

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

    然后您将能够获取 PagesPageLink_Click 事件的值:

    整个示例在这里: http://pastie.org/10503291

    【讨论】:

    • 谢谢,这确实解决了 LinkBut​​tons 无法在 PostBack 上呈现的问题,但它似乎没有按预期工作。例如如果我设置 lastPage = 3,在第一个页面加载时,3 个链接按钮会在禁用第一个按钮的情况下呈现(因为它是 currPage),如果我点击第二个链接按钮,所有 3 个按钮都会再次正确呈现,同时禁用按钮 2(因为它现在是 currPage ) 但如果我现在单击第三个 LinkBut​​ton,则不会触发 Click 事件,因此不会禁用第三个 LinkBut​​ton,而是禁用第一个。
    • 对不起,我不太明白你的意思……但你可以尝试调试看看为什么……
    • 好的,我设法解决了这个问题,它似乎动态创建的控件需要在每次回发时分配一个唯一的 ID。感谢您对我最初的问题的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多