表单控件续(1)——应用接口来简化和分散代码
上次有点仓促,有几个地方没有明确。
后者是整个流程,前者是其中的一个步骤,是一个简单的思路说明,其中前三段代码都是表单控件里面的。
2、我要写的是一个表单控件,b/s结构里面的控件。虽然内部会有点复杂,但是编译成dll后,调用就会很方便了。
上一篇里的表单控件有很多需要完善的地方,这里先说一下扩展性。
扩展呢就是说可以比较方便的添加更多的子控件,而现在的表单控件里面只有两种,文本框和下拉列表框,这个显然是不够用的,那么如何更好的扩展呢?
先回顾一下表单控件里的代码,由于要控制不同的子控件,所以case里面写了很多的代码,那么能不能简化一下呢,或者分给子控件自己解决。
先看一下取值的情况,一般文本框需要使用 .Text属性来取值,而下拉列表框需要使用 .SelectedValue 取值,其他的控件又有不同的属性,是不是很烦呢?那为什么不能统一一个方法呢?比如都叫 GetValue,那多方便呀。可惜,目前还没有。怎么办呢?自己动手、丰衣足食,我们自己来实现一个吧。
那么具体怎么来实现呢?直接给基类加属性,好像是不太可能,只有利用接口了。集成.net框架里提供的框架,然后实现接口,表单控件里面在操作接口。(这个算不算面对接口编程呀?)
先定义接口。
public interface IGetControlValue
{
/// 返回控件的编号
string ControlKind{ get;}
/// 默认的取值方式
string GetControlValue();
/// 可以选择的取值方式
/// <param name="kind">取哪种值,比如提取下拉列表框的value还是text</param>
string GetControlValue(string kind);
/// 默认的给控件赋值的方式
void SetControlValue(string value);
/// 可以选择的赋值方式
/// <param name="value">赋值</param>
/// <param name="kind">通过哪种方式给控件赋值,比如通过下拉列表框的value还是text</param>
void SetControlValue(string value, string kind);
/// 通过控件的描述信息,进行自我描述。比如设置maxlength 等。
void ShowMe(ControlInfos info);
}
这里不仅定义了取值和赋值用的几个函数,还设计了一个自我描述的函数,ShowMe(ControlInfos info);可以通过把一些任务交给子控件来实现
然后写几个自定义控件,文本框
#region 实现接口
/// 获取文本框的.Text.Trim();
public string GetControlValue()
{
return this.Text.Trim();
}
/// 给文本框的Text属性赋值
/// <param name="value">赋值</param>
public void SetControlValue(string value)
{
this.Text = value;
}
/// 设置 文本框的一些属性
public void ShowMe(ControlInfos info)
{
//通过 info 里面的信息来设置 Columns、MaxLength 等属性。代码暂时略
}
#endregion
下拉列表框
/// 获取下拉列表框选中的value值;
public string GetControlValue()
{
return this.SelectedValue;
}
/// 通过kind获取下拉列表框的选中的值;
/// <param name="kind">1:获取value;2:获取Text</param>
public string GetControlValue(string kind)
{
switch (kind )
{
case "":
return this.SelectedValue;
default :
return this.SelectedItem.Text;
}
}
/// 设置下拉列表框的默认选项
public void SetControlValue(string value)
{
this.SetSelectedByValue(value);
}
/// 设置下拉列表框的默认选项
/// <param name="kind">1:通过value;2:通过Text</param>
public void SetControlValue(string value, string kind)
{
switch (kind)
{
case "":
this.SetSelectedByValue(value); break;
default:
SetSelectedByText(value); break;
}
}
/// <summary>
/// 设置 下拉列表框的一些属性
/// </summary>
/// <param name="info"></param>
public void ShowMe(ControlInfos info)
{
//通过 info 里面的信息来 设置下拉列表框的item。代码暂时略
//sql|select Col1 as id,col2 as txt from table |0|1
//cus|0~1~男~女|0|1
//先写一个测试用的
this.Items.Add(new ListItem("测试项目1", ""));
this.Items.Add(new ListItem("测试项目2", ""));
}
然后在修改表单控件里面的 ShowData() 函数,当然还有 SaveDate() 函数。
public string ShowData()
{
IGetControlValue iCntl = null;
Control cntl = null;
foreach (ControlInfos info in this.CtrlInfo)
{
switch (info.ControlKind)
{
case "": //单行文本框
cntl = new JYKTextBox(); break;
case "": //下拉列表框
cntl = new JYKDropDownList(); break;
}
iCntl = (IGetControlValue)cntl;
cntl.ID = "c_" + info.ColSysName; //设置ID
iCntl.ShowMe(info); //让子控件自己描绘自己
//添加到表单控件里
this.Controls.Add(new LiteralControl(info.ColName));
this.Controls.Add(cntl);
this.Controls.Add(new LiteralControl("<BR>"));
iCntl.SetControlValue("sss"); //赋值测试
}
return "";
}
/// 保存数据
public string SaveDate()
{
ControlInfos[] info = this.CtrlInfo;
IGetControlValue iCntl = null; //定一个接口
string[] str1 = new string[info.Length];
string[] str = new string[info.Length];
for (int i = ; i < info.Length; i++)
{
str1[i] = info[i].ColSysName;
//这里可以去掉case 了。
iCntl = this.FindControl("c_" + info[i].ColSysName) as IGetControlValue;
if (iCntl == null)
str[i] = "";
else
str[i] = iCntl.GetControlValue(); //利用接口来取值
}
return "";
}
ShowData() 函数里面的case 已经变得很短了,是不是有点像简单工厂?剩下的就都可以通过接口来操作了。
rex xiang同学和怪怪同学等,说这里的case 可以使用 Dictionary 来去掉,但是目前对于 Dictionary 还是不太了解,所以先暂时使用case 的方式。
SaveDate() 函数里面的case就完全去掉了,iCntl = this.FindControl("c_" + info[i].ColSysName) as IGetControlValue;。很奇怪,C#里居然可以这么用,因为在编译的时候无法确定find出来的控件就一定实现了接口。这个居然也可以。
完整代码下载
http://www.cnblogs.com/jyk/archive/2008/04/25/1170979.html
- 记一次dg故障的处理总结(r6笔记第63天)
- Java企业面试——Javaweb
- Linux下/var/spool/clientmqueue空间不足的解决(r6笔记第81天)
- Pytorch 0.3发布:实现多方面提速,增加对ONNX支持 | 快讯
- 基于DB time的调优分析 (r6笔记第79天)
- 通过shell脚本抓取awr报告中的问题sql(r6笔记第78天)
- Tomcat 快速入门
- 服务器进程异常的原因分析(r6笔记第74天)
- Elastic 技术栈之 Filebeat
- Elastic 技术栈之 Logstash 基础
- 备库CPU使用异常优化(r6笔记第73天)
- 数据清理的遗留问题处理(二)(r6笔记第91天)
- Kaggle Titanic 生存预测比赛超完整笔记(上)
- 多系统交互中DBA需要实现的技术细节(r6笔记第90天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 3分钟短文 ! Laravel拼装SQL子查询的最佳实现
- 对java中的泛型的理解
- 解决elasticsearch集群Unassigned Shards无法reroute的问题
- 一次系统扩容引起的elasticsearch故障及恢复
- WPF SharpDx 性能优化方法
- java中的reference(四): WeakReference的应用--ThreadLocal源码分析
- 聊聊dubbo-go的availableCluster
- 删除排序链表中重复元素的方法
- java异常体系及1.7中的try-with-resources
- JAVA中的静态代理、动态代理以及CGLIB动态代理分析
- 基于centos7 搭建storm1.2.3集群过程
- JAVA中的浅克隆和深克隆分析
- mysql表占用多少磁盘空间以及清理表空间
- 基于docker快速搭建hbase集群
- 在springboot中对kafka进行读写操作