ASPXPopupControl - обновление содержимого сразу после popup
Имеем Web-форму default.aspx. На форме две UpdatePanel: на первой основная таблица ASPxTreeList с доп. контролами, на второй - ASPXPopupControl, содержащий меню и WebChartControl, отображающий детальные данные. Ещё на форме есть два SqlDataSource, выдающие данные соответственно в ASPxTreeList и в WebChartControl. По отдельности и ASPxTreeList и WebChartControl отлично работают и отображают данные.
Триггер UpdatePanel2 настроен на события ASPxTreeList.FocusedNodeChanged и на ASPxPopupControl1.Load.
Popup вызывается скриптом OnShowAtPosButtonClick (ниже код). Пробовал вместо этого прописать в свойство PopupElementID "ASPxTreeList1", это не изменяет поведение и не решает проблему.
Задача тривиальная: при клике мышью на ячейке ASPxTreeList вывести на экран ASPXPopupControl -> отобразить в WebChartControl данные, соответствующие выбранному столбцу и строке.
Проблема: ASPXPopupControl выскакивает на экран со старым заголовком и данными. В дальнейшем, при щелчке мышью на любом контроле внутри ASPxPopupControl он обновляется и отображается верно. Моя версия - на клиенте не происходит обновления содержимого ASPXPopupControl, обновленного на сервере процедурой ASPxPopupControl1_Load. Либо сама процедура ASPxPopupControl1_Load на сервере не вызывается при popup.
Вопрос: как сделать, чтобы ASPxPopupControl обновлялся САМ сразу после popup, не дожидаясь click?
Форма:
<ContentTemplate>
<dx:ASPxTreeList ID="ASPxTreeList1" runat="server" AutoGenerateColumns="False" DataSourceID="QCDBADataSource" EnableTheming="True" Height="665px" OnHtmlDataCellPrepared="ASPxTreeList1_HtmlDataCellPrepared" Theme="Default" Width="100%" ClientInstanceName="ASPxTreeList1">
<Columns>
...
</Styles>
<ClientSideEvents NodeClick="OnShowAtPosButtonClick" />
</dx:ASPxTreeList>
...
<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<dx:ASPxPopupControl ID="ASPxPopupControl1" runat="server" AllowDragging="True" CloseOnEscape="True" Height="419px" Modal="True" OnLoad="ASPxPopupControl1_Load" Width="894px" AllowResize="True" ClientInstanceName="popupDiagram">
<ContentCollection>
<dx:ASPxMenu ID="ASPxMenu2" runat="server" OnItemClick="ASPxMenu2_ItemClick">
<Items>
...
<dx:WebChartControl ID="WebChartControl1" runat="server" CrosshairEnabled="True" DataSourceID="SqlDataSource1" Height="356px" Width="868px" ClientInstanceName="chart">
<DiagramSerializable>
...
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ASPxTreeList1" EventName="FocusedNodeChanged" />
<asp:AsyncPostBackTrigger ControlID="ASPxPopupControl1" EventName="Load" />
</Triggers>
</asp:UpdatePanel>
Клиентский скрипт, вызывающий popup:
<script type="text/javascript">
function OnShowAtPosButtonClick(s, e) {
var left = 350;
var top = 350;
popupDiagram.ShowAtPos(left, top);
}
</script>
Серверный скрипт, задающий заголовок popup и параметры запроса для SqlDataSource1:
protected void ASPxPopupControl1_Load(object sender, EventArgs e)
{
if (ASPxTreeList1.FocusedNode == null) GetDiargramData(new DateTime(2013, 01, 01), new DateTime(2013, 01, 01), "-1");
else
{
GetDiagramData(new DateTime(aYear, aMonth, aDay), (new DateTime(aYear, aMonth, aDay)).AddDays(30), ASPxTreeList1.FocusedNode.GetValue("ID_PARAMETER").ToString());
ASPxPopupControl1.HeaderText = "Диаграмма: " + ASPxTreeList1.FocusedNode.GetValue("CAPTION2").ToString();
}
private void GetDiagramData(DateTime d1, DateTime d2, string id_param)
{
SqlDataSource1.SelectParameters.Add("d1", DbType.Date, d1.ToString());
SqlDataSource1.SelectParameters.Add("d2", DbType.Date, d2.ToString());
SqlDataSource1.SelectParameters.Add("id_param", DbType.Int32, id_param);
}
Помогите, пожалуйста, найти решение.
Ответы (1 шт):
Временное найденное решение: кидаем на форму ASPxTimer1, Interval - 100, ClientInstanceName - ASPxTimer1, после чего для контролов, которые вызывают/изменяют_содержимое/изменяют_размер всплывающего окна, в ClientSideEvents (в разные Events, исходя из логики взаимодействия) пишем:
function(s, e) {
ASPxTimer1.SetEnabled(true);
}
В ASPxTimer1 - ClientSideEvents - Tick пишем:
function(s, e) {
ASPxTimer1.SetEnabled(false);
}
В UpdatePanel - Triggers добавляем ControlID = ASPxTimer1, EventName = Tick.
В результате после событий, требующих обновления всплывающего окна, с небольшой задержкой будет следовать команда на его update. Не считаю это решение верным, это такой "костыль", чтобы КАК-ТО работало. Настоящие решения приветствуются.