2010-06-02 60 views
1

我有一個轉發器,用於顯示從頁面上的webcontrols獲取條件的動態報告的輸出。在轉發器中動態創建的LinkBut​​tons不會觸發ItemCommand事件

在中繼器的的ItemDataBound方法我添加對照(了LinkBut​​ton用於通過列值排序)動態到中繼器的基礎上在一個複選框列表,並在該點設置了LinkBut​​ton的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例程是頁面上的單個按鈕,未在上面的代碼片段中顯示。)

+0

唉,對不起,我的代碼/縮進搞得一團糟:-( – 5arx 2010-06-02 10:28:38

+0

你會介意把它們放回正確的順序嗎......只需在每行的最左邊寫下你的句子,並在每一行前留下5個空格將會被調整 – 2010-06-02 10:41:12

+0

已編輯,希望對您有所幫助。期待您的回覆:-) – 5arx 2010-06-02 10:54:57

回答

0

我的猜測是,因爲您的動態創建的鏈接按鈕是在ItemDataBound事件中創建的,所以它們不會在回發時重新創建。由於看起來創建按鈕的標準並不基於中繼器數據(單獨的複選框列表),因此您可能會將按鈕的創建移動到事件中,並在回發時觸發。

我不知道在哪裏建議你調用按鈕創建代碼 - > Page_Load也許與一些條件邏輯?

相關問題