Нужна помощь с использованием C # FindControl - PullRequest
2 голосов
/ 28 июля 2010

У меня есть повторитель внутри панели.
Внутри этого повторителя у меня есть еще одна панель. При определенных условиях я хочу установить 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;
    }

Что я делаю не так?

1 Ответ

3 голосов
/ 28 июля 2010

Одна проблема заключается в том, что вы вызываете ретранслятор напрямую, вместо шаблона привязанного элемента - e.Item.FindControl вместо Repeater1.FindControl.

Другая проблема заключается в том, что событие ItemDataBound также будет запускаться дляверхний и нижний колонтитулы, и вы не проверяете тип элемента списка ( ListItemType enum), который включен в повторителе.

Поскольку у вас нет элемента заголовка (который будет первым элементом, вызывающим обработчик), панель управления отсутствует, и приведение не выполняется.

Вам нужен только 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;
    }
}
...