一起谈.NET技术,asp.net控件开发基础(22)

本文介绍如何在ASP.NET中实现自定义的数据源控件,包括DataSourceControl和DataSourceView的基本概念及其简单实现示例。

  上两篇讨论了如何定义结合数据源控件的数据绑定控件.这次我们一起来看下数据源控件是如何实现的。asp.net2.0已经为我们提供了很多数据源控件,相信大家都用过了,也希望大家对其有所熟悉.关于它能做什么就不说了。下面我们也一起来看看,如何简单的实现。

  一.你必须了解的

  1.关于数据源控件(DataSourceControl)

  虽然表面看来,给数据绑定控件指定DataSourceID属性,数据源控件帮你做了一切工作,其实不然,数据源控件只负责收集与数据交互的相关信息,如:SqlDataSource的ConnectionString,AccessDataSource的DataFile
收集好这些信息后交给DataView类统一处理数据,但用户一般不与DataView类直接打交道,而是DataSourceControl,所以DataSourceControl需要获取DataView类,从而间接的调用数据相关操作方法。因此,.net抽象定义出了一个接口IDataSource,实现 IDataSource 接口的任何类都是数据源控件,.net为我们提供了一个起点DataSourceControl类,其实现了IDataSource 接口。

  2.数据处理(DataSourceView数据源视图)

  上面已经谈到,数据源控件将相关数据传给DataSourceView,处理数据。如SqlDataSourceView提供了相当多的数据操作,最基本的则是检索数据,接着还有添加,更新,删除等操作。.net为我们提供了一个起点DataSourceView类,其中ExecuteSelect方法作为抽象方法,子类必须实现。

  二.最简单实现(示例)

  什么是最简单实现呢?比如只提供最基本的检索数据功能的数据源控件,这里我们只需要实现上面两个类的抽象方法就OK了,还是看示例吧.

  (1)定义DataSourceView 实现ExecuteSelect方法


   
public class MyDataSourceView : DataSourceView
{
public MyDataSourceView(MyDataSourceControl owner, string name)
:
base (owner, name)
{
}
protected override IEnumerable ExecuteSelect(DataSourceSelectArguments arguments)
{
arguments.RaiseUnsupportedCapabilitiesError(
this );
SqlConnection conn
=
new SqlConnection( " Server=localhost;Database=Northwind;uid=sa;pwd=123456 " );
conn.Open();

SqlCommand cmd
=
new SqlCommand( " SELECT CustomerID, ContactName, ContactTitle, CompanyName FROM Customers WHERE CustomerID LIKE '[AB]%' " ,
conn);
return (IEnumerable)cmd.ExecuteReader(CommandBehavior.CloseConnection);

}
}

  (2)定义DataSourceControl,获取DataSourceView


   
public class MyDataSourceControl : DataSourceControl
{
protected override DataSourceView GetView( string viewName)
{
return new MyDataSourceView( this , "" );
}
}

  你可能不相信,你已经完成了一个数据源控件了,使用方法一样,如下


   
< aspDemo:MyDataSourceControl ID = " MyDataSourceControl1 " runat = " server " ></ aspDemo:MyDataSourceControl >
< asp:GridView ID = " GridView1 " runat = " server " DataSourceID = " MyDataSourceControl1 " >
</ asp:GridView >

  三.加强功能

  上面是最简单的实现,这样的示例你应该很容易理解。看上上面的示例,你一定会说这样的控件有何用,是的,没用。在这里我们应该熟悉下内置的数据源控件为我们提供了哪些功能。下面可能是你需要的

  1.数据操作需要的参数,.net已经为你提供Parameter类及ParameterCollection集合

  2.返回数据类型DataReader or DataSet

  3.数据操作执行语句(即sql命令语句)

  4.描述sql命令类型 (即文本 or 存储过程)

  5.事件 在数据操作前后提供事件触发,如Selected(检索数据完成后)和Selecting(检索数据前)

  ...还有其他你可能想的到的。还是上面的话,DataSourceControl封装一些基本的属性提供给DataSourceView使用,DataSourceView提供实现。

  四.简单思路

  1.定义需要的成员

  这里先说明DataSourceView的实现,因为其为核心操作的具体实现,这里你可以根据你提供的具体操作的一个操作来实现,下面的则可触类旁通,如检索数据操作

  (1)SelectCommand属性,用于检索数据的字符串


   
public string SelectCommand
{
get { return ViewState[ " SelectCommand " ] != null ? ( string )ViewState[ " SelectCommand " ] : string .Empty; }
set { ViewState[ " SelectCommand " ] = value; }
}

  (2)SelectCommandType属性,用于描述sql命令类型


   
public SqlDataSourceCommandType SelectCommandType
{
get { return ViewState[ " SelectCommandType " ] != null ? (SqlDataSourceCommandType)ViewState[ " SelectCommandType " ] : SqlDataSourceCommandType.Text; }
set { ViewState[ " SelectCommandType " ] = value; }
}

  (3)SelectParameters属性,获取该集合包含由SelectCommand属性使用的参数集合


   
public ParameterCollection SelectParameters
{
get
{
if (selectParameters == null )
{
selectParameters
= new ParameterCollection();

return selectParameters;
}
}

  (4)Can数据操作(如CanDelete)属性,由于检索数据为必须的操作,所以没有CanSelect属性

  (5)Selected和Selecting事件


   
public event SqlDataSourceStatusEventHandler Selected
{
add { Events.AddHandler(SelectedKey, value); }
remove { Events.RemoveHandler(SelectedKey, value); }
}

public event SqlDataSourceSelectingEventHandler Selecting
{
add { Events.AddHandler(SelectingKey, value); }
remove { Events.RemoveHandler(SelectingKey, value); }
}

  (6)ExecuteSelect具体实现方法


   
protected override IEnumerable ExecuteSelect(DataSourceSelectArguments arguments)
{
}

  此外DataSourceControl也需要根据不同数据的来源定义相关属性,当然还有其他你可能想到的,你也可以加进去。此篇就先此打住,至少实现了一个最简单的示例^__^.下次我们继续,不然篇幅可能太长.有些问题放在一起太多,可能太乱.其实现在我们已经看到一些自定义的数据源控件了,如支持NBear和Nhibernate的数据源控件,大家可以参考以下。

上一篇:asp.net控件开发基础(21)

下一篇:asp.net控件开发基础(23)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值