CS控件适配使用
来源:互联网 发布:et制版软件 编辑:程序博客网 时间:2024/06/03 21:50
Community Server新版本又发布了,不知道大家有没有在研究,对于我来说还是狂复杂的,以前看过一段时间,想着什么时候把看的过程写下来,但总是由于各种的原因而耽搁了.现在把点点滴滴都给记录下来.因为学起来不知道从何下手,所以学到哪算到哪吧.
这次讲的是简单控件适配器的使用.
在.net2.0中,文本控件都实现了ITextControl接口,按钮系列的控件都实现了IButtonControl接口
(1)一般情况下,我们创建一个对象的时候可以用new关键字来创建
(2)另外,我们可以做一个简单的工厂来创建,代码如下
方便在哪里,即以后你只需要使用TextManager类来创建就可以了,不用再使用new关键字了.
现在发生了一点点的变化,不需要创建一个新的对象,我要获取一个对象,然后针对接口编程
假设页面上存在一个Label控件,则
接着你还可以创建一个通用的Create方法,以上的如CreateLabel这些方法说实话几乎没用.
到了这里,我们就可以抛弃上面的两个方法了,使用Create方法.
问题来了
现在我需要扩展ITextControl接口,添加新的一些东西
那么我也需要扩展原来实现ITextControl的控件实现IText接口
/**//// <summary>
/// CS Literal implemenation of Literal with IText
/// </summary>
public class CSLiteral : Literal, IText
{
public Control Control
{
get{ return this;}
}
}
/**//// <summary>
/// CS Label implemenation of Literal with IText
/// </summary>
public class CSLabel : Label, IText
{
public Control Control
{
get{ return this;}
}
}
最难的问题在这里,我们页面上用的控件都是Label和Literal,难道我们要把页面上的控件全换成CSLabel和CSLiteral?
我们只想针对接口编程,不过还是有点麻烦,你想用IText接口的话,你还是得把ITextControl换成IText,在老系统中CSLabel等新控件暂时无法发挥作用,我们需要进行适配
代码如下
/**//// <summary>
/// Literal helper wrapper for IText
/// </summary>
public class LiteralWrapper : IText
{
internal LiteralWrapper(Literal literal)
{
_literal = literal;
}
private Literal _literal = null;
IText Members#region IText Members
public bool Visible
{
get { return _literal.Visible; }
set { _literal.Visible = value; }
}
public string Text
{
get { return _literal.Text; }
set { _literal.Text = value; }
}
public Control Control
{
get { return _literal; }
}
#endregion
}
/**//// <summary>
/// Lable helper wrapper for IText
/// </summary>
public class LabelWrapper : IText
{
internal LabelWrapper(Label label)
{
_label = label;
}
private Label _label = null;
IText Members#region IText Members
public bool Visible
{
get{ return _label.Visible;}
set{_label.Visible = value;}
}
public string Text
{
get{return _label.Text;}
set{_label.Text = value;}
}
public Control Control
{
get{return _label;}
}
#endregion
}
#endregion
/**//// <summary>
/// Utility class that attempts to convert a given control to an IText-supporting control.
/// </summary>
public class TextManager
{
private TextManager(){}
/**//// <summary>
/// Creates an IText version of a Literal control.
/// </summary>
/// <param name="lit">The literal control.</param>
/// <returns></returns>
public static IText CreateLiteral(Literal lit)
{
return new LiteralWrapper(lit);
}
/**//// <summary>
/// Creates an IText version of a Label control.
/// </summary>
/// <param name="label">The label control.</param>
/// <returns></returns>
public static IText CreateLabel(Label label)
{
return new LabelWrapper(label);
}
/**//// <summary>
/// Attempts to create an IText version of the given control, otherwise null.
/// </summary>
/// <param name="cntrl">The control.</param>
/// <returns></returns>
public static IText Create(Control cntrl)
{
if(cntrl == null)
return null;
IText it = cntrl as IText;
if(it == null)
{
if(cntrl is Literal)
it = new LiteralWrapper(cntrl as Literal);
else if (cntrl is Label )
it = new LabelWrapper(cntrl as Label);
}
return it;
}
}
来看下类图
此都是针对接口进行编程,忽略其他你不关心的功能,Manager类则充当工厂,当然有时候你并不需要这些东西,看需要吧
这次讲的是简单控件适配器的使用.
在.net2.0中,文本控件都实现了ITextControl接口,按钮系列的控件都实现了IButtonControl接口
(1)一般情况下,我们创建一个对象的时候可以用new关键字来创建
Label testLabel = new Label();
Button testBtn = new Button();
Button testBtn = new Button();
(2)另外,我们可以做一个简单的工厂来创建,代码如下
public class TextManager
{
public static ITextControl CreateLiteral()
{
return new Literal();
}
public static ITextControl CreateLabel()
{
return new Label();
}
}
{
public static ITextControl CreateLiteral()
{
return new Literal();
}
public static ITextControl CreateLabel()
{
return new Label();
}
}
ITextControl label = TextManager.CreateLabel();
label.Text = "hello";
Controls.Add(label as Label);
label.Text = "hello";
Controls.Add(label as Label);
方便在哪里,即以后你只需要使用TextManager类来创建就可以了,不用再使用new关键字了.
现在发生了一点点的变化,不需要创建一个新的对象,我要获取一个对象,然后针对接口编程
public class TextManager
{
public static ITextControl CreateLiteral(Literal lit)
{
return lit;
}
public static ITextControl CreateLabel(Label label)
{
return label;
}
}
{
public static ITextControl CreateLiteral(Literal lit)
{
return lit;
}
public static ITextControl CreateLabel(Label label)
{
return label;
}
}
假设页面上存在一个Label控件,则
protected void Page_Load(object sender, EventArgs e)
{
//ITextControl mylabel = Label1;
ITextControl mylabel = TextManager.CreateLabel(Label1);
mylabel.Text = "hello";
}
{
//ITextControl mylabel = Label1;
ITextControl mylabel = TextManager.CreateLabel(Label1);
mylabel.Text = "hello";
}
接着你还可以创建一个通用的Create方法,以上的如CreateLabel这些方法说实话几乎没用.
public static ITextControl Create(Control cntrl)
{
if (cntrl == null)
return null;
ITextControl it = cntrl as ITextControl;
if (it == null)
{
if (cntrl is Literal)
it = cntrl as Literal;
else if (cntrl is Label)
it = cntrl as Label;
}
return it;
}
{
if (cntrl == null)
return null;
ITextControl it = cntrl as ITextControl;
if (it == null)
{
if (cntrl is Literal)
it = cntrl as Literal;
else if (cntrl is Label)
it = cntrl as Label;
}
return it;
}
到了这里,我们就可以抛弃上面的两个方法了,使用Create方法.
问题来了
现在我需要扩展ITextControl接口,添加新的一些东西
/**//// <summary>
/// Interface identifying a text-containing control.
/// </summary>
public interface IText : ITextControl
{
bool Visible {get;set;}
Control Control { get;}
}
/// Interface identifying a text-containing control.
/// </summary>
public interface IText : ITextControl
{
bool Visible {get;set;}
Control Control { get;}
}
那么我也需要扩展原来实现ITextControl的控件实现IText接口
/**//// <summary>
/// CS Literal implemenation of Literal with IText
/// </summary>
public class CSLiteral : Literal, IText
{
public Control Control
{
get{ return this;}
}
}
/**//// <summary>
/// CS Label implemenation of Literal with IText
/// </summary>
public class CSLabel : Label, IText
{
public Control Control
{
get{ return this;}
}
}
最难的问题在这里,我们页面上用的控件都是Label和Literal,难道我们要把页面上的控件全换成CSLabel和CSLiteral?
我们只想针对接口编程,不过还是有点麻烦,你想用IText接口的话,你还是得把ITextControl换成IText,在老系统中CSLabel等新控件暂时无法发挥作用,我们需要进行适配
代码如下
/**//// <summary>
/// Literal helper wrapper for IText
/// </summary>
public class LiteralWrapper : IText
{
internal LiteralWrapper(Literal literal)
{
_literal = literal;
}
private Literal _literal = null;
IText Members#region IText Members
public bool Visible
{
get { return _literal.Visible; }
set { _literal.Visible = value; }
}
public string Text
{
get { return _literal.Text; }
set { _literal.Text = value; }
}
public Control Control
{
get { return _literal; }
}
#endregion
}
/**//// <summary>
/// Lable helper wrapper for IText
/// </summary>
public class LabelWrapper : IText
{
internal LabelWrapper(Label label)
{
_label = label;
}
private Label _label = null;
IText Members#region IText Members
public bool Visible
{
get{ return _label.Visible;}
set{_label.Visible = value;}
}
public string Text
{
get{return _label.Text;}
set{_label.Text = value;}
}
public Control Control
{
get{return _label;}
}
#endregion
}
#endregion
/**//// <summary>
/// Utility class that attempts to convert a given control to an IText-supporting control.
/// </summary>
public class TextManager
{
private TextManager(){}
/**//// <summary>
/// Creates an IText version of a Literal control.
/// </summary>
/// <param name="lit">The literal control.</param>
/// <returns></returns>
public static IText CreateLiteral(Literal lit)
{
return new LiteralWrapper(lit);
}
/**//// <summary>
/// Creates an IText version of a Label control.
/// </summary>
/// <param name="label">The label control.</param>
/// <returns></returns>
public static IText CreateLabel(Label label)
{
return new LabelWrapper(label);
}
/**//// <summary>
/// Attempts to create an IText version of the given control, otherwise null.
/// </summary>
/// <param name="cntrl">The control.</param>
/// <returns></returns>
public static IText Create(Control cntrl)
{
if(cntrl == null)
return null;
IText it = cntrl as IText;
if(it == null)
{
if(cntrl is Literal)
it = new LiteralWrapper(cntrl as Literal);
else if (cntrl is Label )
it = new LabelWrapper(cntrl as Label);
}
return it;
}
}
来看下类图
此都是针对接口进行编程,忽略其他你不关心的功能,Manager类则充当工厂,当然有时候你并不需要这些东西,看需要吧
- CS控件适配使用
- 自定义控件的使用二----DBGlobal.cs部分
- CS第三方控件
- AspNetPager分页控件使用方法(不使用DBAccess.cs文件)(二)
- sqlhelper.cs 如何使用????
- seg cs 的使用
- seg cs 的使用
- [免费]晒晒近期的CS控件
- c#cs結構控件拖动
- cs 界面多线程调用窗体控件
- ASPX.CS 动态添加服务器控件
- cs文件,外部类操作窗体控件
- 三层及winform前台页面 XmlHelper.cs Sqlhelper.cs AbstractSqlHelper.cs Com.cs 分页控件的后台代码
- asp.net 在使用母版页的子页面cs后台代码中控制母版页中的登录控件显示
- SqlHelper.cs修改及使用
- 使用ZeroMQ实现CS通信
- photoshop cs 安装及使用
- c#使用实例之命令行编译cs源码demo.cs
- asp.net控件设计时支持(3)
- VTK安装
- [转]强悍!情书居然能写得如此专业
- CS中的缓存类,保证都看的懂
- cs配置文件的获取
- CS控件适配使用
- 关于asp.net服务器控件的一些想法
- linq版本E-Commerce网站示例
- widgets已开源
- Lambda表达式练习
- .net3.5正统分页控件来了(ListView和DataPager)
- Visual Studio Code Name 'Orcas' Express Editions
- 数据库连接方案比拼
- ASP.NET 2.0服务器控件与组件开发中文版即将出版