前言

FineUI中的Window控件常用作选择、新增或编辑内容。而关闭Window控件却有很多技巧,了解这些技巧有助于项目的快速开发。

如何关闭Window控件

第一个问题就是如何关闭Window控件,最明显的方式就是右上角的关闭图标了。总的说来,有三种方式:

  1. ESC按键(在Window控件所在页面获取焦点的情况下,按下键盘的ESC将会关闭当前激活窗体)
  2. 窗体右上角的关闭图标
  3. 用户自定义的关闭按钮

前两种方式自不必说,那么如何自定义关闭按钮呢?有两种做法:

  1. 按钮禁用回发,在页面初始化时注册关闭脚本

     <f:Button ID="btnHideInClient" CssClass="inline" Text="隐藏窗体(客户端代码)" EnablePostBack="false"
    runat="server">
    </f:Button>
     protected void Page_Load(object sender, EventArgs e)
    {
    if (!IsPostBack)
    {
    btnHideInClient.OnClientClick = Window2.GetHideReference();
    }
    }
  2. 按钮回发,在回发事件中设置窗体Hidden属性,
     <f:Button ID="btnHideInServer" Text="隐藏窗体(服务端代码)" runat="server" OnClick="btnHideInServer_Click">
    </f:Button>
     protected void btnHideInServer_Click(object sender, EventArgs e)
    {
    Window2.Hidden = true;
    }

    或者注册关闭脚本:

     protected void btnHideInServer_Click(object sender, EventArgs e)
    {
    PageContext.RegisterStartupScript(Window2.GetHideReference());
    }

当然,这里按钮是和Window控件在同样一个页面的。

对于另一种常见情况,也即启用IFrame的Window控件,位于IFrame页面内的按钮如何关闭父页面中的这个Window控件呢?

显然,我们无法在IFrame页面内获取Window控件的实例!

没关系,FineUI提供了ActiveWindow类来处理这个常见问题:

 protected void btnSaveContinue_Click(object sender, EventArgs e)
{
PageContext.RegisterStartupScript(ActiveWindow.GetHideReference());
}

关闭窗体的方式

前面提到的关闭窗体,只是简单的关闭,并未做任何其他处理。其实FineUI提供了三种关闭窗体的方式:

  1. 直接关闭:也就是前面提到的 GetHideReferene 方法返回的脚本
  2. 关闭窗体,然后回发窗体所在的页面,触发Window控件的Close事件:可以使用内置的 GetHidePostBackReference 方法
  3. 关闭窗体,然后刷新窗体所在的页面:可以使用内置的 GetHideRefreshReference 方法

再回到前面介绍的"如何关闭窗体",显然前两种关闭方法(ESC,右上角关闭图标)无法使用 GetHide***Reference 方法,怎么办?

FineUI同时为Window控件提供了 CloseAction 属性,可能的值为 Hide,HidePostBack 和 HideRefresh,分别对应上述方法。

来看一个例子:

  1. 初始显示
  2. 点击右上角关闭图标,触发了Close事件


    这个行为是由Window控件的CloseAction属性控制的,来看下控件标签:

     <f:Window ID="Window2" Width="650px" Height="300px" Icon="TagBlue" Title="窗体" Hidden="true"
    EnableMaximize="true" EnableCollapse="true" runat="server" EnableResize="true"
    IsModal="false" CloseAction="HidePostBack" OnClose="Window2_Close" Layout="Fit">
    </f:Window>

    后台的事件处理代码:

     protected void Window2_Close(object sender, WindowCloseEventArgs e)
    {
    Alert.ShowInTop("窗体被关闭了。参数:" + (String.IsNullOrEmpty(e.CloseArgument) ? "无" : e.CloseArgument));
    }

    CloseAction无法定义返回参数,所以这里显示"无"!

  3. 点击页面上的"隐藏窗体,带回发参数",触发了Close 事件,此时的页面显示


    这个按钮的响应脚本是在页面初始化时注册的,如下所示(注意参数是如何设进去的):

     protected void Page_Load(object sender, EventArgs e)
    {
    if (!IsPostBack)
    {
    btnHideInClient2.OnClientClick = Window2.GetHidePostBackReference("btnHideInClient2");
    }
    }

