表单控件续(1)——应用接口来简化和分散代码

上次有点仓促,有几个地方没有明确。

1、两篇随笔可以合在一起看
能自己“跑”的表单控件,思路,雏形,源码。vs2005版本
 
我写项目的步骤。抛砖引玉。  

后者是整个流程,前者是其中的一个步骤,是一个简单的思路说明,其中前三段代码都是表单控件里面的。

2、我要写的是一个表单控件,b/s结构里面的控件。虽然内部会有点复杂,但是编译成dll后,调用就会很方便了。

表单控件续(1)——应用接口来简化和分散代码

上一篇里的表单控件有很多需要完善的地方,这里先说一下扩展性

      扩展呢就是说可以比较方便的添加更多的子控件,而现在的表单控件里面只有两种,文本框和下拉列表框,这个显然是不够用的,那么如何更好的扩展呢?

      先回顾一下表单控件里的代码,由于要控制不同的子控件,所以case里面写了很多的代码,那么能不能简化一下呢,或者分给子控件自己解决。

      先看一下取值的情况,一般文本框需要使用 .Text属性来取值,而下拉列表框需要使用 .SelectedValue 取值,其他的控件又有不同的属性,是不是很烦呢?那为什么不能统一一个方法呢?比如都叫 GetValue,那多方便呀。可惜,目前还没有。怎么办呢?自己动手、丰衣足食,我们自己来实现一个吧。

      那么具体怎么来实现呢?直接给基类加属性,好像是不太可能,只有利用接口了。集成.net框架里提供的框架,然后实现接口,表单控件里面在操作接口。(这个算不算面对接口编程呀?)

      先定义接口。
表单控件续(1)——应用接口来简化和分散代码public interface IGetControlValue
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码    
表单控件续(1)——应用接口来简化和分散代码{
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
/**//// 返回控件的编号
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码         string ControlKind表单控件续(1)——应用接口来简化和分散代码get;}
表单控件续(1)——应用接口来简化和分散代码
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
/**//// 默认的取值方式
表单控件续(1)——应用接口来简化和分散代码         string GetControlValue();
表单控件续(1)——应用接口来简化和分散代码
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
/**//// 可以选择的取值方式
表单控件续(1)——应用接口来简化和分散代码         
/// <param name="kind">取哪种值,比如提取下拉列表框的value还是text</param>

表单控件续(1)——应用接口来简化和分散代码        string GetControlValue(string kind);
表单控件续(1)——应用接口来简化和分散代码
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
/**//// 默认的给控件赋值的方式
表单控件续(1)——应用接口来简化和分散代码         void SetControlValue(string value);
表单控件续(1)——应用接口来简化和分散代码
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
/**//// 可以选择的赋值方式
表单控件续(1)——应用接口来简化和分散代码         
/// <param name="value">赋值</param>
表单控件续(1)——应用接口来简化和分散代码        
/// <param name="kind">通过哪种方式给控件赋值,比如通过下拉列表框的value还是text</param>

表单控件续(1)——应用接口来简化和分散代码        void SetControlValue(string value, string kind);
表单控件续(1)——应用接口来简化和分散代码
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
/**//// 通过控件的描述信息,进行自我描述。比如设置maxlength 等。
表单控件续(1)——应用接口来简化和分散代码         void ShowMe(ControlInfos info);
表单控件续(1)——应用接口来简化和分散代码
表单控件续(1)——应用接口来简化和分散代码    }

      这里不仅定义了取值和赋值用的几个函数,还设计了一个自我描述的函数,ShowMe(ControlInfos info);可以通过把一些任务交给子控件来实现

      然后写几个自定义控件,文本框
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码  实现接口#region 实现接口
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
/**//// 获取文本框的.Text.Trim();
表单控件续(1)——应用接口来简化和分散代码        public string GetControlValue()
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
表单控件续(1)——应用接口来简化和分散代码{
表单控件续(1)——应用接口来简化和分散代码            
return this.Text.Trim();
表单控件续(1)——应用接口来简化和分散代码        }

表单控件续(1)——应用接口来简化和分散代码
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
/**//// 给文本框的Text属性赋值
表单控件续(1)——应用接口来简化和分散代码        
/// <param name="value">赋值</param>

表单控件续(1)——应用接口来简化和分散代码        public void SetControlValue(string value)
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
表单控件续(1)——应用接口来简化和分散代码{
表单控件续(1)——应用接口来简化和分散代码            
this.Text = value;
表单控件续(1)——应用接口来简化和分散代码        }

