0

リピーターを使ってテーブルを作ろうとしています。ただし、いくつかの特定のコントロールに実装する必要があるロジックがいくつかあります、と div は言います。

私はこれを試しましたが、うまくいきませんでした。

例外の詳細: System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。

ソース エラー:

Line 35:         HtmlGenericControl myDiv = (HtmlGenericControl)e.Item.FindControl("RepeaterBG");
Line 36: 
Line 37:         myDiv.Style.Add("background-color","green");
Line 38:     }
Line 39: }

説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

私のHtmlは:

<asp:Repeater runat="server" ID="MyStudents"
        OnItemDataBound="rptArticleContent_ItemDataBound">
            <HeaderTemplate>
                <table><tr>
            </HeaderTemplate>
            <ItemTemplate> 

                <td>
                    <div  runat="server" ID="RepeaterBG" > helli there</div>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("Name") %>'></asp:Label>
                </td>
                <td>
                    <asp:Label ID="Label2" runat="server" Text='<%# Bind("RegistrationDate") %>'></asp:Label>
                </td>
                <td>
                    <asp:Label ID="Label3" runat="server" Text='<%# Bind("Email") %>'></asp:Label>
                </td>

            </ItemTemplate>
            <FooterTemplate>
                </tr></table>
            </FooterTemplate>
        </asp:Repeater>

私の.CS

protected void rptArticleContent_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    Label lb = new Label();
    lb.Text = "</tr><tr>";
    e.Item.Controls.Add(lb);

    HtmlGenericControl myDiv = (HtmlGenericControl)e.Item.FindControl("RepeaterBG"); // i get null here, it seems to not find it at all!
    myDiv.Style.Add("background-color","green"); // problem here
}

どこで私は間違えましたか?!

4

3 に答える 3

2

たとえば、「ヘッダーで検索」しないように項目タイプを確認する必要があります。

protected void rptArticleContent_ItemDataBound(object sender, RepeaterItemEventArgs e)
    if (e.Item.ItemType == ListItemType.Item ||
        e.Item.ItemType == ListItemType.AlternatingItem) {
        // search for control here
    }
}
于 2012-08-30T21:50:48.250 に答える
1

アイテムがデータアイテムであることを確認する必要があります。投稿したリンクの例を見ると、ItemDataBound イベント内の最初の行は次のようになります。

if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType !=   
       ListItemType.AlternatingItem) return;

IIRC さん、これは ItemDataBound イベント内の最初の項目がヘッダー項目であるためです。項目がデータ項目であるかどうかを確認するためにチェックを行う必要があります。

于 2012-08-30T21:51:09.033 に答える
0

コードの実行後にリピーターのコントロールが追加されるため、実行時にリピーター内からアイテムを取得することはできません。

代わりに、データバインドされているため、個々のアイテムに対して FindControl を実行する必要があります。これを行うには、リピーターに onItemDataBound イベントを設定し、アイテムごとに発生するイベントでロジックを実行します。コントロールは、イベント引数のアイテム プロパティのアイテム テンプレートにあります。

例えば:

リピーターで:

<asp:Repeater id="Repeater1" OnItemDataBound="Repeater1OnItemDataBound" runat="server">

コードビハインドで:

Public void Repeater1OnItemDataBound(Object Sender, RepeaterItemEventArgs e) {
    HtmlGenericControl myDynamicRepeaterControl = 
     ((HtmlGenericControl)e.Item.FindControl("MyDiv"))
    //...do some work on myDynamicRepeaterControl 
}
于 2012-08-30T21:30:02.597 に答える