0

我有一个转发器,只有当它存在时才应该显示绑定的字段值。阅读了这篇文章后,我决定在我的转发器中使用文字并使用 OnItemDatabound 触发器填充我的文字,但我的文字似乎无法从后面的 c# 代码访问,我不明白为什么!

这是aspx页面

    <asp:Repeater runat="server" ID="rpt_villaresults" OnItemDataBound="checkForChildren">
    <HeaderTemplate>

    </HeaderTemplate>
    <ItemTemplate>       
//.................MORE CODE HERE......................                           
<div class="sleeps"><h4>To Sleep</h4><h5><%#Eval("sleeps")%> <asp:Literal ID="sleepsChildrenLit" runat="server" /> </h5></div>
//.............MORE CODE HERE........................

以及背后的代码

public void checkForChildren(object sender, RepeaterItemEventArgs e)
{
    Literal childLit = e.Item.FindControl("sleepsChildrenLit") as Literal; 
    //this is null at runtime
    String str = e.Item.DataItem.ToString();
    if (e.Item.DataItem != null)
    {
        if (Regex.IsMatch(str, "[^0-9]"))
        {
            if (Convert.ToInt32(str) > 0)
            {
                childLit.Text = " + " + str;
            }
        }         
    }
}
4

3 回答 3

2

正如您所说的那样,您可能已经知道:as Literal它可以返回null值。如果您进行了正确的强制转换,您将在运行时收到一个异常,该异常将为您提供有关问题所在和/或哪个元素导致您出现问题的更多信息。

如果您总是期望“chilLit”有一个值并且您不检查空值,那么您应该使用

Literal childLit = (Literal)e.Item.FindControl("sleepsChildrenLit");
于 2008-12-23T11:20:01.100 回答
2

好吧,使用您当前的代码,我们不知道这是因为 e.Item.FindControl 返回 null,还是因为它不是文字。这就是为什么你应该使用强制类型转换而不是“as”,如果你确定它确实应该是那种类型的话。

将代码更改为:

Literal childLit = (Literal) e.Item.FindControl("sleepsChildrenLit");

看看会发生什么。如果你得到一个强制转换异常,你就会知道这是因为它是错误的类型。如果您仍然获得 NRE,则 FindControl 返回 null。

编辑:现在,除此之外,让我们看看它之后的代码:

String str = e.Item.DataItem.ToString();
if (e.Item.DataItem != null)
{
    ...
}

如果e.item.DataItem为 null,则对 ToString() 的调用将引发异常 - 因此下一行的检查毫无意义。我怀疑你实际上想要:

if (e.Item.DataItem != null)
{
    String str = e.Item.DataItem.ToString();
    ...
}
于 2008-12-23T11:21:05.203 回答
2

还将为转发器的 HeaderItem 调用 OnItemDataBound 事件处理程序 checkForChildren()。但在这种情况下, e.Item.DataItem 将为空。当然 FindControl() 也将返回 null,因为在 HeaderTemplate 中没有 ID 为“sleepsChildrenLit”的 Literal 控件。

您可以使用 e.Item.ItemType 属性来检查当前 Item 是 FooterItem 的 HeaderItem,还是“普通”Item,例如:

if (e.Item.ItemType == ListItemType.Header)
{
...
}
else if (...)
{
...
}
于 2008-12-23T11:31:39.220 回答