ASP.Net 3.5 AjaxControlToolkit CollapsiblePanelExpander в Master In UpdatePanel частичные проблемы обратной передачи - PullRequest
0 голосов
/ 08 августа 2011

Долгое время читатель первый раз постер

У меня есть страница с контентом, связанная с главной страницей. Мастер имеет инструментарий скриптменеджера. На странице содержимого у меня есть вложенный повторитель в шаблоне элемента родительского повторителя, у меня есть CollapsiblePanelExtender для дочернего элемента управления повторителем. При частичной обратной передаче, если атрибут свернутый не установлен, все панели раскрываются. Если для атрибута collapsed установлено значение true, то все панели сворачиваются при частичной обратной передаче.

Привязка данных повторителя происходит в разделе page_init кода, и я проверяю состояние панелей, просматривая элементы в событии page_load. Кажется, что ничего не работает, при отладке кода я вижу свойства, устанавливаемые надлежащим образом, но при отображении в браузере все панели открыты. Событие редактирования, которое запускает частичную обратную передачу, предварительно формируется в modalpopup.

Я попытался переместить панели в собственную панель обновлений, удалить панель обновлений, разместить модальные окна за пределами панели обновлений безрезультатно. ViewState не поддерживается.

Код страницы:

<asp:Repeater ID="rptrConsultants" runat="server" OnItemCommand="rptrConsultants_ItemCommand" OnItemDataBound="rptrConsultants_ItemDataBound">
                            <HeaderTemplate>
                                <div class="pageTitle">
                                    Your Consultants (Click on the image beside the consultant to view their group memberships)
                                    <br />
                                    Official names are listed. Expanding the consultant will show the name assigned and the related groups.
                                </div>
                                <br />
                                <table>
                                    <tr>
                                        <td style="width: 60px; font-weight: bold; text-align: center;">
                                            Actions
                                        </td>
                                        <td style="font-weight: bold;">
                                            Consultant information
                                        </td>
                                    </tr>
                            </HeaderTemplate>
                            <FooterTemplate>
                                </table>
                                <asp:Label ID="lblNoConsultant" runat="server" Text="You have not created any consultants" Visible="false"></asp:Label>
                            </FooterTemplate>
                            <ItemTemplate>
                                <tr>
                                    <td style="width: 60px; text-align: center;">
                                        <asp:Image ID="imgConsultantExpander" runat="server" ToolTip="Click here to toggle consultant details" AlternateText="Toggle Consultant Details" />
                                        <asp:ImageButton ID="btnDeleteConsultant" AlternateText="Delete Consultant" runat="server" CausesValidation="false" CommandName="DeleteConsultant" CommandArgument='<%#DataBinder.Eval(Container.DataItem, "IndividualsID")%>' ImageUrl="~/Styles/Images/Icons/remove_consultant.png" ToolTip="Delete consultant" />
                                        <asp:ImageButton ID="btnAddConsultantToNewGroup" AlternateText="Add consultant to a new group" runat="server" CommandName="AddConsultantToGroup" CommandArgument='<%#DataBinder.Eval(Container.DataItem, "IndividualsID")%>' ImageUrl="~/Styles/Images/Icons/add_user_to_group.png" ToolTip="Add consultant to a new group" />
                                    </td>
                                    <td>
                                        <%#DataBinder.Eval(Container.DataItem, "Name")%>
                                        (<%#DataBinder.Eval(Container.DataItem, "UserID") %>)
                                        <asp:Label ID="lblGroupCount" runat="server" />
                                    </td>
                                </tr>
                                <tr>
                                    <td colspan="2">
                                        <asp:Panel ID="pnlConsultantExpander" runat="server">
                                            <asp:Repeater ID="rptrConsultantGroups" runat="server" DataSource='<%#Container.DataItem.Row.GetChildRows("ConsultantGroupRelation") %>' OnItemCommand="rptrConsultantGroups_ItemCommand">
                                                <HeaderTemplate>
                                                    <table style="margin-left: 50px;">
                                                        <tr>
                                                            <td style="width: 40px; text-align: center; font-weight: bold;">
                                                                Actions
                                                            </td>
                                                            <td style="font-weight: bold;">
                                                                Membership
                                                            </td>
                                                            <td style="font-weight: bold;">
                                                                Nick Name
                                                            </td>
                                                        </tr>
                                                </HeaderTemplate>
                                                <ItemTemplate>
                                                    <tr>
                                                        <td style="width: 40px;">
                                                            <asp:ImageButton ID="btnEditConsultant" AlternateText="Edit Consultant" runat="server" CommandName="EditConsultantInGroup" CommandArgument='<%#Container.DataItem("GroupID") & "|" & Container.DataItem("GroupMembershipID")%>' ImageUrl="~/Styles/Images/Icons/edit_consultant.png" />
                                                            <asp:ImageButton ID="btnDeleteConsultant" AlternateText="Remove from group" runat="server" CommandName="DeleteConsultantFromGroup" CommandArgument='<%#Container.DataItem("GroupID") & "|" & Container.DataItem("GroupMembershipID")%>' ImageUrl="~/Styles/Images/Icons/delete_fromgroup.png" ToolTip="Remove from group" />
                                                        </td>
                                                        <td class="textbold">
                                                            <%#Container.DataItem("GroupName")%>
                                                        </td>
                                                        <td class="textitalic">
                                                            <%#Container.DataItem("nickname")%>
                                                        </td>
                                                    </tr>
                                                </ItemTemplate>
                                                <FooterTemplate>
                                                    </table>
                                                </FooterTemplate>
                                            </asp:Repeater>
                                        </asp:Panel>
                                        <asp:CollapsiblePanelExtender ID="cpepnlConsultantExpander" runat="server" TargetControlID="pnlConsultantExpander" CollapseControlID="imgConsultantExpander" ExpandControlID="imgConsultantExpander" CollapsedImage="~/Styles/Images/Icons/user_info.png" ExpandedImage="~/Styles/Images/Icons/user_open.png" ImageControlID="imgConsultantExpander" EnableViewState="true" CollapsedSize="0" />
                                    </td>
                                </tr>
                            </ItemTemplate>
                        </asp:Repeater>

А затем метод кода, который происходит в page_load:

Private Sub setCollapsiblePanelsInRepeater(ByVal rptr As Repeater)
    For Each item As RepeaterItem In rptr.Items
        If ((item.ItemType = ListItemType.AlternatingItem) Or (item.ItemType = ListItemType.Item)) Then
            For Each ctl As Control In item.Controls
                If (TypeOf ctl Is AjaxControlToolkit.CollapsiblePanelExtender) Then
                    Dim cpe As AjaxControlToolkit.CollapsiblePanelExtender = DirectCast(ctl, AjaxControlToolkit.CollapsiblePanelExtender)
                    If (Not IsPostBack()) Then
                        cpe.Collapsed = True
                        cpe.ClientState = "true"
                    Else
                        Dim isCollapsed As Boolean
                        If (Request.Form(cpe.UniqueID & "_ClientState") IsNot Nothing) Then
                            isCollapsed = (Request.Form(cpe.UniqueID & "_ClientState").ToString() = "true")
                        Else
                            isCollapsed = True
                        End If
                        If (isCollapsed) Then
                            cpe.ClientState = "true"
                            cpe.Collapsed = True
                        Else
                            cpe.ClientState = "false"
                            cpe.Collapsed = False
                        End If
                    End If
                End If
            Next
        End If
    Next
End Sub

Обратите внимание, что событие начальной загрузки работает! Все панели сворачиваются при загрузке страницы

Также обратите внимание, что повторитель вложен в tabPanel

Заранее спасибо за ответ!

извините за длинное объяснение

EDIT:

Обновление:

Попытка Javascript Route - пока безрезультатно

    pageLoad = function()
    {
            CheckStatusOfPanels();
    };

    function CheckStatusOfPanels()
    {
        var allBehaviors = Sys.Application.getComponents();
        for (var loopIndex = 0; loopIndex < allBehaviors.length; loopIndex++)
        {
            currentBehavior = allBehaviors[loopIndex];
            if (currentBehavior._name && currentBehavior.get_name() == 'CollapsiblePanelBehavior')
            {
                var myID = currentBehavior.get_id() + '_ClientState';
                var isCollapsed = document.getElementById(myID).value
                if (isCollapsed == 'true')
                {
                    currentBehavior.expandPanel();
                    currentBehavior._ClientState = isCollapsed;
                }
                else
                {
                    currentBehavior.collapsePanel();
                    currentBehavior._ClientState = isCollapsed;
                }
            }
        }
    }

** ОБНОВЛЕНИЕ № 2 **

Моему представителю меньше 100, поэтому мне нужно ждать 8 часов, чтобы ответить на мой вопрос:

Вот мое "исправление" после работы почти весь день над этим:

Хорошо, наконец, нашел решение. Вот оно:

Используя метод SetCollapsiblePanelsInRepeater, опубликованный в моем исходном сообщении, я добавил вызов этого метода в метод prerender updatePanel, и теперь панели теперь сохраняют свое состояние ...

Protected Sub updtpnlMain_PreRender(ByVal sender As Object, ByVal e As EventArgs) Handles updtpnlMain.PreRender
    setCollapsiblePanelsInRepeater(rptrGroups)
    setCollapsiblePanelsInRepeater(rptrConsultants)

End Sub

Для Ясности для других При поиске этой проблемы метод, устанавливающий события панели:

Private Sub setCollapsiblePanelsInRepeater(ByVal rptr As Repeater)
    For Each item As RepeaterItem In rptr.Items
        If ((item.ItemType = ListItemType.AlternatingItem) Or (item.ItemType = ListItemType.Item)) Then
            For Each ctl As Control In item.Controls
                If (TypeOf ctl Is AjaxControlToolkit.CollapsiblePanelExtender) Then
                    Dim cpe As AjaxControlToolkit.CollapsiblePanelExtender = DirectCast(ctl, AjaxControlToolkit.CollapsiblePanelExtender)
                    If (Not IsPostBack()) Then
                        cpe.Collapsed = True
                        cpe.ClientState = "true"
                    Else
                        Dim isCollapsed As Boolean
                        If (Request.Form(cpe.UniqueID & "_ClientState") IsNot Nothing) Then
                            isCollapsed = (Request.Form(cpe.UniqueID & "_ClientState").ToString() = "true")
                        Else
                            isCollapsed = True
                        End If
                        If (isCollapsed) Then
                            cpe.ClientState = "true"
                            cpe.Collapsed = True
                        Else
                            cpe.ClientState = "false"
                            cpe.Collapsed = False
                        End If
                    End If
                End If
            Next
        End If
    Next
End Sub

Ответы [ 2 ]

1 голос
/ 09 августа 2011

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

Также вы уверены, что вы включили режим просмотра состояний на страницах контента, подобных этой

<%@ Page EnableViewState="true" Language="C#" AutoEventWireup="true" CodeFile="myfile.aspx.cs"
    Inherits="myfile" %>

Это для C #

0 голосов
/ 09 августа 2011

Хорошо, наконец, нашел решение. Вот оно:

Используя метод SetCollapsiblePanelsInRepeater, опубликованный в моем исходном сообщении, я добавил вызов этого метода в метод prerender updatePanel, и теперь панели теперь сохраняют свое состояние ...

Protected Sub updtpnlMain_PreRender(ByVal sender As Object, ByVal e As EventArgs) Handles updtpnlMain.PreRender
    setCollapsiblePanelsInRepeater(rptrGroups)
    setCollapsiblePanelsInRepeater(rptrConsultants)

End Sub

Для Ясности для других При поиске этой проблемы метод, который проверяет состояние панелей и сворачивает / разворачивает их:

Private Sub setCollapsiblePanelsInRepeater (ByVal rptr As Repeater) Для каждого элемента как RepeaterItem в rptr.Items Если ((item.ItemType = ListItemType.AlternatingItem) Или (item.ItemType = ListItemType.Item)) Тогда Для каждого ctl как элемент управления в item.Controls If (TypeOf ctl Is AjaxControlToolkit.CollapsiblePanelExtender) Тогда Dim cpe As AjaxControlToolkit.CollapsiblePanelExtender = DirectCast (ctl, AjaxControlToolkit.CollapsiblePanelExtender) Если (не IsPostBack ()), то cpe.Collapsed = True cpe.ClientState = "true" еще Dim isCollased As Boolean If (Request.Form (cpe.UniqueID & "_ClientState") не является ничем) Тогда isCollapsed = (Request.Form (cpe.UniqueID & "_ClientState"). ToString () = "true") еще isCollapsed = True End If If (isCollapsed) Тогда cpe.ClientState = "true" cpe.Collapsed = True еще cpe.ClientState = "false" cpe.Collapsed = False End If End If End If следующий End If следующий End Sub

...