同样,对于启用IFrame的Window控件,其IFrame内按钮的关闭窗体处理,对应于ActiveWindow的几个方法:

  1. ActiveWindow.GetHideReference
  2. ActiveWindow.GetHidePostBackReference
  3. ActiveWindow.GetHideRefreshReference

关闭窗体的确认对话框

这个特性可能很多人都不知道,不过存在很强的实用性。

简单描述:启用IFrame的Window控件,如果IFrame页面内任意表单字段发生改变,则在关闭窗体时弹出确认框。

目的是防止用户在输入表单内容后,还没来的及保存,一个误操作把弹出窗体关了。

  1. 页面初始显示
  2. 在"数字输入框"内输入任意值,然后点击右上角的关闭图标,弹出确认对话框
  3. 清空 "数字输入框"内的值(也即是还原到其初始状态),然后点击右上角的关闭图标,则直接关闭窗体

上述操作是由Window控件的 EnableConfirmOnClose 属性控制(默认为false),下面是这个Window实例的标签定义:

 <f:Window ID="Window1" Hidden="true" EnableIFrame="true" runat="server" EnableConfirmOnClose="true"
EnableMaximize="true" EnableResize="true" Height="450px" Width="800px" Title="窗体一">
</f:Window>

对于上述页面中的"关闭"按钮,行为和右上角的关闭图标一致,不过这种一致性也是认为控制的,来看看"关闭"按钮的脚本:

 protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
btnClose.OnClientClick = ActiveWindow.GetConfirmHideReference();
}
}

本章小结

本篇文章介绍了三种关闭Window控件的方法(ESC、关闭图标、自定义),以及三种FineUI定义的处理方式(隐藏、隐藏后回发、隐藏后刷新)。对于IFrame内的关闭按钮,FineUI提供了ActiveWindow来生成关闭脚本。同时还介绍了一个FineUI内置的属性 EnableConfirmOnClose ,用来控制是否弹出关闭窗体的确认对话框。

源代码与在线示例

本系列所有文章的源代码均可自行下载:http://fineui.codeplex.com/

在线示例:

  1. http://fineui.com/demo/#/demo/window/window.aspx
  2. http://fineui.com/demo/#/demo/iframe/window.aspx

如果本文对你有所启发或者帮助,请猛击“好文要顶”,支持原创,支持三石!

24张专业版高清大图

《FineUI小技巧》系列文章目录

