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 шт):

Автор решения: NordRus

Временное найденное решение: кидаем на форму 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. Не считаю это решение верным, это такой "костыль", чтобы КАК-ТО работало. Настоящие решения приветствуются.

→ Ссылка