0

每当我使用 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>

使用页眉和页脚模板 - 不起作用。

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

为什么会发生这种情况?

谢谢

4

3 回答 3

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

于 2010-05-23T17:37:40.177 回答
1

您需要检查 ListItemType

if (e.Item.ItemType == ListItemType.Header)
{
   //Find your control
}
于 2010-05-23T17:20:07.567 回答
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();
}
于 2010-05-23T17:29:01.040 回答