我有一個轉發器,用於顯示從頁面上的webcontrols獲取條件的動態報告的輸出。在轉發器中動態創建的LinkButtons不會觸發ItemCommand事件
在中繼器的的ItemDataBound方法我添加對照(了LinkButton用於通過列值排序)動態到中繼器的基礎上在一個複選框列表,並在該點設置了LinkButton的CommandArgument和的CommandName屬性選擇的值的頭。
問題是,當單擊鏈接按鈕時,它們不會觸發ItemCommand事件,雖然它們顯然被正確創建並添加到標題(還有一些額外的代碼來設置cssClass,文本等,如預期的那樣)。中繼器中的第一列標題在標記中設置,itemcommand事件僅在這一個上正確觸發。當其他列標題被點擊時,中繼器按照編程重新綁定,但列不會被動態地重新生成。
我會很感激別人解釋我在做什麼錯 - 據我所知,我下面做這個:-(的批准方式
簡化的代碼如下:
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例程是頁面上的單個按鈕,未在上面的代碼片段中顯示。)
唉,對不起,我的代碼/縮進搞得一團糟:-( – 5arx 2010-06-02 10:28:38
你會介意把它們放回正確的順序嗎......只需在每行的最左邊寫下你的句子,並在每一行前留下5個空格將會被調整 – 2010-06-02 10:41:12
已編輯,希望對您有所幫助。期待您的回覆:-) – 5arx 2010-06-02 10:54:57