每当我使用DataList的Header或Footer模板时,FindControl都无法找到DataList的标签部分,并抛出NullReferenceException。
我的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>
Header&amp;页脚模板 - 不起作用。
<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();
}
为什么会发生这种情况?
由于
答案 0 :(得分: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中声明。
答案 1 :(得分:1)
您需要检查ListItemType
if (e.Item.ItemType == ListItemType.Header)
{
//Find your control
}
答案 2 :(得分: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();
}