在Repeater中动态创建的LinkBut​​tons不要触发ItemCommand事件

时间:2010-06-02 10:09:17

标签: c# asp.net

我有一个转发器,用于显示动态报告的输出,该报告从网页上的webcontrols中获取标准。

在转发器的ItemDataBound方法中,我根据复选框列表中选择的值动态地将控件(按列值排序的链接按钮)添加到转发器的标头,此时设置链接按钮的CommandArgument和CommandName属性。

问题在于,当单击链接按钮时,它们不会触发ItemCommand事件,尽管它们显然已正确创建并添加到标题中(还有一些其他代码可用于设置cssClass,文本等,这可用作预期。)转发器中的第一个列标头在标记中设置,而itemcommand事件仅在此标记上正确触发。单击其他列标题时,转发器将按照编程重新绑定,但不会动态重新生成列。

我真的很感激有人解释我做错了什么 - afaik我遵循批准的方式: - (

简化代码如下:

Nightmare.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>

Nightmare.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());
}

(唯一可以调用runreport例程的是页面上的一个按钮,上面的代码片段中没有显示。)

1 个答案:

答案 0 :(得分:0)

我的猜测是,因为动态创建的链接按钮是在ItemDataBound事件中创建的,所以它们不会在回发时重新创建。由于看起来创建按钮的标准不是基于转发器数据(单独的复选框列表),因此您可以将按钮的创建移动到也将在回发时触发的事件。

我不确定在哪里建议您调用按钮创建代码 - &gt; Page_Load可能有一些条件逻辑吗?