asp.net控件开发(二)--------简单属性

我们开发出来的控件一般都需要跟使用控件的人编程人员交互,其中交互有两个途径:一个是属性还有就是事件。属性可能是简单的类型如:int、string等并不太复杂的类型,也有比较复杂的类型如:集合。
一、属性实现交互
我们还是沿用上面的例子来添加属性 PicShow示例:
public class PicShow : Control
    
{
        
private string _imgUrl;
        
//属性
        public virtual string ImgUrl
        
{
            
get
            
{
                
return this._imgUrl;
            }

            
set
            
{
                
this._imgUrl = value;
            }

        }


        
protected override void Render(HtmlTextWriter writer)
        
{
            writer.AddStyleAttribute(HtmlTextWriterStyle.TextAlign, 
"center");
            writer.AddStyleAttribute(HtmlTextWriterStyle.Height, 
"100px");
            writer.AddStyleAttribute(HtmlTextWriterStyle.Width, 
"100px");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
           
            
//Create Img Tag
            writer.AddAttribute(HtmlTextWriterAttribute.Src, this.ImgUrl);
            writer.AddStyleAttribute(HtmlTextWriterStyle.Width, 
"80px");
            writer.AddStyleAttribute(HtmlTextWriterStyle.Height, 
"80px");
            writer.RenderBeginTag(HtmlTextWriterTag.Img);
            writer.RenderEndTag();
            
//End Of Div
            writer.RenderEndTag();
        }

    }
上面的示例就是改变了上次的控件只能指定死了图片,这样图片的地址就可以由控件的使用人员自己去指定了。控件中定义了一个私有字段,通过属性ImgUrl来设置其值,因为我们允许重写其属性,所以定义成了virtual类型的。这里的属性定义跟一般类的定义是一样的,就不多做说明。
二、视图状态
底下我们在一个项目中应用此控件,但我们发现,这样的控件的属性的状态是没法维持的。也就是说,它永远只能维持我们初始给它的值。
举个例子:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ControlSatePic.aspx.cs" Inherits="ControlSatePic" %>

<%@ Register Assembly="HenllyeeConrol" Namespace="MyConrol1" TagPrefix="cc1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    
<title>示例</title>
</head>
<body>
    
<form id="form1" runat="server">
    
<div>
        
<cc1:PicShow ID="" runat="server" 
                ImgUrl
="Images/1109508867.jpg">
        
</cc1:PicShow>
        
<asp:Button ID="btnChange" Text="Change Picture" runat="server" 
            onclick
="btnChange_Click" />
    
</div>
    
</form>
</body>
</html>

我们通过按钮来改变其属性:
 
protected void btnChange_Click(object sender, EventArgs e)
    
{
        
if (this.psDemo.ImgUrl == "Images/1109508867.jpg")
        

            
this.psDemo.ImgUrl = "Images/bg.jpg";
        

        
else
        

            
this.psDemo.ImgUrl = "Images/1109508867.jpg";
        

    }

运行后我们会发现,我们的图片只能改变一次。原因很简单,客户端发出http请求后,服务器端并没有帮我们去维持上一次的请求信息。
在有的时候我们必须要求其维持状态。状态分为两种:一个是视图状态,一个是控件状态。
视图状态在脚本中的表现为:保存到一个叫"_VIEWSTATE"的隐藏域中去,这样来实现保存上次的用户请求。视图状态是一个集合(ViewState)。
我们来继承一个PicShow
public class viewStatePic : PicShow
    
{
        
public override string ImgUrl
        
{
            
get
            
{
                
string strImgUrl = (string)ViewState["ImgUrl"];
                
return (strImgUrl == null? String.Empty : strImgUrl;
            }

            
set
            
{
                ViewState[
"ImgUrl"= value;
            }

        }
   
    }
这里我们只是把ImgUrl重写了,通过视图的状态来实现的,这下子我们在使用时就可以维持上次用户的请求。

三、控件状态
我们会发现如果用户禁止使用了视图状态的话(在<%Page%>中添加EnableViewState="false"),我们还是维持不了用户的上次请求,这时我们可以通过控件状态来永远地维持。
控件状态的维持一般分为三步:1.通过Page.RegisterRequiresControlState()方法来通知控件运行时所在的页面,把此控件维持成控件状态。
                                       2.重写SaveControlState()方法来保存控件状态的值。
                                       3.最后再将控件状态的值返回到属性中去。
控件状态示例:
 public class ControlStatePic : PicShow
    
{
        
protected override void OnInit(EventArgs e)
        
{
            Page.RegisterRequiresControlState(
this);
            
base.OnInit(e);
        }


        
protected override object SaveControlState()
        
{
            
return this.ImgUrl;
        }


        
//从保存的控件视图中取出来
        protected override void LoadControlState(object savedState)
        
{
            
this.ImgUrl = savedState as string;
        }

    }
注意的一点,我们在重写OnInit方法时,我们只是需要要添加额外的功能,去注册控件状态,所以一定要调用base.OnInit(e)方法,来保存以前的初始化工作。
posted @ 2008-05-15 09:30 Henllyee Cui 阅读(1324) 评论(11)  编辑 收藏 所属分类: Asp.net 控件开发

  回复  引用  查看    
#1楼 2008-05-15 10:15 | 王孟军!      
呵呵,学习了
  回复  引用  查看    
#2楼 2008-05-15 11:51 | 生鱼片      
学习
  回复  引用  查看    
#3楼 2008-05-15 13:00 | Ivan-Yan      
不知道学习控件开发对学习asp.net有什么实际的帮助?
准备学这个东西
请lz指教??
  回复  引用    
#4楼 2008-05-15 13:31 | Rzzzz [未注册用户]
楼主刚刚看完ASP.NET控件开发大全吧?
  回复  引用  查看    
#5楼 [楼主]2008-05-15 13:36 | Henllyee Cui      
@Ivan-Yan
我感觉能把一些常用而且能整合的功能整合在一起,
方便开发。
其次能加深我们对asp.net底层的认识。
  回复  引用  查看    
#6楼 [楼主]2008-05-15 13:37 | Henllyee Cui      
@生鱼片
正打算向你学习wf呢。
  回复  引用  查看    
#7楼 [楼主]2008-05-15 13:39 | Henllyee Cui      
@王孟军!
推荐看《道不远人》,我基本上是看thin的这本书的。
  回复  引用  查看    
#8楼 2008-05-15 17:51 | 镜涛      
学习
  回复  引用    
#9楼 2008-05-16 09:23 | allies [未注册用户]
this._picImg 和 _picImg 有什么差别吗。。为什么要特意加个 this ?
  回复  引用  查看    
#10楼 [楼主]2008-05-16 09:56 | Henllyee Cui      
@allies
没什么区别,个人习惯而已。我个人感觉加上this后代码清晰点
  回复  引用  查看    
#11楼 2008-05-18 13:25 | wayne D.S.      
写得很清楚,期待下一篇

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-05-27 14:14 编辑过
 
另存  打印