【发布时间】:2010-06-02 10:09:16
【问题描述】:
我有一个转发器,用于显示动态报告的输出,该报告从页面上的 web 控件中获取标准。
在转发器的 ItemDataBound 方法中,我根据复选框列表中选择的值将控件(用于按列值排序的链接按钮)动态添加到转发器的标题,此时设置链接按钮的 CommandArgument 和 CommandName 属性。
问题是,当点击链接按钮时,它们不会触发 ItemCommand 事件,尽管它们显然已正确创建并添加到标题中(有一些额外的代码来设置 cssClass、文本等,这可以作为预期。)转发器中的第一列标题在标记中设置,并且 itemcommand 事件仅在此正确触发。单击其他列标题时,转发器会按照编程重新绑定,但不会动态重新生成列。
我真的很感谢有人解释我做错了什么 - afaik 我正在按照批准的方式这样做:-(
简化代码如下:
噩梦.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例程的是页面上的单个按钮,上面的代码sn-p中没有显示。)
【问题讨论】:
-
啊,抱歉,我的代码/缩进搞砸了 :-(
-
你介意把它们按正确的顺序放回去吗...只需从每行的最左边写下你的句子,然后在每行代码之前的左边留 5 个空格。会调整的
-
已编辑,希望对您有所帮助。期待您的回复:-)