C#利用委托处理数据源

委托在.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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值