一个控件最基本的元素是属性,属性有好多种类型,在这节中我将先介绍以下简单的属性,拿一个我们最熟悉的控件TextBox来说,Text(string),Enabled(bool),Columns(int)等都是属性,这些就是我今天要讲的简单类型的属性。
属性的写法很简单,一般的属性可以是可读写的,也可以是只读的或者只写的,这都取决于属性的“访问器”,一般的写法如下
但是我在本系列第二节中讲到的Web程序设计是要考虑到在一个web请求的持续时间之外来保持信息的,这时我们就不能用简单的私有变量来存储属性的值,要用到ViewSate,下面有一个例子说明了有用ViewState和没有用ViewSats来保存属性之间的区别。
我先定义一个继承自Control的类,里面有一个属性是用ViewState保存的,而另外一个是用一个私有变量来保存。
运行程序后按下SetValue的Button可以看到显示了ViewStatePro的值但是NonViewStatePro的值却没有显示,这就说明了ViewStatePro的属性在pageload中赋值的时候让ViewState给存储下来了,当按下Button后页面postback这时存在ViewState中的值会在postback之后再次将postback之前的值再次赋给属性ViewStatePro;而NonViewSatePro的属性的存储载体是一个私有变量,它并没有存入ViewState,所以在按下Button后页面postback,私有变量的值随着页面的生存周期的结束而一起被销毁了。
属性的写法很简单,一般的属性可以是可读写的,也可以是只读的或者只写的,这都取决于属性的“访问器”,一般的写法如下
class Pro
{
private string _readOnlyPro = "i'm readonly!";
private string _writeOnlyPro;
private string _readAndWritePro;
/// <summary>
/// 只读属性
/// </summary>
public string ReadOnlyPro
{
get { return _readOnlyPro; }
}
/// <summary>
/// 只写属性
/// </summary>
public string WriteOnlyPro
{
set { _writeOnlyPro = value; }
}
/// <summary>
/// 可读写属性
/// </summary>
public string ReadAndWritePro
{
get { return _readAndWritePro; }
set { _readAndWritePro = value; }
}
}
上面代码就为一个类添加3个属性,分别是只读,只写,和可读写的属性。{
private string _readOnlyPro = "i'm readonly!";
private string _writeOnlyPro;
private string _readAndWritePro;
/// <summary>
/// 只读属性
/// </summary>
public string ReadOnlyPro
{
get { return _readOnlyPro; }
}
/// <summary>
/// 只写属性
/// </summary>
public string WriteOnlyPro
{
set { _writeOnlyPro = value; }
}
/// <summary>
/// 可读写属性
/// </summary>
public string ReadAndWritePro
{
get { return _readAndWritePro; }
set { _readAndWritePro = value; }
}
}
但是我在本系列第二节中讲到的Web程序设计是要考虑到在一个web请求的持续时间之外来保持信息的,这时我们就不能用简单的私有变量来存储属性的值,要用到ViewSate,下面有一个例子说明了有用ViewState和没有用ViewSats来保存属性之间的区别。
我先定义一个继承自Control的类,里面有一个属性是用ViewState保存的,而另外一个是用一个私有变量来保存。
public class ViewStateControl : Control
{
/// <summary>
/// 使用了ViewState的属性
/// </summary>
public string ViewStatePro
{
get
{
object obj = this.ViewState["ViewStatePro"];
if (obj != null)
{
return (string)obj;
}
return "";
}
set
{
this.ViewState["ViewStatePro"] = value;
}
}
private string _nonViewStatePro;
/// <summary>
/// 未使用ViewState的属性
/// </summary>
public string NonViewStatePro
{
get
{
return _nonViewStatePro;
}
set
{
_nonViewStatePro = value;
}
}
/// <summary>
/// 获取个属性的值
/// </summary>
public string ProValues()
{
return "ViewStatePro's value is '" + this.ViewStatePro + "'<br/>NonViewStatePro's value is '" + this.NonViewStatePro + "'";
}
}
{
/// <summary>
/// 使用了ViewState的属性
/// </summary>
public string ViewStatePro
{
get
{
object obj = this.ViewState["ViewStatePro"];
if (obj != null)
{
return (string)obj;
}
return "";
}
set
{
this.ViewState["ViewStatePro"] = value;
}
}
private string _nonViewStatePro;
/// <summary>
/// 未使用ViewState的属性
/// </summary>
public string NonViewStatePro
{
get
{
return _nonViewStatePro;
}
set
{
_nonViewStatePro = value;
}
}
/// <summary>
/// 获取个属性的值
/// </summary>
public string ProValues()
{
return "ViewStatePro's value is '" + this.ViewStatePro + "'<br/>NonViewStatePro's value is '" + this.NonViewStatePro + "'";
}
}
接下来我新建一个测试用的网页,添加刚才ViewSateControl类所在程序集的引用后,在网页上设计如下
<cc1:ViewStateControl ID="ViewStateControl1" runat="server" />
<asp:Button ID="btnSetValue" runat="server" Text="SetValue" OnClick="btnSetValue_Click" />
<asp:Button ID="btnSetValue" runat="server" Text="SetValue" OnClick="btnSetValue_Click" />
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.ViewStateControl1.ViewStatePro = "hello";
this.ViewStateControl1.NonViewStatePro = "world";
}
}
protected void btnSetValue_Click(object sender, EventArgs e)
{
Response.Write(this.ViewStateControl1.ProValues());
}
{
if (!IsPostBack)
{
this.ViewStateControl1.ViewStatePro = "hello";
this.ViewStateControl1.NonViewStatePro = "world";
}
}
protected void btnSetValue_Click(object sender, EventArgs e)
{
Response.Write(this.ViewStateControl1.ProValues());
}
运行程序后按下SetValue的Button可以看到显示了ViewStatePro的值但是NonViewStatePro的值却没有显示,这就说明了ViewStatePro的属性在pageload中赋值的时候让ViewState给存储下来了,当按下Button后页面postback这时存在ViewState中的值会在postback之后再次将postback之前的值再次赋给属性ViewStatePro;而NonViewSatePro的属性的存储载体是一个私有变量,它并没有存入ViewState,所以在按下Button后页面postback,私有变量的值随着页面的生存周期的结束而一起被销毁了。