2011-01-10 3 views
4

Внутри веб-страницы после загрузки я заполняю набор данных двумя таблицами с соотношением между этими таблицами и затем загружаю данные в ретранслятор с помощью вложенного ретранслятора. Это также может произойти после нажатия пользователем кнопки. Данные загружаются из базы данных SQL, а источник данных ретранслятора устанавливается в набор данных после обратной передачи. Однако, когда ItemDataBound происходит, Item.Dataitem всегда имеет значение null.ASP.NET-ретранслятор item.DataItem имеет значение

Зачем это происходит?

Вот код DataBind:

 this.rptCustomSpaList.DataSource = ds; 
     this.rptCustomSpaList.DataBind(); 

Вот код ItemDataBound:

 RepeaterItem item = e.Item; 

     Repeater ChildRepeater = (Repeater)item.FindControl("rptCustomSpaItem"); 
     DataRowView dv = e.Item.DataItem as DataRowView; 
     ChildRepeater.DataSource = dv.CreateChildView("sparelation"); 
     ChildRepeater.DataBind(); 

ниже мой HTML-код повторитель

<asp:Repeater ID="rptCustomSpaList" runat="server" 
onitemdatabound="rptCustomSpaList_ItemDataBound"> 
    <HeaderTemplate></HeaderTemplate> 
    <ItemTemplate> 
     <table> 
      <tr> 
       <td><asp:Label ID="Label3" runat="server" Text="Spa Series:"></asp:Label></td> 
       <td><asp:Label ID="Label4" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "SPASERIESVALUE") %>'></asp:Label></td> 
      </tr> 
      <tr> 
       <td><asp:Label ID="Label5" runat="server" Text="Spa Model:"></asp:Label></td> 
       <td><asp:Label ID="Label6" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "SPAMODELVALUE") %>'></asp:Label></td> 
      </tr> 
      <tr> 
       <td><asp:Label ID="Label9" runat="server" Text="Acrylic Color:"></asp:Label></td> 
       <td><asp:Label ID="Label10" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "ACRYLICCOLORVALUE") %>'></asp:Label></td> 
      </tr> 
      <tr> 
    <td> 
    <asp:Label ID="Label11" runat="server" Text="Cabinet Color:"></asp:Label> 
    </td> 
    <td> 
    <asp:Label ID="Label12" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "CABPANCOLORVALUE") %>'></asp:Label> 
    </td> 
      </tr> 
      <tr> 
    <td> 
    <asp:Label ID="Label17" runat="server" Text="Cabinet Type:"></asp:Label> 
    </td> 
    <td> 
    <asp:Label ID="Label18" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "CABINETVALUE") %>'></asp:Label> 
    </td> 
    </tr> 
    <tr> 
    <td> 
    <asp:Label ID="Label13" runat="server" Text="Cover Color:"></asp:Label> 
    </td> 
    <td> 
    <asp:Label ID="Label14" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "COVERCOLORVALUE") %>'></asp:Label> 
    </td> 
    </tr> 
    </table> 
    <asp:Label ID="Label15" runat="server" Text="Options:"></asp:Label> 
    <asp:Repeater ID="rptCustomSpaItem" runat="server"> 
    <HeaderTemplate> 
    <table> 
    </HeaderTemplate> 
    <ItemTemplate> 
    <tr> 
    <td> 
    <asp:Label ID="Label1" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "PROPERTY") %>'></asp:Label> 
    </td> 
    <td> 
    <asp:Label ID="Label2" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "VALUE") %>'></asp:Label> 
    </td> 
    </tr> 
    </ItemTemplate> 
    <FooterTemplate> 
    </table> 
    </FooterTemplate> 
    </asp:Repeater> 
    <table> 
    <tr> 
    <td style="padding-top:15px;padding-bottom:30px;"> 
    <asp:Label ID="Label7" runat="server" Text="Configured Price:"></asp:Label> 
    </td> 
    <td style="padding-top:15px;padding-bottom:30px;"> 
    <asp:Label ID="Label8" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "SPAVALUEVALUE") %>'></asp:Label> 
    </td> 
    </tr> 
    </table> 
    <asp:Label ID="Label16" runat="server" Text="------"></asp:Label> 
</ItemTemplate> 
<FooterTemplate></FooterTemplate> 
</asp:Repeater> 
+0

Как выглядит ваш код? – hunter

ответ

11

ли верно, что DataItem является ВСЕГДА null? Потому что, может быть, вам просто нужно проверить на ItemType имущества до доступа к DataItem собственности:

if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
{ 
    var data = e.Item.DataItem; 
    // .... 
} 
+0

+1 Я всегда забываю о 'ListItemType.AlternatingItem' –

1

Вы должны проверить ItemType.

Итак, в вашем ItemDataBound Event.

switch (e.Item.ItemType) { 
      case ListItemType.Item: 
      case ListItemType.AlternatingItem: 
       RepeaterItem item = e.Item; 

       Repeater ChildRepeater = (Repeater)item.FindControl("rptCustomSpaItem"); 
       DataRowView dv = e.Item.DataItem as DataRowView; 
       ChildRepeater.DataSource = dv.CreateChildView("sparelation"); 
       ChildRepeater.DataBind(); 

} 
Смежные вопросы