分页是Web应用程序中最常用到的功能之一,在ASP.NET中,虽然自带了一些可以分页的数据控件,但其分页功能并不尽如人意。本文对于这些数据控件的假分页暂且不表,如有不明白的同学请百Google度之。

本文中实现的分页控件是在手动分页基础上做的改善,将分页实现的逻辑部分和数据控件的绑定尽可能分开,以克服手工编写分页代码任务繁琐、代码重用率低等问题。

本文依旧是一粒粟子。

一、分页控件素颜

二、分页控件的实现

本文中将介绍两种将分页实现逻辑与数据控件绑定分离的实现方式:

  • 使用反射机制
  • 使用事件机制

1、基于反射机制的分页控件

源码

PagingHelper.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="PagingHelper.ascx.cs" Inherits="PagingHelper.Controls.PagingHelper" %>

<div style="width:100%">

    <asp:LinkButton ID="lbtnFirstPage" runat="server" CausesValidation="false" onclick="lbtnPage_Click"  >首页</asp:LinkButton>

    <asp:LinkButton ID="lbtnPrevPage" runat="server" CausesValidation="false"  onclick="lbtnPage_Click" >上一页</asp:LinkButton>

    &nbsp;第<asp:Label ID="lbPageIndex" runat="server" Text=""></asp:Label>

    页/共<asp:Label ID="lbTotalPages" runat="server" Text=""></asp:Label>

    页&nbsp;

    <asp:LinkButton ID="lbtnNextPage" runat="server" CausesValidation="false"  onclick="lbtnPage_Click" >下一页</asp:LinkButton>

    <asp:LinkButton ID="lbtnLastPage" runat="server" CausesValidation="false"  onclick="lbtnPage_Click" >尾页</asp:LinkButton>

</div>

PagingHelper.ascx.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

using System.Reflection;

 

namespace PagingHelper.Controls

{

    public partial class PagingHelper : System.Web.UI.UserControl

    {

        #region 属性

        private int m_PageSize;

        public int PageSize         //每页显示记录数

        {

            set

            {

                m_PageSize = value;

            }

            get

            {

                if (m_PageSize.Equals(0))

                {

                    m_PageSize = 10;

                }

                return m_PageSize;

            }

        }

 

        private int m_PageIndex;

        public int PageIndex        //当前页页码

        {

            set

            {

                m_PageIndex = value;

            }

            get

            {

                if (m_PageIndex.Equals(0))

                {

                    m_PageIndex = 1;

                }

                return m_PageIndex;

            }

        }

 

        public int TotalItemCount   //记录总数

        {

            set;

            private get;

        }

 

        public string BindDataMethodName    //绑定数据的方法名

        {

            set;

            private get;

        }

        #endregion

 

        #region 受保护的方法

        protected void Page_Load(object sender, EventArgs e)

        {

            if (!IsPostBack)

            {

                BindPagingHelperControl();

            }

        }

        protected void lbtnPage_Click(object sender, EventArgs e)

        {

            LinkButton lbtn = sender as LinkButton;

            ReBindData(lbtn.CommandArgument);

        }

        #endregion

 

        #region 公共方法

 

        #endregion

 

        #region 私有方法

        private void BindPagingHelperControl()

        {

            int totalPages = (TotalItemCount % PageSize) == 0 ? TotalItemCount / PageSize : TotalItemCount / PageSize + 1;

            //显示

            lbPageIndex.Text = PageIndex.ToString();

            lbTotalPages.Text = totalPages.ToString();

            //使能

            lbtnFirstPage.Enabled = PageIndex > 1;

            lbtnPrevPage.Enabled =  PageIndex > 1;

            lbtnLastPage.Enabled = PageIndex < totalPages;

            lbtnNextPage.Enabled = PageIndex < totalPages;

            //命令

            lbtnFirstPage.CommandArgument = "1";

            lbtnPrevPage.CommandArgument = (PageIndex - 1).ToString();

            lbtnNextPage.CommandArgument = (PageIndex + 1).ToString();

            lbtnLastPage.CommandArgument = totalPages.ToString();

        }

