2009-09-28 52 views
0

我有一箇中繼器控件,可以從SqlReader生成鏈接列表。我試圖在每個鏈接旁邊創建一個按鈕,以允許用戶刪除該鏈接。我最初的想法是在下面的Item模板中使用<%#Eval(「URL」)%>表達式。然而,ItemCommand方法中的CommandArgument總是回到空。SqlReader,Repeater控件和CommandArgument問題

<asp:Repeater ID="rptLinks" runat="server" onitemdatabound="rptLinks_ItemDataBound" 
       onitemcommand="rptLinks_ItemCommand"> 
<ItemTemplate><a href="<%# DataBinder.Eval(Container.DataItem, "URL") %>" target="_blank"><%# DataBinder.Eval(Container.DataItem, "URL") %></a><asp:ImageButton visible="false" ID="btnDeleteLink" runat="server" ImageUrl="/Images/DeleteIcon.gif" CommandName="DELETE" CommmandArgument=<%#Eval("URL") %> /> 
</ItemTemplate> 
<SeparatorTemplate><br /></SeparatorTemplate> 
    </asp:Repeater> 

我想接下來的事情是使用ItemDataBound事件以編程方式設置CommandArgument,但我想不出什麼鑄就e.Item.DataItem強制轉換成這樣我就可以參考[「URL」 ]項目。

protected void rptLinks_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    ImageButton btnDelete; 
    btnDelete = (ImageButton) e.Item.FindControl("btnDeleteLink"); 
    if (btnDelete != null) 
    { 
     btnDelete.Visible = (bool)ViewState["LinkEditing"]; 

     string URL = ((WhatTypeGoesHere)(e.Item.DataItem))["URL"].ToString(); 
     btnDelete.CommandArgument = URL; 

    } 
} 

回答

3

,就可以把DataItem任何在你的讀者的產業鏈實現IDataRecord的類:

// You could also cast to SqlDataReader, DbDataReader, or IDataReader 
string URL = ((IDataRecord)(e.Item.DataItem))["URL"].ToString(); 

數據的讀者是有點混亂,因爲從DbDataReader繼承的對象既可用作行動一個數據源(通過執行IEnumerable)和代表數據的對象(通過執行IDataRecord)。

IDataRecord接口提供對數據讀取器記錄的列值(通過Item屬性和各種Get *方法)的訪問。

換句話說,就像你綁定到一個IEnumerable<IDataRecord>(雖然不是真的,因爲DbDataReader實現IEnumerable的非通用版本)。

+0

只是一個評論: 在不知道數據源的類型的情況下,是否有可能得到[「URL」]值?假設將來我想將數據源更改爲數據表或XML結構,是不是有辦法編寫ItemDataBound代碼,因此它是不可知的,並且可以用於任何數據源? – Aheho 2009-09-28 17:57:51

+0

更新了我的回答,解釋了爲什麼這裏沒有問題 - 基本上,您並不是將您的ItemDataBound代碼綁定到數據源,而是綁定到您的對象。 – 2009-09-28 18:36:56