ASP.Net 3.5 AjaxControlToolkit CollapsiblePanelExpander в Master In UpdatePanel частичные проблемы обратной передачи
Долгое время читатель первый раз постер
У меня есть страница с контентом, связанная с главной страницей. Мастер имеет инструментарий скриптменеджера. На странице содержимого у меня есть вложенный повторитель в шаблоне элемента родительского повторителя, у меня есть 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
Заранее благодарю за ответ!
извините за длинное объяснение
РЕДАКТИРОВАТЬ:
Обновить:
Попытка 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 ответа
ОК, наконец, нашел решение. Здесь это идет:
Используя метод SetCollapsiblePanelsInRepeater, опубликованный в моем исходном сообщении, я добавил вызов этого метода в метод prerender updatePanel, и теперь панели теперь сохраняют свое состояние....
Protected Sub updtpnlMain_PreRender(ByVal sender As Object, ByVal e As EventArgs) Handles updtpnlMain.PreRender
setCollapsiblePanelsInRepeater(rptrGroups)
setCollapsiblePanelsInRepeater(rptrConsultants)
End Sub
Для ясности для других При поиске этой проблемы в Google метод, который проверяет состояние панелей и сворачивает / разворачивает их:
Private Sub setCollapsiblePanelsInRepeater (ByVal rptr As Repeater) Для каждого элемента в качестве RepeaterItem в rptr.Items If ((item.ItemType = ListItemType.AlternatingItem) Или (item.ItemType = ListItemType.Item)) Тогда для каждого элемента управления элемента управления If (TypeOf ctl является AjaxControlToolkit.CollapsiblePanelExtender) Затем Dim cpe As AjaxControlToolkit.CollapsiblePanelExtender = DirectCast(ctl, AjaxControlToolkit.CollapsiblePanelExlap If (Request.Form(cpe.UniqueID & "_ClientState") IsNot Nothing) Тогда isCollapsed = (Request.Form(cpe.UniqueID & "_ClientState").ToString() = "true") Else isCollapsed = True End If If (isCollapsed) Тогда cpe.ClientState = "true" cpe.Collapsed = True Остальное cpe.ClientState = "false" cpe.Collapsed = False End If End If End End Если Next End If Next End Sub
Менеджер инструментария на главных страницах вызывает реальные проблемы. Вы можете найти свое решение как использование на отдельных страницах контента.
Также вы уверены, что вы включили ViewState на страницах контента, как это
<%@ Page EnableViewState="true" Language="C#" AutoEventWireup="true" CodeFile="myfile.aspx.cs"
Inherits="myfile" %>
Это для C#