        private void ReBindData(string pageIndex)

        {

            PageIndex = int.Parse(pageIndex);

            Object obj = null;  //空间所在的容器

            if (base.Parent is HtmlForm)

            {

                obj = this.Page;

            }

            else if (base.Parent is ContentPlaceHolder)

            {

                obj = this.Page.Master.Page;

            }

            else

            {

                obj = base.Parent;

            }

            MethodInfo methodInfo = obj.GetType().GetMethod(BindDataMethodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

            methodInfo.Invoke(obj, null);

            BindPagingHelperControl();

        }

        #endregion

 

    }

}

Demo:

Default.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="PagingHelper.Default" %>

 

<%@ Register src="Controls/PagingHelper.ascx" tagname="PagingHelper" tagprefix="uc1" %>

 

<!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>

        <asp:GridView ID="gvDemo" runat="server">

        </asp:GridView>

        <br />

        <uc1:PagingHelper ID="PagingHelper1" runat="server" PageSize="2" />

    </div>

    </form>

</body>

</html>

Default.aspx.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Data;

 

namespace PagingHelper

{

    public partial class Default : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            GvDemoBind();

        }

 

        protected void GvDemoBind()

        {

            string sql = @"SELECT * FROM tb_user";

            string sqlCount = @"SELECT COUNT(*) FROM tb_user ";

            int itemStart = (PagingHelper1.PageIndex - 1) * PagingHelper1.PageSize;

            sql += string.Format(" LIMIT {0},{1}",itemStart,PagingHelper1.PageSize);

            gvDemo.DataSource = SQLHelper.ExecuteDataTable(sql).DefaultView;

            gvDemo.DataBind();

            PagingHelper1.TotalItemCount = Convert.ToInt32(SQLHelper.ExecuteScalar(sqlCount));

            PagingHelper1.BindDataMethodName = "GvDemoBind";

        }

    }

}

2、基于事件机制的分页控件

源码:

PagingHelper.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="PagingHelper.ascx.cs" Inherits="PagingHelper_V2.Controls.PagingHelper" %>

<div style="width:100%">

    <asp:LinkButton ID="lbtnFirstPage" runat="server" CausesValidation="false" onclick="lbtnPage_Click"  >首页</asp:LinkButton>

    <asp:LinkButton ID="lbtnPrevPage" runat="server" CausesValidation="false"  onclick="lbtnPage_Click" >上一页</asp:LinkButton>

    &nbsp;第<asp:Label ID="lbPageIndex" runat="server" Text=""></asp:Label>

    页/共<asp:Label ID="lbTotalPages" runat="server" Text=""></asp:Label>

    页&nbsp;

    <asp:LinkButton ID="lbtnNextPage" runat="server" CausesValidation="false"  onclick="lbtnPage_Click" >下一页</asp:LinkButton>

    <asp:LinkButton ID="lbtnLastPage" runat="server" CausesValidation="false"  onclick="lbtnPage_Click" >尾页</asp:LinkButton>

    &nbsp;转到

    <asp:TextBox ID="txtGoto" runat="server" Width="32px"></asp:TextBox>

    页<asp:Button ID="btnGoto" runat="server" Text="确定" onclick="btnGoto_Click" />

</div>

PagingHelper.ascx.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

 

namespace PagingHelper_V2.Controls

{

    public partial class PagingHelper : System.Web.UI.UserControl

    {

        #region 属性

        private int m_PageSize;

        public int PageSize         //每页显示记录数

        {

            set

            {

                m_PageSize = value;

            }

            get

            {

                if (m_PageSize.Equals(0))

                {

                    m_PageSize = 10;

                }

                return m_PageSize;

            }

        }

 

        private int m_PageIndex;

        public int PageIndex        //当前页页码

