窗体控件在项目中使用非常频繁,同时窗体控件和启用IFrame的面板控件也一起构成了FineUI所特有的内联框架,从而使弹出窗体不再局限于IFrame页面中。本章我们会详细介绍窗体控件的基本用法。
在页面中声明窗体控件标签,并设置需要的属性:
1: <ext:Window ID="Window2" Width="500px" Height="300px" Icon="TagBlue" Title="窗体" Hidden="false"
2: EnableMaximize="true" EnableCollapse="true" runat="server" EnableResize="true"
3: IsModal="false" CloseAction="HidePostBack" OnClose="Window2_Close" Layout="Fit">
4: <Items>
5: <ext:ContentPanel ShowBorder="false" ShowHeader="false" ID="ContentPanel2" EnableBackgroundColor="true"
6: BodyPadding="5px" runat="server">
7: <br />
8: 这是窗体的内容。
9: <br />
10: <br />
11: <br />
12: <br />
13: </ext:ContentPanel>
14: </Items>
15: </ext:Window>
显示效果如下图:
这是一个允许折叠、允许最大化、允许关闭、允许改变尺寸、允许拖动的模式窗体,并且关闭后会触发Close服务器端事件。
由于窗体控件也是一个面板控件,所以拥有面板控件的公共属性,这里列出几个常用的面板属性:
其中EnableIFrame、IFrameUrl、IFrameName三个属性在上一节介绍TabStrip控件时已经接触到,在Window控件中会经常使用这三个属性,比如下面的代码:
1: <ext:Window ID="Window2" Width="500px" Height="300px" Icon="TagBlue" Title="窗体" Hidden="false"
2: EnableMaximize="true" EnableCollapse="true" runat="server" EnableResize="true"
3: IsModal="false" CloseAction="HidePostBack" OnClose="Window2_Close" EnableIFrame=“true” IFrameUrl=“about:blank” >
4: </ext:Window>
窗体控件自身也拥有很多属性:
在服务器端显示隐藏窗体控件非常简单,只需要设置Hidden属性即可(你可能会看到使用Popup属性来显示隐藏窗体,不过这个属性已经作废了)。注意Hidden属性存在于基类ControlBase中,也就是说所有的FineUI控件都拥有此属性。
比如点击按钮来关闭弹出窗体:
1: protected void btnHideInServer_Click(object sender, EventArgs e)
2: {
3: Window2.Hidden = true;
4: }
也可以通过JavaScript来关闭当前窗体,FineUI提供了帮助函数来完成这一任务:
1: <ext:Button ID="btnShowInClient" Text="显示窗体" EnablePostBack="false" runat="server">
2: </ext:Button>
1: protected void Page_Load(object sender, EventArgs e)
2: {
3: if (!IsPostBack)
4: {
5: btnShowInClient.OnClientClick = Window2.GetShowReference();
6: }
7: }
除了GetShowReference两个帮助函数,还有很多类似的帮助函数,从官方文档可以清晰的看到这些帮助函数:
与窗体的CloseAction属性类似(Hide、HideRefresh、HidePostBack),FineUI提供了相应的帮助函数来完成相同的任务:
除此之外,还有GetHidePostBackReference还有一个重载函数 GetHidePostBackReference (string argument),用来在回发时传递参数,比如下面这个例子:
1: <ext:Button ID="btnHideInClient2" Text="隐藏窗体,带回发参数(客户端代码)" EnablePostBack="false"
2: runat="server">
3: </ext:Button>
1: protected void Page_Load(object sender, EventArgs e)
2: {
3: if (!IsPostBack)
4: {
5: btnHideInClient.OnClientClick = Window2.GetHideReference();
6: btnHideInClient2.OnClientClick = Window2.GetHidePostBackReference("btnHideInClient2");
7: }
8: }
1: protected void Window2_Close(object sender, WindowCloseEventArgs e)
2: {
3: Alert.ShowInTop("窗体被关闭了。参数:" + e.CloseArgument);
4: }
当点击此按钮时,界面效果:
有些网友希望能够打开窗体就最大化,这也可以通过上面的JavaScript脚本来实现,其实很简单:
1: protected void Page_Load(object sender, EventArgs e)
2: {
3: if (!IsPostBack)
4: {
5: PageContext.RegisterStartupScript(Window2.GetShowReference() + Window2.GetMaximizeReference());
6:
7: }
8: }
通常的站点框架是左侧菜单,右侧IFrame页面的形式,因此在IFrame页面中弹出的任何窗体控件都被限制在右侧的IFrame页面中,这也是常见框架的无奈。对于这个常用功能,FineUI进行了扩展,为窗体控件增加Target属性,从而解除了这个限制(其实FineUI内部进行了大量的工作来满足这种需求)。
下面通过一个示例来说明两者的区别:
1: <ext:Button ID="Button1" runat="server" EnablePostBack="false" Text="在本页面弹出IFrame窗体">
2: </ext:Button>
3: <ext:Button ID="Button2" runat="server" EnablePostBack="false" Text="在父页面弹出IFrame窗体">
4: </ext:Button>
5:
6: <ext:Window ID="Window1" IconUrl="~/images/16/10.png" runat="server" Popup="false"
7: WindowPosition="Center" IsModal="true" Title="Popup Window 1" EnableMaximize="true"
8: EnableResize="true" Target="Self" EnableIFrame="true" IFrameUrl="about:blank"
9: Height="500px" Width="650px" OnClose="Window1_Close">
10: </ext:Window>
11:
12: <ext:Window ID="Window2" IconUrl="~/images/16/11.png" runat="server" Popup="false"
13: IsModal="true" Target="Parent" EnableMaximize="true" EnableResize="true" OnClose="Window2_Close"
14: Title="Popup Window 2" EnableConfirmOnClose="true" CloseAction="HidePostBack"
15: EnableIFrame="true" IFrameUrl="about:blank" Height="500px" Width="650px">
16: </ext:Window>
1: protected void Page_Load(object sender, EventArgs e)
2: {
3: if (!IsPostBack)
4: {
5: Button1.OnClientClick = Window1.GetShowReference("../grid/grid_iframe_window.aspx", "弹出窗口一");
6: Button2.OnClientClick = Window2.GetShowReference("../grid/grid_iframe_window.aspx", "弹出窗口二");
7: }
8: }
可见,在本页面弹出窗体控件和在父页面弹出窗体控件的唯一区别是窗体控件的Target属性设置,而后台注册的JavaScript脚本却完全一样。
那么,如何在弹出窗体的IFrame页面中关闭当前弹出窗体呢?
使用Hidden属性啊,很多人可能会不假思索的说。其实这是不对的,因为此窗体是在父页面中定义的,窗体IFrame中的页面是拿不到窗体实例的(因为这是两个页面),那么该怎么办?
不用急,FineUI提供了ActiveWindow静态类帮助完成这一任务,同时也提供了扩展(是否在关闭窗体前检查窗体IFrame中表单是否改变)。
在窗体IFrame中关闭窗体的三个功能:
注意:本文中第三次出现了Hide、HideRefresh和HidePostBack内容,但是这次和前两次都不同。
当然我们也可以为按钮注册客户端脚本,在客户端直接关闭弹出窗体:
1: protected void Page_Load(object sender, EventArgs e)
2: {
3: if (!IsPostBack)
4: {
5: btnClose.OnClientClick = ActiveWindow.GetHideReference();
6: }
7: }
对于需要在关闭窗体前检查IFrame中表单是否改变,并弹出确认框的情况,有相应的扩展:
当窗体IFrame中的表单发生改变时,在没有保存的情况下关闭就会弹出确认对话框,如下图所示:
还记得我们前面介绍的EnableConfirmOnClose属性么,这个是用来控制右上角关闭按钮和ESC快捷键的类似方法。
本章详细讲解了窗体控件的基本用法,包括创建窗体控件、显示隐藏窗体控件,以及如何在本页面和父页面弹出窗体。下一篇文章会继续深入窗体控件,介绍表格与窗体控件的交互以及子窗体和父页面的传值问题。