asp.net服务器控件开发(三) :简单属性

Posted on 2007-09-23 13:42  小镇姑娘她爹  阅读(299)  评论(0编辑  收藏  举报
  一个控件最基本的元素是属性,属性有好多种类型,在这节中我将先介绍以下简单的属性,拿一个我们最熟悉的控件TextBox来说,Text(string),Enabled(bool),Columns(int)等都是属性,这些就是我今天要讲的简单类型的属性。
属性的写法很简单,一般的属性可以是可读写的,也可以是只读的或者只写的,这都取决于属性的“访问器”,一般的写法如下
    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个属性,分别是只读,只写,和可读写的属性。
但是我在本系列第二节中讲到的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 + "'";
        }
}

接下来我新建一个测试用的网页,添加刚才ViewSateControl类所在程序集的引用后,在网页上设计如下

<cc1:ViewStateControl ID="ViewStateControl1" runat="server" />
<asp:Button ID="btnSetValue" runat="server" Text="SetValue" OnClick="btnSetValue_Click" />


最后我在网页的codebehindcs代码中的PageLoad事件中给2个属性赋值,在ButtonClick事件中让它们显示出来

    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());
    }

运行程序后按下SetValueButton可以看到显示了ViewStatePro的值但是NonViewStatePro的值却没有显示,这就说明了ViewStatePro的属性在pageload中赋值的时候让ViewState给存储下来了,当按下Button后页面postback这时存在ViewState中的值会在postback之后再次将postback之前的值再次赋给属性ViewStatePro;而NonViewSatePro的属性的存储载体是一个私有变量,它并没有存入ViewState,所以在按下Button后页面postback,私有变量的值随着页面的生存周期的结束而一起被销毁了。