委托在.Net Framework中的应用非常广泛,最近一个项目用到了委托来处理GridView数据源,在这里做了一个简单的Demo来分享一下它的应用场景,相信对委托不是很熟悉的朋友,看后应该会有所了解。
说明:Demo使用了自定义控件(LinqGridView)。
一、自定义LinqGridView 类源码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
namespace DelegateWeb.UserControl
{
/// <summary>
/// 描述:自定义Linq数据表格
/// 作者:Eric He
/// 日期:2012-08-09
/// </summary>
public class LinqGridView : GridView
{
/// <summary>
/// 定义一个返回IQueryable类型的委托
/// </summary>
/// <returns></returns>
public delegate IQueryable GetCurrentQuery();
/// <summary>
/// 定义一个返回Object类型的委托
/// </summary>
/// <returns></returns>
public delegate object GetQueryList();
/// <summary>
/// 数据查询器(IQueryable类型的委托)
/// </summary>
public GetCurrentQuery QueryGetter;
/// <summary>
/// 数据查询器(Object类型的委托)
/// </summary>
public GetQueryList ListGetter;
/// <summary>
/// 加载数据
/// </summary>
/// <returns></returns>
public void LoadData()
{
//如果有方法注册委托变量
if (QueryGetter != null)
//通过委托调用方法
base.DataSource = QueryGetter.Invoke();
else if (ListGetter != null)
base.DataSource = ListGetter.Invoke();
else
base.DataSource = LinqQuery;
this.DataBind();
}
/// <summary>
/// 数据查询接口
/// </summary>
public IQueryable LinqQuery
{
get;
set;
}
}
}
二、页面html代码
1. 注册自定义控件:<%@ Register Assembly="DelegateWeb" Namespace="DelegateWeb.UserControl" TagPrefix="UC"%>
2. 使用自定义控件:<UC:LinqGridView ID="gvTest" runat="server"></UC:LinqGridView>
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="LoadData.aspx.cs" Inherits="DelegateWeb.LoadData" %>
<%@ Register Assembly="DelegateWeb" Namespace="DelegateWeb.UserControl" TagPrefix="UC"%>
<!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>
<UC:LinqGridView ID="gvTest" runat="server"></UC:LinqGridView>
</div>
</form>
</body>
</html>
三、页面.cs代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using DelegateStudy.Entity;
using DelegateStudy;
using DelegateWeb.UserControl;
namespace DelegateWeb
{
public partial class LoadData : BasePage
{
protected override void OnLoad(EventArgs e)
{
//指定数据源
gvTest.QueryGetter = QueryEmployee;
base.OnLoad(e);
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
gvTest.LoadData();
}
}
/// <summary>
/// 查询员工数据
/// </summary>
/// <returns></returns>
private IQueryable QueryEmployee()
{
List<Employee> lstEmployee = new List<Employee>();
lstEmployee.Add(new Employee { Id = 1, FirstName = "Eric", LastName = "He", Age = 24 });
lstEmployee.Add(new Employee { Id = 2, FirstName = "Issac", LastName = "Chen", Age = 26 });
lstEmployee.Add(new Employee { Id = 3, FirstName = "Jim", LastName = "Zhang", Age = 25 });
lstEmployee.Add(new Employee { Id = 4, FirstName = "Warren", LastName = "Yang", Age = 25 });
lstEmployee.Add(new Employee { Id = 5, FirstName = "Yafyr", LastName = "Qiu", Age = 26 });
lstEmployee.Add(new Employee { Id = 6, FirstName = "Cheney", LastName = "Zhang", Age = 30 });
return (from a in lstEmployee select a).AsQueryable();
}
struct Employee
{
private int id;
private string firstname;
private string lastname;
private int age;
public int Id
{
get { return id; }
set { id = value; }
}
public string FirstName
{
get { return firstname; }
set { firstname = value; }
}
public string LastName
{
get { return lastname; }
set { lastname = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}
public Employee(int iId, string strFirstNamem, string strLastName, int iAge)
{
id = iId;
firstname = strFirstNamem;
lastname = strLastName;
age = iAge;
}
}
}
}
四、效果图
作者:Eric He
http://my.csdn.net/eriche_yong