2010-05-23 19 views
0

,FindControl無法找到DataList的標籤部分,並拋出NullReferenceException。無論何時我使用DataList的Header或Footer模板時,ASP.NET C#DataList FindControl&Header/Footer模板都會導致錯誤

我SqlDataSource和DataList控件(沒有頁眉和頁腳模板 - 工程):

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

隨着頁眉頁腳&模板 - 不工作。

<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,但它可能很容易做以下事情。

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 2010-05-23 17:45:02

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中聲明。