FineUI小技巧(4)关闭窗体那些事的更多相关文章

  1. FineUI小技巧(1)简单的购物车页面

    起因 最初是一位 FineUI 网友对购物车功能的需求,需要根据产品单价和数量来计算所有选中商品的总价. 这个逻辑最好在前台使用JavaScript实现,如果把这个逻辑移动到后台C#实现,则会导致过多 ...

  2. FineUI小技巧(5)向子窗口传值,向父窗口传值

    前言 FineUI中经常会用到启用IFrame的Window控件,这样有助于从物理上进行代码解耦和.IFrame的引入就会涉及传值问题,如何在父窗口和子窗口之间相互传值呢? 向子窗口传值 向子窗口传值 ...

  3. FineUI小技巧(3)表格导出与文件下载

    需求描述 实际应用中,我们可能需要导出表格内容,或者在页面回发时根据用户权限下载文件(注意,这里的导出与下载,都是在后台进行的,和普通的一个链接下载文件不同). 点击按钮导出表格 由于FineUI 默 ...

  4. FineUI小技巧(7)多表头表格导出

    前言 之前我们曾写过一篇文章 FineUI小技巧(3)表格导出与文件下载,对于在 FineUI 中导出表格数据进行了详细描述.今天我们要更进一步,介绍下如何导出多表头表格. 多表头表格的标签定义 在 ...

  5. FineUI小技巧(2)将表单内全部字段禁用、只读、设置无效标识

    需求描述 对表单内的所有字段进行操作也是常见需求,这些操作有: 禁用:表单字段变灰,不响应用户动作. 只读:表单字段不变灰,但不接受用户输入(实际上是设置DOM节点的readonly属性),有触发器的 ...

  6. FineUI小技巧(6)自定义页面回发

    前言 FineUI中的绝大部分回发事件都是由控件触发了,比如按钮的点击事件,下拉列表的改变事件,表格的排序分页事件.但有时我们可能会要自己触发页面回发,这时就要知道怎么使用 JavaScript 来做 ...

  7. [小技巧] Notepad++关闭拼写检查

    From : http://blog.csdn.net/xuefeng0707/article/details/18272989 把[插件]-[DSpellCheck]-[Spell Check Do ...

  8. cmd窗口关闭 -----window小技巧!

    前沿 平时开发的时候经常用到windows  的命令行工具来启动程序  或是 查看本地数据库的信息 : 经常的手动关闭 ,对于我这种,能用键盘完成的就坚决不用鼠标的人是多么痛苦. 所以在此罗列了一些命 ...

  9. Android Studio 使用小技巧和快捷键

    Android Studio 使用小技巧和快捷键 Alt+回车 导入包,自己主动修正 Ctrl+N   查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L  格式化代码 Ctrl+Alt ...

随机推荐

  1. C#实现函数默认值和C#4.0实现默认值

    static void Main(string[] args) { SayHello(); SayHello("侯志强"); Console.ReadKey(); } C#.0实现 ...

  2. mysql常用函数汇总

    一.数学函数ABS(x)   返回x的绝对值BIN(x)   返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x)   返回大于x的最小整数值EXP(x)   返回值e(自然对数 ...

  3. 《Google想出了一个决定人员晋升的算法,然后就没有然后了......》有感

    Prasad Setty 是 Google People Analytics 团队的副总裁.7 年前 Google 成立的这支团队的职责是收集和利用数据来支撑公司的管理实践.其使命很简单,即基于数据和 ...

  4. 2014.1.23 Discuz论坛迁移+VPS配置手记

    虽说这也不是我第一次转移这个论坛了,但毕竟还是第一次自己配置VPS,写点东西记一下 一:关于VPS的配置 1.用TeamViewer连接服务器 这个VPS的IDC自己带有一个远程控制的页面,用浏览器打 ...

  5. 0003 64位Oracle11gR2不能运行SQL Developer的解决方法

    "应用程序开发"下的"SQL Developer"双击不可用,出现“Windows正在查找SQLDEVELOPER.BAT"的提示,如下图: 搜索博客 ...

  6. 如何阻止h5body的滑动

    // 禁止 document.body.style.overflow = 'hidden'; function _preventDefault(e) { e.preventDefault(); } w ...

  7. 烂泥:源码安装apache

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 最近要开始学习nagios监控方面的知识了,但是nagios与apache结合的比较紧密,所以本篇文章就先把apache的源码安装学习下. 我们现在分以 ...

  8. x01.Game.LitSkull: 梯次防御

    1.人要有点精神 人要有点精神,否则,不是沦落为毫无意义的看客,就是退化成食色性也的动物,有被开除球籍的危险,如晚清. 2.框架 引号头文件在当前目录下搜寻,三角头文件在配置目录下搜寻,这是一个简单的 ...

  9. Java基础-super关键字与this关键字

    用super调用父类构造方法 类如果没有显式声明构造方法,则自动生成无参数的默认构造方法. 1.先用一个无参数的父类构造方法验证一下, 执行子类构造方法会自动调用父类的构造方法.测试代码: class ...

  10. python中if __name__ == "__main__":用法解析

    __name__: __name__作为模块的内置属性,简单点说呢,就是.py文件的调用方式. __main__: 如果__name__等于"__main__"就表示是直接执行. ...