表单控件续(1)——应用接口来简化和分散代码
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
/**//// 设置 文本框的一些属性
表单控件续(1)——应用接口来简化和分散代码        public void ShowMe(ControlInfos info)
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
表单控件续(1)——应用接口来简化和分散代码{
表单控件续(1)——应用接口来简化和分散代码            
//通过 info 里面的信息来设置 Columns、MaxLength 等属性。代码暂时略
表单控件续(1)——应用接口来简化和分散代码
        }

表单控件续(1)——应用接口来简化和分散代码
表单控件续(1)——应用接口来简化和分散代码        
#endregion

下拉列表框
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码 /**//// 获取下拉列表框选中的value值;
表单控件续(1)——应用接口来简化和分散代码        public string GetControlValue()
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
表单控件续(1)——应用接口来简化和分散代码{
表单控件续(1)——应用接口来简化和分散代码            
return this.SelectedValue;
表单控件续(1)——应用接口来简化和分散代码        }

表单控件续(1)——应用接口来简化和分散代码        
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
/**//// 通过kind获取下拉列表框的选中的值;
表单控件续(1)——应用接口来简化和分散代码        
/// <param name="kind">1:获取value;2:获取Text</param>

表单控件续(1)——应用接口来简化和分散代码        public string GetControlValue(string kind)
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
表单控件续(1)——应用接口来简化和分散代码{
表单控件续(1)——应用接口来简化和分散代码            
switch (kind )
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码            
表单控件续(1)——应用接口来简化和分散代码{
表单控件续(1)——应用接口来简化和分散代码                
case "1":
表单控件续(1)——应用接口来简化和分散代码                    
return this.SelectedValue; 
表单控件续(1)——应用接口来简化和分散代码                
default :
表单控件续(1)——应用接口来简化和分散代码                    
return this.SelectedItem.Text; 
表单控件续(1)——应用接口来简化和分散代码            }

表单控件续(1)——应用接口来简化和分散代码         }

表单控件续(1)——应用接口来简化和分散代码         
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
/**//// 设置下拉列表框的默认选项
表单控件续(1)——应用接口来简化和分散代码        public void SetControlValue(string value)
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
表单控件续(1)——应用接口来简化和分散代码{
表单控件续(1)——应用接口来简化和分散代码            
this.SetSelectedByValue(value);
表单控件续(1)——应用接口来简化和分散代码        }

表单控件续(1)——应用接口来简化和分散代码
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
/**//// 设置下拉列表框的默认选项
表单控件续(1)——应用接口来简化和分散代码        
/// <param name="kind">1:通过value;2:通过Text</param>

表单控件续(1)——应用接口来简化和分散代码        public void SetControlValue(string value, string kind)
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
表单控件续(1)——应用接口来简化和分散代码{
表单控件续(1)——应用接口来简化和分散代码           
switch (kind)
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码            
表单控件续(1)——应用接口来简化和分散代码{
表单控件续(1)——应用接口来简化和分散代码                
case "1":
表单控件续(1)——应用接口来简化和分散代码                    
this.SetSelectedByValue(value); break;
表单控件续(1)——应用接口来简化和分散代码                
default:
表单控件续(1)——应用接口来简化和分散代码                    SetSelectedByText(value); 
break;
表单控件续(1)——应用接口来简化和分散代码            }

表单控件续(1)——应用接口来简化和分散代码        }

表单控件续(1)——应用接口来简化和分散代码
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
/**//// <summary>
表单控件续(1)——应用接口来简化和分散代码        
/// 设置 下拉列表框的一些属性
表单控件续(1)——应用接口来简化和分散代码        
/// </summary>
表单控件续(1)——应用接口来简化和分散代码        
/// <param name="info"></param>

表单控件续(1)——应用接口来简化和分散代码        public void ShowMe(ControlInfos info)
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
表单控件续(1)——应用接口来简化和分散代码{
表单控件续(1)——应用接口来简化和分散代码            
//通过 info 里面的信息来 设置下拉列表框的item。代码暂时略
表单控件续(1)——应用接口来简化和分散代码            
//sql|select Col1 as id,col2 as txt from table |0|1
表单控件续(1)——应用接口来简化和分散代码            
//cus|0~1~男~女|0|1
表单控件续(1)——应用接口来简化和分散代码       
表单控件续(1)——应用接口来简化和分散代码            
//先写一个测试用的
表单控件续(1)——应用接口来简化和分散代码
            this.Items.Add(new ListItem("测试项目1""1"));
表单控件续(1)——应用接口来简化和分散代码            
this.Items.Add(new ListItem("测试项目2""2"));
表单控件续(1)——应用接口来简化和分散代码                        
表单控件续(1)——应用接口来简化和分散代码        }


      然后在修改表单控件里面的 ShowData() 函数,当然还有 SaveDate() 函数。
