2

パネル内にリピーターがあります。
このリピーターの中にもうひとつパネルがありますpanel.visibility = false

コード ビハインドでは、パネルをオンにしてOnItemDataBound、visible=false を設定してみます。しかし、それは返すだけObject reference not set to an instance of an object.です。パネルが見つからないからだと思います。

これが私のコードです:

    <asp:Panel ID="Panel1" runat="server">
        <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="repComments_OnDataBound">    
             <ItemTemplate>                         
                <div>
                   <asp:Panel runat="server" ID="commentAdminPanel" CssClass="floatRight" >
                     <img id='deleteComment' class='deleteComment' src='/img/delete1.jpg' />  
                   </asp:Panel>                     
                </div>
              </div>
            </ItemTemplate>
         </asp:Repeater>
     </asp:Panel>

そして、ここに私のコードビハインドがあります:

    protected void repComments_OnDataBound(Object sender, RepeaterItemEventArgs e)
    {
        Panel panel = (Panel)Repeater1.FindControl("commentAdminPanel");
        panel.Visible = false;
    }

私は何を間違っていますか?

4

1 に答える 1

3

1 つの問題は、バインドされた項目テンプレートではなく、リピーターを直接呼び出していることe.Item.FindControlですRepeater1.FindControl

もう 1 つの問題は、ItemDataBoundイベントがヘッダーとフッターに対しても発生し、リピーターで使用しているリスト アイテムのタイプ ( ListItemType列挙型) をチェックしていないことです。

ヘッダー アイテム (ハンドラーを呼び出す最初のアイテム) がないため、パネル コントロールはなく、キャストは失敗します。

ItemとのAlternatingItem項目タイプのみが必要です。

protected void repComments_OnDataBound(Object sender, RepeaterItemEventArgs e)
{
    if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem )
    {
        Panel panel = (Panel)e.Item.FindControl("commentAdminPanel");
        panel.Visible = false;
    }
}
于 2010-07-28T07:50:22.170 に答える