【问题标题】:LinkButtons Created Dynamically in a Repeater Don't Fire ItemCommand Event在中继器中动态创建的链接按钮不会触发 ItemCommand 事件
【发布时间】: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 个空格。会调整的
  • 已编辑,希望对您有所帮助。期待您的回复:-)

标签: c# asp.net


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    相关资源
    最近更新 更多