FineUI小技巧(2)将表单内全部字段禁用、只读、设置无效标识
需求描述
对表单内的所有字段进行操作也是常见需求,这些操作有:
- 禁用:表单字段变灰,不响应用户动作。
- 只读:表单字段不变灰,但不接受用户输入(实际上是设置DOM节点的readonly属性),有触发器的要隐藏起来
- 设置无效标识:一般用在服务器端验证失败的提示信息
界面效果
- 默认状态

- 禁用状态

- 只读状态

- 设置无效标识状态

前台代码
前台代码非常直观,只是一个Form控件外加几个Button控件,按钮的响应事件在后台完成:
<f:PageManager ID="PageManager1" runat="server" />
<f:Form Width="600px" LabelWidth="100px" OffsetRight="10px" LabelSeparator=":"
BodyPadding="5px" EnableCollapse="true" ID="Form1" runat="server" Title="表单">
<Rows>
<f:FormRow>
<Items>
<f:Label ID="Label3" Label="电话" Text="0551-1234567" runat="server" />
<f:Label ID="Label16" runat="server" Label="申请人" Text="admin">
</f:Label>
</Items>
</f:FormRow>
<f:FormRow>
<Items>
<f:Label ID="Label4" Label="编号" Text="200804170006" runat="server" />
<f:TextBox ID="TextBox2" Required="true" ShowRedStar="true" Label="电子邮箱" RegexPattern="EMAIL"
RegexMessage="请输入有效的邮箱地址!" runat="server">
</f:TextBox>
</Items>
</f:FormRow>
<f:FormRow>
<Items>
<f:DropDownList ID="DropDownList3" Label="审批人" runat="server" ForceSelection="false" Required="true" ShowRedStar="True">
<f:ListItem Text="老大甲" Value="0"></f:ListItem>
<f:ListItem Text="老大乙" Value="1"></f:ListItem>
<f:ListItem Text="老大丙" Value="2"></f:ListItem>
</f:DropDownList>
<f:NumberBox ID="NumberBox1" Label="申请数量" MaxValue="1000" Required="true" runat="server"
ShowRedStar="True" />
</Items>
</f:FormRow>
<f:FormRow>
<Items>
<f:DatePicker runat="server" Required="true" Label="日期" EmptyText="请选择日期"
ID="DatePicker1" SelectedDate="2014-07-10" ShowRedStar="True">
</f:DatePicker>
<f:TimePicker ID="TimePicker1" ShowRedStar="True" Label="时间" Increment="30"
Required="true" Text="08:30" EmptyText="请选择时间" runat="server">
</f:TimePicker>
</Items>
</f:FormRow> <f:FormRow>
<Items>
<f:FileUpload runat="server" ID="filePhoto" EmptyText="请选择一张照片" Label="个人头像" Required="true"
ShowRedStar="true">
</f:FileUpload>
</Items>
</f:FormRow>
<f:FormRow>
<Items>
<f:TextArea ID="TextArea1" runat="server" Label="描述" ShowRedStar="True" Required="True">
</f:TextArea>
</Items>
</f:FormRow>
<f:FormRow>
<Items>
<f:CheckBoxList ID="CheckBoxList1" Label="复选框列表" ColumnNumber="3" runat="server">
<f:CheckItem Text="可选项 1" Value="value1" />
<f:CheckItem Text="可选项 2" Value="value2" Selected="true" />
<f:CheckItem Text="可选项 3" Value="value3" Selected="true" />
<f:CheckItem Text="可选项 4" Value="value4" Selected="true" />
<f:CheckItem Text="可选项 5" Value="value5" Selected="true" />
</f:CheckBoxList>
</Items>
</f:FormRow>
<f:FormRow>
<Items>
<f:RadioButtonList ID="RadioButtonList2" Label="单选框列表" ColumnNumber="3" runat="server">
<f:RadioItem Text="可选项 1" Value="value1" />
<f:RadioItem Text="可选项 2" Value="value2" />
<f:RadioItem Text="可选项 3" Value="value3" Selected="true" />
<f:RadioItem Text="可选项 4" Value="value4" />
<f:RadioItem Text="可选项 5" Value="value5" />
</f:RadioButtonList>
</Items>
</f:FormRow>
</Rows>
</f:Form>
<br />
<f:Button ID="btnDisableAll" Text="全部禁用" CssClass="marginr" runat="server" OnClick="btnDisableAll_Click">
</f:Button>
<f:Button ID="btnEnableAll" Text="全部启用" CssClass="marginr" runat="server" OnClick="btnEnableAll_Click">
</f:Button>
<f:Button ID="btnReadOnlyAll" Text="全部只读" CssClass="marginr" runat="server" OnClick="btnReadOnlyAll_Click">
</f:Button>
<f:Button ID="btnCancelReadOnlyAll" Text="取消只读" CssClass="marginr" runat="server" OnClick="btnCancelReadOnlyAll_Click">
</f:Button>
<br />
<br />
<f:Button ID="btnMarkInvalid" Text="设置无效标识" CssClass="marginr" runat="server" OnClick="btnMarkInvalid_Click">
</f:Button>
<f:Button ID="btnClearInvalid" Text="取消无效标识" CssClass="marginr" runat="server" OnClick="btnClearInvalid_Click">
</f:Button>
后台代码
因为几个按钮的逻辑类似,这里我们定义一个代理(delegate),把相同的逻辑放在一个函数中完成,如下所示:
private delegate void ProcessFormField(Field field); private void ResolveFormField(ProcessFormField process)
{
foreach (FormRow row in Form1.Rows)
{
foreach (Field field in row.Items)
{
if (field != null)
{
process(field);
}
}
}
}
几个按钮的只需要调用刚刚定义的ResolveFormField函数,并传入自己的代理实现即可:
protected void btnDisableAll_Click(object sender, EventArgs e)
{
ResolveFormField(delegate(Field field)
{
field.Enabled = false;
});
} protected void btnEnableAll_Click(object sender, EventArgs e)
{
ResolveFormField(delegate(Field field)
{
field.Enabled = true;
});
} protected void btnReadOnlyAll_Click(object sender, EventArgs e)
{
ResolveFormField(delegate(Field field)
{
if (!(field is Label))
{
field.Readonly = true;
}
});
} protected void btnCancelReadOnlyAll_Click(object sender, EventArgs e)
{
ResolveFormField(delegate(Field field)
{
if (!(field is Label))
{
field.Readonly = false;
}
});
} protected void btnMarkInvalid_Click(object sender, EventArgs e)
{
ResolveFormField(delegate(Field field)
{
if (!(field is Label))
{
field.MarkInvalid("这个字段出错了!");
}
});
} protected void btnClearInvalid_Click(object sender, EventArgs e)
{
ResolveFormField(delegate(Field field)
{
if (!(field is Label))
{
field.ClearInvalid();
}
});
}
本章小结
本篇文章介绍了如何对表单内全部字段进行批量操作,要注意禁用和只读的区别,虽然两种情况下表单字段都不响应用户动作,但还是有一些细微的差别,首先是颜色的变化不同,其次只读时会隐藏TriggerBox右侧的触发按钮。
后台的代码实现用到了C#代理(delegate),从JavaScript的角度看其实就是个回调函数,只不过C#的强类型限制,必须把这个回调函数抽象成一个类型而已。
专业版截图
FineUI(专业版)是由三生石上全新打造的基于 jQuery 的专业 ASP.NET 控件库,计划在七月下旬正式发布。
选择FineUI(专业版)的四大理由:
1. 简单:专业版和开源版兼容(v4.x),您现在就可以使用开源版进行开发,等正式版发布时只需替换 DLL 即可。
2. 极速:专业版基于 jQuery 库重写,使得 JS 和 CSS 体积大幅减少,页面加载速度将是开源版的 2 倍以上。
3. 多彩:专业版内置 24 种 jQueryUI 皮肤,用户还可以使用 jQueryUI ThemeRoller 创建专属自己的皮肤。
4. 便宜:专业版不限开发者数量和永久免费升级,使得典型授权案例的费用减少为开源版的 1/3 左右。
声明:
- FineUI(专业版)授权协议是商业授权,需购买使用。
- FineUI(开源版)授权协议是Apache License v2.0,免费下载使用,并且会继续维护和开发,个人用户推荐使用开源版。
















































