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」に値があり、nullをチェックしないことが常に期待される場合は、を使用してリテラルにキャストする必要があります。

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)
{
    ...
}

nullの場合e.item.DataItem、ToString()の呼び出しは例外をスローします。したがって、次の行のチェックは無意味です。私はあなたが実際に望んでいると思います:

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

OnItemDataBoundイベントハンドラーcheckForChildren()は、リピーターのHeaderItemに対しても呼び出されます。ただし、その場合、e.Item.DataItemはnullになります。そしてもちろん、HeaderTemplateにID「sleepsChildrenLit」を持つリテラルコントロールがないため、FindControl()もnullを返します。

e.Item.ItemTypeプロパティを使用して、現在のアイテムがFooterItemのHeaderItemであるか、「通常の」アイテムであるかを確認できます。例:

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