        {

            set

            {

                m_PageIndex = value;

            }

            get

            {

                if (m_PageIndex.Equals(0))

                {

                    m_PageIndex = 1;

                }

                return m_PageIndex;

            }

        }

 

        public int TotalItemCount   //记录总数

        {

            set;

            private get;

        }

 

        #endregion

 

        #region 受保护的方法

        protected void Page_Load(object sender, EventArgs e)

        {

            if (!IsPostBack)

            {

                BindPagingHelperControl();

            }

        }

        protected void lbtnPage_Click(object sender, EventArgs e)

        {

            LinkButton lbtn = sender as LinkButton;

            ReBindData(int.Parse(lbtn.CommandArgument));

        }

        protected void btnGoto_Click(object sender, EventArgs e)

        {

            int gotoPageIndex = PageIndex;

            if (int.TryParse(txtGoto.Text, out gotoPageIndex))

            {

                if (gotoPageIndex < 1 || gotoPageIndex > int.Parse(lbTotalPages.Text))

                {

                    Response.Write("<script>alert('此页面不存在!')</script>");

                }

                else

                {

                    if (!gotoPageIndex.Equals(int.Parse(lbPageIndex.Text)))

                    {

                        ReBindData(gotoPageIndex);

                    }

                }

            }

            else

            {

                Response.Write("<script>alert('请输入正确的页码!')</script>");

            }

 

        }

        #endregion

 

        #region 公共方法

 

        #endregion

 

        #region 私有方法

        private void BindPagingHelperControl()

        {

            int totalPages = (TotalItemCount % PageSize) == 0 ? TotalItemCount / PageSize : TotalItemCount / PageSize + 1;

            //显示

            lbPageIndex.Text = PageIndex.ToString();

            lbTotalPages.Text = totalPages.ToString();

            txtGoto.Text = PageIndex.ToString();

            //使能

            lbtnFirstPage.Enabled = PageIndex > 1;

            lbtnPrevPage.Enabled = PageIndex > 1;

            lbtnLastPage.Enabled = PageIndex < totalPages;

            lbtnNextPage.Enabled = PageIndex < totalPages;

            //命令

            lbtnFirstPage.CommandArgument = "1";

            lbtnPrevPage.CommandArgument = (PageIndex - 1).ToString();

            lbtnNextPage.CommandArgument = (PageIndex + 1).ToString();

            lbtnLastPage.CommandArgument = totalPages.ToString();

        }

        private void ReBindData(int pageIndex)

        {

            PageIndex = pageIndex;

            OnPageIndexChanged(new EventArgs());

            BindPagingHelperControl();

        }

        #endregion

 

        #region 事件

        public delegate void PageIndexChangedEventHandler(object sender, EventArgs e);

        public event PageIndexChangedEventHandler PageIndexChanged;

        protected virtual void OnPageIndexChanged(EventArgs e)

        {

            PageIndexChangedEventHandler handler = PageIndexChanged;

            if (handler != null)

            {

                handler(this, e);

            }

        }

        #endregion

 

        

    }

}

Demo:

Default.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="PagingHelper_V2.Default" %>

 

<%@ Register src="Controls/PagingHelper.ascx" tagname="PagingHelper" tagprefix="uc1" %>

 

<!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>

        <asp:GridView ID="gvDemo" runat="server">

        </asp:GridView>

        &nbsp;

        <uc1:PagingHelper ID="PagingHelper1" runat="server" PageSize="2" OnPageIndexChanged="PagingHelper1_OnPageIndexChanged" />

    </div>

    </form>

</body>

</html>

Default.aspx.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

 

namespace PagingHelper_V2

{

