[原创]FineUI秘密花园(二十七) — 窗体控件概述(上)

窗体控件在项目中使用非常频繁,同时窗体控件和启用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>

显示效果如下图:

image

这是一个允许折叠、允许最大化、允许关闭、允许改变尺寸、允许拖动的模式窗体,并且关闭后会触发Close服务器端事件。

 

由于窗体控件也是一个面板控件,所以拥有面板控件的公共属性,这里列出几个常用的面板属性:

  • Expanded:是否展开
  • Title:面板的标题
  • EnableIFrame:是否启用IFrame
  • IFrameUrl:IFrame的地址
  • IFrameName:IFrame的名称

其中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=“trueIFrameUrl=“about:blank>
   4:  </ext:Window>


窗体控件自身也拥有很多属性:

  • WindowPosition:窗口的位置(Center、GoldenSection) ,GoldenSection是推荐的、也是默认的窗体位置,对此前面已有详细解释。
  • EnableClose:是否可以关闭
  • EnableDrag:是否可以移动
  • EnableMaximize:是否可以最大化
  • EnableMinimize:是否可以最小化
  • EnableResize:是否可以改变窗口大小
  • MinHeight:最小高度
  • MinWidth:最小宽度
  • IsModal:是否模式窗口
  • OnClientCloseButtonClick:点击关闭按钮时需要执行的客户端脚本
  • EnableConfirmOnClose:关闭Window之前弹出确认当前表单改变的对话框,只有在EnableIFrame时才有效。如果窗体控件IFrame页面中的表单内容发生改变,此时关闭此弹出窗体时会首先弹出确认关闭对话框(防止用户输入数据由于误操作而丢失)。
  • CloseAction:关闭窗体的动作(点击关闭按钮或者按 ESC 键都会执行此动作) (Hide、HideRefresh、HidePostBack)。这里的刷新和回发都指的是关闭窗体后对父页面进行的操作。比如只有将此属性设为HidePostBack才会在关闭窗体时触发窗体的Close事件。
  • Target:弹出窗口的目标位置(Self、Parent、Top)。这是FineUI的一个创新,也是FineUI内联框架的精华所在,简单的一个属性设置让弹出窗体不再局限于IFrame的框框中。

 

显示隐藏窗体控件


在服务器端显示隐藏窗体控件非常简单,只需要设置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两个帮助函数,还有很多类似的帮助函数,从官方文档可以清晰的看到这些帮助函数:

image

 

与窗体的CloseAction属性类似(Hide、HideRefresh、HidePostBack),FineUI提供了相应的帮助函数来完成相同的任务:

  • GetHideReference:获取关闭当前激活Window的客户端脚本
  • GetHideRefreshReference:获取关闭当前激活Window然后刷新页面的客户端脚本
  • GetHidePostBackReference:获取关闭当前激活Window然后回发页面的客户端脚本

除此之外,还有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:  }

当点击此按钮时,界面效果:

image

 

有些网友希望能够打开窗体就最大化,这也可以通过上面的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中关闭窗体的三个功能:

  • 关闭窗体按钮:PageContext.RegisterStartupScript(ActiveWindow.GetHideReference());
  • 关闭窗体后刷新父页面按钮:PageContext.RegisterStartupScript(ActiveWindow.GetHideRefreshReference());
  • 关闭窗体后回发父页面按钮:PageContext.RegisterStartupScript(ActiveWindow.GetHidePostBackReference());

 

注意:本文中第三次出现了Hide、HideRefresh和HidePostBack内容,但是这次和前两次都不同。

  • 窗体控件的CloseAction属性,值可以为Hide、HideRefresh和HidePostBack:控制点击右上角关闭按钮和ESC来关闭窗体的行为。
  • 窗体的GetHideReference、GetHideRefreshReference和GetHidePostBackReference帮助函数:控制关闭当前窗体的行为,发起方是当前窗体所在的页面。
  • 静态类ActiveWindow的三个帮助函数:控制关闭当前激活窗体的行为,发起方可以不是当前窗体所在的页面。

 

 

当然我们也可以为按钮注册客户端脚本,在客户端直接关闭弹出窗体:

   1:  protected void Page_Load(object sender, EventArgs e)
   2:  {
   3:      if (!IsPostBack)
   4:      {
   5:          btnClose.OnClientClick = ActiveWindow.GetHideReference();
   6:      }
   7:  }

 

