2012-10-29 60 views
1

我有下面的示例代碼,它使用嵌套的ListView:ASP .NET嵌套的ListView無法識別

<asp:ListView ID="list" runat="server" ItemPlaceholderID="placeHolder" 
     OnItemDataBound="listItemDataBound"> 
    <ItemTemplate> 
     <p><%#Eval("name") %></p> 
     <asp:ListView ID="sublist" runat="server" ItemPlaceholderID="subPlaceHolder"> 
      <ItemTemplate><%#Eval("subName") %></ItemTemplate> 
      <LayoutTemplate> 
       <asp:PlaceHolder ID="subPlaceHolder" runat="server"></asp:PlaceHolder> 
      </LayoutTemplate> 
     </asp:ListView> 
    </ItemTemplate> 
    <LayoutTemplate> 
     <asp:PlaceHolder ID="placeHolder" runat="server"></asp:PlaceHolder> 
    </LayoutTemplate> 
</asp:ListView> 

但嵌套的ListView(子表)不被認爲是在我的腳本代碼的變量,這樣我就可以」訪問它並提供一些數據綁定。當我在主ListView(如DataSource)中添加其他對象時,它也不被識別。 如何訪問嵌套的ListView?

感謝您的任何建議。

+0

你是什麼'腳本代碼'?你的意思是JavaScript嗎? –

+0

不,我的意思是C#服務器端代碼,它處理主列表的OnItemDataBound。嵌套的ListView(子列表)在當前上下文中報告爲未知。 –

+0

您可以顯示您嘗試運行的OnItemDataBound代碼嗎? –

回答

2

ItemTemplate中的控件將被創建多次,每次爲您的數據源中的每個項目創建一次,因此編譯器無法生成單個字段來表示它們。你需要使用FindControl代替:

protected void listItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    var sublist = (ListView)e.Item.FindControl("sublist"); 
    ... 
} 
+0

謝謝,這正是我正在尋找。 –

0

在您OnItemDataBound事件代碼,你就必須做到這一點:

if (e.Item.ItemType == ListViewItemType.DataItem) 
{ 
    ListView sublist = (ListView)e.Item.FindControl("sublist"); 
} 

爲了找到你的嵌套的ListView