Как закрыть родительское окно из своего дочернего элемента?
У меня есть следующий случай:
У меня есть gridview на моей странице:
page1.aspx
Я открываю другую страницу (page2.aspx
) через это gridview в окне rad, после чего через некоторую кнопку на page2.aspx
открываю последнюю страницу (page3.aspx
) в rad window
.
все эти шаги выполняются с помощью кода на стороне сервера:
protected void OpenNewWindow(string url, int width, int height, int mode)
{
RadWindow newWindow = new RadWindow();
newWindow.NavigateUrl = url;
newWindow.VisibleOnPageLoad = true;
newWindow.KeepInScreenBounds = true;
newWindow.Skin = "Metro";
if (width > 0)
{
newWindow.Width = width;
}
if (height > 0)
{
newWindow.Height = height;
}
newWindow.VisibleStatusbar = false;
if (mode == 0)
{
{
}
//newWindow.OnClientClose = "OnChildWindowClosed";
newWindow.DestroyOnClose = true;
newWindow.InitialBehaviors = WindowBehaviors.Maximize;
}
RadWindowManager1.Windows.Add(newWindow);
}
Что я хочу сделать:
при нажатии на определенную кнопку на моей (page3.aspx
) закройте ее и ее родительский page2.aspx
.
Как это сделать (на стороне сервера)?
Я пробую это: но он просто закрывает дочерний элемент page3.aspx
Я хочу закрыть родительский page2.aspx
также?!
protected void Button1_Click(object sender, EventArgs e)
{
((RadAjaxManager)this.Parent.FindControl("RadAjaxManager1")).ResponseScripts.Add("CloseModal();");
RadAjaxManager1.ResponseScripts.Add("CloseModal();");
}
Ответы
Ответ 1
protected void Button1_Click(object sender, EventArgs e)
{
((RadAjaxManager)this.Parent.FindControl("RadAjaxManager1")).ResponseScripts.Add("CloseModal();");
RadAjaxManager1.ResponseScripts.Add("CloseModal();");
}
Если событие CloseModal()
запускается правильно, вы можете вызвать window.close()
внутри него. RadWindows существует только в контексте родительского окна, поэтому вы все равно можете вызвать window.close()
, который закроет каждое открывающееся окно.
Изменить:, хотя немного не по теме, эта ссылка от Telerik показывает вам, как получить доступ к родительское окно из RadWindow. Затем вы можете вызвать клиентскую сторону метода close, чтобы закрыть окно браузера (page1.aspx), который закроет все последующие RadWindows.
От эта ссылка:
Основное отличие RadWindow от всплывающего окна браузера заключается в том, что RadWindow, как и любой другой элемент DHTML, существует только в контексте страницы, на которой он создан. Он не может покинуть границы окна браузера.
Ответ 2
Вы можете сделать событие пузыря, реализуя интерфейс каждого родителя. Я пытаюсь проиллюстрировать свой разум.
public interface IClosingParent
{
void Close();
}
public class PageA : System.Web.Page, IClosingParent
{
public void IClosingParent.Close()
{
//Code to close it or hide it
}
}
public class PageB : System.Web.Page, ClosingParent
{
public void IClosingParent.Close()
{
((IClosingParent)this.Parent).Close();
//Code to close it or hide it
}
}
public class PageC : System.Web.Page
{
protected void ButtonClose_Click(object sender, EventArgs e)
{
((IClosingParent)this.Parent).Close();
//Code to close it or hide it
}
}
В том числе вы должны объявить RadWindow в родительский. Таким образом, в иерархическом представлении это выглядит следующим образом:
PageA : IClosingParent
|
|-- PageB : IClosingParent
|
|-- PageC
|-- ButtonClose
Я думаю, что вы можете с помощью этого решения управлять процессом закрытия, как вы хотите, и изменять, когда бы вы ни хотели.
Ответ 3
Это может показаться деревенским, но почему бы вам просто не выполнить код сервера, который вы хотите запустить до закрытия, а затем вернуть клиенту параметр bool, который позволяет ему запускать оператор if, который закрывает окно (на стороне клиента )?
PS: Я думаю, что алгоритмически, у меня нет большого опыта работы с серверной С#.