需求描述

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

  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. yii2 GridView 日期格式化并实现日期可搜索 案例

    作者:白狼 出处:http://www.manks.top/article/yii2_gridview_dateformat_search 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且 ...

  2. jstack简单使用,定位死循环、线程阻塞、死锁等问题

    当我们运行java程序时,发现程序不动,但又不知道是哪里出问题时,可以使用JDK自带的jstack工具去定位: 废话不说,直接上例子吧,在window平台上的: 死循环 写个死循环的程序如下: pac ...

  3. 字符输出流Writer简要概括

    偷个懒,直接参考上篇字符输入流Reader的形式,其实Reader和Writer本来就大同小异: 字符输出流Writer 本篇将对JAVA I/O流中的字符输出流Writer做个简单的概括: 总得来说 ...

  4. jsoup解析HTML及简单实例

    jsoup 中文参考文献    http://www.open-open.com/jsoup/ 本文将利用jsoup,简单实现网络抓取的功能,并给出一个小实例,该实例效果为:获取作者本人在博客园写的所 ...

  5. [20140504] ADO.NET客户端超时

    背景:      最近总是出现客户端超时,那么根据超时进行排查      System.Data.SqlClient.SqlException (0x80131904): Timeout expire ...

  6. Sql Server之旅——第八站 复合索引和include索引到底有多大区别?

    周末终于搬进出租房了,装了宽带....才发现没网的日子...那是一个怎样的与世隔绝呀...再也受不了那样的日子了....好了,既然网 安上去了,还得继续我的这个系列. 索引和锁,这两个主题对我们开发工 ...

  7. java统计汉字

    public class TotalUtil { public static int getSum(String text) {        String reg = "^[\u4e00- ...

  8. 简析一下SQL Server里面Fast_Forword 和 SRROLL 的区别

    这次简单说说游标的分类. 先看看通常游标的语法 DECLARE cursor_name CURSOR [ LOCAL :局部游标,仅在当前会话有效 | GLOBAL : 全局游标,全局有效,可以 ] ...

  9. Android 横竖屏切换小结

    (自己体会:每次横竖屏自动切时都会run Activity的onCreate,即相当后重新进入Activity初始化一样:) 转自:http://www.cnblogs.com/franksunny/ ...

  10. 010 使用netmap API接管网卡,接收数据包,回应ARP请求

    一.本文目的: 上一节中,我们已经在CentOS 6.7 上安装好了netmap,也能接收和发送包了,这节我们来调用netmap中的API,接管网卡,对网卡上收到的数据包做分析,并回应ARP请求. 二 ...