    public partial class Default : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            GvDemoBind();

        }

 

        protected void GvDemoBind()

        {

            string sql = @"SELECT * FROM tb_user";

            string sqlCount = @"SELECT COUNT(*) FROM tb_user ";

            int itemStart = (PagingHelper1.PageIndex - 1) * PagingHelper1.PageSize;

            sql += string.Format(" LIMIT {0},{1}", itemStart, PagingHelper1.PageSize);

            gvDemo.DataSource = SQLHelper.ExecuteDataTable(sql).DefaultView;

            gvDemo.DataBind();

            PagingHelper1.TotalItemCount = Convert.ToInt32(SQLHelper.ExecuteScalar(sqlCount));

            

        }

 

        protected void PagingHelper1_OnPageIndexChanged(object sender, EventArgs e)

        {

            GvDemoBind();

        }

    }

}

三、总结

比较两种实现方式,基于事件机制的实现更符合ASP.NET服务器控件的style。

好!那就参照园子里的分页使用基于事件机制的方式再做一个控件作为总结。

源码:

PagingHelper.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="PagingHelper.ascx.cs" Inherits="PagingHelper_V3.Controls.PagingHelper" %>

<style type="text/css">

    a.LinkButtonDefault{text-align:center;text-decoration:none;margin-right:1px;padding:2px 4px;}

    a.LinkButtonBlue{background: #ebebeb;text-align:center;text-decoration:none;margin-right:1px;padding:2px 4px;}

    a.LinkButtonYellow { background-color:#ccc; color:#000fff; font-weight:bold;text-align:center;text-decoration:none;margin-right:1px;padding:2px 4px;}

</style>

<div style="width:100%">

    共<asp:Label ID="lbTotalPages" runat="server" ForeColor="#fff"></asp:Label>页:

    <asp:LinkButton ID="lbtnFirstPage" runat="server" CausesValidation="false" CssClass="LinkButtonDefault" onclick="lbtnPage_Click" >首页</asp:LinkButton>

    <asp:LinkButton ID="lbtnPrevPage" runat="server" CausesValidation="false" CssClass="LinkButtonDefault" onclick="lbtnPage_Click" >上一页</asp:LinkButton>

    <asp:Repeater ID="rptPageNumber" runat="server">

        <ItemTemplate>

            <asp:LinkButton ID="lbtnPageNumber" runat="server" CausesValidation="false" Width="16px" onclick="lbtnPage_Click"

                 CssClass='<%# Convert.ToInt32(Container.DataItem)==PageIndex?"LinkButtonYellow":"LinkButtonBlue"%>' CommandArgument='<%# Container.DataItem %>'>

<%
   1: #Container.DataItem 
%>

            </asp:LinkButton>

        </ItemTemplate>

    </asp:Repeater>

    <asp:LinkButton ID="lbtnNextPage" runat="server" CausesValidation="false" CssClass="LinkButtonDefault"  onclick="lbtnPage_Click" >下一页</asp:LinkButton>

    <asp:LinkButton ID="lbtnLastPage" runat="server" CausesValidation="false" CssClass="LinkButtonDefault"  onclick="lbtnPage_Click" >尾页</asp:LinkButton>

</div>

PagingHelper.ascx.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

 

namespace PagingHelper_V3.Controls

{

    public partial class PagingHelper : System.Web.UI.UserControl

    {

        #region 属性

        private int m_PageSize;

        public int PageSize         //每页显示记录数

        {

            set

            {

                m_PageSize = value;

            }

            get

            {

                if (m_PageSize.Equals(0))

                {

                    m_PageSize = 10;

                }

                return m_PageSize;

            }

        }

 

        private int m_PageIndex;

        public int PageIndex        //当前页页码

        {

            set

            {

                m_PageIndex = value;

            }

            get

            {

                if (m_PageIndex.Equals(0))

                {

                    m_PageIndex = 1;

                }

                return m_PageIndex;

            }

        }

 

        public int TotalItemCount   //记录总数

        {

            set;

            private get;

        }

 

        #endregion

 

        #region 受保护的方法

        protected void Page_Load(object sender, EventArgs e)

        {

            if (!IsPostBack)

            {

                BindPagingHelperControl();

            }

        }

        protected void lbtnPage_Click(object sender, EventArgs e)

        {

            LinkButton lbtn = sender as LinkButton;

            ReBindData(int.Parse(lbtn.CommandArgument));

        }

        #endregion

 

        #region 公共方法

 

        #endregion

 

        #region 私有方法

        private void BindPageNum(int totalPages)

        {

            int startPageIndex = 1, endPageIndex = 10;

            if (totalPages < endPageIndex)

            {

                endPageIndex = totalPages;

            }

            else

            {

                startPageIndex = (PageIndex > 5) ? PageIndex - 5 : startPageIndex;

                int result = (startPageIndex + 9) - totalPages;

                if (result > 0)

                {

                    endPageIndex = totalPages;

                    startPageIndex -= result;

                }

                else

                {

                    endPageIndex = startPageIndex + 9;

                }

            }

            BindPageNum(startPageIndex, endPageIndex);

        }

        private void BindPageNum(int startPageIndex, int endPageIndex)

        {

            int[] pages = new int[endPageIndex - startPageIndex + 1];

            int index = 0;

            for (int i = startPageIndex; i <= endPageIndex; i++)

            {

                pages[index] = i;

                index++;

            }

            rptPageNumber.DataSource = pages;

            rptPageNumber.DataBind();

        }

        private void BindPagingHelperControl()

        {

            int totalPages = (TotalItemCount % PageSize) == 0 ? TotalItemCount / PageSize : TotalItemCount / PageSize + 1;

            //显示

            lbTotalPages.Text = totalPages.ToString();

            BindPageNum(totalPages);

            //使能

            lbtnFirstPage.Enabled = PageIndex > 1;

            lbtnPrevPage.Enabled = PageIndex > 1;

            lbtnLastPage.Enabled = PageIndex < totalPages;

            lbtnNextPage.Enabled = PageIndex < totalPages;

            //命令

            lbtnFirstPage.CommandArgument = "1";

            lbtnPrevPage.CommandArgument = (PageIndex - 1).ToString();

            lbtnNextPage.CommandArgument = (PageIndex + 1).ToString();

            lbtnLastPage.CommandArgument = totalPages.ToString();

        }

        private void ReBindData(int pageIndex)

        {

            PageIndex = pageIndex;

            OnPageIndexChanged(new EventArgs());

            BindPagingHelperControl();

        }

        #endregion

 

        #region 事件

        public delegate void PageIndexChangedEventHandler(object sender, EventArgs e);

        public event PageIndexChangedEventHandler PageIndexChanged;

        protected virtual void OnPageIndexChanged(EventArgs e)

        {

            PageIndexChangedEventHandler handler = PageIndexChanged;

            if (handler != null)

            {

                handler(this, e);

            }

        }

        #endregion

    }

}

Web用户控件开发--分页控件的更多相关文章

  1. jQuery控件之分页控件-- kkpager v1.3使用简介

    js分页展示控件,传入简单参数就能使用的分页效果控件 在线测试链接: http://pgkk.github.io/kkpager/example/pager_test.html http://pgkk ...

  2. DEV控件的分页控件,实现勾选复选框

    /// <summary> /// 单元格的点击事件 /// </summary> /// <param name="sender"></ ...

  3. 用C#编写ActiveX控件,开发浏览器控件,注册ActiveX 控件

    用C#编写ActiveX控件,开发浏览器控件,注册ActiveX 控件用C#编写ActiveX控件 开发浏览器控件这是本控件开发完成后的一个简单应用.我们可以利用它以本地文件夹为单位来批量更新服务器的 ...

  4. 基于jquery扩展漂亮的分页控件(ajax)

    分页控件式大家在熟悉不过的控件,很多情况下都需要使用到分页控件来完成列表数据加载操作,在很多分页控件中有的编写麻烦,有的应用扩展比较复杂,有的分页控件样式比较丑陋,有的分页控件用户体验操作比较简单等等 ...

  5. asp.net分页控件库

    AspNetPager分页控件 AspNetPager分页控件解决了分页中的很多问题,直接采用该控件进行分页处理,会将繁琐的分页工作变得简单化,下面是我如何使用AspNetPager控件进行分页处理的 ...

  6. 【NET】Winform分页控件初探

    public partial class WinFormPager : UserControl { ; /// <summary> /// 当前页 /// </summary> ...

  7. 《ASP.NET1200例》ListView 控件与DataPager控件的结合<一>

    分页     在前一部分开始时介绍的原 HTML 设计中内含分页和排序,所以根据规范完整实现该网格的任务尚未完成.我们先分页,然后再排序. ListView 控件中的分页通过引入另一个新控件 Data ...

  8. PCHMI工控组态开发视频教程

    PCHMI是一款适合所有PLC工程师快速上手工控组态开发的控件 下面是视频教程链接 PCHMI工控组态 02-按钮的使用 PCHMI工控组态 03-数据显示器使用 PCHMI工控组态 04-标签控件的 ...

  9. 用C#开发ActiveX控件,并使用web调用

    入职差不多两个月了,由学生慢慢向职场人做转变,也慢慢的积累知识,不断的更新自己.最近的一个项目里边,涉及到的一些问题,因为SDK提供的只是winform才能使用了,但是有需求咱们必须得完成啊,所以涉及 ...

随机推荐

  1. Python过滤emoji

    参考博客:http://my.oschina.net/jiemachina/blog/189460 1. 将emoji表情替换为指定字符串 import re def filter_emoji(des ...

  2. 微信小程序 - 深度定义骨架屏(提示)

    此举每个页面必须创建对应的css样式,比较麻烦(但非常准确),推荐使用组件化的skeleton组件 原理很简单:知晓一下this.setData原理,就OK了,可能大家会因此了解到全屏加载loadin ...

  3. JAVA_SE基础——26.[深入解析]局部变量与成员变量的差别

    黑马程序猿入学blog ... 假设这章节非常难懂的话应该返回去先看  JAVA_SE基础--10.变量的作用域 定义的位置上差别: 1. 成员变量是定义在方法之外,类之内的. 2. 局部变量是定义在 ...

  4. 使用paramiko中 Server not found in known_hosts的错误解决

    报错的格式如下: 主要是缺少set_missing_host_key_policy配置信息. set_missing_host_key_policy方法,是制定连接远程主机没有本地密钥或HostKey ...

  5. ES6学习笔记七:生成器与异步操作

    一:Generator Generator 函数是一个普通函数,但是有两个特征.一是,function关键字与函数名之间有一个星号:二是,函数体内部使用yield表达式,输出不同的内部状态. 执行 G ...

  6. java 判断是否为纯数字

      java 判断是否为数字格式 CreateTime--2017年12月1日10:37:00 Author:Marydon java 判断是否为数字格式 /** * 判断是否为数字格式不限制位数 * ...

  7. sql如何通过当前日期获取上周,上上周,上上上周的起始日期(周一_周七)

    当前时间周的起始日期(以周一为例)select DATEADD(week,DATEDIFF(week,0,getdate()),0)上周起始:select dateadd(week,-1,DATEAD ...

  8. phpBB3.1和3.2

    闲逛看到一个帖子, phpBB3的论坛经常被机器人注册攻击, 要找人做拦截. 出于兴趣, 联系了一下. 论坛是一个做健康养老调查的社会机构的, 版本3.1, 十年前我还在更新phpbb中文包的时候, ...

  9. Arduino的光敏传感器和超声波测距传感器测试代码

    光敏传感器测试代码 使用的是一个未知名4pin模块, 4pin依次为Vcc, Gnd, DO, AO, 板载一个可调电阻以及一个LED, 调节电阻大小, 可以控制LED亮灭和DO输出变化对光亮的灵敏度 ...

  10. (转)Delta3D源码分析

    最近学习Delta3D,  2.4版忙着发布,一直不能成功编译SimCore, 索性静下心来看看源码,官网上竟然提供了几个重要组建的软件设计说明书(SDD),虽说基本都是2005版了,不过我看了后觉得 ...