<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Aimin Han</title><subtitle type="text">SharePoint Server、Office、Silverlight、Flash、GIS、AVEVA NET &amp; solutions培训 咨询 设计</subtitle><id>http://feed.cnblogs.com/blog/u/30437/rss</id><updated>2012-02-08T15:16:02Z</updated><author><name>aimin</name><uri>http://www.cnblogs.com/hanaimin/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hanaimin/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/30437/rss"/><entry><id>http://www.cnblogs.com/hanaimin/archive/2012/02/08/2342404.html</id><title type="text">SharePoint Foundation中文档与文件、单据类型定制办法</title><summary type="text">在历次课程中，无论是之前的SharePoint版本，还是现在的SharePoint 2010，管理课程的培训学员都经常提出一个问题：如何在SharePoint中配置“单据基本信息”和“单据明细条目”组合显示的页面？且保持单据和单据条目一直的权限控制。SharePoint 2010 中提供了文档集的内容类型，在Server版本中，可以用来处理文档库中的“文档与文件”的问题。但是对列表而言，无论是Foundation还是Server都没有出箱即用的内容类型。本文介绍的示例是一个简单的合同管理的案例，合同有“基本信息”及“附属的合同文件”，附属文件类型比较多，如谈判记录、合同正文、技术附件等等。</summary><published>2012-02-08T03:18:00Z</published><updated>2012-02-08T03:18:00Z</updated><author><name>aimin</name><uri>http://www.cnblogs.com/hanaimin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hanaimin/archive/2012/02/08/2342404.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hanaimin/archive/2012/02/08/2342404.html"/><content type="html">&lt;p&gt;在历次课程中，无论是之前的SharePoint版本，还是现在的SharePoint 2010，管理课程的培训学员都经常提出一个问题：如何在SharePoint中配置&amp;#8220;单据基本信息&amp;#8221;和&amp;#8220;单据明细条目&amp;#8221;组合显示的页面？且保持单据和单据条目一直的权限控制。&lt;/p&gt; &lt;p&gt;SharePoint 2010 中提供了文档集的内容类型，在Server版本中，可以用来处理文档库中的&amp;#8220;文档与文件&amp;#8221;的问题。但是对列表而言，无论是Foundation还是Server都没有出箱即用的内容类型。&lt;/p&gt; &lt;p&gt;本文介绍的示例是一个简单的合同管理的案例，合同有&amp;#8220;基本信息&amp;#8221;及&amp;#8220;附属的合同文件&amp;#8221;，附属文件类型比较多，如谈判记录、合同正文、技术附件等等。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081114016899.jpg"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="order1" border="0" alt="order1" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081114053216.jpg" width="1043" height="316" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;下面介绍的配置方法，同时适用于文档库和列表。&lt;/p&gt; &lt;p&gt;1、创建单据和单据明细内容类型&lt;/p&gt; &lt;p&gt;单据可以看做一种容器类型，因此，我们可以从&amp;#8220;文件夹&amp;#8221;内容类型派生。 单据明细可以根据需要从其他内容类型派生。如在本示例中，从文档类型派生合同文件内容类型。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081114136583.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081114196654.png" width="681" height="621" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081114223114.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081114287612.png" width="457" height="473" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081114581371.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081115036260.png" width="460" height="494" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081115052097.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081115191391.png" width="471" height="467" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;2、创建文档库或者列表&lt;/p&gt; &lt;p&gt;在本示例中，创建文档库，命名为Contracts&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081115234885.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/20120208111528330.png" width="1005" height="371" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;3、管理文档库或列表的内容类型&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081115325776.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081115383928.png" width="926" height="661" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081115424914.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081115505183.png" width="930" height="602" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;如有必要，可以更改新建按钮顺序，指定在顶级目录下，只允许创建的内容类型，有兴趣的可以尝试一下。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;4、创建All Contracts&amp;nbsp; 和 All&amp;nbsp; Contracts Files视图。&lt;/p&gt; &lt;p&gt;这两个都是默认视图，但是分别是不同文件夹下的默认视图，All Contracts 设定为顶级文件夹下的默认视图，All Contract Files设定为 Contract 内容类型文件夹下的默认视图。&lt;/p&gt; &lt;p&gt;由于包含多种合同文件，如果需求，可以将All Contract Files指定为分组视图，分类显示。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081115559615.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081116015226.png" width="694" height="487" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081116041096.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081116078112.png" width="693" height="274" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081116103426.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081116148282.png" width="702" height="178" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081116171644.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081116211484.png" width="704" height="252" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;4、添加合同信息 及 合同中的文件附件&lt;/p&gt; &lt;p&gt;通过上面的设置，我们可以发现，点击进入Contracts文档库的时候，使用的是All Contracts视图&lt;/p&gt; &lt;p&gt;点击进入某个具体的合同文件夹时，使用的是All Files视图。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081116236764.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081116274619.png" width="707" height="133" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081116291852.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081116354921.png" width="716" height="108" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;5 使用SharePoint Designer编辑&amp;nbsp; All Files视图页面&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081116436619.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081116491980.png" width="725" height="559" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;新建参数，从Url参数中取得当前Folder的地址&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081116538265.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081116577581.png" width="736" height="25" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081117106210.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081117181430.png" width="733" height="596" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;设置过滤条件&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081117221859.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081117287852.png" width="602" height="318" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;查看效果图&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081117356070.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081117432992.png" width="895" height="182" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/2012020811175279.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081117573954.png" width="907" height="362" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;根据需要，调整表单汇总需要显示的栏&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081137115903.png"&gt;&lt;img style="border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201202/201202081137179562.png" width="911" height="385" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;总结一下，定制表单页面和定制视图页面各有优缺点，在本示例中，定制视图页面可以较好地解决单据类型的对象。有关DataFormWebPart 和 xsltlistviewwebpart的定制方法，本文不作介绍。&lt;/p&gt; &lt;img src="http://www.cnblogs.com/hanaimin/aggbug/2342404.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hanaimin/archive/2012/02/08/2342404.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hanaimin/archive/2012/01/31/2332853.html</id><title type="text">SharePoint2010的牛刀：一、新的服务应用程序架构</title><summary type="text">新的服务应用程序架构是一种可扩展的中间层应用程序，可以为第三方应用程序或者服务提供数据或某种专业计算能力。新的服务应用程序架构能够被服务器场中不同服务器所共享，具备一定的负载均衡的能力，该负载均衡可自定义。 全新的服务模型将更加灵活 服务将不再依赖于 SSP，而是相对独立 Web 应用程序拥有更加宽泛的服务选择余地 可对高能耗的服务实现更优化的负载平衡 既可依附于单独的服务器场，也可在多个服务器场之间共享 所有服务器场均可专门用于服务托管 用于超高能耗型服务的成本投入可控，例如Web 分析服务、商业智能、搜索服务、Office Web等等。 以上讨论过于直板，为了建立更加直观的认识，我们从一.</summary><published>2012-01-31T04:01:00Z</published><updated>2012-01-31T04:01:00Z</updated><author><name>aimin</name><uri>http://www.cnblogs.com/hanaimin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hanaimin/archive/2012/01/31/2332853.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hanaimin/archive/2012/01/31/2332853.html"/><content type="html">&lt;p&gt;新的服务应用程序架构是一种可扩展的中间层应用程序，可以为第三方应用程序或者服务提供数据或某种专业计算能力。新的服务应用程序架构能够被服务器场中不同服务器所共享，具备一定的负载均衡的能力，该负载均衡可自定义。 &lt;p&gt;全新的服务模型将更加灵活 &lt;p&gt;服务将不再依赖于 SSP，而是相对独立 &lt;p&gt;Web 应用程序拥有更加宽泛的服务选择余地 &lt;p&gt;可对高能耗的服务实现更优化的负载平衡 &lt;p&gt;既可依附于单独的服务器场，也可在多个服务器场之间共享 &lt;p&gt;所有服务器场均可专门用于服务托管 &lt;p&gt;用于超高能耗型服务的成本投入可控，例如Web 分析服务、商业智能、搜索服务、Office Web等等。 &lt;p&gt;&amp;nbsp; &lt;p&gt;以上讨论过于直板，为了建立更加直观的认识，我们从一个实际案例开始吧。&lt;/p&gt; &lt;p&gt;故事发生在某大型能源行业国有制造企业，该企业承担了国内外众多大型工厂、工程的设计和施工项目。它已经采购了SharePoint 2007，将为它的市场部、开发部、设计部提供门户网站、项目管理、产品数据管理的解决方案。三个部门的需求和业务各有特点，又前后相继，具体如下：&lt;/p&gt; &lt;p&gt;1、市场部&lt;/p&gt; &lt;p&gt;市场部包括项目的立项申请、以及项目执行过程中的保函、佣金、签约资料、信函等文档管理和成本测算管理。每个项目产生约数十上百兆的文档。&lt;/p&gt; &lt;p&gt;2、开发部&lt;/p&gt; &lt;p&gt;开发部承担报价设计、合同设计、以及交底文档管理，合同设计过程需要进行简单的管理。每个项目产生数百兆的文档。&lt;/p&gt; &lt;p&gt;3、设计部&lt;/p&gt; &lt;p&gt;设计部承担企业所有在建项目的初步设计、详细设计、完工设计等工作，要求对设计过程中图纸目录、设计计划、设计师任务、设计工时、设计图档、设计更改、图纸晒发进行有效管控。&lt;/p&gt; &lt;p&gt;系统将根据设计计划向任务负责人及时派发任务，提醒设校审人员在线执行校审工作，任务完成后，系统会自动生成工时单，要求设计部人员填写相应任务所耗用的工时，由专业主管在线审核。设计部每年承担的并行项目约有十余个，每个项目在完成后，产生约20-50G的各类文档：Office、CAD、各种三维模型等等。这些文档最终会形成一个可交付的结构化的项目成果库。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;考虑到本系统承担了大量的数据存储和计算工作，因此设计院购买了3台8核16G的IBM 服务器，以及统一备份管理的高速磁盘阵列。然后，组织人员使用SharePoint 2007 实施了以上解决方案，解决方案中包含了大量自定义的工作流活动、事件处理、Web部件、应用程序页面。&lt;/p&gt; &lt;p&gt;服务器规划：一台SQL Server 报表服务器、一台作为应用服务器、一台前端服务器、数据库服务器使用了企业的统一SQL Server 集群。&lt;/p&gt; &lt;p&gt;网站规划：&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201201/201201311201105851.jpg"&gt;&lt;img style="border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="case1" border="0" alt="case1" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201201/201201311201138100.jpg" width="471" height="385" /&gt;&lt;/a&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;本系统上线不久，就遭遇了用户较为强烈的不满，尤其是市场部和开发部，由于这两个部门的应用只是简单的文档管理和较少的工作流管理，他们反映新上线的系统还不如之前一家小公司实施的文档管理系统响应速度快，这不合常理。 &lt;p&gt;通过上面的网站规划，显而易见，且不论服务器组合是否有优化空间，网站规划逻辑本身就很有问题：所有门户和项目网站都放在同一个网站集中。 &lt;p&gt;为什么说这是一个问题呢？我们可以通过SharePoint的几个基础概念来弄懂这个问题所在。 &lt;p&gt;1、服务器场 &lt;p&gt;将多台物理服务器组合成一个硬件资源池，从而实现单台服务器所不具备的处理能力。 &lt;p&gt;2、Web应用程序 &lt;p&gt;对硬件资源池的计算和存储虚拟化，任何系统都离不开两个方面：计算（CPU和内存）、存储（磁盘）。SharePoint Web应用程序使用IIS来发布，使用W3WP的一个进程实例，内存上限一般设定为800M &amp;#8211; 1G ； 它使用SQL Server来进行数据存储。 &lt;p&gt;可以回想一下SharePoint&amp;nbsp; &amp;#8221;管理中心&amp;#8221;中， Web应用程序的创建过程，指定一个应用程序池名称，指定一个数据库名称（当然，一个Web应用程序可以包含N个内容数据库，此处指的是创建的第一个数据库名称，一般名称为WSS_Content_XXX），实际上可以认为是对计算资源和存储资源的分配。 &lt;p&gt;小结一下：一个Web应用程序只能有一个应用程序池（计算资源，有内存上限，尤其32位系统）和多个内容数据库。 &lt;p&gt;3、网站集 &lt;p&gt;网站集是一堆面向具体业务应用的网站的集合。如果说Web应用程序还是对资源的分配，与具体企业业务没有具体关系的话，那么网站集则是从Web应用程序分配的资源里面分出一部分，服务于某个具体业务需求。网站集在创建的时候，会默认创建一个顶级网站，以衍生出一些列的子网站，算得上是所有网站的父亲、祖父、曾祖父&amp;#8230;&amp;#8230; &lt;p&gt;一个网站集只能存储于一个内容数据库中。 但一个内容数据库可以存储多个网站集的内容。一个网站集只能属于一个Web应用程序，也就只能够使用当前Web应用程序对应的单个计算资源（一个W3WP，不超过1G的内存使用上限）。 &lt;p&gt;4、网站 &lt;p&gt;网站集中的一个具体应用的示例。 &lt;p&gt;&amp;nbsp; &lt;p&gt;我们通过以上的介绍来分析一下该企业网站规划的问题所在。 &lt;p&gt;首先，由于使用的是单个网站集存储所有数据，就意味着所有数据都必须存储在一个SQL Server数据库之中。该企业设计部以10个年并行项目计算，10 X 20G = 200G。每年该数据库至少多出200G的数据。而SharePoint 2007 推荐的单库大小是80G，不超过 200G。实际上很多项目在完工后，都处于只读状态，但却不得不参与数据库的查询分析，影响了数据库的性能。 &lt;p&gt;其次，由于设计部的功能使用了大量的计算资源，如原始CAD dwg图纸的在线转换可视化，产品结构基线分析等等。使得共用同一&amp;#8220;计算资源&amp;#8221;的市场部和开发部不得不忍受着资源被抢占的痛苦。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;明白了问题所在，参考以上的几个基础概念，在SharePoint 2007下，我们可以将设计部放置在单独的Web应用程序中，将市场部和开发部放置于另一个Web应用程序中，从而将双方的计算资源独立。此外，使用网站集来管理每一个项目，从而确保每个内容数据库中容纳不超过2个项目网站集。似乎一切都开始正常了。&lt;/p&gt; &lt;p&gt;但是也存在一些问题，譬如，由于存在两个Web应用程序，在部门网站切换时，需要再次认证；在调用另一个Web应用程序数据时，需要额外的认证和设置等等。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;在SharePoint2010 中，这些可以进一步优化，譬如我们看到的Office Web App服务，就类似于CAD文档在线可视化的服务，在新的服务应用程序架构中，这种高能耗的服务被独立出来了，可以使用单台或多台服务器，甚至一个独立的服务器场为该运算进行服务。同样，对于一些具备全局特点的数据，也可以通过服务应用程序来提供。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;但是为了适应Sharepoint 2010的服务架构，我们提供一个A+B的加法运算服务，也需要编写大量的代码，使它能够通过Powershell创建、在管理中心被设置，被Web应用程序关联调用等等。所以，它是一把牛刀，非必要场合不要用它，毕竟开发者都是比较懒的。&lt;/p&gt; &lt;img src="http://www.cnblogs.com/hanaimin/aggbug/2332853.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hanaimin/archive/2012/01/31/2332853.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hanaimin/archive/2012/01/29/2331163.html</id><title type="text">Silverlight甘特图：五、Gantt图控件[已开源发布Codeplex]</title><summary type="text">如果说TimeLine，GanttPanel，TreeGrid是甘特图控件的三个核心部件，那么Gantt则是这三个部件之间行为和数据的协调者，Gantt统一了这三个部件的接口，提供了更简洁的开发能力。架构提要：功能：设计：在*.Gantt.Core 程序集中，可以发现大量的以Layout和Descriptor作为结尾的命名类，这些类构件了GanttPanel和TimeLine的计算模型和数据模型。TimeLineViewer和TaskEntryViewer分别作为TimeLine和GanttPanel的视图层。Viewer类会调用Renderer进行渲染。1. 语法1.1. XAML2. 备注</summary><published>2012-01-29T06:55:00Z</published><updated>2012-01-29T06:55:00Z</updated><author><name>aimin</name><uri>http://www.cnblogs.com/hanaimin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hanaimin/archive/2012/01/29/2331163.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hanaimin/archive/2012/01/29/2331163.html"/><content type="html">&lt;p&gt;如果说TimeLine，GanttPanel，TreeGrid是甘特图控件的三个核心部件，那么Gantt则是这三个部件之间行为和数据的协调者，Gantt统一了这三个部件的接口，提供了更简洁的开发能力。&lt;p&gt;&amp;nbsp;&lt;p&gt;架构提要：&lt;p&gt;功能：&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201201/201201311024289224.jpg"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="ganttfunctions" border="0" alt="ganttfunctions" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201201/201201311024331181.jpg" width="473" height="404" /&gt;&lt;/a&gt;&lt;p&gt;设计：&lt;p&gt;&amp;nbsp;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201201/201201311027328715.jpg"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="design" border="0" alt="design" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201201/201201311027343963.jpg" width="472" height="392" /&gt;&lt;/a&gt;&lt;p&gt;在*.Gantt.Core 程序集中，可以发现大量的以Layout和Descriptor作为结尾的命名类，这些类构件了GanttPanel和TimeLine的计算模型和数据模型。&lt;p&gt;TimeLineViewer和TaskEntryViewer分别作为TimeLine和GanttPanel的视图层。Viewer类会调用Renderer进行渲染。&lt;p&gt;&amp;nbsp;&lt;p&gt;1. 语法&lt;p&gt;1.1. XAML&lt;p&gt;2. 备注&lt;p&gt;2.1. 设置数据源&lt;p&gt;甘特图控件目前仅支持特定的数据源格式: ObservableCollection&amp;lt;ITaskDescriptor&amp;gt;。其中ITaskDescriptor是单任务信息的数据接口，详细信息参考Class Library中内容。&lt;p&gt;因此，面对来自不同类型数据源的任务信息，开发者必须编写解析类或方法，将XML,JSON等类型的数据转化为甘特图指定的数据源类型。&lt;p&gt;除初始化设定数据源外，甘特图控件允许分步加载数据，这是通过OnRequestData事件响应来实现的。&lt;p&gt;激发OnRequestData事件的条件时，展开当前任务，任务的ITaskDescriptor.EnableExpand=true，但ITaskDescriptor.Children.Count = 0;&lt;p&gt;示例代码如下：&lt;p&gt;1) 事件处理函数逻辑&lt;/p&gt;&lt;div style='margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: "Courier New", courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: rgb(244, 244, 244);' id="codeSnippetWrapper"&gt;&lt;div style='padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: "Courier New", courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);' id="codeSnippet"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum1"&gt;   1:&lt;/span&gt; ObservableCollection&amp;lt;ITaskDescriptor&amp;gt; Gantt_OnRequestData(&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt; sender, V2TEK.Silverlight.Charts.TreeGridHelper.RequestDataArgs args)&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; GetSimWCFData();&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum4"&gt;   4:&lt;/span&gt; }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum5"&gt;   5:&lt;/span&gt;  &lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; ObservableCollection&amp;lt;ITaskDescriptor&amp;gt; GetSimWCFData()&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum7"&gt;   7:&lt;/span&gt; {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; ObservableCollection&amp;lt;ITaskDescriptor&amp;gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum9"&gt;   9:&lt;/span&gt;     {&lt;!--CRLF--&gt;&lt;br/&gt;&lt;p&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum10"&gt;  10:&lt;/span&gt;         &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleTaskDescriptor{ TaskName=&lt;span style="color: rgb(0, 96, 128);"&gt;"--------Sub Task 1"&lt;/span&gt;, StartDate= DateTime.Now.AddMonths(4), EndDate=DateTime.Now.AddMonths(5), PercentComplete=25f,&lt;/p&gt;&lt;br/&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;br/&gt;&lt;p&gt; TimeBaseLine=&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleTimeImpl{ StartDate=DateTime.Now.AddMonths(1), EndDate=DateTime.Now.AddMonths(10)} },&lt;/p&gt;&lt;br/&gt;&lt;/blockquote&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum11"&gt;  11:&lt;/span&gt;         &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleTaskDescriptor{ TaskName=&lt;span style="color: rgb(0, 96, 128);"&gt;"--------Sub Task 2"&lt;/span&gt;, StartDate= DateTime.Now.AddMonths(2), EndDate=DateTime.Now.AddMonths(3), PercentComplete=50f },&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum12"&gt;  12:&lt;/span&gt;         &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleTaskDescriptor{ TaskName=&lt;span style="color: rgb(0, 96, 128);"&gt;"--------Sub Task 3"&lt;/span&gt;, StartDate= DateTime.Now.AddMonths(3), EndDate=DateTime.Now.AddMonths(5), PercentComplete=75f },&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum13"&gt;  13:&lt;/span&gt;         &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleTaskDescriptor{ TaskName=&lt;span style="color: rgb(0, 96, 128);"&gt;"--------Sub Task 4"&lt;/span&gt;, StartDate= DateTime.Now.AddMonths(5), EndDate=DateTime.Now.AddMonths(10),  PercentComplete=100f }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum14"&gt;  14:&lt;/span&gt;     };&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum15"&gt;  15:&lt;/span&gt; }&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;2.2. 导航&lt;p&gt;导航指从指定任务的开始时间，或指定时间开始绘制甘特图，免于使用滚动条搜寻。&lt;p&gt;1) 导航到指定任务&lt;p&gt;NavigateTo(ITaskDescriptor task)&lt;p&gt;2) 导航到选中任务&lt;p&gt;NavigateToSeleteItem()&lt;p&gt;3) 导航到当前时间&lt;p&gt;NavigateToCurrentDate()&lt;p&gt;4) 导航到指定时间&lt;p&gt;NavigateToDate(DateTime date)&lt;p&gt;2.3. 放大/缩小&lt;p&gt;根据TimeLine中定义的时间轴分级缩放机制逐级放大或缩小，提供了三个接口:&lt;p&gt;1) ZoomOut()&lt;p&gt;放大到下一级&lt;p&gt;2) ZoomIn()&lt;p&gt;缩小至上一级&lt;p&gt;3) ZoomToIndex(int index)&lt;p&gt;缩放至指定级别， Index即Dictionary&amp;lt;IDateTimeDescriptor, int&amp;gt;的索引。&lt;p&gt;此外，Gantt允许设置TimeLineSummaryDescriptors和TimeLineDetailDescriptors属性值。&lt;p&gt;1) TimeLineSummaryDescriptors是上层时间轴的缩放分级定义。&lt;p&gt;2) TimeLineDetailDescriptors是下层时间轴的缩放分级定义。&lt;p&gt;2.4. 布局&lt;p&gt;除了通过以上接口更新Gantt的布局外，还可以通过下面的接口实现更为细致的布局更新。&lt;p&gt;Gantt提供了诸如XPosition，YPosition，GanttViewPortHeight，GanttViewPortWidth等布局的设定接口。在修改了这些布局属性值后，须调用Update方法。当然，也可以分别调用GanttPanel.Update(), TreeGrid.Update, TimeLine.Update, 前提是开发者能够确定需要更新那个子控件的布局。 &lt;/p&gt;&lt;div&gt;&lt;object style="width: 1000px; height: 600px;" data="data:application/x-oleobject;base64,QfXq3+HzJEysrJnDBxUISgAJAADzWgAAAz4AAAAAAAAAAAAAAAAAAAAAAABgAAAAaAB0AHQAcAA6AC8ALwBmAGkAbABlAHMALgBjAG4AYgBsAG8AZwBzAC4AYwBvAG0ALwBoAGEAbgBhAGkAbQBpAG4ALwBHAGEAbgB0AHQAVgBpAGUAdwAuAHgAYQBwAAAAPAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAGAAAADUALgAwAC4ANgAxADEAMQA4AC4AMAAAAAoAAAB0AHIAdQBlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" type="application/x-silverlight-2"&gt;&lt;param value="http://files.cnblogs.com/hanaimin/GanttView.xap" name="source"/&gt;&lt;param value="true" name="windowless"/&gt;&lt;param value="5.0.61118.0" name="minRuntimeVersion"/&gt;&lt;param value="true" name="autoUpgrade"/&gt;&lt;p&gt;You need to install Microsoft Silverlight to view this content. &lt;a style="text-decoration: none;" href="http://go.microsoft.com/fwlink/?LinkID=149156&amp;amp;v=5.0.61118.0"&gt;Get Silverlight!&lt;br /&gt;&lt;img style="" alt="Get Microsoft Silverlight" src="http://go.microsoft.com/fwlink/?LinkID=108181" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/object&gt;&lt;iframe style="border-width: 0px; width: 0px; height: 0px; visibility: hidden;"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/hanaimin/aggbug/2331163.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hanaimin/archive/2012/01/29/2331163.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hanaimin/archive/2012/01/29/2331156.html</id><title type="text">Silverlight甘特图：四、树形DataGrid开发原理</title><summary type="text">1. 语法 1.1. XAML 2. 备注 当前版本的TreeGrid仅可以使用甘特图控件指定数据源格式。如需支持其他类型数据源，需要重新实现AbstractExpander和AbstractTreeGridLayout。 2.1. 定义Expander样式 通过自定义AbstractExpander的集成类，并设置TreeGrid.ExpanderProvider，可实现Expander的自定义，从而更换逻辑或样式。 自定义类的实现可参考默认提供的Expander类：SimpleTaskExpander TreeGrid是扩展Silverlight自身提供的DataGrid实现的，关键是自.</summary><published>2012-01-29T06:47:00Z</published><updated>2012-01-29T06:47:00Z</updated><author><name>aimin</name><uri>http://www.cnblogs.com/hanaimin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hanaimin/archive/2012/01/29/2331156.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hanaimin/archive/2012/01/29/2331156.html"/><content type="html">&lt;p&gt;1. 语法 &lt;p&gt;1.1. XAML &lt;p&gt;2. 备注 &lt;p&gt;当前版本的TreeGrid仅可以使用甘特图控件指定数据源格式。如需支持其他类型数据源，需要重新实现AbstractExpander和AbstractTreeGridLayout。 &lt;p&gt;2.1. 定义Expander样式 &lt;p&gt;通过自定义AbstractExpander的集成类，并设置TreeGrid.ExpanderProvider，可实现Expander的自定义，从而更换逻辑或样式。 &lt;p&gt;自定义类的实现可参考默认提供的Expander类：SimpleTaskExpander &lt;p&gt;&amp;nbsp; &lt;p&gt;TreeGrid是扩展Silverlight自身提供的DataGrid实现的，关键是自定义了新的Column类型，此Column在每一行的单元格中添加了一个按钮控件，根据任务的层级缩进，并在用户单击时，发起一个&amp;#8220;展开/折叠&amp;#8221;事件，事件EventArgs中包含行所对应的任务Item数据。 &lt;p&gt;代码如下：&lt;/p&gt; &lt;div style='margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: "Courier New", courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: rgb(244, 244, 244);' id="codeSnippetWrapper"&gt; &lt;div style='padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: "Courier New", courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);' id="codeSnippet"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;namespace&lt;/span&gt; V2TEK.Silverlight.Charts.TreeGridHelper&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: rgb(0, 128, 0);"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color: rgb(0, 128, 0);"&gt;/// 包含一个默认的Expander，继承自AbstractExpander。&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum5"&gt;   5:&lt;/span&gt;     &lt;span style="color: rgb(0, 128, 0);"&gt;/// 如有必要，可以通过继承AbstractExpander，复写Expander，并设置ExpanderProvider。&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum6"&gt;   6:&lt;/span&gt;     &lt;span style="color: rgb(0, 128, 0);"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum7"&gt;   7:&lt;/span&gt;     &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt; TreeGridExpanderColumn : DataGridTextColumn&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum8"&gt;   8:&lt;/span&gt;     {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum9"&gt;   9:&lt;/span&gt;         &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; TreeGridExpanderColumn()&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum10"&gt;  10:&lt;/span&gt;         {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum11"&gt;  11:&lt;/span&gt;         }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum12"&gt;  12:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum13"&gt;  13:&lt;/span&gt;         &lt;span style="color: rgb(0, 0, 255);"&gt;private&lt;/span&gt; AbstractExpander CreateExpander()&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum14"&gt;  14:&lt;/span&gt;         {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum15"&gt;  15:&lt;/span&gt;             &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; Activator.CreateInstance(ExpanderProvider) &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; AbstractExpander;        &lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum16"&gt;  16:&lt;/span&gt;         }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum17"&gt;  17:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum18"&gt;  18:&lt;/span&gt;         &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; Type ExpanderProvider&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum19"&gt;  19:&lt;/span&gt;         {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum20"&gt;  20:&lt;/span&gt;             get;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum21"&gt;  21:&lt;/span&gt;             set;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum22"&gt;  22:&lt;/span&gt;         }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum23"&gt;  23:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum24"&gt;  24:&lt;/span&gt;         &lt;span style="color: rgb(0, 0, 255);"&gt;protected&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;override&lt;/span&gt; FrameworkElement GenerateEditingElement(DataGridCell cell, &lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt; dataItem)&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum25"&gt;  25:&lt;/span&gt;         {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum26"&gt;  26:&lt;/span&gt;             StackPanel panel = GeneratePanel(dataItem);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum27"&gt;  27:&lt;/span&gt;             panel.Children.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;base&lt;/span&gt;.GenerateEditingElement(cell, dataItem));&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum28"&gt;  28:&lt;/span&gt;             &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; panel;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum29"&gt;  29:&lt;/span&gt;         }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum30"&gt;  30:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum31"&gt;  31:&lt;/span&gt;         &lt;span style="color: rgb(0, 0, 255);"&gt;protected&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;override&lt;/span&gt; FrameworkElement GenerateElement(DataGridCell cell, &lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt; dataItem)&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum32"&gt;  32:&lt;/span&gt;         {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum33"&gt;  33:&lt;/span&gt;             StackPanel panel = GeneratePanel(dataItem);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum34"&gt;  34:&lt;/span&gt;             panel.Children.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;base&lt;/span&gt;.GenerateElement(cell, dataItem));&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum35"&gt;  35:&lt;/span&gt;             &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; panel;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum36"&gt;  36:&lt;/span&gt;         }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum37"&gt;  37:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum38"&gt;  38:&lt;/span&gt;         &lt;span style="color: rgb(0, 0, 255);"&gt;protected&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;override&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt; PrepareCellForEdit(FrameworkElement editingElement, RoutedEventArgs editingEventArgs)&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum39"&gt;  39:&lt;/span&gt;         {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum40"&gt;  40:&lt;/span&gt;             TextBox ee = editingElement &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; TextBox;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum41"&gt;  41:&lt;/span&gt;             &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (ee == &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;)&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum42"&gt;  42:&lt;/span&gt;             {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum43"&gt;  43:&lt;/span&gt;                 &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;.Empty;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum44"&gt;  44:&lt;/span&gt;             }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum45"&gt;  45:&lt;/span&gt;             &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; text = ee.Text;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum46"&gt;  46:&lt;/span&gt;             &lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt; length = text.Length;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum47"&gt;  47:&lt;/span&gt;             KeyEventArgs args = editingEventArgs &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; KeyEventArgs;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum48"&gt;  48:&lt;/span&gt;             &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; ((args != &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;) &amp;amp;&amp;amp; (args.Key == Key.F2))&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum49"&gt;  49:&lt;/span&gt;             {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum50"&gt;  50:&lt;/span&gt;                 ee.Select(length, length);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum51"&gt;  51:&lt;/span&gt;                 &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; text;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum52"&gt;  52:&lt;/span&gt;             }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum53"&gt;  53:&lt;/span&gt;             ee.Select(0, length);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum54"&gt;  54:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum55"&gt;  55:&lt;/span&gt;             &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;base&lt;/span&gt;.PrepareCellForEdit(editingElement, editingEventArgs);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum56"&gt;  56:&lt;/span&gt;         }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum57"&gt;  57:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum58"&gt;  58:&lt;/span&gt;         &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; AbstractExpander GetExpander(DataGridRow row)&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum59"&gt;  59:&lt;/span&gt;         {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum60"&gt;  60:&lt;/span&gt;             StackPanel panel = (StackPanel)&lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.GetCellContent(row);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum61"&gt;  61:&lt;/span&gt;             AbstractExpander expander = panel.Children[0] &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; AbstractExpander;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum62"&gt;  62:&lt;/span&gt;             expander.Data = row.DataContext;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum63"&gt;  63:&lt;/span&gt;             &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; expander;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum64"&gt;  64:&lt;/span&gt;         }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum65"&gt;  65:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum66"&gt;  66:&lt;/span&gt;         &lt;span style="color: rgb(0, 0, 255);"&gt;private&lt;/span&gt; StackPanel GeneratePanel(&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt; dataItem)&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum67"&gt;  67:&lt;/span&gt;         {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum68"&gt;  68:&lt;/span&gt;             StackPanel panel = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; StackPanel();&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum69"&gt;  69:&lt;/span&gt;             panel.Orientation = Orientation.Horizontal;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum70"&gt;  70:&lt;/span&gt;             panel.Children.Add(GenerateExpander(dataItem));&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum71"&gt;  71:&lt;/span&gt;             &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; panel;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum72"&gt;  72:&lt;/span&gt;         }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum73"&gt;  73:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum74"&gt;  74:&lt;/span&gt;         &lt;span style="color: rgb(0, 0, 255);"&gt;private&lt;/span&gt; AbstractExpander GenerateExpander(&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt; dataItem)&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum75"&gt;  75:&lt;/span&gt;         {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum76"&gt;  76:&lt;/span&gt;             AbstractExpander expander = CreateExpander();&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum77"&gt;  77:&lt;/span&gt;             expander.Data = dataItem;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum78"&gt;  78:&lt;/span&gt;             expander.PropertyChanged += &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; System.ComponentModel.PropertyChangedEventHandler(expander_PropertyChanged);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum79"&gt;  79:&lt;/span&gt;             &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; expander;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum80"&gt;  80:&lt;/span&gt;         }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum81"&gt;  81:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum82"&gt;  82:&lt;/span&gt;         &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; expander_PropertyChanged(&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt; sender, System.ComponentModel.PropertyChangedEventArgs e)&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum83"&gt;  83:&lt;/span&gt;         {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum84"&gt;  84:&lt;/span&gt;             &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (e.PropertyName == AbstractExpander.DATA_PROPERTY)&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum85"&gt;  85:&lt;/span&gt;                 (sender &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; AbstractExpander).Update();&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum86"&gt;  86:&lt;/span&gt;         }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum87"&gt;  87:&lt;/span&gt;     }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum88"&gt;  88:&lt;/span&gt; }&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;  &lt;img src="http://www.cnblogs.com/hanaimin/aggbug/2331156.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hanaimin/archive/2012/01/29/2331156.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hanaimin/archive/2012/01/29/2331152.html</id><title type="text">Silverlight甘特图：三、甘特图面板开发原理</title><summary type="text">1. 语法 1.1. XAML 2. 备注 2.1. 布局计算 GanttPanel与TimeLine的计算方法类似，仅计算ViewPort范围内需要绘制的任务项，但是多了一个参数YPosition。YPostion是纵向坐标上的位置。 纵向坐标轴：当前已展开的所有任务项中最顶端的YPosition=0，依次递增数为1。 GanttPanel.TaskEntryLayout.Rows属性枚举了所有展开的任务项，而GanttPanel.TaskEntryLayout.Items仅仅枚举了当前需要绘制的任务项。 同时GanttPanel.TaskEntryLayout布局计算，允许每行Row中有多</summary><published>2012-01-29T06:42:00Z</published><updated>2012-01-29T06:42:00Z</updated><author><name>aimin</name><uri>http://www.cnblogs.com/hanaimin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hanaimin/archive/2012/01/29/2331152.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hanaimin/archive/2012/01/29/2331152.html"/><content type="html">&lt;p&gt;1. 语法 &lt;p&gt;1.1. XAML &lt;p&gt;2. 备注 &lt;p&gt;2.1. 布局计算 &lt;p&gt;GanttPanel与TimeLine的计算方法类似，仅计算ViewPort范围内需要绘制的任务项，但是多了一个参数YPosition。YPostion是纵向坐标上的位置。 &lt;p&gt;纵向坐标轴：当前已展开的所有任务项中最顶端的YPosition=0，依次递增数为1。 &lt;p&gt;GanttPanel.TaskEntryLayout.Rows属性枚举了所有展开的任务项，而GanttPanel.TaskEntryLayout.Items仅仅枚举了当前需要绘制的任务项。 &lt;p&gt;同时GanttPanel.TaskEntryLayout布局计算，允许每行Row中有多个Items。这种情况一般应用在资源任务图表上，即查看每个资源所参加或负责的任务项。要实现资源任务图表，必须继承继承自AbstractTaskEntryLayout类，可参考SimpleTaskEntryLayout的实现，重新构造AbstractTaskEntryLayout.Rows成员项。同时，必须制定GanttPanel. TaskEntryLayoutProvider的值为自定义的Layout实现类。 &lt;p&gt;2.2. 渲染 &lt;p&gt;GanttPanel允许自定义渲染甘特图横向条目，要求实现ITaskEntryRenderer接口或继承自AbstractTaskEntryRenderer。在3.2.3 Walkthrough，将会给出一个通过这种方法创建关键路径显示的方式。 &lt;p&gt;3. 示例&lt;/p&gt; &lt;img src="http://www.cnblogs.com/hanaimin/aggbug/2331152.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hanaimin/archive/2012/01/29/2331152.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hanaimin/archive/2012/01/20/2327984.html</id><title type="text">Silverlight甘特图：二、时间线开发原理</title><summary type="text">1. 语法 1.1. XAML 2. 备注 2.1. 布局计算 TimeLine作为时间轴(横向坐标)，其精度为毫秒。原点为StartDate，相对于原点的位置为某一时间点减去开始时间所得时间的毫秒数，即XPosition。 TimeLine布局计算继承自ILayout接口，主要依赖于XPosition，ViewPortWidth，ViewPortHeight属性。 出于性能考虑，TimeLine仅仅计算出当前ViewPortWidth和ViewPortHeight范围内的所需的单元格(表示时间段的方格)。 2.2. 渲染 TimeLine允许自定义Renderer的风格，自定义的Render</summary><published>2012-01-20T08:15:00Z</published><updated>2012-01-20T08:15:00Z</updated><author><name>aimin</name><uri>http://www.cnblogs.com/hanaimin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hanaimin/archive/2012/01/20/2327984.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hanaimin/archive/2012/01/20/2327984.html"/><content type="html">&lt;p&gt;1. 语法 &lt;p&gt;1.1. XAML &lt;p&gt;2. 备注 &lt;p&gt;2.1. 布局计算 &lt;p&gt;TimeLine作为时间轴(横向坐标)，其精度为毫秒。原点为StartDate，相对于原点的位置为某一时间点减去开始时间所得时间的毫秒数，即XPosition。 &lt;p&gt;TimeLine布局计算继承自ILayout接口，主要依赖于XPosition，ViewPortWidth，ViewPortHeight属性。 &lt;p&gt;出于性能考虑，TimeLine仅仅计算出当前ViewPortWidth和ViewPortHeight范围内的所需的单元格(表示时间段的方格)。 &lt;p&gt;2.2. 渲染 &lt;p&gt;TimeLine允许自定义Renderer的风格，自定义的Renderer类必须继承自ITimeLineEntryRenderer接口。可参考SimpleTimeLineEntryRenderer的实现。并指定TimeLine.ItemRendererProvider的值为自定义的Renderer类。 &lt;p&gt;2.3. 放大/缩小 &lt;p&gt;时间轴控件允许自定义放大缩小的层级，从而变换&amp;#8220;年/季度&amp;#8221;，&amp;#8220;年/月&amp;#8221;，&amp;#8220;月/日&amp;#8221;等不同样式。 &lt;p&gt;设定放大缩小层级，必须了解Dictionary&amp;lt;IDateTimeDescriptor, int&amp;gt;和最小MinDateTimeRangeWidth 的定义。 &lt;p&gt;1) Dictionary&amp;lt;IDateTimeDescriptor, int&amp;gt; &lt;p&gt;IDateTimeDescriptor表示TimeLine上同一时间轴上每个方块显示的时间范围，即一个单元时间范围，如下面的代码表示2季度：&lt;/p&gt; &lt;div style='margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: "Courier New", courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: rgb(244, 244, 244);' id="codeSnippetWrapper"&gt; &lt;div style='padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: "Courier New", courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);' id="codeSnippet"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum1"&gt;   1:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(2, DateTimeType.Quarter)&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Dictionary包含N个IDateTimeDescriptor，依次排列。即排列中枚举了N级单元时间范围。&lt;p&gt;2) MinDateTimeRangeWidth&lt;p&gt;MinDateTimeRangeWidth 表示绘制IDateTimeDescriptor时间范围的最小长度。如MinDateTimeRangeWidth = 80d; 则表示80像素表示2个季度时间的长度。&lt;p&gt;3) 放大原理&lt;p&gt;举一个简单的例子，设定如下：&lt;/p&gt;&lt;div style='margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: "Courier New", courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: rgb(244, 244, 244);' id="codeSnippetWrapper"&gt;&lt;div style='padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: "Courier New", courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);' id="codeSnippet"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum1"&gt;   1:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum2"&gt;   2:&lt;/span&gt; ITaskDescriptor t = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleTaskDescriptor{StartDate=2010/1/1, &lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum3"&gt;   3:&lt;/span&gt; EndDate=2010/4/1}&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum4"&gt;   4:&lt;/span&gt; MinDateTimeRangeWidth = 80d&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(1, DateTimeType.Quarter)&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(1, DateTimeType.Year)&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;上面定义时间开始与2010年1月1日，跨度为1个季度的任务，并定义了两级单元时间范围，此外，还定义单元时间范围在屏幕上绘制的长度下限为80像素。&lt;p&gt;当甘特图此任务条以&amp;gt;=80像素显示时，TimeLine上单元格显示为&amp;#8221;X季度&amp;#8221;。当任务以&amp;lt;80像素显示时，时间轴上单元格显示为&amp;#8221;XX年&amp;#8221;。&lt;p&gt;此外，还需注意Dictionary&amp;lt;IDateTimeDescriptor, int&amp;gt;类型中标红的int类型，此类型参数表示&amp;#8221;跳针&amp;#8221;，用于TimeLine的多层时间轴，譬如下图表示两层时间轴：&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201201/201201201614388173.jpg"&gt;&lt;img style="border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="timeline1" border="0" alt="timeline1" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201201/201201201614406612.jpg" width="244" height="33" /&gt;&lt;/a&gt;&lt;p&gt;显然，每一层时间轴有不同的缩放机制，而每一种放大机制都对应了一个Dictionary&amp;lt;IDateTimeDescriptor, int&amp;gt;类型的实例。从而形成&amp;#8221;年/季度&amp;#8221;，&amp;#8220;年/月&amp;#8221;等结构。&lt;p&gt;通过下面的例子，说明如何&amp;#8221;跳针&amp;#8221;， DefaultDateTimeRangeDescriptor是下层时间轴的缩放机制，DefaultDateTimeRangeDescriptor2是上层时间轴的缩放机制，上层时间轴使用了跳针:&lt;/p&gt;&lt;div style='margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: "Courier New", courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: rgb(244, 244, 244);' id="codeSnippetWrapper"&gt;&lt;div style='padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: "Courier New", courier, monospace; font-size: 8pt; direction: ltr; background-color: rgb(244, 244, 244);' id="codeSnippet"&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; Dictionary&amp;lt;IDateTimeDescriptor, &lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt;&amp;gt; DefaultDateTimeRangeDescriptor&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum2"&gt;   2:&lt;/span&gt;         {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum3"&gt;   3:&lt;/span&gt;             get&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum4"&gt;   4:&lt;/span&gt;             {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum5"&gt;   5:&lt;/span&gt;                 &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (_defaultDateTimeRangeDescriptor == &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;)&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum6"&gt;   6:&lt;/span&gt;                 {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum7"&gt;   7:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Dictionary&amp;lt;IDateTimeDescriptor, &lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt;&amp;gt;();&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum8"&gt;   8:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(1, DateTimeType.Minute), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum9"&gt;   9:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(5, DateTimeType.Minute), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum10"&gt;  10:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(10, DateTimeType.Minute), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum11"&gt;  11:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(15, DateTimeType.Minute), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum12"&gt;  12:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(30, DateTimeType.Minute), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum13"&gt;  13:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(1, DateTimeType.Hour), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum14"&gt;  14:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(2, DateTimeType.Hour), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum15"&gt;  15:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(6, DateTimeType.Hour), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum16"&gt;  16:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(12, DateTimeType.Hour), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum17"&gt;  17:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(1, DateTimeType.WeekDay), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum18"&gt;  18:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(2, DateTimeType.Day), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum19"&gt;  19:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(4, DateTimeType.Day), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum20"&gt;  20:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(7, DateTimeType.Day), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum21"&gt;  21:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(1, DateTimeType.Month), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum22"&gt;  22:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(1, DateTimeType.Quarter), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum23"&gt;  23:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(2, DateTimeType.Quarter), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum24"&gt;  24:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(1, DateTimeType.Year), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum25"&gt;  25:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(2, DateTimeType.Year), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum26"&gt;  26:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(5, DateTimeType.Year), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum27"&gt;  27:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(10, DateTimeType.Year), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum28"&gt;  28:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(20, DateTimeType.Year), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum29"&gt;  29:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor(50, DateTimeType.Year), 0);&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum30"&gt;  30:&lt;/span&gt;                 }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum31"&gt;  31:&lt;/span&gt;                 &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; _defaultDateTimeRangeDescriptor;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum32"&gt;  32:&lt;/span&gt;             }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum33"&gt;  33:&lt;/span&gt;         }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum34"&gt;  34:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum35"&gt;  35:&lt;/span&gt;         &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; Dictionary&amp;lt;IDateTimeDescriptor, &lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt;&amp;gt; DefaultDateTimeRangeDescriptor2&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum36"&gt;  36:&lt;/span&gt;         {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum37"&gt;  37:&lt;/span&gt;             get&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum38"&gt;  38:&lt;/span&gt;             {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum39"&gt;  39:&lt;/span&gt;                 &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (_defaultDateTimeRangeDescriptor2 == &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;)&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum40"&gt;  40:&lt;/span&gt;                 {&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum41"&gt;  41:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2 = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Dictionary&amp;lt;IDateTimeDescriptor, &lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt;&amp;gt;();&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum42"&gt;  42:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(1, DateTimeType.Minute), 1); &lt;span style="color: rgb(0, 128, 0);"&gt;//-------0&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum43"&gt;  43:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(5, DateTimeType.Minute), 1);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------1&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum44"&gt;  44:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(10, DateTimeType.Minute), 3);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------2&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum45"&gt;  45:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(15, DateTimeType.Minute), 2);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------3&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum46"&gt;  46:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(30, DateTimeType.Minute), 1);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------4&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum47"&gt;  47:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(1, DateTimeType.Hour), 2);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------5&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum48"&gt;  48:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(2, DateTimeType.Hour), 1);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------6&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum49"&gt;  49:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(6, DateTimeType.Hour), 2);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------7&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum50"&gt;  50:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(12, DateTimeType.Hour), 1);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------8&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum51"&gt;  51:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(1, DateTimeType.Day), 3);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------9&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum52"&gt;  52:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(2, DateTimeType.Day), 3);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------10&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum53"&gt;  53:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(4, DateTimeType.Day), 2);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------11&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum54"&gt;  54:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(1, DateTimeType.Week), 1);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------12&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum55"&gt;  55:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(1, DateTimeType.Month), 1);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------14&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum56"&gt;  56:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(1, DateTimeType.Quarter), 2);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------15&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum57"&gt;  57:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(2, DateTimeType.Quarter), 1);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------16&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum58"&gt;  58:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(1, DateTimeType.Year), 1);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------18&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum59"&gt;  59:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(2, DateTimeType.Year), 1);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------19&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum60"&gt;  60:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(5, DateTimeType.Year), 1);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------20&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum61"&gt;  61:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(10, DateTimeType.Year), 1);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------21&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum62"&gt;  62:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(20, DateTimeType.Year), 1);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------22&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum63"&gt;  63:&lt;/span&gt;                     _defaultDateTimeRangeDescriptor2.Add(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SimpleDateTimeDescriptor2(50, DateTimeType.Year), 0);&lt;span style="color: rgb(0, 128, 0);"&gt;//-------22&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum64"&gt;  64:&lt;/span&gt;                 }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum65"&gt;  65:&lt;/span&gt;                 &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; _defaultDateTimeRangeDescriptor2;&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum66"&gt;  66:&lt;/span&gt;             }&lt;!--CRLF--&gt;&lt;span style="color: rgb(96, 96, 96);" id="lnum67"&gt;  67:&lt;/span&gt;         }&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;DeafultDateTimeDescriptor2中第一行Int = 1，意思是，如果当前时间轴上放大至：80像素/1分钟的话，那么直接跳到下一个，用400像素的单元格表示5分钟。  &lt;/p&gt;&lt;img src="http://www.cnblogs.com/hanaimin/aggbug/2327984.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hanaimin/archive/2012/01/20/2327984.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hanaimin/archive/2012/01/19/2327283.html</id><title type="text">Silverlight甘特图：一、甘特图介绍及开发者之系统准备</title><summary type="text">源码还在整理中，最迟在年后1月底2月初发布，项目名称初定为BestGantt，地址：http://bestgantt.codeplex.com/ 该部分包括如下主题： 1) 甘特图控件是什么 2) 客户系统需求 3) 开发系统需求 1.1 什么是甘特图控件 甘特图是计划管理进度分析常用的工具之一。典型的甘特图由两个维度组成：纵向表示任务，横向时间轴表示任务进度。 本文档所表述的甘特图...</summary><published>2012-01-19T07:05:00Z</published><updated>2012-01-19T07:05:00Z</updated><author><name>aimin</name><uri>http://www.cnblogs.com/hanaimin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hanaimin/archive/2012/01/19/2327283.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hanaimin/archive/2012/01/19/2327283.html"/><content type="html">&lt;p&gt;源码还在整理中，最迟在年后1月底2月初发布，项目名称初定为BestGantt，地址：&lt;a href="http://bestgantt.codeplex.com/"&gt;http://bestgantt.codeplex.com/&lt;/a&gt;  &lt;p&gt;&amp;nbsp; &lt;p&gt;该部分包括如下主题：  &lt;p&gt;1) 甘特图控件是什么  &lt;p&gt;2) 客户系统需求  &lt;p&gt;3) 开发系统需求  &lt;p&gt;&lt;strong&gt;&lt;a name="_Toc280003780"&gt;1.1 什么是甘特图控件&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;甘特图是计划管理进度分析常用的工具之一。典型的甘特图由两个维度组成：纵向表示任务，横向时间轴表示任务进度。  &lt;p&gt;本文档所表述的甘特图控件不仅可以展示出典型的甘特图样式，也可以通过二次开发显示为资源任务分配图，关键路径图。  &lt;p&gt;1) 资源任务分配：纵轴表示资源列，横向时间轴表示每个资源所拥有的一个或多个分配任务。  &lt;p&gt;2) 关键路径图：在典型甘特图上，将处于关键路径的任务用特定的颜色显示。  &lt;p&gt;Note: 目前版本的甘特图不支持网络图，即以有向线段表示任务的前置关系。但预留了接口，可以通过二次开发实现，目前部分PDM项目已实现，通过对这些项目代码的重构，后续版本会默认支持网络图，从而减少二次开发的工作量。  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201201/201201191504463423.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="taskview" border="0" alt="taskview" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201201/201201191504484687.jpg" width="640" height="293"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201201/201201191504543187.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="resourceview" border="0" alt="resourceview" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201201/201201191504551660.jpg" width="640" height="296"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;a name="_Toc280003782"&gt;1.2 客户系统配置&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt; &lt;p&gt;IE 6以上版本 或 Firefox 2.0 以上版本  &lt;p&gt;Silverlight 3, 4  &lt;p&gt;&lt;strong&gt;&lt;a name="_Toc280003783"&gt;1.3 开发者系统配置&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;控件最初使用Silverlight 3开发，因此代码支持 Silverlight 3运行时，如有需要请自行编译  &lt;p&gt;开发系统软件配置需求如下  &lt;p&gt;IE 6 Firefox 2.0……… 以上版本  &lt;p&gt;Silverlight 3, 4 for developer  &lt;p&gt;Visual Studio 2008, 2010  &lt;p&gt;Microsoft Expression 3, 4 &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;下一节将介绍甘特图控件及其三个主要的子控件的用法和开发原理，通过组合使用这些控件，可以开发出高效实用的甘特图应用程序。&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;三个子控件分别是：TimeLine, Gantt Panel, Tree Grid。 &lt;p&gt;TimeLine: 时间轴，可以定义不同的缩放层级，包括年/季度，年/月，季度/月，月/日，周/日，日/时，时/分等。 &lt;p&gt;Gantt Panel: 甘特图( 横道图 )显示区域，根据任务的起止时间显示柱状图形。 &lt;p&gt;Tree Grid: 扩展自Silverlight DataGrid，继承了DataGrid大部分特性，并增加了显示层级化数据的能力。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/hanaimin/201201/201201191516471666.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="guid1" border="0" alt="guid1" src="http://images.cnblogs.com/cnblogs_com/hanaimin/201201/201201191516486517.jpg" width="645" height="423"&gt;&lt;/a&gt;&lt;img src="http://www.cnblogs.com/hanaimin/aggbug/2327283.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hanaimin/archive/2012/01/19/2327283.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hanaimin/archive/2011/07/25/2115854.html</id><title type="text">SharePoint Silverlight Workspacer 1.0</title><summary type="text">环境：SharePoint Fundation 2010， Silverlight 4演示地址:workspacer intro and workflow(高质量，速度较慢)workspacer intro and workflow(中等质量，速度较快)YES OA Road Map 1.0Workspacer 1.0 功能单据管理 流程管理 文档共享 即时通讯 邮箱集成 短信集成Workspacer 1.1 功能+离线工作，在线同步Workspacer 1.2 功能+图形化工作流管理 流程流转节点高亮Workspacer 2.0 功能+项目管理集成：甘特图 工时单 周/月计划</summary><published>2011-07-25T01:46:00Z</published><updated>2011-07-25T01:46:00Z</updated><author><name>aimin</name><uri>http://www.cnblogs.com/hanaimin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hanaimin/archive/2011/07/25/2115854.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hanaimin/archive/2011/07/25/2115854.html"/><content type="html">&lt;p&gt;&lt;span style="line-height: 20px; font-family: 宋体, 微软雅黑, 黑体, sans-serif; font-size: 12px" class="Apple-style-span"&gt;&lt;a href="http://www.v2tek.com/flash/workspacer1/demo3.html" target="_blank"&gt;&lt;img style="padding-bottom: 0px; line-height: 20px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" border="0" alt="oa demo" src="http://www.v2tek.com/images/oademo.jpg" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;div id="con_right"&gt;&lt;p&gt;&lt;a href="http://www.v2tek.com/flash/workspacer1/demo3.html" target="_blank"&gt;&lt;img alt="" src="http://www.v2tek.com/images/oademo1.jpg" width="768" height="492" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;环境：SharePoint Fundation 2010， Silverlight 4&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;演示地址:&lt;/p&gt;&lt;p&gt;&lt;a style="padding-bottom: 0px; line-height: 20px; margin: 0px; padding-left: 0px; padding-right: 0px; color: #333333; font-size: 12px; text-decoration: none; padding-top: 0px" href="http://www.v2tek.com/flash/workspacer/workspacer%20intro%20and%20workflow.html" target="_blank"&gt;workspacer intro and workflow&lt;/a&gt;&amp;nbsp;(高质量，速度较慢)&lt;/p&gt;&lt;p&gt;&lt;a style="padding-bottom: 0px; line-height: 20px; margin: 0px; padding-left: 0px; padding-right: 0px; color: #333333; font-size: 12px; text-decoration: none; padding-top: 0px" href="http://www.v2tek.com/flash/workspacer1/demo3.html" target="_blank"&gt;workspacer intro and workflow&lt;/a&gt;&amp;nbsp;(中等质量，速度较快)&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h1 style="padding-bottom: 0px; line-height: 20px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体, 微软雅黑, 黑体, sans-serif; font-size: 12px; padding-top: 0px"&gt;YES OA Road Map 1.0&lt;/strong&gt;&lt;/p&gt;&lt;span style="line-height: 20px; font-family: 宋体, 微软雅黑, 黑体, sans-serif; font-size: 12px" class="Apple-style-span"&gt;&lt;img style="padding-bottom: 0px; line-height: 20px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" alt="" src="http://www.v2tek.com/images/oaroadmap.jpg" /&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Workspacer 1.0 功能&lt;/p&gt;&lt;p class="auto-style1"&gt;单据管理 流程管理 文档共享 即时通讯 邮箱集成 短信集成&lt;/p&gt;&lt;p&gt;Workspacer 1.1 功能&lt;/p&gt;&lt;p class="auto-style1"&gt;+离线工作，在线同步&lt;/p&gt;&lt;p&gt;Workspacer 1.2 功能&lt;/p&gt;&lt;p class="auto-style1"&gt;+图形化工作流管理&amp;nbsp; 流程流转节点高亮&lt;/p&gt;&lt;p&gt;Workspacer 2.0 功能&lt;/p&gt;&lt;p class="auto-style1"&gt;+项目管理集成：甘特图 工时单 周/月计划&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hanaimin/aggbug/2115854.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hanaimin/archive/2011/07/25/2115854.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hanaimin/archive/2010/06/23/1763278.html</id><title type="text">Silverlight Gantt Chart 改进计划</title><summary type="text">二次开发的代码很简单：Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gt;1Gantt.StartDate=DateTime.Now;2Gantt.EndDate=DateTime.Now.AddMonths(20);3Gantt.ContentWidth=1800d;4Gantt.XPosition=0;5Gantt.DataSource=GetTasks();6Gantt.OnRequestData+=newRequestDataEventH</summary><published>2010-06-23T01:50:00Z</published><updated>2010-06-23T01:50:00Z</updated><author><name>aimin</name><uri>http://www.cnblogs.com/hanaimin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hanaimin/archive/2010/06/23/1763278.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hanaimin/archive/2010/06/23/1763278.html"/><content type="html">&lt;p&gt;二次开发的代码很简单：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Gantt.StartDate&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;DateTime.Now;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Gantt.EndDate&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;DateTime.Now.AddMonths(&lt;/span&gt;&lt;span style="color: #800080"&gt;20&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Gantt.ContentWidth&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;1800d;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Gantt.XPosition&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Gantt.DataSource&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;GetTasks();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Gantt.OnRequestData&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;RequestDataEventHandler(Gantt_OnRequestData);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;不定义ViewPort属性值的情况下，是自适应浏览器窗口。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div id="silverlightControlHost"&gt;&lt;object style="width: 100%; height: 600px" data="data:application/x-oleobject;base64,QfXq3+HzJEysrJnDBxUISgAJAABikAAAAz4AAAAAAAAAAAAAAAAAAAAAAABWAAAAaAB0AHQAcAA6AC8ALwBmAGkAbABlAHMALgBjAG4AYgBsAG8AZwBzAC4AYwBvAG0ALwBnAGgAbgBlAHIALwBHAGEAbgB0AHQANgA4AC4AeABhAHAAAAA8AAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAYAAAANAAuADAALgA1ADAANAAwADEALgAwAAAACgAAAHQAcgB1AGUAAAAAAAAAAAAAAAAAAAA=" type="application/x-silverlight-2"&gt;&lt;param name="source" value="http://files.cnblogs.com/ghner/Gantt68.xap"  /&gt;&lt;param name="windowless" value="true"  /&gt;&lt;param name="minRuntimeVersion" value="4.0.50401.0"  /&gt;&lt;param name="autoUpgrade" value="true"  /&gt;&lt;p&gt;You need to install Microsoft Silverlight to view this content. &lt;a href="http://go.microsoft.com/fwlink/?LinkID=149156&amp;amp;v=4.0.50401.0" style="text-decoration:none;" target="_blank"&gt;Get Silverlight!&lt;br /&gt;&lt;img src="http://go.microsoft.com/fwlink/?LinkID=108181" alt="Get Microsoft Silverlight" style="border-style:none;"  /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/object&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/hanaimin/aggbug/1763278.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hanaimin/archive/2010/06/23/1763278.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hanaimin/archive/2010/06/10/1755408.html</id><title type="text">为业务建模——MOSS的优势与劣势</title><summary type="text">在许多与业务紧密相关的ＩＴ项目中，进行as - is 和 to-be分析后，可以在业务层次的对象建模。在传统的开发模式中，最终会映射为关系数据库的数据表关系表和抽象的逻辑层；而在基于类似SharePoint这种对象型数据库，实施的项目时，由于它已经在关系型数据库中进行了进一步的基于对象的架构，所以我们只需要进行简单的转化和抽象，就可以直接对业务层次的对象进行系统建模。</summary><published>2010-06-10T05:17:00Z</published><updated>2010-06-10T05:17:00Z</updated><author><name>aimin</name><uri>http://www.cnblogs.com/hanaimin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hanaimin/archive/2010/06/10/1755408.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hanaimin/archive/2010/06/10/1755408.html"/><content type="html">&lt;p&gt;虽然2010已经发布了，但是在没有SP *之前，还是不打算正是应用到项目中。相信任何一个明智的项目技术决策人员会同意这个说法。&amp;nbsp;&lt;/p&gt;&lt;p&gt;所以打算使用SharePoint的项目而言，WSS 3.0 或 MOSS 对于在运行和将要实施的项目，应该还是首倡之选。&lt;/p&gt;&lt;p&gt;虽然较SPS 2003有很大的改进，但WSS3、MOSS依然被许多技术人员视为Portal和OA的选项。对于更加复杂的ERP、PDM/PLM，总显得有些力不从心。ERP 我不是很熟悉，就PDM或PLM，宏观而言，复杂的产品结构、交错的关联关系、庞大的数据容量都给基于SharePoint的项目实施带来了很大困扰；从细节而言，譬如：缺少事务机制、无法建立结构基线版本、WSS3中虽然有Document Library, 但是它却没有文档的概念，只有文件的概念 (在PDM中，版本控制主要是针对文档而言的，文档在产品生命周期不同阶段有不同的含义，它最终会产生一个或多个实体文件。)&lt;/p&gt;&lt;p&gt;下图只是一个现实业务模型的冰山一角：&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/ghner/model.jpg" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;但SharePoint还是一个非常不错的平台 (WSS MOSS SP2+1个Hotfix后，还是相当稳定的)&lt;/p&gt;&lt;p&gt;开放性&lt;/p&gt;&lt;p&gt;SharePoint是开放的，Web Service、BDC、XML/XSLT；众多公开、易于理解的接口；EventHandler (其实只是被动的事件处理，自定义事件无法享受EventRceiverManager可注册、事件队列等优秀的EventBus机制), 使用Feature包装技术点，使之功能化，并部署至服务器场；ASP.NET、WCF、AJAX的直接支持；MasterPage对页面布局的灵活控制；对Office的天然整合自然不用多说。总而言之，只要你愿意，可以在充分利用其优势的情况下，将它改的&amp;#8220;面目全非&amp;#8221;，当然对它的改动必须是在充分理解了SharePoint庞大规则的基础之上。在SharePoint实施过程中，常常听到重写某某控件，重写某某页面的决策，这些决定太过轻率，并会导致不可测的后果。&lt;/p&gt;&lt;p&gt;可建模(标准化)&lt;/p&gt;&lt;p&gt;SharePoint提供了ContentType作为主要的建模机制，ContentType可定义：栏位(属性)、事件处理、新建编辑查看表单、绑定工作流等。 如果涉及多个项目，可以将模型应用到所有项目，实现项目管理、设计管理、生产管理的标准化。ContentType的可继承性也确保了个项目模型定制的个性化能力。但是由于Lookup字段类型能力比较弱，无法在建立模型时确定各业务对象类型之间的关系。而这个缺失的能力可以通过扩展开发来实现，在后面的章节会详细解释。&lt;/p&gt;&lt;p&gt;可定制&lt;/p&gt;&lt;p&gt;SharePoint提供的组件都是可以定制或定制开发的。举两个常见的例子：SharePoint中典型的两个WebPart，ListViewWebPart和ListFormWebPart。&lt;/p&gt;&lt;p&gt;ListViewWebPart: 许多开发人员一看是sealed，就认为难以扩展，难以实现想要的效果，其实不然，因为ListViewWebPart只是一个空壳，数据-HTML的转化实际上是靠VIEW CAML完成的，在SharePoint 2010版本中，则提供了更通用的标准语言XSLT来替代这个转化规则。在SharePoint 2007中，我们可以通过定义CAML实现我们想要的HTML效果，也可以注册Custom Action来添加操作，同样可以定义新的ToolBar，包括New菜单等等。这些都是在保留了ListViewWebPart本身能力基础之上的扩展。&lt;/p&gt;&lt;p&gt;ListFormWebPart: 这个就更加不用多说了，除了Custom Action之外，可以通过开发或定制ASCX用户空间，置入12 templates controltemplate下，实现自定义的风格。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;在对WSS3, MOSS的优劣势进行简单分析后，我们回归主题&amp;#8212;&amp;#8212;为业务建模&lt;/p&gt;&lt;p&gt;在许多与传统业务紧密相关的IT项目中，进行as - is 和 to-be分析后，可以进行业务层次的对象建模。在传统的开发模式中，最终会映射为关系数据库的数据表关系表和抽象的逻辑层；而在基于类似SharePoint这种对象型数据库，实施的项目时，由于它已经在关系型数据库中进行了进一步的基于对象的架构，所以只需要进行简单的转化和抽象，就可以直接对业务层次的对象进行系统建模。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;img src="http://www.cnblogs.com/hanaimin/aggbug/1755408.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hanaimin/archive/2010/06/10/1755408.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
