摘自:http://www.blueidea.com/bbs/NewsDetail.asp?lp=541&id=1792010
数据绑定的概念是:通过提供一个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来观察状态的维持。

转载于:https://www.cnblogs.com/wxmxiaoming/articles/371802.html

[asp.net]自定义控件(数据绑定)相关推荐

  1. ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl

    第四章 组合控件开发CompositeControl 大家好,今天我们来实现一个自定义的控件,之前我们已经知道了,要开发自定义的控件一般继承三个基 类:Control,WebControl,还有一个就 ...

  2. ASP.NET自定义控件组件开发 第一章 第二篇 接着待续

    ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 很感谢大家给我的第一篇ASP.NET控件开发的支持!在写这些之前,我也看了一些例 ...

  3. ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇

    第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是行不 通.如果大家开发的是WinForm中的事件,之前的定义可能没有什 ...

  4. ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇

    第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.N ...

  5. ASP.NET MVC3数据绑定到VIEW的方式

    ASP.NET MVC3数据绑定到VIEW的方式 1.     指定页面数据的强类型Module 数据类型是强类型,编译时报错,运行效率高 Action: public ActionResult In ...

  6. ASP.NET 自定义控件从入门到精通3补充

    ASP.NET 自定义控件从入门到精通 3 状态管理和Style类 3.2 新的Render方法 源码下载 首先我们来看看Register控件在前台生成的Html代码,代码如下所示: <!-注意 ...

  7. asp.net 自定义控件之ItemTemplate

    最近在做一个东西,要用一个tab控件,鉴于asp.net ajax tookit extension 控件样式的难以修改和jquery ui的各版本存在较大差异,需要自定义控件,需要用到这个技术点,怕 ...

  8. ASP.Net2.0 数据绑定控件的优越性在哪里?

    尽管有丰富.功能强大的编程接口,ASP.NET 1.x DataGrid 控件仍需要编写大量自定义代码来处理普通操作,如分页.排序.编辑和删除数据.例如,当用户单击以保存或取消更改时,DataGrid ...

  9. 理解Asp.Net自定义控件的生命周期

    大家在平时学习Asp.Net进行web开发时,为了满足项目需要,将开发大量满足需求的自定义控件.那关于自定义控件的生命周期如何呢,与页面生命周期有何区别呢?我今天跟大家详细解释一下:控件生命周期大概有 ...

  10. ASP.NET 的数据绑定,DataList,Repeater 的绑定示例

    1.DataList如何绑定 <asp:DataList ID="DataList2" runat="server" Width="87%&qu ...

最新文章

  1. 如何快速实现HTML编辑器.NET组件
  2. 【CMAC小脑】CMAC逼近sin(t)函数的训练和测试
  3. plsql的安装与部署
  4. Scala _10Actor Model
  5. 【C++】VS2010将写好的程序打包成安装文件发布
  6. CodeForces 615C
  7. matlab如何实现降维,matlab怎么把矩阵降维
  8. java版本-API接口测试框架搭建
  9. KubeEdge 初测
  10. python 拆分excel单元格内容_Excel拆分单元格与把一个单元格内容拆分到多个单元格...
  11. 【读书笔记】【未】杀死一只知更鸟
  12. 一个经济学果粉对国内iOS游戏厂商的5点斥责和5个建议
  13. vue 使用百度 API 实现图像识别
  14. java process 乱码_Java常见乱码原理及解决方案
  15. qq因计算机丢失打不开,QQ面板链接打不开或失效怎么办?
  16. 计算机主机清洁方法,电脑主机除尘清洁板卡维护方法及注意事项 - 主板知识
  17. 为什么时钟信号比数据信号更容易引起辐射超标
  18. 网络安全实验2 扫描器X-SCANNER应用实验
  19. C# 通过百度地图API,获取访问IP详细地址(上网IP的大致位置信息,一般为城市级别)
  20. python画心形代码大全_Python代码合集看点 机器人算法、自动导航算法算法大全...

热门文章

  1. fdisk硬盘分区(1)——系统盘剩余空间创建分区
  2. Openstack安装(1)--keystone安装
  3. C++容器与参数传递方式
  4. 2011-寒假 linux 学习笔记
  5. [JNI]开发之旅(8)传递参数给JNI函数
  6. Android常用组件
  7. android进阶(一)Activity加载模式
  8. vue的零碎知识点-黑马后台项目整理
  9. LVM 逻辑卷管理(原理概念篇)
  10. python爬取美女_Python制作爬虫抓取美女图