asp.net自定义控件

转载 2013年12月02日 16:53:18

asp.net自定义控件(数据绑定DataSource)(转)

数据绑定的概念是:通过提供一个DataSource属性来指定数据源,当控件呈现自己时,从数据源中抽取数据,并将这些数据作为控件的一部分进行呈现。使用的数据源一般是直接或间接实现了IEnumerable接口的数据,如ArrayList、IDataReader、DataTable等,这样可以方便的进行数据的查找。可以想象的到,在进行数据绑定时用的是遍历的办法。一般来说,控件还需要维护自己的状态,这就需要对ViewState进行操作。
下面用一个简单的支持数据绑定的控件来具体说明。该控件是按照《Essential ASP.NET with Examples in C#》中的自定义控件部分的讲解完成的,但是做了自己认为对的改动。我自己加上了详细的注释。
这是一个简单的控件,只能够显示数据表的某一列数据。 
最重要的就是重写的OnDataBinding方法,这个是DataBinding事件的处理方法,当用户调用了DataBind后引发。在这里将指定的数据源转换成IEnumerable,然后就可以获得IEnumerator形式的数据,最后用遍历的办法来得到数据。
状态的维持通过重写LoadViewState和SaveViewState方法来完成。cacheList是我们用来保存数据的ArrayList,通过把它保存到ViewState,可以避免多次存取数据。
getResolvedDataSource和getDataItem是两个很有用的辅助方法,前者帮助将数据源转换成IEnumerable,后者可以取出具体的数据。这两个方法都要先判断数据类型,然后根据具体的情况进行下一步。
using System;
using System.Data;
using System.Web.UI;
using System.Collections;
using System.ComponentModel;

namespace CC
{
/// <summary>
/// 可以进行数据绑定的控件,简单模型,所以只能显示指定的一列记录
/// </summary>
public class DataBindControl : Control
{
//要显示的字段
private string dataTextField;

[Category("自定义属性"),DefaultValue(""),Description("要显示的数据源的字段")] 
public string DataTextField
{
set { this.dataTextField=value; }
get { return this.dataTextField; }
}

//数据源
private object dataSource;

[Category("自定义属性"),Description("数据源")] 
public object DataSource
{
set{ this.dataSource=value; }
get{ return this.dataSource; }
}

/// <summary>
/// 处理数据源,转换成IEnumerable,方便进行下一步操作
/// </summary>
/// <param name="source">数据源,先统一装箱</param>
/// <returns>数据源的IEnumerable形式</returns>
private IEnumerable getResolvedDataSource(object source)
{
if(source is IEnumerable)
return (IEnumerable)source;
else if(source is IList)
return (IEnumerable)source;
else if(source is DataSet)
return (IEnumerable)(((DataSet)source).Tables[0].DefaultView);
else if (source is DataTable)
return (IEnumerable)(((DataTable)source).DefaultView);
else
return null;
}

/// <summary>
/// 从已转化为IEnumerable的数据源的一行中取出需要的DataTextField规定的数据
/// </summary>
/// <param name="item">已转化为IEnumerable的数据源的一行数据</param>
/// <returns>取得的数据的string形式</returns>
private string getDataItem(object item)
{
if(item is IDataRecord)
return ((IDataRecord)item)[this.dataTextField].ToString();
else if(item is DataRowView)
return ((DataRowView)item)[this.dataTextField].ToString();
else
return item.ToString();
}

//用来存放数据的ArrayList,这个也配合ViewState使用
private ArrayList cacheList=new ArrayList();

/// <summary>
/// 处理DataBinding事件,把数据源中需要的数据加到一个ArrayList中。
/// </summary>
/// <param name="e">EventArgs</param>
protected override void OnDataBinding(EventArgs e)
{
base.OnDataBinding (e);
if(this.dataSource!=null)
{
//如果Count为0,则表示是第一次加载
if(this.cacheList.Count==0)
{
IEnumerable source=this.getResolvedDataSource(this.dataSource);
IEnumerator item=source.GetEnumerator();
while(item.MoveNext())
{
//保存数据
this.cacheList.Add(this.getDataItem(item.Current));
}
}
}
}

/// <summary>
/// 呈现,用遍历来循环输出ArrayList中的数据
/// </summary>
/// <param name="writer">HtmlTextWriter</param>
protected override void Render(HtmlTextWriter writer)
{
foreach(string s in this.cacheList)
{
writer.RenderBeginTag(HtmlTextWriterTag.Div);
writer.Write(s);
writer.RenderEndTag();
}
}

/// <summary>
/// 保存自页回发到服务器后发生的任何服务器控件视图状态更改。
/// </summary>
/// <returns>返回服务器控件的当前视图状态。</returns>
protected override object SaveViewState()
{
object[] vState=new object[]{base.SaveViewState(),this.cacheList};
return vState;
}

/// <summary>
///从 SaveViewState 方法保存的上一个页请求还原视图状态信息。
/// </summary>
/// <param name="savedState">表示要还原的控件状态的 Object</param>
protected override void LoadViewState(object savedState)
{
if(savedState!=null)
{
object[] vState=(object[])savedState;
if(vState[0]!=null)
base.LoadViewState(vState[0]);
if(vState[1]!=null)
this.cacheList=(ArrayList)vState[1];
}
}

}
}

