Welcome 微信登录

首页 / 网页编程 / ASP.NET / ASP.NET实现对相似页面的后台代码的抽象及动态GridView动态列数据绑定

ASP.NET实现对相似页面的后台代码的抽象及动态GridView动态列数据绑定2013-10-20 cnblogs alert(dong)以下通过一个ASP.NET的Demo,希望能使您加深对多态的理解。

现在的需求是这样子(当然该需求 是借助于最近的项目中碰到的问题),在该系统中的流程管理中,有两个页面,一个显示的是我本人发起的审 批列表,另一个是等待我进行审批的列表,他们的查询以及列表显示和查看审批历史等均一致,唯一不同的是 待审批还有一个可执行审批动作的一列,但是不同的人或者在不同的应用(我在这里假设该系统是有多个应用 的复杂系统)里面获取到列表的列是不一样的,所以需要使用动态列,当然这些数据来源我在这里不赘述,为 便于举例我也不会去使用到数据库,您可以构造一个类,包含一个属性为列的集合,一个属性为数据集即可, 当然下面的例子均会涉及。

我的环境为Windows 7+ Visual Studio 2010,我创建了一个 WebApplication,名为WebApplication3,为了页面好看点,我将不会选择空Web Application。添加两个aspx 页面(MyApprovals和ToApprovals),并在母版页的导航添加链接(如果你没有母版页可以跳过此步骤直接创 建页面即可)

<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" EnableViewState="false" IncludeStyleBlock="false" Orientation="Horizontal"><Items><asp:MenuItem NavigateUrl="~/Default.aspx" Text="主页"/><asp:MenuItem NavigateUrl="~/MyApprovals.aspx" Text="我的申请"/><asp:MenuItem NavigateUrl="~/ToApprovals.aspx" Text="待我审批"/><asp:MenuItem NavigateUrl="~/About.aspx" Text="关于"/></Items></asp:Menu>
页面代码很简单,MyApprovals的页面代码如下:

<p><asp:TextBox ID="txtKey" runat="server"></asp:TextBox>&nbsp;<asp:Button ID="btnSearch" runat="server" Text="Button"onclick="btnSearch_Click" /><asp:Label ID="lblMsg" runat="server" ForeColor="Red"></asp:Label></p><p><asp:GridView ID="gvApprovals" runat="server"></asp:GridView></p>
ToApprovals的页面代码后面再贴出来。

创建他们的后台代码的基类名为 ApprovalBasePage,我们在实际开发中可能还有一个更BasePage之类的基类,这时ApprovalBasePage就应继承 于BasePage,

View Code public class ApprovalBasePage : BasePage{/// <summary>/// 0为我发起审批的页面,1为待审批的页面,可由子类去确定类型/// </summary>protected virtual int PageType { get { return 0; } }private ApprovalData dataSource;/// <summary>/// 获取数据源/// </summary>ApprovalData DataSource{get{if (this.dataSource == null){this.dataSource = ApprovalData.GetData(this.PageType);}return this.dataSource;}}/// <summary>/// 进行数据绑定,参数仅作为示范作用,/// 因为绑定时可能会与用户有些交互,这些交互很可能不相同,因而留给子类去重写/// 但是本例中他们的数据绑定几乎是一样的/// </summary>protected virtual void BindData(string key = ""){ }/// <summary>/// 将数据转化为DataTable,便于绑定/// </summary>/// <returns></returns>protected DataTable DataToTable(){DataTable dt = new DataTable();if (this.DataSource == null){return null;}foreach (var item in this.DataSource.HeadList){dt.Columns.Add(item, typeof(string));}DataRow dr = null;int colIndex = 0;foreach (var item in this.DataSource.ContentList){dr = dt.NewRow();colIndex = 0;foreach (var itemCol in item){dr[colIndex++] = itemCol;if (colIndex >= dt.Columns.Count){//虽然提供该接口的保证数据肯定是与列数对应的//但我还是尽量保证数据异常时程序不会报错break;}}dt.Rows.Add(dr);}return dt;}#region event 两个页面的共同事件都放进这里来了protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){BindData();}}protected void btnSearch_Click(object sender, EventArgs e){BindData();}#endregion}