对于需要在关闭窗体前检查IFrame中表单是否改变,并弹出确认框的情况,有相应的扩展:

  • 关闭窗体按钮:PageContext.RegisterStartupScript(ActiveWindow.GetConfirmHideReference());
  • 关闭窗体后刷新父页面按钮:PageContext.RegisterStartupScript(ActiveWindow.GetConfirmHideRefreshReference());
  • 关闭窗体后回发父页面按钮:PageContext.RegisterStartupScript(ActiveWindow.GetConfirmHidePostBackReference());

当窗体IFrame中的表单发生改变时,在没有保存的情况下关闭就会弹出确认对话框,如下图所示:

image

 

还记得我们前面介绍的EnableConfirmOnClose属性么,这个是用来控制右上角关闭按钮和ESC快捷键的类似方法。

 

小结

本章详细讲解了窗体控件的基本用法,包括创建窗体控件、显示隐藏窗体控件,以及如何在本页面和父页面弹出窗体。下一篇文章会继续深入窗体控件,介绍表格与窗体控件的交互以及子窗体和父页面的传值问题。

 

注:《FineUI秘密花园》系列文章由三生石上原创,博客园首发,转载请注明出处。文章目录 官方论坛

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之AIDL使用详解

1.什么是aidl:aidl是 Android Interface definition language的缩写&#xff0c;一看就明白&#xff0c;它是一种android内部进程通信接口的描述语言&#xff0c;通过它我们可以定义进程间的通信接口 icp:interprocess communication :内部进程通信 2.既然aidl可以定义并实现进…

用php打印九九乘法表,php如何打印出九九乘法表呢?

摘要:下文讲述使用php代码在页面上输出九九乘法表的示例分享&#xff0c;如下所示&#xff1b;实现思路:主要使用遍历的方式输出九九乘法表例:php 循环输出九九乘法表echo "maomao365.com 示例分享\n";echo "for 循环打印出九九乘法表";for($j1; $j<9; …

他言行不一屡次跳槽,还升职加薪走上了人生巅峰,全数学界都炸了......

全世界只有3.14 % 的人关注了爆炸吧知识看在大家都这么爱学习的份上&#xff0c;今天小天就和大家介绍一名老师吧&#xff01;这位老师就是亚历山大.雅科夫列奇.辛钦&#xff01;家庭教育好&#xff0c;学霸就有了亚历山大.雅科夫列奇.辛钦&#xff0c;1894年出生于前苏联莫斯科…

IoTSharp部署教程-Sqlite分表篇

IoTSharp的部署环境极其灵活&#xff0c;我们推荐使用Docker方式进行部署&#xff0c; 这减少了很多配置&#xff0c; 首先最简单的部署当然属于 Sqlite 数据库&#xff0c; 且不适用任何外部依赖。 在生产环境中&#xff0c; 我们需要配置 appsettings.Production.json 文件&a…

Android之AsyncTask两种线程池分析和总结

Android AsyncTask两种线程池分析和总结(一) 前言在android AsyncTask里面有两种线程池供我们调用1&#xff0e; THREAD_POOL_EXECUTOR, 异步线程池2&#xff0e; SERIAL_EXECUTOR&#xff0c;同步线程池正如上面名称描述的那样&#xff0c;一个是异步线程池&#xff…

一款好的折线图、饼图、柱形图

链接地址http://www.highcharts.com/demo/line-basic/skies http://www.highcharts.com/demo/转载于:https://www.cnblogs.com/blueking/p/3530787.html

被遗忘的数学家!曾提出最接地气的数学定理,可以计算男朋友真不真心的那种......

全世界只有3.14 % 的人关注了爆炸吧知识在介绍了业余数学家费马后&#xff0c;听说很多小伙伴还想看看业余的。这不&#xff0c;小天这次又来介绍业余数学家来了。险些被遗忘托马斯.贝叶斯&#xff0c;十八世纪英国的一个长老会的牧师&#xff08;专业&#xff09;和数学家&…

Android之MVVM框架 - 数据绑定

本教程是跟着 Data Binding Guide 学习过程中得出的一些实践经验&#xff0c;同时修改了官方教程的一些错误&#xff0c;每一个知识点都有对应的源码&#xff0c;争取做到实践与理论相结合。 Data Binding 解决了 Android UI 编程中的一个痛点&#xff0c;官方原生支持 MVVM 模…

再见 Typora,这款 Markdown 编辑器开源又免费!

推荐一个免费开源的 Markdown 编辑器编程导航 致力于推荐优质编程资源 &#x1f48e;项目开源仓库&#xff1a;https://github.com/liyupi/code-nav跪求一个 star ⭐️哈喽大家好&#xff01;我是编程导航的小编火宝。前段时间 Typora 宣布将升级并开始收费&#xff0c;想必大家…

Android窗口管理服务WindowManagerService的简要介绍和学习计划