使用的时候可以往页面上放两个该控件,然后将其中一个的ViewState禁用,通过PostBack来观察状态的维持。

创建ASP.Net自定义控件

   自定义服务器控件完全由开发人员自行设计开发,开发人员可自定义UI、功能、属性、方法、事件等特征,常见的自定义服务器控件分为4种:复合控件、验证控件、模板控件和数据绑定控件。(1)复合控件:该类控...
  • friend_yutian
  • friend_yutian
  • 2006年12月30日 15:34
  • 21952

asp.net WebForm之用户自定义控件

关于用户自定义控件,想必大家已经非常熟悉了。虽然说经常用过,但是只是简单的使用而已。在这里再次总结一下Asp.net中的UserControl,以便下次使用时 能够得心应手。本文将会介绍以下内容...
  • ydm19891101
  • ydm19891101
  • 2016年05月11日 09:45
  • 2866

asp.net 自定义控件(2种方法)

一、在类中写自定义控件 自定义DropDownList: 1,首先创建一个cs类文件Controls(采用工厂模式) using System.Collections.Generic; using S...
  • anihasiyou
  • anihasiyou
  • 2013年01月16日 10:57
  • 1840

强大的ASP.NET控件----用户控件对战自定义控件

用户控件,用户控件的属性 自定义控件,如何使用自定义和用户控件,如何制作自定义控件和用户控件...
  • u010073895
  • u010073895
  • 2014年11月08日 21:34
  • 2745

ASP.NET总结——Web自定义控件

北大青鸟ASP.NET的视频,向我们介绍了用户控件和自定义控件。        先简单说一下这两者的明显的区别。 用户控件的扩展名为.aspx;自定义控件的扩展名为.dll。用户控件使用时,需...
  • u010924834
  • u010924834
  • 2014年09月15日 15:58
  • 2141

Asp.net MVC 中的自定义控件的使用

 自定义控件RenderPartialASP.NET MVC中如果要自定义控件的话并不能像WebForm那样用这样来引用,而要使用Helper。 例如我们建立一个ct.ascx  其内容: 1: "C...
  • xueshanzhisheng
  • xueshanzhisheng
  • 2009年10月10日 17:53
  • 3632

为ASP.NET WEB自定义控件添加提交事件

为ASP.NET WEB自定义控件添加提交事件顾庆岗 prettywolf@vip.sina.com在Visual Studio.Net提供的服务端控件中有一个叫做“LinkButton”的,它看上去...
  • jokuldamao
  • jokuldamao
  • 2004年11月30日 19:42
  • 1310

ASP.net 中用户自定义控件的使用

其中用一个Register 指令。其中它有三个特性TagPrefix 用户自定义控件的前缀TagName 用户控件的标记名Scr 包含用户控件文件的虚拟路径我们需要注意的是用户自定义控件的前缀名可以相...
  • liuliguihome
  • liuliguihome
  • 2007年12月06日 16:11
  • 279

asp.net向自定义控件传递参数-两个例子

在控件.ascx.cs声明控件属性           private int _ClassID = 0;           public int ClassID           {  ...
  • lishimin1012
  • lishimin1012
  • 2014年06月27日 21:14
  • 4920

ASP.NET自定义控件组件开发 第一章:从一个简单的控件谈起

起始开发ASP.NET自定义控件不是那么的高深,当初我开始学的时候还有点恐惧,但是慢慢就好了。学习控件的开发技术,并不一定说以后要从事控件的开发,而是让我们深入的理解掌握ASP.NET内部的机理。你会...
  • quan_QQ
  • quan_QQ
  • 2017年03月07日 23:21
  • 1089
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:asp.net自定义控件
举报原因:
原因补充:

(最多只允许输入30个字)