表单控件续(1)——应用接口来简化和分散代码public string ShowData()
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
表单控件续(1)——应用接口来简化和分散代码{
表单控件续(1)——应用接口来简化和分散代码            IGetControlValue iCntl 
= null;
表单控件续(1)——应用接口来简化和分散代码            Control  cntl 
= null;
表单控件续(1)——应用接口来简化和分散代码            
foreach (ControlInfos info in this.CtrlInfo)
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码            
表单控件续(1)——应用接口来简化和分散代码{
表单控件续(1)——应用接口来简化和分散代码                
switch (info.ControlKind)
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码                
表单控件续(1)——应用接口来简化和分散代码{
表单控件续(1)——应用接口来简化和分散代码                    
case "201":     //单行文本框
表单控件续(1)——应用接口来简化和分散代码
                        cntl = new JYKTextBox();  break;
表单控件续(1)——应用接口来简化和分散代码
表单控件续(1)——应用接口来简化和分散代码                    
case "205":     //下拉列表框
表单控件续(1)——应用接口来简化和分散代码
                        cntl = new JYKDropDownList(); break;
表单控件续(1)——应用接口来简化和分散代码
表单控件续(1)——应用接口来简化和分散代码                }

表单控件续(1)——应用接口来简化和分散代码               
表单控件续(1)——应用接口来简化和分散代码                iCntl 
= (IGetControlValue)cntl;
表单控件续(1)——应用接口来简化和分散代码                cntl.ID 
= "c_" + info.ColSysName;   //设置ID
表单控件续(1)——应用接口来简化和分散代码
                iCntl.ShowMe(info);                 //让子控件自己描绘自己
表单控件续(1)——应用接口来简化和分散代码
表单控件续(1)——应用接口来简化和分散代码                
//添加到表单控件里
表单控件续(1)——应用接口来简化和分散代码
                this.Controls.Add(new LiteralControl(info.ColName));
表单控件续(1)——应用接口来简化和分散代码                
this.Controls.Add(cntl);
表单控件续(1)——应用接口来简化和分散代码                
this.Controls.Add(new LiteralControl("<BR>"));
表单控件续(1)——应用接口来简化和分散代码
表单控件续(1)——应用接口来简化和分散代码                iCntl.SetControlValue(
"sss");   //赋值测试
表单控件续(1)——应用接口来简化和分散代码

表单控件续(1)——应用接口来简化和分散代码            }

表单控件续(1)——应用接口来简化和分散代码            
return "";
表单控件续(1)——应用接口来简化和分散代码        }

表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码         /**//// 保存数据
表单控件续(1)——应用接口来简化和分散代码         public string SaveDate()
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码        
表单控件续(1)——应用接口来简化和分散代码{
表单控件续(1)——应用接口来简化和分散代码             ControlInfos[] info 
= this.CtrlInfo;
表单控件续(1)——应用接口来简化和分散代码
表单控件续(1)——应用接口来简化和分散代码            IGetControlValue iCntl 
= null;      //定一个接口
表单控件续(1)——应用接口来简化和分散代码
           
表单控件续(1)——应用接口来简化和分散代码            
string[] str1 = new string[info.Length];
表单控件续(1)——应用接口来简化和分散代码            
string[] str = new string[info.Length];
表单控件续(1)——应用接口来简化和分散代码
表单控件续(1)——应用接口来简化和分散代码            
for (int i = 0; i < info.Length; i++)
表单控件续(1)——应用接口来简化和分散代码表单控件续(1)——应用接口来简化和分散代码            
表单控件续(1)——应用接口来简化和分散代码{
表单控件续(1)——应用接口来简化和分散代码                str1[i] 
= info[i].ColSysName;
表单控件续(1)——应用接口来简化和分散代码                
//这里可以去掉case 了。
表单控件续(1)——应用接口来简化和分散代码

表单控件续(1)——应用接口来简化和分散代码                iCntl 
= this.FindControl("c_" + info[i].ColSysName) as IGetControlValue;
表单控件续(1)——应用接口来简化和分散代码                
if (iCntl == null)
表单控件续(1)——应用接口来简化和分散代码                    str[i] 
= "";
表单控件续(1)——应用接口来简化和分散代码                
else
表单控件续(1)——应用接口来简化和分散代码                    str[i] 
= iCntl.GetControlValue();   //利用接口来取值
表单控件续(1)——应用接口来简化和分散代码

表单控件续(1)——应用接口来简化和分散代码            }

表单控件续(1)——应用接口来简化和分散代码
表单控件续(1)——应用接口来简化和分散代码           return "";
表单控件续(1)——应用接口来简化和分散代码        }


 
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
上一篇:Win2016异机还原方法


下一篇:win server 2012 R2 你需要先安装 对应于 KB2919355 的更新 ,然后才可在 Windows 8.1 或 Windows Server 2012 R2 上安装此产品