在前一个系列文章中&#xff0c;我们从个体的角度来分析了Android应用程序窗口的实现框架。事实上&#xff0c;如果我们从整体的角度来看&#xff0c;Android应用程序窗口的实现要更复杂&#xff0c;因为它们的类型和作用不同&#xff0c;且会相互影响。在Android系统中&#x…

Andorid之为何要用到NDK?

概括来说主要分为以下几种情况&#xff1a; 1. 代码的保护&#xff0c;由于apk的java层代码很容易被反编译&#xff0c;而C/C库反汇难度较大。 2. 在NDK中调用第三方C/C库&#xff0c;因为大部分的开源库都是用C/C代码编写的。 3. 便于移植&#xff0c;用C/C写得库可以方便在其…

日本最惨数学天才!37岁裸辞,房子被政府没收,向全村人乞讨,一家五口只能吃野菜.........

全世界只有3.14 % 的人关注了爆炸吧知识数学是火他是飞蛾多年以后&#xff0c;当冈熙哉站在桥本市的数学家纪念碑前&#xff0c;准会想起父亲请他吃面包片的那个遥远的夜晚。当时&#xff0c;他们一家五口蜗居在邻居施舍租出的小库房里。冈洁家三代同堂在他的回忆中&#xff0c…

3、Eternal框架-控制器

2019独角兽企业重金招聘Python工程师标准>>> 介绍 MVC&#xff1a;Model-View-Controller&#xff0c;包括三类对象&#xff0c;Model模型对象、View视图表示、Controller控制器。在应用MVC方式以前&#xff0c;通常将这三个对象的功能合到了一起&#xff0c;通过分…

java配置JDK

1、将JDK文件拷入电脑并解压缩 根据系统版本选择JDK版本&#xff0c;并将eclipse解压缩 2、配置系统环境变量 右键我的电脑--属性--高级系统设置--环境变量 新建JAVA_HOME如图所示&#xff08;严格区分大小写&#xff09; 修改环境变量Path 在变量值一栏的最前面加上%JAVA_HOM…

可怕!原来我们看到的世界地图一直都是“错”的!多年的地理白学了...

▲ 点击查看几乎每个家庭都会有两张地图&#xff1a;一张世界地图&#xff0c;一张中国地图。薄薄的两张纸&#xff0c;蕴藏着让每个人学会“看世界”的磅礴力量。哈佛上一任校长&#xff0c;也是300多年来唯一一位女校长德鲁吉尔平福斯特&#xff08;Drew Gilpin Faust&#x…

.NET 程序测试 Java 项目 log4j2 是否存在远程代码执行漏洞

最近两天被朋友圈的“Apache Log4j2 远程代码执行漏洞”刷屏了&#xff0c;主要是因为组件存在 Java JNDI 注入漏洞&#xff1a;当程序将用户输入的数据记入日志时&#xff0c;攻击者通过构造特殊请求&#xff0c;来触发 Apache Log4j2 中的远程代码执行漏洞&#xff0c;从而利…

史上最牛的文科生:法学出身,却发明出十进制计算器,折磨无数人的微积分符号,跨界40多个领域惊艳学术圈

全世界只有3.14 % 的人关注了爆炸吧知识“世界上没有完全相同的两片树叶。”想必大家对这句话耳熟能详&#xff0c;但却不知道这名言背后的作者是谁吧&#xff1f;其实&#xff0c;他就是与牛顿争论微积分优先权大战中的大佬&#xff1a;莱布尼茨。博览群书 天赋异禀1646年&…

如何解决secureCRT里面的The remote system refused the connection.

不废话,先爆照 Ubuntu缺省安装了openssh-client,所以在这里就不安装了,如果你的系统没有安装的话,再用apt-get安装上即可。然后确认sshserver是否启动了: ps -e |grep ssh 如果只有ssh-agent那ss

python 带pydev的eclipse无法导入win32api包(或无法导入其他包)

需要重新配置pydev中的python解释器&#xff0c;因为它不会自动更新。 将原先的python.exe先remove掉&#xff0c;再重新new回来&#xff0c;new回来的时候会让你勾选system libs&#xff0c;把你想要更新的勾选上去就可以了。转载于:https://blog.51cto.com/xuewei/1111889

OC之非ARC环境下循环retain问题

观察上述情况&#xff0c;上述就是著名的循环引用问题&#xff0c;对于此类问题&#xff0c;“你包含我&#xff0c;我包含你”&#xff0c;里面相关的对象占用的内存永远回收不了&#xff0c;解决办法很简单&#xff0c;与常规方法不同。正常情况下&#xff0c;我们应在Person…