2010-05-23 13 views
0

chaque fois que j'utilise le modèle d'en-tête ou de pied de page de DataList, FindControl ne trouve pas une partie d'étiquette de DataList et renvoie une exception NullReferenceException.Le fichier ASP.NET C# DataList FindControl & Header/Footer provoque l'erreur

Mon SQLDataSource et DataList (pas d'en-tête et pied de page modèle - travaux):

 <asp:SqlDataSource ID="sdsMinaKop" runat="server" 
     ConnectionString="<%$ ConnectionStrings:dbCSMinaKop %>"  
     SelectCommand="SELECT kopare_id, bok_id, bok_titel, bok_pris, kop_id FROM kop WHERE kopare_id = @UserName" 
     onselecting="sdsMinaKop_Selecting"> 
     <SelectParameters> 
      <asp:Parameter DefaultValue="admin" Name="UserName" /> 
     </SelectParameters> 
    <asp:SelectParameters> 
     <asp:Parameter Name="UserName" Type="String" /> 
    </asp:SelectParameters> 
    </asp:SqlDataSource> 

    <asp:DataList ID="DataList1" runat="server" DataKeyField="kop_id" 
     DataSourceID="sdsMinaKop" onitemdatabound="DataList1_ItemDataBound" 
      RepeatLayout="Table"> 
     <ItemTemplate> 
     <tr> 
     <td><asp:Label ID="bok_titelLabel" runat="server" Text='<%# Eval("bok_titel") %>' /></td> 
     <td><asp:Label ID="bok_prisLabel" runat="server" Text='<%# Eval("bok_pris") %>' /> 
      kr</td> 
     <td><a href="avbestall.aspx?id='<%# Eval("kop_id") %>'" />[X]</a></td> 
     </tr> 
     </ItemTemplate> 
     <ItemStyle Wrap="False" /> 
    </asp:DataList> 

avec en-tête & modèle de bas de page - ne fonctionne pas.

<asp:DataList ID="DataList1" runat="server" DataKeyField="kop_id" 
     DataSourceID="sdsMinaKop" onitemdatabound="DataList1_ItemDataBound" 
      RepeatLayout="Table"> 
     <ItemTemplate> 
     <tr> 
     <td><asp:Label ID="bok_titelLabel" runat="server" Text='<%# Eval("bok_titel") %>' /></td> 
     <td><asp:Label ID="bok_prisLabel" runat="server" Text='<%# Eval("bok_pris") %>' /> 
      kr</td> 
     <td><a href="avbestall.aspx?id='<%# Eval("kop_id") %>'" />[X]</a></td> 
     </tr> 
     </ItemTemplate> 
     <ItemStyle Wrap="False" /> 
     <HeaderTemplate> 
      a 
     </HeaderTemplate> 
     <FooterTemplate> 
      a 
     </FooterTemplate> 
    </asp:DataList> 

événement Sélection:

protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e) 
{ 
    Label pris = (Label)e.Item.FindControl("bok_prisLabel"); 

    LabelTotalt.Text = (Convert.ToDouble(LabelTotalt.Text) + Convert.ToDouble(pris.Text)).ToString(); 
} 

Pourquoi serait-ce possible?

Merci

Répondre

1

lorsque vous ajoutez l'en-tête et pied de page, parfois le « point » sera l'en-tête et pied de page de sorte qu'il ne trouve pas l'étiquette. vous pouvez tester pour itemtype mais il pourrait être plus facile de faire le suivant.

protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e) 
{ 
    Label pris = e.Item.FindControl("bok_prisLabel") as Label; //won't fail if null returned 

    if (pris !=null) 
     LabelTotalt.Text = (Convert.ToDouble(LabelTotalt.Text) + Convert.ToDouble(pris.Text)).ToString(); 
} 
+0

Je vais le signaler en raison du texte descriptif. Ben, Cen et John Allers, merci! – pastapockets

1

Vous devez vérifier la listItemType

if (e.Item.ItemType == ListItemType.Header) 
{ 
    //Find your control 
} 
2

L'événement DataList1_ItemDataBound devrait ressembler à:

protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     Label pris = (Label)e.Item.FindControl("bok_prisLabel"); 

     LabelTotalt.Text = (Convert.ToDouble(LabelTotalt.Text) + Convert.ToDouble(pris.Text)).ToString(); 
    } 
} 

Cette méthode se déclenche pour chaque élément dans votre DataList. Lorsqu'il arrive à l'en-tête ou au pied de page, il ne trouve pas le contrôle bok_prisLabel car il est uniquement déclaré dans ItemTemplate, pas dans HeaderTemplate ou FooterTemplate.