Закрытие RadWindow путем вызова JavaScript с сервера

У меня есть элемент управления, который выглядит следующим образом:

<telerik:RadCodeBlock runat="server">
    <script type="text/javascript">
        function refresh() {
            window.$find("<%= RadAjaxManager1.ClientID %>").ajaxRequest("RebindRecommendations");
        }
    </script>
</telerik:RadCodeBlock>
<telerik:RadAjaxManager ID="RadAjaxManager1" runat="server" OnAjaxRequest="AjaxRequest">
    <AjaxSettings>
        <telerik:AjaxSetting AjaxControlID="RadAjaxManager1">
            <UpdatedControls>
                <telerik:AjaxUpdatedControl ControlID="NameOfGrid" />
            </UpdatedControls>
        </telerik:AjaxSetting>
    </AjaxSettings>
</telerik:RadAjaxManager>
<telerik:RadWindowManager ID="RadWindowManager1" runat="server">
    <Windows>
        <telerik:RadWindow ID="RadWindow1" runat="server" NavigateUrl="UrlOfPage" OnClientClose="refresh"></telerik:RadWindow>
    </Windows>
</telerik:RadWindowManager>

Страница:

<script type="text/javascript">
    function closeWindow() {
        self.close();
        return false;
    }
</script>
<!-- form fields here -->
<telerik:RadButton runat="server" ID="_cancel" Text="Cancel" OnClientClick="closeWindow"></telerik:RadButton>
<telerik:RadButton runat="server" ID="_submit" Text="Submit" OnClientClick="closeWindow" OnClick="DoSomeDataBaseStuff"></telerik:RadButton>

Это работает как задумано. Мое RadWindow удалено, и сетка моего элемента управления обновляется при нажатии кнопок отмены или отправки. Проблема в том, что к тому времени база данных еще не закончила свою работу, поэтому обновление сетки не показывает изменений. Я попытался переключить мою реализацию страницы, чтобы выглядеть так:

Страница:

<script type="text/javascript">
    function closeWindow() {
        self.close();
        return false;
    }
</script>
<!-- form fields here -->
<telerik:RadButton runat="server" ID="_cancel" Text="Cancel" OnClick="CallJavaScriptToKillWindow"></telerik:RadButton>
<telerik:RadButton runat="server" ID="_submit" Text="Submit" OnClick="DoSomeDataBaseStuffAndThenCallJavaScriptToKillWindow"></telerik:RadButton>

Code Behind в конце концов вызывает это после завершения работы с базой данных:

ClientScript.RegisterStartupScript(GetType(), "Key", "closeWindow();", true);

Я достиг своей точки останова в функции closeWindow, но она не имеет такого поведения (окно на самом деле не закрывается). Я пробовал различные итерации, такие как:

ClientScript.RegisterStartupScript(GetType(), "Key", "$(document).ready(function() {return closeWindow();});", true);

но безрезультатно. Что мне не хватает?

3 ответа

Решение

Что такое "я"? Разве вы не имеете в виду "это"?

Вы пытаетесь закрыть RadWindow изнутри окна или со страницы, которая запускает окно?

Из окна я обычно делаю это:

    function GetRadWindow()
    {
        var oWindow = null;
        if (window.radWindow)
            oWindow = window.radWindow;
        else if (window.frameElement.radWindow)
            oWindow = window.frameElement.radWindow;
        return oWindow;
    }

    function Close()
    {
        var oWindow = GetRadWindow();
        oWindow.argument = null;
        oWindow.close();
        return false;
    }

Кроме того, я бы использовал ScriptManager.RegisterStartupScript, а не ClientScript.

Я почти уверен, что сталкивался с этой проблемой раньше, и я думаю, что это исправило:

setTimeout("self.close()", 1000);

Если это не сработает, попробуйте это:

setTimeout("self.focus()", 500); //adjust the timeout as needed
setTimeout("self.close()", 1000);

Вы также можете сделать это таким образом, если вы предпочитаете:

setTimeout(function(){
    self.close();
}, 1000);

Я не уверен, что я улучшаю этот ответ, я просто пытаюсь облегчить его понимание. У меня есть рад окно, которое открывается с главной страницы. Radwindow открывается в коде позади (C#), а не в Javascript. Когда мой пользователь нажимает кнопку "Сохранить" в RadWindow, он выполняет некоторые логические задачи, а затем закрывает само Radwindow. Вам просто нужно:

Поместите этот блок кода в вас RadWindow aspx.....

<telerik:RadCodeBlock runat="server" ID="rcb1">
<script language="javascript" type="text/javascript">

function GetRadWindow() 
{
var oWindow = null;
if (window.radWindow) oWindow = window.radWindow;
else if (window.frameElement.radWindow) oWindow = window.frameElement.radWindow;
return oWindow;
}
function CloseDialog(button) 
{
GetRadWindow().close();
}  

</script>
</telerik:RadCodeBlock>

Поместите этот код в нажатие кнопки вашего RadWindow после выполнения логики предварительного закрытия (та же кнопка, которая выполняет другую логику, закрывает окно)

C# ClientScript.RegisterStartupScript (typeof (string), "", "CloseDialog ();");

ИЛИ ЖЕ

VB ClientScript.RegisterStartupScript(Me.GetType(), "", "CloseDialog();")

Если вам интересно, как открыть это окно из кода, вот как я это сделал:

RadWindow window1 = new RadWindow();
// Set the window properties   
window1.NavigateUrl = "winStrengthChart.aspx?EMPLOYIDNAME=" + parmString;
window1.ID = "RadWindow1";
window1.Width = 800;
window1.Height = 650;
window1.VisibleStatusbar = false;
window1.Behaviors = Telerik.Web.UI.WindowBehaviors.Close | Telerik.Web.UI.WindowBehaviors.Resize | Telerik.Web.UI.WindowBehaviors.Move;
window1.VisibleOnPageLoad = true; // Set this property to True for showing window from code   
rwm1.Windows.Add(window1);
this.Form1.Controls.Add(window1);   

... И, конечно, вам нужен базовый RadWindowManager на главной странице, которая открывает окно:

<telerik:RadWindowManager ID="rwm1" runat="server">
<Windows>
</Windows>
</telerik:RadWindowManager>

Это должно работать, если я допустил ошибку, пожалуйста, исправьте меня.

Спасибо

Другие вопросы по тегам