代码之家  ›  专栏  ›  技术社区  ›  immutabl

在转发器中动态创建的LinkButtons不触发ItemCommand事件

  •  1
  • immutabl  · 技术社区  · 14 年前

    我有一个转发器,用来显示一个动态报告的输出,它从页面上的网络控件中获取条件。

    问题是,当单击linkbutton时,它们不会触发ItemCommand事件,尽管它们显然被正确地创建并添加到标题中(有一些额外的代码来设置cssClass,repeater中的第一个列标题是在标记中设置的,itemcommand事件仅在此列上正确触发。当单击其他列标题时,repeater会按编程重新绑定,但不会动态地重新生成列。

    如果有人能解释一下我做错了什么,我会非常感激的-虽然我是按照认可的方式来做的:-(

    简化代码如下:

    噩梦.ascx

    <asp:repeater runat="server" id="rptReport" OnItemDataBound="rptResults_ItemDataBound" OnItemCommand="rptResults_ItemCommand" EnableViewState="true">
    <headertemplate>
    <table>
    <tr runat="Server" id="TRDynamicHeader">
    <th>
    <!-- This one works -->
    <asp:Linkbutton runat="server" CommandName="sort" commandArgument='<%# Eval("Name")%?' />
    </th>
    <!-- additional header cells get added dynamically here -->
    </tr>
    </headertemplate>
    <itemTemplate>
    <td><%# Eval("Name")</td>
    ...
    </itemTemplate>
    
    </asp:repeater>
    

    噩梦.ascx.cs

    protected void PageLoad(object sender, eventArgs e){
    if (! isPostback){
    setupGui();//just binds dropdowns etc. to datasources
    }
    }
    
    protected void btnRunReport_Click(...){
    List<ReportLines> lstRep = GetReportLines();
    
    rptReport.DataSource = lstRep;
    repReport.DataBind();
    }
    
    protected void rptReport_ItemDataBound (...){
    if (e.Item.ItemType == ListItemType.Header)
    {
    foreach (ListItem li in chbxListBusFuncs.Items)
    {
    if (li.Selected)               
    {
    th = new HtmlTableCell();
    lb = new LinkButton();
    lb.CssClass = "SortColHeader";
    lb.CommandArgument = li.Text.Replace(" ", "");
    lb.CommandName = "sort";
    lb.Text = li.Text;
    th.Controls.Add(lb);
    
    
    ((HtmlTableRow)e.Item.FindControl("TRDynamicHeader")).Cells.Add(th);
    }
    }
    }
    
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
    //Row level customisations, totals calculations etc.
    
    }
    }
    
    <!-- this only gets called when the 'hardcoded' linkbutton in the markup is clicked.
    protected void rptReport_ItemCommand(object sender, Eventargs e){
    lblDebug.Text = string.Format("Well? What's Happening? -> {0}:{1}", e.CommandName, e.CommandArgument.ToString());
    }
    

    1 回复  |  直到 14 年前
        1
  •  0
  •   HectorMac    14 年前

    我不知道在哪里建议您调用按钮创建代码->页面加载可能有一些条件逻辑?