Изменение элементов в LayoutTemplate вложенного ListView

Asked
Viewd4203

0

Это связано с моим более ранним вопросом , но Думал упростить и сделать из этого вызов. Можете ли вы изменить значение «ChangeThisLabel», используя приведенный ниже код?

 <asp:ListView ID="OuterListView" runat="server">
    <LayoutTemplate>
        <asp:PlaceHolder ID="itemPlaceHolder" runat="server" />
    </LayoutTemplate>
    <ItemTemplate>
        <%#Eval("outer_value")%> <br/>
        <asp:ListView ID="InnerListView" runat="server" DataSource='<%#Eval("inner") %>'>
            <LayoutTemplate>
                <asp:Label ID="ChangeThisLabel" runat="server" />
                <asp:PlaceHolder ID="itemPlaceHolder" runat="server" />
            </LayoutTemplate>
            <ItemTemplate>
                <%#Eval("inner_value")%> <br/>
            </ItemTemplate>
        </asp:ListView>
    </ItemTemplate>
</asp:ListView>
 

Я бы посоветовал попробовать это самостоятельно, прежде чем отправлять ответ, так как в моем предыдущем посте я получил много предложений, которые отлично работают для одного ListView, но падают при движении против вложенного ListView.

2 ответов

3

, как упоминалось в другом ответе. в коде позади, при загрузке, вы можете сделать это:

 `OuterListView.FindControl("InnerListView").FindControl("ChangeThisLabel")
 

затем преобразуйте его как метку и измените текст. очевидно, что вы должны повторять этот код внутри цикла, поэтому вы делаете это для каждой метки во внутреннем представлении списка каждого внешнего представления списка.

Что касается ответов на ваш другой вопрос, вам не ясно, что вы хотите получить к нему доступ из кода. Также вы можете опубликовать то, что вы пробовали, чтобы люди знали, что вы пробовали разные методы.

удачи!

изменить: относительно вашего комментария:

Если я чего-то не упустил, это не сработает, потому что ChangeThisLabel превращается в ctl00_ctl00_BodyContentPlaceHolder_ReportContentPlaceHolder. _OuterListView_ctrl0_InnerListView_ChangeThisLabel ", когда он отображается внутренним ListView

вы правы, но когда вы используете FindControl (id), он будет использовать идентификатор на стороне сервера для поиска элемента управления. если вы это сделаете: InnerListView.FindControl ("ChangeThisLabel"), тогда он найдет правильную метку независимо от идентификатора стороны клиента, назначенного этому элементу управления.

  • Спасибо, что указали мне правильное направление. Моя проблема заключалась в том, что я пытался найти InnerListView, выполняя OutListView.FindControl («InnerListView»), забывая, что InnerListView живет в каждой строке (элементе) в OuterListView, поэтому я перебирал коллекцию элементов в цикле.

    gfrizzle24 декабря 2008, 16:40
1

В обработчике событий DataBound (или чем-то подобном) используйте FindControl("ChangeThisLabel") для получения ссылки на метку. Конечно, перед использованием ссылки вы должны привести к Label.

Вы можете написать свой собственный метод FindControl, который вы будете вызывать рекурсивно, чтобы найти элемент управления на уровне n.

  • Моя беда - я не просматривал коллекцию элементов, чтобы найти InnerListView, поэтому мне не повезло.

    gfrizzle24 декабря 2008, 16:41
  • Если я чего-то не упустил, это не сработает, потому что ChangeThisLabel становится ctl00_ctl00_BodyContentPlaceHolder_ReportContentPlaceHolder_OuterListView_ctrl0_InnerListView_ChangeThisLabel при визуализации внутренним ListView.

    gfrizzle23 декабря 2008, 21:41