需求描述

对表单内的所有字段进行操作也是常见需求,这些操作有:

  1. 禁用:表单字段变灰,不响应用户动作。
  2. 只读:表单字段不变灰,但不接受用户输入(实际上是设置DOM节点的readonly属性),有触发器的要隐藏起来
  3. 设置无效标识:一般用在服务器端验证失败的提示信息

界面效果

  1. 默认状态
  2. 禁用状态
  3. 只读状态
  4. 设置无效标识状态

前台代码

前台代码非常直观,只是一个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 左右。

声明:

    1. FineUI(专业版)授权协议是商业授权,需购买使用。
    2. FineUI(开源版)授权协议是Apache License v2.0,免费下载使用,并且会继续维护和开发,个人用户推荐使用开源版。

源代码与在线示例

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

在线示例(暂时不可用):http://fineui.com/demo/#/demo/form/form_disabled.aspx

这个示例会添加到下个版本的FineUI(开源版)中,因此在线示例还不可见,需要的同学请自行下载全部源代码,自己运行。

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

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

FineUI小技巧(2)将表单内全部字段禁用、只读、设置无效标识的更多相关文章

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

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

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

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

  3. FineUI小技巧(4)关闭窗体那些事

    前言 FineUI中的Window控件常用作选择.新增或编辑内容.而关闭Window控件却有很多技巧,了解这些技巧有助于项目的快速开发. 如何关闭Window控件 第一个问题就是如何关闭Window控 ...

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

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

  5. hTML5实现表单内的上传文件框,上传前预览图片,针刷新预览images

    hTML5实现表单内的上传文件框,上传前预览图片,针刷新预览images, 本例子主要是使用HTML5 的File API,建立一個可存取到该file的url, 一个空的img标签,ID为img0,把 ...

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

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

  7. HTML5表单内元素的required属性

    当表单内元素(如input.textarea)中有required属性并且值不为false的时候,则该字段不能为空,否则提交失败. <input type="text" au ...

  8. bootstrap 基础表单 内联表单 横向表单

    bootstrap 基础表单 内联表单 横向表单 <!DOCTYPE html> <html> <head> <title></title> ...

  9. 10天学会phpWeChat——第八天:Form类,丰富表单提交的字段类型

    通过前面七讲的系列教程,我们完成了一个包含后台并自适应PC+h5移动端的文章管理模块. 在实际的生产环境中,文章投稿.商品上传等操作并不会简单局限于一个text和textarea组成的表单.在实际中, ...

随机推荐

  1. JSON 数据使用方法

    当同一个模板需要替换不同的数据显示的时候,如果数据量大点,用json很方便. json对象: var JSONObject= { "name":"Bill Gates&q ...

  2. Nodejs之MEAN栈开发(九)---- 用户评论的增加/删除/修改

    由于工作中做实时通信的项目,需要用到Nodejs做通讯转接功能,刚开始接触,很多都不懂,于是我和同事就准备去学习nodejs,结合nodejs之MEAN栈实战书籍<Getting.MEAN.wi ...

  3. 记一次ORACLE的UNDO表空间爆满分析过程

    这篇文章是记录一次ORACLE数据库UNDO表空间爆满的分析过程,主要整理.梳理了同事分析的思路.具体过程如下所示: 早上收到一数据库服务器的UNDO表空间的告警邮件,最早一封是7:55发出的(监控作 ...

  4. What every programmer should know about memory 笔记

    What every programmer should know about memory, Part 1(笔记) 每个程序员都应该了解的内存知识[第一部分] 2.商用硬件现状      现在硬件的 ...

  5. 十五天精通WCF——第八天 对“绑定”的最后一点理解

    转眼已经中断10几天没有写博客了,也不是工作太忙,正好碰到了端午节,然后最近看天津台的爱情保卫战入迷了...太好看了,一直都是回味无穷...而且 涂磊老师话说的真是tmd的经典,然后就这样耽搁了,好了 ...

  6. java多线程学习

    在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 一.扩展java.lang.Thread类 package com.multithread.lea ...

  7. C#读取XML文件

    --硬盘Xml文件存储路径:d:\xmlFile\Testxml.xml xml文件内容: <Root> <Tab> <ID>245575913</ID> ...

  8. python基础(四)运算

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python的运算符和其他语言类似 (我们暂时只了解这些运算符的基本用法,方便我们 ...

  9. Android ScrollView中的组件设置android:layout_height="fill_parent"不起作用的解决办法

    例子,在ScrollView下加入的组件,无论如何也不能自动扩展到屏幕高度. 布局文件. [html] <?xml version="1.0" encoding=" ...

  10. 在Eclipse里查看Java字节码

    要理解 Java 字节码,比较推荐的方法是自己尝试编写源码对照字节码学习.其中阅读 Java 字节码的工具必不可少.虽然javap可以以可读的形式展示出.class 文件中字节码,但每次改动源码都需调 ...