.net中Web自定义控件编写的几个注意事项

如果重载本身父类提供的enable属性,将导致无法将子控件中的值用viewstate回传,即无法保持状态。所以最好自己定义该类属性并实现。
定义属性时,如果是子控件本身属性的反映,可以直接取其值,值将自动保留,如果属于自己定义的属性,用viewState保留状态
例如:
/// <summary>

         
/// 文本框值 txtMD是一个Web TextBox

         
/// </summary>


         [Bindable(
true ),

         Category(
" Appearance " ),

         DefaultValue(
"" )]

         
public   string  Text

         
{

              
get

              
{

                  

                   
if(txtMD.Text!="")

                       
return txtMD.Text;

                   
else

                       
return "";

              }


 

              
set

              
{

                   

                   txtMD.Text
=value; 

              }


         }


 

自定义属性:

/// <summary>

         
/// 参考录入窗口宽度

         
/// </summary>


         [Bindable(
true ),

         Category(
" Appearance " ),

         DefaultValue(
" 50 " )]

         
public   int  TextBoxMaxLength

         
{

              
get

              
{

                   
return ViewState[this.UniqueID+"TextBoxMaxLength"]==null?50:(int)ViewState[this.UniqueID+"TextBoxMaxLength"];

              }


              
set

              
{

                   ViewState[
this.UniqueID+"TextBoxMaxLength"]=value;

              }


 

         }

 注意:加上this.UniqueID是区分多个相同控件在同一页面上时的相同属性。

  在WEB自定义控件中实现事件及自动保存值

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Collections.Specialized;
namespace MyWebControls
{
 /// <summary>
 /// 创建一个派生于WEBCONTROL的类
 /// 实现一个公有构造函数,它将调用基类构造函数来指定服务器控件应该输出一个input元素
 /// 重写AddAttributesToRender方法,调用该方法是为了允许派生类为根元素input 添加属性
 /// 我们将添加一个name属性,它的值由uniqueID特性派生,asp.net使用这个特性来存储每个控件的唯一ID。
 /// </summary>
 [DefaultProperty("Text"),
  ToolboxData("<{0}:MyTextBox runat=server></{0}:MyTextBox>")]
 public class MyTextBox : System.Web.UI.WebControls.WebControl,IPostBackDataHandler
 {
  public MyTextBox():base("input")
  {
  }

  //使用ViewState对象将值保存起来,此对象的有效范围为当前页面都可以存取.最终保存在客户端。每次都会进行回送
  //ViewState是StateBag类,可存放的数据类型有 int bool string 或数组 及其他的基本数据类型,及arraylist,hashtable,
  //或具有类型转换器的类型,可以串行的类型
  public string Text
  {
   get
   {
    if(ViewState["value"]==null)
    {
     return String.Empty;
    }
    return (string)ViewState["value"];
   }
   set
   {
    ViewState["value"]=value;
   }
  }

  protected override void AddAttributesToRender(HtmlTextWriter writer)
  {
   base.AddAttributesToRender (writer);
   writer.AddAttribute(HtmlTextWriterAttribute.Name,UniqueID);
   writer.AddAttribute("type","text");
   if(Text!=null)
    writer.AddAttribute("value",Text);
  }

  #region IPostBackDataHandler 成员

  //为了访问回送数据,服务器控件要实现IPostBackDataHandler接口,有二个方法
  public void RaisePostDataChangedEvent()
  {
   //如果用户回送的数据发生改变则,发生事件
   if(OnMyTextChnaged!=null)
   {
    OnMyTextChnaged(this,EventArgs.Empty);
   }
  }

  //当有回送发生并且某个控件有回送数据时,此方法就会被调用,该方法为页面上所有需要访问回送数据的控件依次调用。
  //此方法如果返回真,那么在为页面上所有其他带有回送数据的控件调用过LoadPostData方法后,RaisePostDataChangedMethod将被调用。
  //如果返回假,则不调用.由于在此方法里引发事件会引起不可预知的结果,所以一定要在RaisePostDataChangedEvent里引发事件。
  //
  public bool LoadPostData(string postDataKey, NameValueCollection postCollection)
  {
   bool raiseEvent=false; //要不要触发事件的标志
   //如果上一次的文本与回送的文本不一样
   if(Text!=postCollection[postDataKey])
   {
    raiseEvent=true;
    Text=postCollection[postDataKey];//将回送的值保存
   }
   return raiseEvent;
  }

  #endregion

  //注册一个事件,文本改变事件
  public event EventHandler OnMyTextChnaged;


 }
}

 自定义控件实现自动回传的功能

在开发自定义的WEB控件时,有时我们想让自定义控件实现自动回传的功能。通常只有BUTTON这样的控件才能实现此功能。如果想实现的话,只要让我们的自定义控件实现IPostBackEventHandler接口就可以了,同时给控件加上事件引发的代码调用。

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;

namespace MyWebControls
{
 /// <summary>
 /// MyCounter 的摘要说明。
 /// </summary>
 [DefaultProperty("Text"),
  ToolboxData("<{0}:MyCounter runat=server></{0}:MyCounter>")]
 public class MyCounter : System.Web.UI.WebControls.WebControl,IPostBackEventHandler
 {
//在控件中当用户按下增加或减少时,对此数字进行操作。
  public int Number
  {
   get
   {
    if(ViewState["number"]!=null)
    {
     return (int)ViewState["number"];
    }
    return 50;
   }
   set
   {
    ViewState["number"]=value;
   }
  }

//Page.GetPostBackEventReference(this,"inc")在客户端生成一个脚本区(用于上传数据的),同时再进行调用
  /// <summary>
  /// 将此控件呈现给指定的输出参数。
  /// </summary>
  /// <param name="output"> 要写出到的 HTML 编写器 </param>
  protected override void Render(HtmlTextWriter output)
  {
   output.Write("当前数字为:"+Number.ToString());
   output.Write("<a href=/"javascript:"
    +Page.GetPostBackEventReference(this,"inc")
    +"/">增加</a>");
   output.Write(" &nbsp;");
   output.Write("<a href=/"javascript:"
    +Page.GetPostBackEventReference(this,"dec")
    +"/">减少</a>");
  }
  #region IPostBackEventHandler 成员
//实现事件回送接口,HTML中只有BUTTON和IMAGEBUTTON能起回送的发生,如果你想
  //让自己的控件也实现点击后自动回送,则实现此接口
//判断回传时的参数。这个控件回送时有二种动作。
  public void RaisePostBackEvent(string eventArgument)
  {
   if(eventArgument=="inc")
   {
    Number=Number+1;
   }
   else
   {
    Number=Number-1;
   }
  }

  #endregion
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值