2010-05-23 1 views
0

всякий раз, когда я использую шаблон заголовка или нижнего колонтитула DataList, FindControl не может найти метку в DataList и выдает исключение NullReferenceException.ASP.NET C# DataList В шаблоне FindControl и Header/Footer возникает ошибка

Мои SqlDataSource и DataList (без заголовка и шаблон Footer - работа):

 <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> 

С заголовком шаблоном & Footer - не работают.

<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> 

Выбор события:

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(); 
} 

Почему это произошло?

Благодаря

ответ

1

при добавлении колонтитулы, иногда «элемент» будет верхний и нижний колонтитулы, так что не находит метку. вы можете проверить для itemtype, но это может быть easierto делать infollowing.

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

Я буду отмечать это из-за описательного текста. Бен, Цен и Джон Аллерс, спасибо! – pastapockets

1

Вы должны проверить для ListItemType

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

Событие DataList1_ItemDataBound должно выглядеть примерно так:

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(); 
    } 
} 

Этот метод будет срабатывать для каждого элемента в вашем DataList. Когда он попадает в верхний или нижний колонтитул, он не может найти элемент управления bok_prisLabel, потому что он объявлен только в ItemTemplate, а не в HeaderTemplate или FooterTemplate.

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