源代码与在线示例
本系列所有文章的源代码均可自行下载:http://fineui.codeplex.com/
在线示例(暂时不可用):http://fineui.com/demo/#/demo/form/form_disabled.aspx
这个示例会添加到下个版本的FineUI(开源版)中,因此在线示例还不可见,需要的同学请自行下载全部源代码,自己运行。
如果本文对你有所启发或者帮助,请猛击“好文要顶”,支持原创,支持三石!
《FineUI小技巧》系列文章目录
FineUI小技巧(2)将表单内全部字段禁用、只读、设置无效标识的更多相关文章
- FineUI小技巧(1)简单的购物车页面
起因 最初是一位 FineUI 网友对购物车功能的需求,需要根据产品单价和数量来计算所有选中商品的总价. 这个逻辑最好在前台使用JavaScript实现,如果把这个逻辑移动到后台C#实现,则会导致过多 ...
- FineUI小技巧(5)向子窗口传值,向父窗口传值
前言 FineUI中经常会用到启用IFrame的Window控件,这样有助于从物理上进行代码解耦和.IFrame的引入就会涉及传值问题,如何在父窗口和子窗口之间相互传值呢? 向子窗口传值 向子窗口传值 ...
- FineUI小技巧(4)关闭窗体那些事
前言 FineUI中的Window控件常用作选择.新增或编辑内容.而关闭Window控件却有很多技巧,了解这些技巧有助于项目的快速开发. 如何关闭Window控件 第一个问题就是如何关闭Window控 ...
- FineUI小技巧(3)表格导出与文件下载
需求描述 实际应用中,我们可能需要导出表格内容,或者在页面回发时根据用户权限下载文件(注意,这里的导出与下载,都是在后台进行的,和普通的一个链接下载文件不同). 点击按钮导出表格 由于FineUI 默 ...
- hTML5实现表单内的上传文件框,上传前预览图片,针刷新预览images
hTML5实现表单内的上传文件框,上传前预览图片,针刷新预览images, 本例子主要是使用HTML5 的File API,建立一個可存取到该file的url, 一个空的img标签,ID为img0,把 ...
- FineUI小技巧(7)多表头表格导出
前言 之前我们曾写过一篇文章 FineUI小技巧(3)表格导出与文件下载,对于在 FineUI 中导出表格数据进行了详细描述.今天我们要更进一步,介绍下如何导出多表头表格. 多表头表格的标签定义 在 ...
- HTML5表单内元素的required属性
当表单内元素(如input.textarea)中有required属性并且值不为false的时候,则该字段不能为空,否则提交失败. <input type="text" au ...
- bootstrap 基础表单 内联表单 横向表单
bootstrap 基础表单 内联表单 横向表单 <!DOCTYPE html> <html> <head> <title></title> ...
- 10天学会phpWeChat——第八天:Form类,丰富表单提交的字段类型
通过前面七讲的系列教程,我们完成了一个包含后台并自适应PC+h5移动端的文章管理模块. 在实际的生产环境中,文章投稿.商品上传等操作并不会简单局限于一个text和textarea组成的表单.在实际中, ...
随机推荐
- 去掉字符序列左边和右边的空格 trim()
str = " ai lafu yo ";str = trim(str); 输出的将是"ai lafu yo"
- JavaScript Patterns 5.5 Sandbox Pattern
Drawbacks of the namespacing pattern • Reliance on a single global variable to be the application’s ...
- C#语句1:选择语句一(if else )
语句是指程序命令,都是按照顺序执行的.语句在程序中的执行顺序称为“控制流”或“执行流”. 根据程序对运行时所收到的输入的响应,在程序每次运行时控制流可能有所不同. 注意,语句间的标点符号必须是英文标点 ...
- mysql自增列导致主键重复问题分析。。。
前几天开发童鞋反馈一个利用load data infile命令导入数据主键冲突的问题,分析后确定这个问题可能是mysql的一个bug,这里提出来给大家分享下.以免以后有童鞋遇到类似问题百思不得其解,难 ...
- Oracle11g的安装和基本使用
一:Oracle11g的安装过程(Windows版本)很简单,步骤为: 1. 首先从Oracle官方网站上下载Oracle11g数据库,大约为1.7G.解压后,setup.ext就可以开始安装 2. ...
- truncate表hang住(等待时间较长),出现enq:RO fast object reuse等待事件
有一个应用truncate表等待了一晚上,一个定时任务,跑了几年了,今天早上来发现昨晚没有执行完成,hang住了,查询发现等待事件 fast object reuse. 10.2.0.4的库 Bug ...
- Runtime.exec() sucks!!!!
自己项目中使用到了 Runtime rt = Runtime.getRuntime(); Process p = rt.exec("query session");p.waitFo ...
- 【转】MySQL 数据库存储引擎
原文地址:http://blog.jobbole.com/94385/ 简单介绍 存储引擎就是指表的类型.数据库的存储引擎决定了表在计算机中的存储方式.存储引擎的概念是MySQl的特点,而且是一个插入 ...
- iNeedle日志下载功能问题
问题: iNeedle系统本身包含日志下载功能,主要是将web服务器中的用户访问日志按照一定条件进行筛选并下载,提供管理者分析.但是这次的测试中发现iNeedle日志下载一直会卡住,web界面显示正在 ...
- 微软Nokia 222:可拍照可上网 售价37美元 32GB的microSD卡扩展
腾讯科技讯 8月27日,在几乎所有厂商都在智能手机领域大肆拼杀的时候,微软日前却悄悄地发布了一款功能手机Nokia 222. 目前,尽管全球许多发达国家的居民都对互联网已经再熟悉不过了,但事实上全球依 ...