<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_.NET 學習</title><subtitle type="text">.NET 學習生活感想...万事成蹉跎.....贵在坚持及时整理自己做过和学过的东西</subtitle><id>http://feed.cnblogs.com/blog/u/23336/rss</id><updated>2012-01-09T05:49:07Z</updated><author><name>Tonyyang</name><uri>http://www.cnblogs.com/Tonyyang/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Tonyyang/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/23336/rss"/><entry><id>http://www.cnblogs.com/Tonyyang/archive/2012/01/09/2317008.html</id><title type="text">XAF Delta Replication Module   for Devexpress eXpressApp Framework</title><summary type="text">Delta Replication Module for Devexpress eXpressApp Framework一个实现了异步复制XAF模块为分布式XAF应用程序。http://xafdelta.narod.ru/XafDelta 功能特点:•Provides a system of asynchronous heterogeneous replication for WinForms and ASP.NET XAF applications. Supports domain components.•Allows you to build and load images of the </summary><published>2012-01-09T05:30:00Z</published><updated>2012-01-09T05:30:00Z</updated><author><name>Tonyyang</name><uri>http://www.cnblogs.com/Tonyyang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Tonyyang/archive/2012/01/09/2317008.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Tonyyang/archive/2012/01/09/2317008.html"/><content type="html">&lt;p&gt;&lt;span style="font-family: STFangsong; font-size: 14pt"&gt;Delta Replication Module &amp;nbsp;&amp;nbsp;for Devexpress eXpressApp Framework&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: STFangsong; font-size: 14pt"&gt;一个实现了异步复制XAF模块为分布式XAF应用程序。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: STFangsong; font-size: 14pt"&gt;&lt;a href="http://xafdelta.narod.ru/"&gt;http://xafdelta.narod.ru/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: STFangsong; font-size: 14pt"&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p 25937289115910605="22"  metrikaId_0.&gt;&lt;span style="font-size: 12pt; font-weight: bold" 25937289115910605="23"  metrikaId_0.&gt;XafDelta 功能特点&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;:&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p 25937289115910605="24"  metrikaId_0.&gt;&lt;/p&gt;&#xD;
&lt;div style="text-align: left; padding-bottom: 0px; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" 25937289115910605="25"  metrikaId_0.&gt;&#xD;
&lt;table style="line-height: normal" cellspacing="0" cellpadding="0" 25937289115910605="26"  metrikaId_0.&gt;&#xD;
&lt;tbody 25937289115910605="27"  metrikaId_0.&gt;&#xD;
&lt;tr style="vertical-align: baseline" 25937289115910605="28"  metrikaId_0.&gt;&#xD;
&lt;td style="width: 13px"&gt;&lt;span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #000000; font-size: 10pt"&gt;&amp;#8226;&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td 25937289115910605="29"  metrikaId_0.&gt;Provides a system of asynchronous heterogeneous replication for WinForms and ASP.NET XAF applications. Supports &lt;a  href="http://documentation.devexpress.com/#Xaf/CustomDocument3262" target="_blank" 25937289115910605="46"  metrikaId_0.&gt;domain components&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div style="text-align: left; padding-bottom: 0px; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" 25937289115910605="30"  metrikaId_0.&gt;&#xD;
&lt;table style="line-height: normal" cellspacing="0" cellpadding="0" 25937289115910605="31"  metrikaId_0.&gt;&#xD;
&lt;tbody 25937289115910605="32"  metrikaId_0.&gt;&#xD;
&lt;tr style="vertical-align: baseline" 25937289115910605="33"  metrikaId_0.&gt;&#xD;
&lt;td style="width: 13px" 25937289115910605="68"  metrikaId_0.&gt;&lt;span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #000000; font-size: 10pt" 25937289115910605="69"  metrikaId_0.&gt;&amp;#8226;&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td 25937289115910605="34"  metrikaId_0.&gt;Allows you to build and load images of the database (snapshots) for selected replication nodes.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div style="text-align: left; padding-bottom: 0px; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" 25937289115910605="35"  metrikaId_0.&gt;&#xD;
&lt;table style="line-height: normal" cellspacing="0" cellpadding="0" 25937289115910605="42"  metrikaId_0.&gt;&#xD;
&lt;tbody 25937289115910605="43"  metrikaId_0.&gt;&#xD;
&lt;tr style="vertical-align: baseline" 25937289115910605="44"  metrikaId_0.&gt;&#xD;
&lt;td style="width: 13px" 25937289115910605="47"  metrikaId_0.&gt;&lt;span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #000000; font-size: 10pt" 25937289115910605="48"  metrikaId_0.&gt;&amp;#8226;&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td 25937289115910605="45"  metrikaId_0.&gt;Supports broadcast and targeted package routing&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div style="text-align: left; padding-bottom: 0px; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" 25937289115910605="36"  metrikaId_0.&gt;&#xD;
&lt;table style="line-height: normal" cellspacing="0" cellpadding="0" 25937289115910605="38"  metrikaId_0.&gt;&#xD;
&lt;tbody 25937289115910605="39"  metrikaId_0.&gt;&#xD;
&lt;tr style="vertical-align: baseline" 25937289115910605="40"  metrikaId_0.&gt;&#xD;
&lt;td style="width: 13px"&gt;&lt;span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #000000; font-size: 10pt"&gt;&amp;#8226;&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td 25937289115910605="41"  metrikaId_0.&gt;Provides configuration system for rules of replication and snapshots&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div style="text-align: left; padding-bottom: 0px; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" 25937289115910605="37"  metrikaId_0.&gt;&#xD;
&lt;table style="line-height: normal" cellspacing="0" cellpadding="0" 25937289115910605="49"  metrikaId_0.&gt;&#xD;
&lt;tbody 25937289115910605="50"  metrikaId_0.&gt;&#xD;
&lt;tr style="vertical-align: baseline" 25937289115910605="51"  metrikaId_0.&gt;&#xD;
&lt;td style="width: 13px" 25937289115910605="70"  metrikaId_0.&gt;&lt;span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #000000; font-size: 10pt"&gt;&amp;#8226;&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td 25937289115910605="52"  metrikaId_0.&gt;Has a flexible built-in encryption and packaging service&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div style="text-align: left; padding-bottom: 0px; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" 25937289115910605="53"  metrikaId_0.&gt;&#xD;
&lt;table style="line-height: normal" cellspacing="0" cellpadding="0" 25937289115910605="64"  metrikaId_0.&gt;&#xD;
&lt;tbody 25937289115910605="65"  metrikaId_0.&gt;&#xD;
&lt;tr style="vertical-align: baseline" 25937289115910605="66"  metrikaId_0.&gt;&#xD;
&lt;td style="width: 13px"&gt;&lt;span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #000000; font-size: 10pt"&gt;&amp;#8226;&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td 25937289115910605="67"  metrikaId_0.&gt;Supports package state tickets&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div style="text-align: left; padding-bottom: 0px; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" 25937289115910605="54"  metrikaId_0.&gt;&#xD;
&lt;table style="line-height: normal" cellspacing="0" cellpadding="0" 25937289115910605="60"  metrikaId_0.&gt;&#xD;
&lt;tbody 25937289115910605="61"  metrikaId_0.&gt;&#xD;
&lt;tr style="vertical-align: baseline" 25937289115910605="62"  metrikaId_0.&gt;&#xD;
&lt;td style="width: 13px" 25937289115910605="91"  metrikaId_0.&gt;&lt;span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #000000; font-size: 10pt" 25937289115910605="92"  metrikaId_0.&gt;&amp;#8226;&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td 25937289115910605="63"  metrikaId_0.&gt;Have a built-in replication message storage&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div style="text-align: left; padding-bottom: 0px; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" 25937289115910605="55"  metrikaId_0.&gt;&#xD;
&lt;table style="line-height: normal" cellspacing="0" cellpadding="0" 25937289115910605="56"  metrikaId_0.&gt;&#xD;
&lt;tbody 25937289115910605="57"  metrikaId_0.&gt;&#xD;
&lt;tr style="vertical-align: baseline" 25937289115910605="58"  metrikaId_0.&gt;&#xD;
&lt;td style="width: 13px"&gt;&lt;span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #000000; font-size: 10pt"&gt;&amp;#8226;&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td 25937289115910605="59"  metrikaId_0.&gt;Have a built-in message delivery service. Supports WCF, HTTP, HTTPS, FTP, FILE protocols (*)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div style="text-align: left; padding-bottom: 0px; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" 25937289115910605="71"  metrikaId_0.&gt;&#xD;
&lt;table style="line-height: normal" cellspacing="0" cellpadding="0" 25937289115910605="72"  metrikaId_0.&gt;&#xD;
&lt;tbody 25937289115910605="73"  metrikaId_0.&gt;&#xD;
&lt;tr style="vertical-align: baseline" 25937289115910605="74"  metrikaId_0.&gt;&#xD;
&lt;td style="width: 13px"&gt;&lt;span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #000000; font-size: 10pt"&gt;&amp;#8226;&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td 25937289115910605="75"  metrikaId_0.&gt;The package includes WCF service and ASP.NET web site, which implements an replication message storage (*)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div style="text-align: left; padding-bottom: 0px; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" 25937289115910605="76"  metrikaId_0.&gt;&#xD;
&lt;table style="line-height: normal" cellspacing="0" cellpadding="0" 25937289115910605="77"  metrikaId_0.&gt;&#xD;
&lt;tbody 25937289115910605="78"  metrikaId_0.&gt;&#xD;
&lt;tr style="vertical-align: baseline" 25937289115910605="79"  metrikaId_0.&gt;&#xD;
&lt;td style="width: 13px" 25937289115910605="87"  metrikaId_0.&gt;&lt;span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #000000; font-size: 10pt" 25937289115910605="88"  metrikaId_0.&gt;&amp;#8226;&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td 25937289115910605="80"  metrikaId_0.&gt;The maximum size of replication package - 2 GB&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div style="text-align: left; padding-bottom: 0px; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" 25937289115910605="81"  metrikaId_0.&gt;&#xD;
&lt;table style="line-height: normal" cellspacing="0" cellpadding="0" 25937289115910605="83"  metrikaId_0.&gt;&#xD;
&lt;tbody 25937289115910605="84"  metrikaId_0.&gt;&#xD;
&lt;tr style="vertical-align: baseline" 25937289115910605="85"  metrikaId_0.&gt;&#xD;
&lt;td style="width: 13px" 25937289115910605="89"  metrikaId_0.&gt;&lt;span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #000000; font-size: 10pt" 25937289115910605="93"  metrikaId_0.&gt;&amp;#8226;&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td 25937289115910605="86"  metrikaId_0.&gt;Collaboration with Audit Trail Module does not allowed&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;p 25937289115910605="82"  metrikaId_0.&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Tonyyang/aggbug/2317008.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Tonyyang/archive/2012/01/09/2317008.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Tonyyang/archive/2012/01/04/2311555.html</id><title type="text">BDD 入门</title><summary type="text">使用 SpecFlow 和 WatiN 进行行为驱动开发 Brandon Satrom http://msdn.microsoft.com/zh-cn/magazine/gg490346.aspx下载示例代码 随着自动化单元测试在软件开发中变得越来越普遍，对各种“测试优先”方法的采用也呈现出相同的趋势。 这些实践为开发团队既带来了难得的机遇，也带来了独特的挑战，但所有这些机遇和挑战都是为了帮助从业人员建立“根据设计进行测试”的思路。 但是在“测试优先”时代的大多数时间，用于表达用户行为的方法一直贯穿于使用系统语言（一种与用户的语言不相关的语言）编写的单元测试。 随着行为驱动开发 (BDD) 技</summary><published>2012-01-04T01:12:00Z</published><updated>2012-01-04T01:12:00Z</updated><author><name>Tonyyang</name><uri>http://www.cnblogs.com/Tonyyang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Tonyyang/archive/2012/01/04/2311555.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Tonyyang/archive/2012/01/04/2311555.html"/><content type="html">&lt;table style="width: 100%; table-layout: fixed" border="0" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="width: auto; vertical-align: top" valign="top"&gt;&#xD;
&lt;div style="width: 100%" id="MainContent"&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span id="xn2_123c96eeaafe0422f9448ad4b6bf8309" &gt;使用 SpecFlow 和 WatiN 进行行为驱动开发&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl01" href="http://msdn.microsoft.com/magazine/ee532098.aspx?sdmr=BrandonSatrom&amp;amp;sdmi=authors"&gt;&lt;span id="xn3_cdc25ab3d394a218dbfe74bf66d82bfe" &gt;Brandon Satrom&lt;/span&gt;&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/magazine/gg490346.aspx"&gt;http://msdn.microsoft.com/zh-cn/magazine/gg490346.aspx&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl02" href="http://code.msdn.microsoft.com/mag201012BDD"&gt;&lt;span id="xn4_d1781541b8cdaac5f20c04c68395ce9f" &gt;下载示例代码&lt;/span&gt;&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn5_a10e04174dbd6c1eeffc40ac5c3f99a3" &gt;随着自动化单元测试在软件开发中变得越来越普遍，对各种&amp;#8220;测试优先&amp;#8221;方法的采用也呈现出相同的趋势。&lt;/span&gt; &lt;span id="xn6_c6bf55b0df3020f9aa41a89558f87055" &gt;这些实践为开发团队既带来了难得的机遇，也带来了独特的挑战，但所有这些机遇和挑战都是为了帮助从业人员建立&amp;#8220;根据设计进行测试&amp;#8221;的思路。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn7_95d892836068cf0046cb3921e897dd45" &gt;但是在&amp;#8220;测试优先&amp;#8221;时代的大多数时间，用于表达用户行为的方法一直贯穿于使用系统语言（一种与用户的语言不相关的语言）编写的单元测试。&lt;/span&gt; &lt;span id="xn8_4839d9802de83a79e356098004d9d36d" &gt;随着行为驱动开发 (BDD) 技术的问世，这种情况也随之改变。&lt;/span&gt; &lt;span id="xn9_64b713c2323cccadd68069b6b3bb5936" &gt;利用 BDD 技术，您可使用业务语言来编写自动化测试，同时还可保持与已实现系统的连接。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn10_a9f4700ae8bd9a9ff42df9a570693b49" &gt;当然，现在我们创建了很多工具，可帮助您在开发过程中实现 BDD。&lt;/span&gt; &lt;span id="xn11_f977684c5b23317d600224f95a6f911b" &gt;这些工具包括 Ruby 中的 Cucumber 以及适用于 Microsoft .NET Framework 的 SpecFlow 和 WatiN。&lt;/span&gt; &lt;span id="xn12_653674e5dd5016b2bad3402881259305" &gt;SpecFlow 可帮助您在 Visual Studio 中编写和执行规范，而 WatiN 可用于驱动浏览器进行自动化的端到端系统测试。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn13_aa798544efa122eb4c6f45cc01770d88" &gt;本文中，我将简要概述 BDD，然后解释 BDD 周期如何通过用于驱动单元级别实现的功能级别测试来包括传统的测试驱动开发 (TDD) 周期。&lt;/span&gt; &lt;span id="xn14_ea0e7884757edaa50d83b9d1d55e6fda" &gt;在介绍&amp;#8220;测试优先&amp;#8221;方法的基本内容后，我将介绍 SpecFlow 和 WatiN，并向您演示如何将这些工具与 MSTest 结合使用来为您的项目实现 BDD 的示例。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span id="xn15_3d52c86f812bc3c8f797eb8540e7ba59" &gt;自动化测试简史&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn16_5c57d3e62e963768d79e59bb018adcd6" &gt;敏捷软件发展过程中产生的最有价值的实践之一就是测试优先的自动化开发模式，通常称为&amp;#8220;测试驱动开发&amp;#8221;或&amp;#8220;TDD&amp;#8221;。&lt;/span&gt; &lt;span id="xn17_48d218b50569a495fb61f37d8a141a9a" &gt;TDD 的一条关键原则就是，测试创建不仅与设计和开发指南相关，同样还与验证和回归相关。&lt;/span&gt; &lt;span id="xn18_5c5027b4ca2469e8eafc88437211f7bf" &gt;测试创建还涉及到使用测试来指定一组所需的功能，以及稍后通过测试来只编写实现该功能所需的代码。&lt;/span&gt; &lt;span id="xn19_7ff1984c5db9590612082a90a64e1ac4" &gt;因此，实现任何新功能的第一步就是通过一个失败测试来描述您的期望（参见&lt;strong&gt;图 1&lt;/strong&gt;）。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://i.msdn.microsoft.com/gg490346.Satrom_Figure1_hires(en-us,MSDN.10).jpg" /&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn20_fbda549f6348ed657b54725dd44d3f46" &gt;图 1 &lt;strong&gt;测试驱动开发的周期&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn21_43990c0e012e305bedeca6236f4e8d65" &gt;许多开发人员和团队已通过 TDD 取得了巨大的成功，&lt;/span&gt; &lt;span id="xn22_d41d6c699ac624106dbb36329252a2ff" &gt;而其他人没有使用 TDD，结果发现自己长期以来疲于应付进程管理工作，尤其是，随着测试量开始增长，这些测试的灵活性却开始降低，情况会更糟糕。&lt;/span&gt; &lt;span id="xn23_c705ded7a572397a9438879583cc9092" &gt;尽管有些人觉得 TDD 很容易上手，而有些人却不清楚如何开始使用 TDD，结果只能将它放在一边，眼睁睁地看着最终期限的临近和工作的大量积压而束手无策。&lt;/span&gt; &lt;span id="xn24_9882da2c5618c18425c936b645d1cf75" &gt;最后，许多对此感兴趣的开发人员遇到了其组织内部对这项工作的重重阻力，要么是因为&amp;#8220;测试&amp;#8221;这个词暗示这项职能属于另一个团队，或是因为&amp;#8220;TDD 产生了太多额外的代码并减缓了项目进度&amp;#8221;这个错误的观念。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn25_6e4d549468bd4053e5f375d465cca3c3" &gt;Steve Freeman 和 Nat Pryce 在他们的著作&amp;#8220;Growing Object-Oriented Software, Guided by Tests&amp;#8221;(Addison-Wesley Professional, 2009) 中指出，&amp;#8220;传统的&amp;#8221;TDD 缺少真正的&amp;#8220;测试优先&amp;#8221;开发的某些优点：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn26_20d28e40245ea6d90d925c2a1a3fc7b9" &gt;&amp;#8220;通过为应用程序中的类编写单元测试来开始 TDD 过程是有风险的。&lt;/span&gt; &lt;span id="xn27_dfff4cf10f93e131332ce16415a01e0f" &gt;这不仅比不进行任何测试要好得多，还可以发现那些我们所熟知但又无法避免的常见编程错误&amp;#8230;但是项目仅进行单元测试却会让 TDD 过程的重要好处大打折扣。&lt;/span&gt; &lt;span id="xn28_4efb4b319c82ea83c14bf305a08fd6c0" &gt;我们也看到了，有些具有高品质和经过严格单元测试的代码的项目并非从任何位置都可以调用，或者这些项目无法与系统的其余部分集成，因而必须重写。&amp;#8221;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn29_82c58890adadf82befd4e043355d02d2" &gt;2006 年，Dan North 在&lt;em&gt; Better Software&lt;/em&gt; 杂志 (&lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl04" href="http://blog.dannorth.net/introducing-bdd"&gt;blog.dannorth.net/introducing-bdd&lt;/a&gt;) 中的一篇文章中提到了许多这类难题。&lt;/span&gt; &lt;span id="xn30_28105d9384d03db9cbfe4ce6c1d6cf80" &gt;在他的文章中，North 介绍了三年来在测试实践方面所采用的一系列做法。&lt;/span&gt; &lt;span id="xn31_df7873b110cf73b5a1af1e85dfcf9b32" &gt;尽管这些实践就本身而言仍属于 TDD 的范畴，但却促使 North 采用一种更加侧重分析的观点来看待测试，并创造了术语&amp;#8220;行为驱动开发&amp;#8221;以概括这种转换。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn32_587549736f73270d27d7647294956be8" &gt;BDD 最常用的一个应用尝试通过验收测试或可执行规范来强化创建测试的重点和过程，从而扩展 TDD。&lt;/span&gt; &lt;span id="xn33_dadbd71676fdb7d1c234d2a073e2d9bc" &gt;每个规范将作为进入开发周期的一个入口点，它从用户角度以分步骤的形式介绍系统的行为方式。&lt;/span&gt; &lt;span id="xn34_f0de9886953465a1fba30b837632e6e1" &gt;完成编写后，开发人员将使用规范及其现有的 TDD 过程来实现足量的生产代码，从而得到一个通过测试的方案（参见&lt;strong&gt;图 2&lt;/strong&gt;）。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://i.msdn.microsoft.com/gg490346.Satrom_Figure2_hires(en-us,MSDN.10).jpg" /&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn35_162fc6951e94ba6424e5da0e789c3dec" &gt;图 2 &lt;strong&gt;行为驱动开发的周期&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span id="xn36_912e60a790e70561228fef59583e0150" &gt;从何处开始设计&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn37_e8f74dffbe644ecd6c040478ced92fb2" &gt;大多数人认为 BDD 是 TDD 的超集，而不是它的替代品。&lt;/span&gt; &lt;span id="xn38_45bbfdaef846da1538587aba0bf263d5" &gt;两者的重要区别是对初始设计和测试创建的侧重点不同。&lt;/span&gt; &lt;span id="xn39_8474c5631c62198f6b63ef4c787081ec" &gt;与 TDD 侧重于针对单元或对象的测试不同，我将以用户的目标以及他们为了实现这些目标而采取的步骤为侧重点。&lt;/span&gt; &lt;span id="xn40_ffdefa0fbecb6e416a6370bfce673051" &gt;因为我不再从小型单元的测试着手，所以我也不太愿意考虑具体用法或设计细节。&lt;/span&gt; &lt;span id="xn41_1bb7a656084971ca02a34cdb4384edbf" &gt;我更多的是记录能够证明系统合适的可执行规范。&lt;/span&gt; &lt;span id="xn42_c16825d108e1cc6fdd71ebc118819603" &gt;我仍然编写单元测试，但是 BDD 鼓励采用由外而内的方法，该方法首先要提供所要实现的功能的完整说明。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn43_4e32d0d59a9e5377293e2a110d293a63" &gt;让我们看看此差异的示例。&lt;/span&gt; &lt;span id="xn44_ec1bfd7794408072bc11c4de7be42d0a" &gt;在传统的 TDD 实践中，您可以在&lt;strong&gt;图 3&lt;/strong&gt; 中编写测试，以便演练 CustomersController 的 Create 方法。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn45_9853e37efee4582b00c6df247f4ba9f5" &gt;图 3 &lt;strong&gt;针对创建客户的单元测试&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1325638225484="8"&gt;&lt;code  jquery1325638225484="7"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[TestMethod]&lt;/li&gt;&lt;li&gt;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;&lt;span &gt;void&lt;/span&gt;&amp;nbsp;PostCreateShouldSaveCustomerAndReturnDetailsView()&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;var&amp;nbsp;customersController&amp;nbsp;=&amp;nbsp;&lt;span &gt;new&lt;/span&gt;&amp;nbsp;CustomersController();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;var&amp;nbsp;customer&amp;nbsp;=&amp;nbsp;&lt;span &gt;new&lt;/span&gt;&amp;nbsp;Customer&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Name&amp;nbsp;=&amp;nbsp;&lt;span &gt;"Hugo&amp;nbsp;Reyes"&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Email&amp;nbsp;=&amp;nbsp;&lt;span &gt;"hreyes@dharmainitiative.com"&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Phone&amp;nbsp;=&amp;nbsp;&lt;span &gt;"720-123-5477"&lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;};&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;var&amp;nbsp;result&amp;nbsp;=&amp;nbsp;customersController.Create(customer)&amp;nbsp;&lt;span &gt;as&lt;/span&gt;&amp;nbsp;ViewResult;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;Assert.IsNotNull(result);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;Assert.AreEqual(&lt;span &gt;"Details"&lt;/span&gt;,&amp;nbsp;result.ViewName);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;Assert.IsInstanceOfType(result.ViewData.Model,&amp;nbsp;&lt;span &gt;typeof&lt;/span&gt;(Customer));&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;customer&amp;nbsp;=&amp;nbsp;result.ViewData.Model&amp;nbsp;&lt;span &gt;as&lt;/span&gt;&amp;nbsp;Customer;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;Assert.IsNotNull(customer);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;Assert.IsTrue(customer.Id&amp;nbsp;&amp;gt;&amp;nbsp;&lt;span &gt;0&lt;/span&gt;);&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn47_32e4f0842d24405711d2635c1b7e7849" &gt;这将是我使用 TDD 编写的首批测试之一。&lt;/span&gt; &lt;span id="xn48_242df8afab3ff710065c039f3a0a3ffe" &gt;我通过设置所期望的 CustomersController 对象的行为方式为它设计一个公共 API。&lt;/span&gt; &lt;span id="xn49_fb7fb32563696a4a30f011f0558a845a" &gt;对于 BDD，我仍然创建该测试，但并非从一开始就创建。&lt;/span&gt; &lt;span id="xn50_c82d10b42bcb546fb4490aa88ca6bfa0" &gt;相反，我通过编写更类似于&lt;strong&gt;图 4&lt;/strong&gt; 的测试来提高对功能级别功能的侧重度。&lt;/span&gt; &lt;span id="xn51_18c869c26f91a4526d6c339b07fe41dc" &gt;然后，我将该方案用作针对实现所需代码的各个单元的指南，以使此方案通过。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn52_ee2fd9b5f38f58babce80e0208c9d1cb" &gt;图 4 &lt;strong&gt;功能级别规范&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1325638225484="18"&gt;&lt;code  jquery1325638225484="17"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Feature:&amp;nbsp;Create&amp;nbsp;a&amp;nbsp;&lt;span &gt;new&lt;/span&gt;&amp;nbsp;customer&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;In&amp;nbsp;order&amp;nbsp;to&amp;nbsp;improve&amp;nbsp;customer&amp;nbsp;service&amp;nbsp;and&amp;nbsp;visibility&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;As&amp;nbsp;a&amp;nbsp;site&amp;nbsp;administrator&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;I&amp;nbsp;want&amp;nbsp;to&amp;nbsp;be&amp;nbsp;able&amp;nbsp;to&amp;nbsp;create,&amp;nbsp;view&amp;nbsp;and&amp;nbsp;manage&amp;nbsp;customer&amp;nbsp;records&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Scenario:&amp;nbsp;Create&amp;nbsp;a&amp;nbsp;basic&amp;nbsp;customer&amp;nbsp;record&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;Given&amp;nbsp;I&amp;nbsp;am&amp;nbsp;logged&amp;nbsp;into&amp;nbsp;the&amp;nbsp;site&amp;nbsp;&lt;span &gt;as&lt;/span&gt;&amp;nbsp;an&amp;nbsp;administrator&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;When&amp;nbsp;I&amp;nbsp;click&amp;nbsp;the&amp;nbsp;&lt;span &gt;"Create&amp;nbsp;New&amp;nbsp;Customer"&lt;/span&gt;&amp;nbsp;link&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;And&amp;nbsp;I&amp;nbsp;enter&amp;nbsp;the&amp;nbsp;following&amp;nbsp;information&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Field&amp;nbsp;|&amp;nbsp;Value&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Name&amp;nbsp;&amp;nbsp;|&amp;nbsp;Hugo&amp;nbsp;Reyes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Email&amp;nbsp;|&amp;nbsp;hreyes@dharmainitiative.com&amp;nbsp;|&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Phone&amp;nbsp;|&amp;nbsp;&lt;span &gt;720&lt;/span&gt;&lt;span &gt;-123&lt;/span&gt;&lt;span &gt;-5477&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;And&amp;nbsp;I&amp;nbsp;click&amp;nbsp;the&amp;nbsp;&lt;span &gt;"Create"&lt;/span&gt;&amp;nbsp;button&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;Then&amp;nbsp;I&amp;nbsp;should&amp;nbsp;see&amp;nbsp;the&amp;nbsp;following&amp;nbsp;details&amp;nbsp;on&amp;nbsp;the&amp;nbsp;screen:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Value&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Hugo&amp;nbsp;Reyes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;hreyes@dharmainitiative.com&amp;nbsp;|&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&lt;span &gt;720&lt;/span&gt;&lt;span &gt;-123&lt;/span&gt;&lt;span &gt;-5477&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn54_ac04382d9f159085c82464bab1d11782" &gt;这是&lt;strong&gt;图 2&lt;/strong&gt; 中的外层循环，失败的验收测试。&lt;/span&gt; &lt;span id="xn55_ebac23197d54aba8ebe88a4da1e8f5b4" &gt;在创建此测试并且测试失败之后，我将按&lt;strong&gt;图 2&lt;/strong&gt; 中所述的内部 TDD 循环来实现我的功能中每个方案的每个步骤。&lt;/span&gt; &lt;span id="xn56_a93dad693d3198b98f6360b6e9cb0455" &gt;对于&lt;strong&gt;图 3&lt;/strong&gt; 中的 CustomersController，一旦到达功能中的合适步骤，我就会在实现使该步骤通过测试所需的控制器逻辑之前立即编写此测试。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span id="xn57_b36190c3b01a359392eebb7579299112" &gt;BDD 和自动化测试&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn58_27b4eb5671587de10f6d1e7f36813c2d" &gt;从一开始，BDD 社区就已设法使用已成为单元测试中的标准一段时间的验收测试来提供相同级别的自动化测试。&lt;/span&gt; &lt;span id="xn59_0b2c3f79b954ddc5394ff01ba74ad8a0" &gt;值得注意的一个示例就是 Cucumber (&lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl08" href="http://cukes.info/"&gt;cukes.info&lt;/a&gt;)，它是一个基于 Rub 的测试工具，强调创建以&amp;#8220;特定于域的业务可读语言&amp;#8221;编写的功能级别的验收测试。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn60_baddd65014d223bbe209258b60c1066b" &gt;Cucumber 测试使用针对每个功能文件的 User Story 语法和针对每个方案的 Given、When、Then (GWT) 语法来编写。&lt;/span&gt; &lt;span id="xn61_aaf54343251ebac3c9706cdd08f60829" &gt;（有关 User Story 语法的详细信息，请参阅 &lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl09" href="http://c2.com/cgi/wiki?UserStory"&gt;c2.com/cgi/wiki?UserStory&lt;/a&gt;。）GWT 描述了方案当前的上下文 (Given)、作为测试的一部分所执行的操作 (When) 以及预期的可观察结果 (Then)。&lt;/span&gt; &lt;span id="xn62_fe3fca9ee87a17f28712dcb2d0e212f8" &gt;&lt;strong&gt;图 4&lt;/strong&gt; 中的功能是此类语法的一个示例。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn63_ffbc7afb324b6d63e8bf76c3a143cb05" &gt;在 Cucumber 中，系统会对用户可读的功能文件进行解析，并将每个方案步骤与 Ruby 代码（演练相关系统的公共接口并确定该步骤是成功还是失败）进行匹配。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn64_00ead5046649e0ef5fa801c639648e93" &gt;近年来，创新促使自动化测试这类方案的使用扩展到 .NET Framework 体系。&lt;/span&gt; &lt;span id="xn65_21cc6a5c8168a1a68feb73c000194d7f" &gt;开发人员现已具有允许通过 Cucumbe 所使用的相同结构的英语语法来编写规范的工具，而随后 Cucumber 又可将这些规范用作演练代码的测试。&lt;/span&gt; &lt;span id="xn66_0747331b15309105645a906165d18d9b" &gt;利用 SpecFlow (&lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl10" href="http://specflow.org/"&gt;specflow.org&lt;/a&gt;)、Cuke4Nuke (&lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl11" href="http://github.com/richardlawrence/Cuke4Nuke"&gt;github.com/richardlawrence/Cuke4Nuke&lt;/a&gt;) 等 BDD 测试工具，您可首先在过程中创建可执行规范，在扩建功能时利用这些规范，并在最后记录那些与您的开发和测试进程直接关联的功能。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span id="xn67_68be24d4f8a1a4025a9c779519b4cc4d" &gt;SpecFlow 和 WatiN 入门&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn68_5015f0d662d2d58f48ead3dcdde7eff1" &gt;本文中，我将利用 SpecFlow 来测试一个模型-视图-控制器 (MVC) 应用程序。&lt;/span&gt; &lt;span id="xn69_be091ad94409a1d41d6e2cf275f87137" &gt;若要开始使用 SpecFlow，您首先要下载并安装它。&lt;/span&gt; &lt;span id="xn70_bacb87c55d636d777a07a0e2fc9dea12" &gt;安装 SpecFlow 后，请使用单元测试项目创建一个新的 ASP.NET MVC 应用程序。&lt;/span&gt; &lt;span id="xn71_5b7319a122d9efafac82c5eb1b1879fb" &gt;我更愿意我的单元测试项目只包含单元测试（控制器测试、存储库测试等等），这样，我就还可以为我的 SpecFlow 测试创建一个 AcceptanceTests 测试。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn72_af800cddabb09b9381407cdb41f5595c" &gt;添加 AcceptanceTests 项目并添加对 TechTalk.SpecFlow 程序集的引用后，请使用 SpecFlow 在安装时创建的&amp;#8220;添加&amp;#8221;|&amp;#8220;新建项目&amp;#8221;模板添加一个新功能，并将其命名为 CreateCustomer.feature。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn73_c6a6bdc4a5df1f3e610b5d50c8910c1b" &gt;请注意，该文件创建时的扩展名为 .feature；由于有了 SpecFlow 的集成工具，Visual Studio 将此文件识别为支持的文件。&lt;/span&gt; &lt;span id="xn74_71fd8190fbd3849389fea6a906183561" &gt;您还可能注意到，您的功能文件具有一个相关的 .cs 代码隐藏文件。&lt;/span&gt; &lt;span id="xn75_9402bcfb58821de1a0fffedd721585d2" &gt;您每次保存 .feature 文件时，SpecFlow 会对文件进行解析，并将该文件中的文本转换到一个测试装置。&lt;/span&gt; &lt;span id="xn76_9c9987573782866261253eddf2eb2186" &gt;关联的 .cs 文件中的代码代表该测试装置，即每次运行您的测试套件时实际执行的代码。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn77_f5fc808a640636df94e550dbad5755ca" &gt;默认情况下，SpecFlow 将 NUnit 用作其测试运行程序，但它也支持配置稍有更改的 MSTest。&lt;/span&gt; &lt;span id="xn78_dc5763066133887ad992bd6f208b460e" &gt;您只需向测试项目中添加一个 app.config 文件并添加以下元素即可：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre&gt;&lt;code  jquery1325638225484="19"&gt;&#xD;
          &lt;span id="xn79_4f0518a7d92d04513b1221234160813a" &gt;&amp;lt;configSections&amp;gt;&#xD;
  &amp;lt;section name="specFlow"&#xD;
    type="TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow"/&amp;gt;&#xD;
&amp;lt;/configSections&amp;gt;&#xD;
&amp;lt;specFlow&amp;gt;&#xD;
  &amp;lt;unitTestProvider name="MsTest" /&amp;gt;&#xD;
&amp;lt;/specFlow&amp;gt;&lt;/span&gt;&#xD;
        &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span id="xn80_fd6aca0b13ce2c49adf1d996256231e8" &gt;首个验收测试&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn81_c2f09cab017bb21d397d94a43fed567a" &gt;当您创建某个新功能时，SpecFlow 将使用默认文本填充该文件，以解释用于描述该功能的语法。&lt;/span&gt; &lt;span id="xn82_cffdc5bbe9ae9528bd94362e455eca69" &gt;将 CreateCustomer.feature 文件中的默认文本替换为&lt;strong&gt;图 4&lt;/strong&gt; 中的文本。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn83_fc1390271483e2db2ccd60c32eba87aa" &gt;每个功能文件分为两个部分。&lt;/span&gt; &lt;span id="xn84_3c8e5cffb16d16afec4f8a3894b6fd83" &gt;第一个部分是顶部的功能名称和说明，此部分使用 User Story 语法来描述用户的角色、用户的目标以及用户为了在系统中实现这个目标而必须能够执行的操作的类型。&lt;/span&gt; &lt;span id="xn85_f38ca27c0a1fac99bdfc9e40b67aee85" &gt;SpecFlow 需要此部分来自动生成测试，但是内容本身不能用于这些测试。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn86_64680413b7cb5e4c6489f26b692cbc73" &gt;每个功能文件的第二部分为一个或多个方案。&lt;/span&gt; &lt;span id="xn87_b86e2444ecbc57dd0296224901ecfd72" &gt;每个方案用于在关联的 .feature.cs 文件中生成一个测试方法（如&lt;strong&gt;图 5&lt;/strong&gt; 所示），且方案中的每个步骤会传递到 SpecFlow 测试运行程序，该运行程序会将步骤的一个基于 RegEx 的匹配项执行到名为&amp;#8220;步骤定义&amp;#8221;文件的 SpecFlow 文件中的一个条目。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span id="xn88_dc83743f8db8274359f0771681c6810f" &gt;图 5 由 SpecFlow 生成的测试方法&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1325638225484="21"&gt;&lt;code  jquery1325638225484="20"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;&lt;span &gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span &gt;void&lt;/span&gt;&amp;nbsp;CreateABasicCustomerRecord()&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;TechTalk.SpecFlow.ScenarioInfo&amp;nbsp;scenarioInfo&amp;nbsp;=&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;new&lt;/span&gt;&amp;nbsp;TechTalk.SpecFlow.ScenarioInfo(&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;"Create&amp;nbsp;a&amp;nbsp;basic&amp;nbsp;customer&amp;nbsp;record"&lt;/span&gt;,&amp;nbsp;((&lt;span &gt;string&lt;/span&gt;[])(&lt;span &gt;null&lt;/span&gt;)));&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;this&lt;/span&gt;.ScenarioSetup(scenarioInfo);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;testRunner.Given(&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;"I&amp;nbsp;am&amp;nbsp;logged&amp;nbsp;into&amp;nbsp;the&amp;nbsp;site&amp;nbsp;as&amp;nbsp;an&amp;nbsp;administrator"&lt;/span&gt;);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;testRunner.When(&lt;span &gt;"I&amp;nbsp;click&amp;nbsp;the&amp;nbsp;\"Create&amp;nbsp;New&amp;nbsp;Customer\"&amp;nbsp;link"&lt;/span&gt;);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;TechTalk.SpecFlow.Table&amp;nbsp;table1&amp;nbsp;=&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;new&lt;/span&gt;&amp;nbsp;TechTalk.SpecFlow.Table(&lt;span &gt;new&lt;/span&gt;&amp;nbsp;&lt;span &gt;string&lt;/span&gt;[]&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;"Field"&lt;/span&gt;,&amp;nbsp;&lt;span &gt;"Value"&lt;/span&gt;});&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;table1.AddRow(&lt;span &gt;new&lt;/span&gt;&amp;nbsp;&lt;span &gt;string&lt;/span&gt;[]&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;"Name"&lt;/span&gt;,&amp;nbsp;&lt;span &gt;"Hugo&amp;nbsp;Reyesv"&lt;/span&gt;});&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;table1.AddRow(&lt;span &gt;new&lt;/span&gt;&amp;nbsp;&lt;span &gt;string&lt;/span&gt;[]&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;"Email"&lt;/span&gt;,&amp;nbsp;&lt;span &gt;"hreyes@dharmainitiative.com"&lt;/span&gt;});&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;table1.AddRow(&lt;span &gt;new&lt;/span&gt;&amp;nbsp;&lt;span &gt;string&lt;/span&gt;[]&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;"Phone"&lt;/span&gt;,&amp;nbsp;&lt;span &gt;"720-123-5477"&lt;/span&gt;});&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;testRunner.And(&lt;span &gt;"I&amp;nbsp;enter&amp;nbsp;the&amp;nbsp;following&amp;nbsp;information"&lt;/span&gt;,&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((&lt;span &gt;string&lt;/span&gt;)(&lt;span &gt;null&lt;/span&gt;)),&amp;nbsp;table1);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;testRunner.And(&lt;span &gt;"I&amp;nbsp;click&amp;nbsp;the&amp;nbsp;\"Create\"&amp;nbsp;button"&lt;/span&gt;);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;TechTalk.SpecFlow.Table&amp;nbsp;table2&amp;nbsp;=&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;new&lt;/span&gt;&amp;nbsp;TechTalk.SpecFlow.Table(&lt;span &gt;new&lt;/span&gt;&amp;nbsp;&lt;span &gt;string&lt;/span&gt;[]&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;"Value"&lt;/span&gt;});&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;table2.AddRow(&lt;span &gt;new&lt;/span&gt;&amp;nbsp;&lt;span &gt;string&lt;/span&gt;[]&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;"Hugo&amp;nbsp;Reyes"&lt;/span&gt;});&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;table2.AddRow(&lt;span &gt;new&lt;/span&gt;&amp;nbsp;&lt;span &gt;string&lt;/span&gt;[]&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;"hreyes@dharmainitiative.com"&lt;/span&gt;});&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;table2.AddRow(&lt;span &gt;new&lt;/span&gt;&amp;nbsp;&lt;span &gt;string&lt;/span&gt;[]&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;"720-123-5477"&lt;/span&gt;});&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;testRunner.Then(&lt;span &gt;"I&amp;nbsp;should&amp;nbsp;see&amp;nbsp;the&amp;nbsp;following&amp;nbsp;details&amp;nbsp;on&amp;nbsp;screen:"&lt;/span&gt;,&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((&lt;span &gt;string&lt;/span&gt;)(&lt;span &gt;null&lt;/span&gt;)),&amp;nbsp;table2);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;testRunner.CollectScenarioErrors();&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn90_83ece934fceb028e0423d8eebf7d3721" &gt;完成您首个功能的定义后，请在按住 Ctrl 的同时按 R 和 T，以运行您的 SpecFlow 测试。&lt;/span&gt; &lt;span id="xn91_eedf1aa482c47a320c38c522b5b1e92d" &gt;您的 CreateCustomer 测试将失败（无结果），因为 SpecFlow 无法为您的测试中的首个步骤找到一个匹配的步骤定义（参见&lt;strong&gt;图 6&lt;/strong&gt;）。&lt;/span&gt; &lt;span id="xn92_ef9fa59b2acefb85d9c2ee6d01f5cc66" &gt;请留意实际 .feature 文件中的异常报告方式，该方式与隐藏代码文件中的异常报告方式相反。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://i.msdn.microsoft.com/gg490346.Satrom_Figure6_hires(en-us,MSDN.10).jpg" /&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn93_ca69df3b55d734a0ebfa3793b37bf76a" &gt;图 6 &lt;strong&gt;SpecFlow 找不到步骤定义&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn94_623b98da704e1bb74a40a37a61bc9064" &gt;因为您尚未创建步骤定义文件，所以发生此异常是正常的。&lt;/span&gt; &lt;span id="xn95_ce5f8b0e3b61727caf34a1f871f86af5" &gt;在&amp;#8220;异常&amp;#8221;对话框上单击&amp;#8220;确定&amp;#8221;，并在 Visual Studio&amp;#8220;测试结果&amp;#8221;窗口中查找 CreateABasicCustomerRecord 测试。&lt;/span&gt; &lt;span id="xn96_dc135670497c7b8d71d7fb9f698713bb" &gt;如果未找到匹配的步骤，则 SpecFlow 将使用您的功能文件生成您的步骤定义文件中所需的代码，您可复制并使用这些代码，以开始实现这些步骤。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn97_be2749cb235fb2cf653d7a8a5f8088ab" &gt;在您的 AcceptanceTests 项目中，使用 SpecFlow 步骤定义模板创建一个步骤定义文件，并将其命名为 CreateCustomer.cs。&lt;/span&gt; &lt;span id="xn98_f6eae81d364901bac5f0c9efb4f0577e" &gt;然后，将 SpecFlow 中的输出复制到该类。&lt;/span&gt; &lt;span id="xn99_4a351e5114d5e9e9c0008b34780d4000" &gt;您将注意到，每个方法都使用 SpecFlow 特性进行了修饰，该特性将方法指定为 Given、When 或 Then 步骤，并提供用于将方法与功能文件中某个步骤匹配的 RegEx。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span id="xn100_a4fdc548188387e14ec38398463ef697" &gt;集成 WatiN 以进行浏览器测试&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn101_6af7a8d1d34eb1fc94f633dc99418f31" &gt;使用 BDD 的部分目标是创建一个自动化测试套件，此套件将尽可能多地演练端到端系统功能。&lt;/span&gt; &lt;span id="xn102_c12a221ce156bfa5e8e5962710ec6425" &gt;因为我要构建一个 ASP.NET MVC 应用程序，所以我可以使用许多工具，这些工具有助于编写 Web 浏览器的脚本以与网站进行交互。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn103_ef49dfe78611e6214d9d0fbab6d8fc54" &gt;这类工具中的其中一个就是 WatiN，它是一个用于自动化 Web 浏览器测试的开放源库。&lt;/span&gt; &lt;span id="xn104_43679c1715bc42f15f66fdd8d91c06c1" &gt;您可从 &lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl15" href="http://watin.sourceforge.net/"&gt;watin.sourceforge.net&lt;/a&gt; 中下载 WatiN，并将对 WatiN.Core 的引用添加到您的验收测试项目，以方便使用。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn105_85610068a285fce9e11d52d6f66fa27e" &gt;与 WatiN 进行交互最主要的途径就是通过浏览器对象（IE() 或 FireFox()，具体取决于您选择的浏览器），这就为控制已安装浏览器的实例提供了一个公共接口。&lt;/span&gt; &lt;span id="xn106_9ad59acba02a434b8b84a948c2c958e0" &gt;因为您要在方案中通过多个步骤来演练浏览器，所以您需要一种可在步骤定义类中的步骤之间传递相同浏览器对象的方法。&lt;/span&gt; &lt;span id="xn107_cf3e743249f693d8eff46b70ed7b0b3f" &gt;为了处理此问题，我通常创建一个 WebBrowser 静态类作为 AcceptanceTests 项目的一部分，并利用该类来处理 WatiN IE 对象和 ScenarioContext（SpecFlow 将其用来存储方案中各步骤之间的状态）：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1325638225484="23"&gt;&lt;code  jquery1325638225484="22"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;&lt;span &gt;static&lt;/span&gt;&amp;nbsp;&lt;span &gt;class&lt;/span&gt;&amp;nbsp;WebBrowser&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;&lt;span &gt;static&lt;/span&gt;&amp;nbsp;IE&amp;nbsp;Current&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;if&lt;/span&gt;&amp;nbsp;(!ScenarioContext.Current.ContainsKey(&lt;span &gt;"browser"&lt;/span&gt;))&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ScenarioContext.Current[&lt;span &gt;"browser"&lt;/span&gt;]&amp;nbsp;=&amp;nbsp;&lt;span &gt;new&lt;/span&gt;&amp;nbsp;IE();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;return&lt;/span&gt;&amp;nbsp;ScenarioContext.Current[&lt;span &gt;"browser"&lt;/span&gt;]&amp;nbsp;&lt;span &gt;as&lt;/span&gt;&amp;nbsp;IE;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn109_d70f4689acb621a85c61423e5275f8ec" &gt;在 CreateCustomer.cs 中需要实现的第一个步骤是 Given 步骤，该步骤通过让用户以管理员身份登录到网站来开始测试：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre&gt;&lt;code  jquery1325638225484="24"&gt;&#xD;
          &lt;span id="xn110_3f73d56389c96c8f4e71a2f8c349f9cd" &gt;[Given(@"I am logged into the site as an administrator")]&#xD;
public void GivenIAmLoggedIntoTheSiteAsAnAdministrator() {&#xD;
  WebBrowser.Current.GoTo(http://localhost:24613/Account/LogOn);&#xD;
&#xD;
  WebBrowser.Current.TextField(Find.ByName("UserName")).TypeText("admin");&#xD;
  WebBrowser.Current.TextField(Find.ByName("Password")).TypeText("pass123");&#xD;
  WebBrowser.Current.Button(Find.ByValue("Log On")).Click();&#xD;
&#xD;
  Assert.IsTrue(WebBrowser.Current.Link(Find.ByText("Log Off")).Exists);&#xD;
}&lt;/span&gt;&#xD;
        &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn111_ce6b869b943012c6768ccc5b21ce7dd4" &gt;请记住，方案的 Given 部分是用来设置当前测试的上下文。&lt;/span&gt; &lt;span id="xn112_69b740af24722950e2635ffb07238c81" &gt;利用 WatiN，您可拥有自己的测试驱动并让它与浏览器交互，以实现此步骤。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn113_c679c14b4baec343e7e2e68acf8f714c" &gt;在本步骤中，我使用 WatiN 打开 Internet Explorer，导航到网站的&amp;#8220;登录&amp;#8221;页面，填写&amp;#8220;用户名&amp;#8221;和&amp;#8220;密码&amp;#8221;文本框，然后单击屏幕上的&amp;#8220;登录&amp;#8221;按钮。&lt;/span&gt; &lt;span id="xn114_a620f248589b630dda7c8294863afa25" &gt;当我再次运行测试时，将自动打开一个 Internet Explorer 窗口，当 WatiN 与网站交互（单击链接并输入文本）时，我可以观察工作中的 WatiN（参见&lt;strong&gt;图 7&lt;/strong&gt;）。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://i.msdn.microsoft.com/gg490346.Satrom_Figure7_hires(en-us,MSDN.10).png" /&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn115_21916dcf805c1726b8eb8dcebf8eeb5a" &gt;图 7 &lt;strong&gt;带有 WatiN 的 Autopilot 上的浏览器&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn116_58b9cee44a91dd538e806d2ca50b1d2f" &gt;现在将通过 Given 步骤，离实现功能又更近一步了。&lt;/span&gt; &lt;span id="xn117_6321106be36163b2687cecb6570678db" &gt;现在，SpecFlow 将会在第一个 When 步骤上失败，因为该步骤尚未实现。&lt;/span&gt; &lt;span id="xn118_4e66a7b155e162757f1e3c247dafd942" &gt;您可使用以下代码实现该步骤：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1325638225484="26"&gt;&lt;code  jquery1325638225484="25"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[When(&lt;span &gt;"I&amp;nbsp;click&amp;nbsp;the&amp;nbsp;\"&amp;nbsp;(.*)\"&amp;nbsp;link"&lt;/span&gt;)]&lt;/li&gt;&lt;li&gt;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;&lt;span &gt;void&lt;/span&gt;&amp;nbsp;WhenIClickALinkNamed(&lt;span &gt;string&lt;/span&gt;&amp;nbsp;linkName)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;var&amp;nbsp;link&amp;nbsp;=&amp;nbsp;WebBrowser.Link(Find.ByText(linkName));&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;if&lt;/span&gt;&amp;nbsp;(!link.Exists)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Assert.Fail(&lt;span &gt;string&lt;/span&gt;.Format(&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;"Could&amp;nbsp;not&amp;nbsp;find&amp;nbsp;{0}&amp;nbsp;link&amp;nbsp;on&amp;nbsp;the&amp;nbsp;page"&lt;/span&gt;,&amp;nbsp;linkName));&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;link.Click();&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn120_c5169a962534548971d787786db29259" &gt;现在，当我再次运行这些测试时，它们又因为 WatiN 无法在页面上找到带有文本&amp;#8220;创建新客户&amp;#8221;的链接而失败。&lt;/span&gt; &lt;span id="xn121_40db1560a98178dd07213f3344911067" &gt;只需向主页添加一个带有该文本的链接，下个步骤就会通过。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn122_0e8ccc734f73019843da14d9672cd71e" &gt;是否理解了模式？&lt;/span&gt; &lt;span id="xn123_01969e2b811f55582b0ea91f0e8eec55" &gt;SpecFlow 鼓励使用相同的 Red-Green-Refactor 方法，此方法是&amp;#8220;测试优先&amp;#8221;开发方法的主流方法。&lt;/span&gt; &lt;span id="xn124_14c6f2440892c0c9c49155ce72af5d5d" &gt;功能中每个步骤的间隔的作用类似于实现的虚拟绑定程序，鼓励您仅实现通过步骤所必需的功能。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn125_a7c1eba61e22ef9323295d7271449395" &gt;但是 BDD 过程内部的 TDD 又是怎样的呢？&lt;/span&gt; &lt;span id="xn126_b76d872cf5bbff0c58c1582a154f018d" &gt;现阶段我只是在页面级别工作，并且我尚未实现实际创建客户记录的功能。&lt;/span&gt; &lt;span id="xn127_0d640dc16f5576d7154f11f8dddf6b8e" &gt;为了简便起见，现在让我们实现剩下的步骤（参见&lt;strong&gt;图 8&lt;/strong&gt;）。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn128_48253c04207cb5fac3aecdddc03a2587" &gt;图 8 &lt;strong&gt;步骤定义中剩下的步骤&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1325638225484="28"&gt;&lt;code  jquery1325638225484="27"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[When(@&lt;span &gt;"I&amp;nbsp;enter&amp;nbsp;the&amp;nbsp;following&amp;nbsp;information"&lt;/span&gt;)]&lt;/li&gt;&lt;li&gt;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;&lt;span &gt;void&lt;/span&gt;&amp;nbsp;WhenIEnterTheFollowingInformation(Table&amp;nbsp;table)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;foreach&lt;/span&gt;&amp;nbsp;(var&amp;nbsp;tableRow&amp;nbsp;&lt;span &gt;in&lt;/span&gt;&amp;nbsp;table.Rows)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;field&amp;nbsp;=&amp;nbsp;WebBrowser.TextField(&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Find.ByName(tableRow[&lt;span &gt;"Field"&lt;/span&gt;]));&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;if&lt;/span&gt;&amp;nbsp;(!field.Exists)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Assert.Fail(&lt;span &gt;string&lt;/span&gt;.Format(&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;"Could&amp;nbsp;not&amp;nbsp;find&amp;nbsp;{0}&amp;nbsp;field&amp;nbsp;on&amp;nbsp;the&amp;nbsp;page"&lt;/span&gt;,&amp;nbsp;field));&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;field.TypeText(tableRow[&lt;span &gt;"Value"&lt;/span&gt;]);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;[When(&lt;span &gt;"I&amp;nbsp;click&amp;nbsp;the&amp;nbsp;\"(.*)\"&amp;nbsp;button"&lt;/span&gt;)]&lt;/li&gt;&lt;li&gt;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;&lt;span &gt;void&lt;/span&gt;&amp;nbsp;WhenIClickAButtonWithValue(&lt;span &gt;string&lt;/span&gt;&amp;nbsp;buttonValue)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;var&amp;nbsp;button&amp;nbsp;=&amp;nbsp;WebBrowser.Button(Find.ByValue(buttonValue));&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;if&lt;/span&gt;&amp;nbsp;(!button.Exists)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Assert.Fail(&lt;span &gt;string&lt;/span&gt;.Format(&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;"Could&amp;nbsp;not&amp;nbsp;find&amp;nbsp;{0}&amp;nbsp;button&amp;nbsp;on&amp;nbsp;the&amp;nbsp;page"&lt;/span&gt;,&amp;nbsp;buttonValue));&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;button.Click();&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;[Then(@&lt;span &gt;"I&amp;nbsp;should&amp;nbsp;see&amp;nbsp;the&amp;nbsp;following&amp;nbsp;details&amp;nbsp;on&amp;nbsp;the&amp;nbsp;screen:"&lt;/span&gt;)]&lt;/li&gt;&lt;li&gt;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;&lt;span &gt;void&lt;/span&gt;&amp;nbsp;ThenIShouldSeeTheFollowingDetailsOnTheScreen(&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;Table&amp;nbsp;table)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;foreach&lt;/span&gt;&amp;nbsp;(var&amp;nbsp;tableRow&amp;nbsp;&lt;span &gt;in&lt;/span&gt;&amp;nbsp;table.Rows)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;value&amp;nbsp;=&amp;nbsp;tableRow[&lt;span &gt;"Value"&lt;/span&gt;];&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Assert.IsTrue(WebBrowser.ContainsText(value),&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;string&lt;/span&gt;.Format(&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;"Could&amp;nbsp;not&amp;nbsp;find&amp;nbsp;text&amp;nbsp;{0}&amp;nbsp;on&amp;nbsp;the&amp;nbsp;page"&lt;/span&gt;,&amp;nbsp;value));&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn130_470514eb9a671d1906be55d2d7b13356" &gt;我重新运行了测试，现在这些测试因为我没有用来输入客户信息的页面而失败。&lt;/span&gt; &lt;span id="xn131_256193a568a65428febadd0bcd2b20c0" &gt;若要允许创建客户，则需要一个&amp;#8220;创建客户视图&amp;#8221;页面。&lt;/span&gt; &lt;span id="xn132_c0c64dfef333eb4813dd906bc1de44b7" &gt;若要在 ASP.NET MVC 中提供这样一个视图，则需要用来提供此视图的 CustomersController。&lt;/span&gt; &lt;span id="xn133_acfeb79a7e25954b92936080b65664f0" &gt;现在我需要新的代码，这意味着我的步骤要从 BDD 的外部循环进入到 TDD 的内部循环，如&lt;strong&gt;图 2&lt;/strong&gt; 所示。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn134_ee784f55709d4fffbac308433e6540f5" &gt;第一步是创建一个失败的单元测试。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span id="xn135_3c8a2ffaec07cf2e156c53be74ab57f5" &gt;将单元测试写入实现步骤&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn136_926f175a2413cd7ab9619a9930b46176" &gt;在 UnitTest 项目中创建 CustomerControllersTests 测试类之后，您需要创建一个测试方法，该方法用于演练要在 CustomersController 中公开的功能。&lt;/span&gt; &lt;span id="xn137_3b987a396175abb18b9bd49ead753314" &gt;具体地说，您要创建 Controller 的一个新实例，调用其 Create 方法，并确保您反过来可接收到合适的&amp;#8220;视图&amp;#8221;和&amp;#8220;模型&amp;#8221;：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1325638225484="30"&gt;&lt;code  jquery1325638225484="29"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[TestMethod]&lt;/li&gt;&lt;li&gt;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;&lt;span &gt;void&lt;/span&gt;&amp;nbsp;GetCreateShouldReturnCustomerView()&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;var&amp;nbsp;customersController&amp;nbsp;=&amp;nbsp;&lt;span &gt;new&lt;/span&gt;&amp;nbsp;CustomersController();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;var&amp;nbsp;result&amp;nbsp;=&amp;nbsp;customersController.Create()&amp;nbsp;&lt;span &gt;as&lt;/span&gt;&amp;nbsp;ViewResult;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;Assert.AreEqual(&lt;span &gt;"Create"&lt;/span&gt;,&amp;nbsp;result.ViewName);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;Assert.IsInstanceOfType(&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result.ViewData.Model,&amp;nbsp;&lt;span &gt;typeof&lt;/span&gt;(Customer));&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn139_24e4f49e9981526692017110d09a4850" &gt;此代码尚未编译，因为您尚未创建 CustomersController 或其 Create 方法。&lt;/span&gt; &lt;span id="xn140_0cb2fb05995951d97a065628832090eb" &gt;创建该控制器和一个空白的 Create 方法后，将立即编译代码，且测试将失败，这是必需的下一个步骤。&lt;/span&gt; &lt;span id="xn141_87f16620e53bc68d3ea9f1ab27c9bc0b" &gt;而如果您完成了 Create 方法，则测试将立即通过：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1325638225484="32"&gt;&lt;code  jquery1325638225484="31"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;ActionResult&amp;nbsp;Create()&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;return&lt;/span&gt;&amp;nbsp;View(&lt;span &gt;"Create"&lt;/span&gt;,&amp;nbsp;&lt;span &gt;new&lt;/span&gt;&amp;nbsp;Customer());&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn143_cb36df305df71cb36bdf2f1b7e8bc5ec" &gt;如果您重新运行 SpecFlow 测试，则会更接近于完成，但功能仍然不能通过。&lt;/span&gt; &lt;span id="xn144_fb64f6f51cf4ba36ac286cbc39cd962a" &gt;这次，测试将因为您不具有 Create.aspx 视图页而失败。&lt;/span&gt; &lt;span id="xn145_edab8781b6eefa05791bbd70b7b7b5b6" &gt;如果您按照功能指示，将其随合适的字段一起添加，则您向完整的功能又迈进了一步。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn146_1f1ae004312c172fca457808adc6c151" &gt;用于实现此创建功能的由外而内的过程如&lt;strong&gt;图 9&lt;/strong&gt; 所示。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://i.msdn.microsoft.com/gg490346.Satrom_Figure9_hires(en-us,MSDN.10).jpg" /&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn147_dc34e8b59cd59b2ebae07f18763b5600" &gt;图 9 &lt;strong&gt;方案到单元测试过程&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn148_00568ba69a2934d60b6aaf33ae4b9564" &gt;这些相同的步骤通常会在此过程中重复出现，循环访问这些步骤的速度随着时间的推移将大大加快，尤其是当您在 AcceptanceTests 项目中实现帮助程序步骤（单击链接和按钮，填写表单等等）和着手测试每个方案中的关键功能时。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn149_db8b27a88f9c1315ffdf0b561182cc30" &gt;现在功能将从有效的创建视图中填写相应的表单字段，且将尝试提交该表单。&lt;/span&gt; &lt;span id="xn150_87bac881f385e3b13accca2afb47abd8" &gt;您现在可以猜到下面将发生什么事：测试将因为您尚不具有保存客户记录所需的逻辑而失败。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn151_05265a65a60730658407d688c860f8f0" &gt;请按照与前面相同的过程，使用如前面&lt;strong&gt;图 3&lt;/strong&gt; 中所示的单元测试代码来创建测试。&lt;/span&gt; &lt;span id="xn152_593eeb1241060f412d20c3e0b112e072" &gt;在添加接受客户对象以允许编译此测试的空白 Create 方法后，您将看到测试失败，随后请按以下方式完成 Create 方法：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre&gt;&lt;code  jquery1325638225484="33"&gt;&#xD;
          &lt;span id="xn153_58872e608f364e53ed6f61a72f7f5d71" &gt;[AcceptVerbs(HttpVerbs.Post)]&#xD;
public ActionResult Create(Customer customer) {&#xD;
  _repository.Create(customer);&#xD;
&#xD;
  return View("Details", customer);&#xD;
}&lt;/span&gt;&#xD;
        &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn154_58936e6892e85e1a53f88fb114950c60" &gt;我的 Controller 只是一个控制器，客户记录的实际创建属于一个了解数据存储机制的存储对象。&lt;/span&gt; &lt;span id="xn155_40f3be442b7b863ce7c0412c232a4b55" &gt;为了简便起见，本文省略了该实现；但要注意，在实际情况中，当需要用来保存客户的存储库时应启动另一个单元测试的子循环。&lt;/span&gt; &lt;span id="xn156_b111e9e645bf65846cadcba4b86b0f0b" &gt;当您需要访问任意协作对象，而该对象不存在或未提供您需要的功能时，则应该遵循您对 Feature 和 Controller 遵循的相同单元测试循环。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn157_c385ebc566f3258aa58f47eac0b50bf1" &gt;实现 Create 方法并拥有工作存储库之后，您将需要创建&amp;#8220;详细信息视图&amp;#8221;，此视图保留新客户的记录并在页面上显示这些记录。&lt;/span&gt; &lt;span id="xn158_ab809957bf4dc41b59410283929146bb" &gt;然后您可再次运行 SpecFlow。&lt;/span&gt; &lt;span id="xn159_a6c2a832016b8999e66479e6211cd0a3" &gt;最后，在多次 TDD 循环和子循环后，您现在具有了通过测试的功能，它证明您系统中存在的一些端到端的功能合适。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn160_d6de221e6f1ef25172591b8131c5164e" &gt;祝贺您！&lt;/span&gt; &lt;span id="xn161_27c30b542dd70385d0e8db70b58c3ad4" &gt;您现已通过验收测试和一组完整的单元测试（用于确保系统进行扩展以添加新功能时新功能可以继续工作）实现了一组端到端功能。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span id="xn162_aeef6ce956bbc888512ca3b702a40e4c" &gt;关于重构的说明&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn163_9e48a90133b41092583b8732e04b2774" &gt;在 UnitTests 项目中创建单元级别测试时，希望您不断对每个测试创建进行重构。&lt;/span&gt; &lt;span id="xn164_d7dc6460e3e5617becce3a5fd2c3eca1" &gt;当您在链中从通过单元测试移回到通过验收测试时，应遵循相同的过程，关注重构的机会，并重定义每个功能以及随后的所有功能的实现。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn165_736635630e552db8693c33b0cbdc9a0e" &gt;还要密切关注重构您的 AcceptanceTests 项目中的代码的机会。&lt;/span&gt; &lt;span id="xn166_1ce38081c0fa5f1e490e2adcf255b32d" &gt;您将发现某些功能中经常出现某些重复的步骤，尤其是您的 Given 步骤。&lt;/span&gt; &lt;span id="xn167_165d940ecb758bc0e904c7f6a7c31001" &gt;利用 SpecFlow，您可轻易将这些步骤移动到按功能分类的单独的步骤定义文件中，例如，LogInSteps.cs。&lt;/span&gt; &lt;span id="xn168_b49e7b01e9b9f3a633e1797917c6b5d2" &gt;这就让主要步骤定义文件变得简单明了并针对您指定的唯一方案。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn169_0f9a6c6bf97179a2c631df021f1135f4" &gt;BDD 侧重于设计和开发。&lt;/span&gt; &lt;span id="xn170_d5ad3141047f4f795e17efa0957d8453" &gt;通过将您的侧重点从对象提升到功能，您自己和您的团队就可以从系统用户的角度出发进行设计。&lt;/span&gt; &lt;span id="xn171_8c122654dae28080f8e50aa239832255" &gt;由于功能设计演变成为单元设计，因此要确保在编写测试时将您的功能考虑在内，还要确保按照不连续的步骤或任务调整测试。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn172_e8b93be4c0aeabbb5be09c66d09da20e" &gt;与任何其他实践或规则类似，BDD 与您的工作流结合还需一些时间。&lt;/span&gt; &lt;span id="xn173_b963b92bf62862ba37e58d008bbe05d8" &gt;本人建议您使用任何可用的工具来亲自体验相关操作，并观察该工具的运行情况。&lt;/span&gt; &lt;span id="xn174_005b6233e004b39552ccb0e4e6c8941b" &gt;当您以这种方式进行开发时，请注意 BDD 鼓励您提出的问题。&lt;/span&gt; &lt;span id="xn175_c9290d11a4659d5bf8fac326bf512048" &gt;不断寻找可改善您的实践和过程的方法，并与他人协作以进行改善。&lt;/span&gt; &lt;span id="xn176_4c012d915bd268190097f720890e9eda" &gt;我希望，无论您使用什么工具集，对 BDD 的研究都能够增加自己的软件开发实践的价值和关注度。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn177_e651c599803d2291bb397d4ffcb21428" &gt;&lt;strong&gt;Brandon Satrom&lt;/strong&gt;&amp;nbsp;&lt;em&gt;是 Microsoft 在德克萨斯州奥斯汀市的开发推广人员。他的博客地址为 &lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl25" href="http://userinexperience.com/"&gt;userinexperience.com&lt;/a&gt;，还可以通过 Twitter 地址 &lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl26" href="http://twitter.com/BrandonSatrom"&gt;@BrandonSatrom&lt;/a&gt; 与他取得联系。&lt;/em&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;&lt;span id="xn178_1199f0d9d8e281c249264fbf12828e62" &gt;感谢以下技术专家对本文的审阅：&lt;strong&gt;Paul Rayner 和 Clark Sell&lt;/strong&gt;&lt;/span&gt; &lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&#xD;
&lt;td style="padding-left: 3px; width: 303px; vertical-align: top" valign="top"&gt;&#xD;
&lt;div id="RightContent"&gt;&#xD;
&lt;div id="ctl00_RightSideBox"&gt;&lt;P:PRIMARY xmlns:asp="http://msdn2.microsoft.com/aspnet" xmlns:pcat="urn:mtpg-com:mtps/2004/1/primary/category" xmlns:p="urn:mtpg-com:mtps/2004/1/primary" pcat:primaryformat="Mtps.Xhtml"&gt;&lt;div &gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/P:PRIMARY&gt;&lt;img src="http://www.cnblogs.com/Tonyyang/aggbug/2311555.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Tonyyang/archive/2012/01/04/2311555.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Tonyyang/archive/2011/12/24/2300149.html</id><title type="text">XAF 用户双击ListView记录时禁止显示DetailView</title><summary type="text">How to prevent a DetailView from being shown when a User double clicks or presses the Enter key on a record in a ListView http://www.devexpress.com/Support/Center/kb/p/K18038.aspx</summary><published>2011-12-24T01:36:00Z</published><updated>2011-12-24T01:36:00Z</updated><author><name>Tonyyang</name><uri>http://www.cnblogs.com/Tonyyang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Tonyyang/archive/2011/12/24/2300149.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Tonyyang/archive/2011/12/24/2300149.html"/><content type="html">&lt;h1 id="ctl00_ctl00_Content_Title" &gt;How to prevent a DetailView from being shown when a User double clicks or presses the Enter key on a record in a ListView &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;a href="http://www.devexpress.com/Support/Center/kb/p/K18038.aspx"&gt;http://www.devexpress.com/Support/Center/kb/p/K18038.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Tonyyang/aggbug/2300149.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Tonyyang/archive/2011/12/24/2300149.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Tonyyang/archive/2011/12/07/2279195.html</id><title type="text">XAF Using Domain Components (DC) in XAF (DevExpress): Part I: The Basics</title><summary type="text">XAF Using Domain Components (DC) in XAF (DevExpress): Part I: The Basicshttp://www.codeproject.com/KB/ThirdParty/DomainComponentsInXAF_1.aspx相关XAF资源：http://conchcoderepublic.com/Screencasts/eXpandScreencasts.aspxhttp://www.distel.nl/index.php/en/xafexperts-uk/whatxaf-ukhttp://www.expressapp.ru/viewf</summary><published>2011-12-07T05:50:00Z</published><updated>2011-12-07T05:50:00Z</updated><author><name>Tonyyang</name><uri>http://www.cnblogs.com/Tonyyang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Tonyyang/archive/2011/12/07/2279195.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Tonyyang/archive/2011/12/07/2279195.html"/><content type="html">&lt;div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h1 id="ctl00_TitleArea_ArticleTitle" &gt;XAF Using Domain Components (DC) in XAF (DevExpress): Part I: The Basics&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;a href="http://www.codeproject.com/KB/ThirdParty/DomainComponentsInXAF_1.aspx"&gt;http://www.codeproject.com/KB/ThirdParty/DomainComponentsInXAF_1.aspx&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;相关XAF资源：&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&lt;font size="2"&gt;&#xD;
&lt;div&gt;&lt;a href="http://conchcoderepublic.com/Screencasts/eXpandScreencasts.aspx"&gt;http://conchcoderepublic.com/Screencasts/eXpandScreencasts.aspx&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;a href="http://www.distel.nl/index.php/en/xafexperts-uk/whatxaf-uk"&gt;http://www.distel.nl/index.php/en/xafexperts-uk/whatxaf-uk&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;a href="http://www.expressapp.ru/viewforum.php?f=18"&gt;http://www.expressapp.ru/viewforum.php?f=18&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/Tonyyang/aggbug/2279195.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Tonyyang/archive/2011/12/07/2279195.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Tonyyang/archive/2011/12/07/2279033.html</id><title type="text">XAF 一个字段的值改变则另一个字段值也改变的实现</title><summary type="text">方法一：protectedoverridevoidOnChanged(stringpropertyName,objectoldValue,objectnewValue){base.OnChanged(propertyName,oldValue,newValue);if((!IsLoading)&amp;amp;&amp;amp;(!IsDeleted)&amp;amp;&amp;amp;(oldValue!=newValue)){if(propertyName==&amp;quot;ItemA&amp;quot;){//todo}}}方法二：publicpartialclassMyViewController:ViewController{</summary><published>2011-12-07T03:57:00Z</published><updated>2011-12-07T03:57:00Z</updated><author><name>Tonyyang</name><uri>http://www.cnblogs.com/Tonyyang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Tonyyang/archive/2011/12/07/2279033.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Tonyyang/archive/2011/12/07/2279033.html"/><content type="html">&lt;p&gt;&lt;font style="background-color: #c7edcc"&gt;方法一：&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;OnChanged(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;propertyName,&amp;nbsp;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;nbsp;oldValue,&amp;nbsp;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;nbsp;newValue)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.OnChanged(propertyName,&amp;nbsp;oldValue,&amp;nbsp;newValue);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;((!IsLoading)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;(!IsDeleted)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;(oldValue&amp;nbsp;!=&amp;nbsp;newValue))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(propertyName&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ItemA&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;todo&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #c7edcc"&gt;方法二：&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;partial&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;MyViewController&amp;nbsp;:&amp;nbsp;ViewController&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;MyViewController()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InitializeComponent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RegisterActions(components);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;OnActivated()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.OnActivated();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((View&amp;nbsp;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&amp;nbsp;DetailView).FindItem(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ItemA&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;)&amp;nbsp;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&amp;nbsp;PropertyEditor).ValueStored&amp;nbsp;+=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;EventHandler(MyViewController&amp;nbsp;_ValueStored);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;MyViewController&amp;nbsp;_ValueStored(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;EventArgs&amp;nbsp;e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((View&amp;nbsp;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&amp;nbsp;DetailView).FindItem(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ItemB&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;)&amp;nbsp;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&amp;nbsp;ListPropertyEditor).Refresh();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;OnDeactivated()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((View&amp;nbsp;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&amp;nbsp;DetailView).FindItem(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ItemA&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;)&amp;nbsp;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&amp;nbsp;PropertyEditor).ValueStored&amp;nbsp;-=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;EventHandler(MyViewController&amp;nbsp;_ValueStored);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.OnDeactivated();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Tonyyang/aggbug/2279033.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Tonyyang/archive/2011/12/07/2279033.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Tonyyang/archive/2011/12/06/2278092.html</id><title type="text">XAF 11.2权限扩展之角色按钮权限控制</title><summary type="text">扩展XAF 11.2权限 之按钮权限控制1. 需求：XAF系统本身已经带了比较好用权限管理：Object-Level,Class-Level,Member-Level；但是没有对自定义按钮按角色分配的权限控制，因此需实现对自定义按钮的角色权限控制2. 控制方式：角色按钮控制(角色、按钮多对多关系)3. 系统权限类型为SecurityStrategyComplex, AuthenticationStandard(需选择自定义的MySecurityUser和MySecurityRole)4. 需要区分自定义按钮和XAF系统本身自带按钮5. 此按钮权限控制不控制XAF系统自带按钮，也可以通过简单修.</summary><published>2011-12-06T07:48:00Z</published><updated>2011-12-06T07:48:00Z</updated><author><name>Tonyyang</name><uri>http://www.cnblogs.com/Tonyyang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Tonyyang/archive/2011/12/06/2278092.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Tonyyang/archive/2011/12/06/2278092.html"/><content type="html">&amp;nbsp; &#xD;
&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family: SimSun; font-size: 14pt"&gt;扩展&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 14pt"&gt;XAF 11.2&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: SimSun; font-size: 14pt"&gt;权限&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: SimSun"&gt;之按钮权限控制&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -78pt; margin-left: 78pt"&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -78pt; margin-left: 78pt"&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin-left: 18pt"&gt;&lt;span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" &gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: 'Times New Roman'" lang="EN-US"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font face="Times New Roman"&gt;1.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;需求：&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;XAF&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;系统本身已经带了比较好用权限管理：&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;Object-Level,Class-Level,Member-Level&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;；但是没有对自定义按钮按角色分配的权限控制，因此需实现对自定义按钮的角色权限控制&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" &gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: 'Times New Roman'" lang="EN-US"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font face="Times New Roman"&gt;2.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;控制方式：角色按钮控制&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;角色、按钮多对多关系&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" &gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: 'Times New Roman'" lang="EN-US"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font face="Times New Roman"&gt;3.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;系统权限类型为&lt;/span&gt;&lt;font face="Times New Roman"&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;SecurityStrategyComplex,&lt;/span&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;AuthenticationStandard(&lt;/span&gt;&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;需选择自定义的&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;MySecurityUser&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;和&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;MySecurityRole)&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" &gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: 'Times New Roman'" lang="EN-US"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font face="Times New Roman"&gt;4.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;需要区分自定义按钮和&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;XAF&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;系统本身自带按钮&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" &gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: 'Times New Roman'" lang="EN-US"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font face="Times New Roman"&gt;5.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;此按钮权限控制不控制&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;XAF&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;系统自带按钮，也可以通过简单修改能控制其自身按钮&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;未测试&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" &gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: 'Times New Roman'" lang="EN-US"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font face="Times New Roman"&gt;6.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;使用规则，按钮的&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;ID&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;定义需以&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;btn&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;开头。&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" &gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: 'Times New Roman'" lang="EN-US"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font face="Times New Roman"&gt;7.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;系统需自定义&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;User&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;为&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;MySecurityUser&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;和&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;Role&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;为&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;MySecurityRole&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;；&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;定义&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;BO&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;为&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;ActionData&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;；&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;定义&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;ViewContorl&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;为&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;ActionPermissionViewControl&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" &gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: 'Times New Roman'" lang="EN-US"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font face="Times New Roman"&gt;8.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;同步按钮信息功能&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN" lang="ZH-CN"&gt;第一次使用需建立同步按钮信息资料&lt;/span&gt;&lt;span style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun" lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin-left: 18pt"&gt;&lt;span style="font-family: SimSun; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA" lang="ZH-CN"&gt;实现代码：&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun"&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System.Linq;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;DevExpress.ExpressApp.Security;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;DevExpress.Xpo;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;DevExpress.Persistent.Base;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;DevExpress.ExpressApp.DC;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&amp;nbsp;SecurityDemoTest.Module.BusinessObjects&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[XafDisplayName(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;User&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;),&amp;nbsp;Persistent,&amp;nbsp;ImageName(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;BO_User&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;MySecurityUser&amp;nbsp;:&amp;nbsp;SecurityUserWithRolesBase&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;MySecurityUser(DevExpress.Xpo.Session&amp;nbsp;session)&lt;br /&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;:&amp;nbsp;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;(session)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;_Description;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;Description&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;_Description;&lt;br /&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;}&lt;br /&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;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetPropertyValue(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Description&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000ff"&gt;ref&lt;/span&gt;&amp;nbsp;_Description,&amp;nbsp;value);&lt;br /&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System.Linq;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System.Text;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;DevExpress.ExpressApp.Security;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;DevExpress.Xpo;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;DevExpress.Persistent.Base;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&amp;nbsp;SecurityDemoTest.Module.BusinessObjects&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DefaultClassOptions]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;MySecurityRole&amp;nbsp;:&amp;nbsp;SecurityRole&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;MySecurityRole(Session&amp;nbsp;session)&lt;br /&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;:&amp;nbsp;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;(session)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Association(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ActionDatas-MySecurityRoles&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;XPCollection&amp;lt;ActionData&amp;gt;&amp;nbsp;ActionPermissions&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;GetCollection&amp;lt;ActionData&amp;gt;(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ActionPermissions&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;br /&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System.Linq;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System.Text;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;DevExpress.Xpo;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;DevExpress.Xpo.Metadata;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;DevExpress.Persistent.Base;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&amp;nbsp;SecurityDemoTest.Module.BusinessObjects&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DefaultClassOptions,Persistent]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;ActionData&amp;nbsp;:&amp;nbsp;XPObject&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;_ActionId;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;ActionId&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;_ActionId;&lt;br /&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;}&lt;br /&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;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetPropertyValue(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ActionId&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000ff"&gt;ref&lt;/span&gt;&amp;nbsp;_ActionId,&amp;nbsp;value);&lt;br /&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;_Caption;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;Caption&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;_Caption;&lt;br /&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;}&lt;br /&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;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetPropertyValue(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Caption&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000ff"&gt;ref&lt;/span&gt;&amp;nbsp;_Caption,&amp;nbsp;value);&lt;br /&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;_Descritpion;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;Descritpion&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;_Descritpion;&lt;br /&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;}&lt;br /&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;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetPropertyValue(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Descritpion&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000ff"&gt;ref&lt;/span&gt;&amp;nbsp;_Descritpion,&amp;nbsp;value);&lt;br /&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;nbsp;_Enabled;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;nbsp;Enabled&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;_Enabled;&lt;br /&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;}&lt;br /&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;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetPropertyValue(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Enabled&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000ff"&gt;ref&lt;/span&gt;&amp;nbsp;_Enabled,&amp;nbsp;value);&lt;br /&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;MySecurityRole&amp;nbsp;_MyRole;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;ActionData()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;ActionData(Session&amp;nbsp;session)&lt;br /&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;:&amp;nbsp;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;(session)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;ActionData(Session&amp;nbsp;session,&amp;nbsp;XPClassInfo&amp;nbsp;classInfo)&lt;br /&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;:&amp;nbsp;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;(session,&amp;nbsp;classInfo)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;[Association(typeof(MySecurityRole))]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;public&amp;nbsp;MySecurityRole&amp;nbsp;MyRole&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;_MyRole;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetPropertyValue("MyRole",&amp;nbsp;ref&amp;nbsp;_MyRole,&amp;nbsp;value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;}&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;_Kind;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;Kind&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;_Kind;&lt;br /&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;}&lt;br /&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;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetPropertyValue(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Kind&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000ff"&gt;ref&lt;/span&gt;&amp;nbsp;_Kind,&amp;nbsp;value);&lt;br /&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;_Category;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;Category&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;_Category;&lt;br /&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;}&lt;br /&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;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetPropertyValue(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Category&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000ff"&gt;ref&lt;/span&gt;&amp;nbsp;_Category,&amp;nbsp;value);&lt;br /&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Association(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ActionDatas-MySecurityRoles&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;XPCollection&amp;lt;MySecurityRole&amp;gt;&amp;nbsp;MySecurityRoles&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;GetCollection&amp;lt;MySecurityRole&amp;gt;(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;MySecurityRoles&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;br /&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;DevExpress.ExpressApp;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;DevExpress.ExpressApp.Actions;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;DevExpress.ExpressApp.Model;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;DevExpress.Data.Filtering;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;DevExpress.Utils;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;DevExpress.ExpressApp.Core;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&amp;nbsp;SecurityDemoTest.Module.BusinessObjects&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;partial&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;ActionPermissionViewController&amp;nbsp;:&amp;nbsp;ViewController&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;ActionPermissionViewController()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;InitializeComponent();&lt;br /&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;RegisterActions(components);&lt;br /&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;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.TargetObjectType&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(ActionData);&lt;br /&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;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.TargetViewType&amp;nbsp;=&amp;nbsp;ViewType.ListView;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;OnActivated()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&amp;nbsp;(Controller&amp;nbsp;controller&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;Frame.Controllers)&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&amp;nbsp;(ActionBase&amp;nbsp;action&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;controller.Actions)&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(action.Id.StartsWith(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;btn&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;))&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;nbsp;isAction&amp;nbsp;=&amp;nbsp;IsAllowAccessAction(action.Id);&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;action.Active.SetItemValue(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ActionState1&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;isAction);&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;nbsp;IsAllowAccessAction(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;actionId)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;MySecurityUser&amp;nbsp;currentUser&amp;nbsp;=&amp;nbsp;SecuritySystem.CurrentUser&amp;nbsp;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&amp;nbsp;MySecurityUser;&lt;br /&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;Guard.ArgumentNotNull(currentUser,&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;CurrentUser&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;br /&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;Guard.ArgumentIsNotNullOrEmpty(actionId,&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ActionId&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;br /&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;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&amp;nbsp;(MySecurityRole&amp;nbsp;role&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;currentUser.Roles)&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&amp;nbsp;(ActionData&amp;nbsp;ap&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;role.ActionPermissions)&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(ap.ActionId&amp;nbsp;==&amp;nbsp;actionId&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;ap.Kind&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Custom&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;)&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&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;}&lt;br /&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;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;SycAction_Execute(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;SimpleActionExecuteEventArgs&amp;nbsp;e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;SyncActions(btnSycAction);&lt;br /&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;ObjectSpace.CommitChanges();&lt;br /&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;View.ObjectSpace.Refresh();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;SyncActions(ActionBase&amp;nbsp;action)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&amp;nbsp;(IModelAction&amp;nbsp;item&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;action.Model.Application.ActionDesign.Actions)&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ActionData&amp;nbsp;ap&amp;nbsp;=&amp;nbsp;ObjectSpace.FindObject&amp;lt;ActionData&amp;gt;(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;BinaryOperator(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ActionId&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;item.Id));&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(ap&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ap&amp;nbsp;=&amp;nbsp;ObjectSpace.CreateObject&amp;lt;ActionData&amp;gt;();&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ap.ActionId&amp;nbsp;=&amp;nbsp;item.Id;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ap.Caption&amp;nbsp;=&amp;nbsp;item.Caption;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ap.Category&amp;nbsp;=&amp;nbsp;item.Category;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ap.Enabled&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ap.Descritpion&amp;nbsp;=&amp;nbsp;item.ToolTip;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ap.Caption&amp;nbsp;=&amp;nbsp;item.Caption;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ap.Descritpion&amp;nbsp;=&amp;nbsp;item.ToolTip;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ap.Category&amp;nbsp;=&amp;nbsp;item.Category;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(item.Id.StartsWith(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;btn&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;))&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ap.Kind&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Custom&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ap.Kind&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;System&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&amp;nbsp;SecurityDemoTest.Module.BusinessObjects&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;partial&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;ActionPermissionViewController&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Required&amp;nbsp;designer&amp;nbsp;variable.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;System.ComponentModel.IContainer&amp;nbsp;components&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Clean&amp;nbsp;up&amp;nbsp;any&amp;nbsp;resources&amp;nbsp;being&amp;nbsp;used.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param&amp;nbsp;name="disposing"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;true&amp;nbsp;if&amp;nbsp;managed&amp;nbsp;resources&amp;nbsp;should&amp;nbsp;be&amp;nbsp;disposed;&amp;nbsp;otherwise,&amp;nbsp;false.&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;Dispose(&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;nbsp;disposing)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(disposing&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;(components&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;))&lt;br /&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;{&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;components.Dispose();&lt;br /&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;}&lt;br /&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;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.Dispose(disposing);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;#region&lt;/span&gt;&amp;nbsp;Component&amp;nbsp;Designer&amp;nbsp;generated&amp;nbsp;code&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Required&amp;nbsp;method&amp;nbsp;for&amp;nbsp;Designer&amp;nbsp;support&amp;nbsp;-&amp;nbsp;do&amp;nbsp;not&amp;nbsp;modify&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;the&amp;nbsp;contents&amp;nbsp;of&amp;nbsp;this&amp;nbsp;method&amp;nbsp;with&amp;nbsp;the&amp;nbsp;code&amp;nbsp;editor.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;InitializeComponent()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.components&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;System.ComponentModel.Container();&lt;br /&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;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.btnSycAction&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;DevExpress.ExpressApp.Actions.SimpleAction(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.components);&lt;br /&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;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;br /&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;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;btnSycAction&lt;br /&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;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&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;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.btnSycAction.Caption&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;btn&amp;nbsp;Syc&amp;nbsp;Action&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;;&lt;br /&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;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.btnSycAction.ConfirmationMessage&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&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;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.btnSycAction.Id&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;btnSycAction&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;;&lt;br /&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;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.btnSycAction.ImageName&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&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;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.btnSycAction.Shortcut&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&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;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.btnSycAction.Tag&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&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;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.btnSycAction.TargetObjectsCriteria&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&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;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.btnSycAction.TargetViewId&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&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;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.btnSycAction.ToolTip&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&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;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.btnSycAction.TypeOfView&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&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;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.btnSycAction.Execute&amp;nbsp;+=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;DevExpress.ExpressApp.Actions.SimpleActionExecuteEventHandler(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.SycAction_Execute);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;DevExpress.ExpressApp.Actions.SimpleAction&amp;nbsp;btnSycAction;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p style="text-indent: -18pt; margin-left: 18pt"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Tonyyang/aggbug/2278092.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Tonyyang/archive/2011/12/06/2278092.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Tonyyang/archive/2011/11/24/2261131.html</id><title type="text">XAF How to enable LayoutView mode in the GridControl in List Views</title><summary type="text">http://www.devexpress.com/Support/Center/p/E1486.aspxIMPORTANT NOTES1. The LayoutViewListEditor class implemented in this example is not a complete solution, but rather a starting point for creating a custom List Editor based on the XtraGrid&amp;#39;s LayoutView and providing similar features as a stand</summary><published>2011-11-24T00:52:00Z</published><updated>2011-11-24T00:52:00Z</updated><author><name>Tonyyang</name><uri>http://www.cnblogs.com/Tonyyang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Tonyyang/archive/2011/11/24/2261131.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Tonyyang/archive/2011/11/24/2261131.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.devexpress.com/Support/Center/p/E1486.aspx"&gt;http://www.devexpress.com/Support/Center/p/E1486.aspx&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;IMPORTANT NOTES&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; The LayoutViewListEditor class implemented in this example is not a complete solution, but rather a starting point for creating a custom List Editor based on the XtraGrid's LayoutView and providing similar features as a standard GridListEditor. Since this custom List Editor may have issues, you will use it at your own risk. &lt;br /&gt;Refer to the sources of a standard GridListEditor class ("%ProgramFiles\DevExpress 2011.1\eXpressApp Framework\Sources\DevExpress.ExpressApp\DevExpress.ExpressApp.Win\Editors\GridListEditor.cs") and the product documentation for more information about implementing custom List Editors.&lt;br /&gt;You can also track &lt;a href="http://www.devexpress.com/Support/Center/p/S19992.aspx"&gt;S19992&lt;/a&gt; to be automatically notified when the complete solution is available.&lt;br /&gt;&lt;strong&gt;2.&lt;/strong&gt; To see LayoutViewListEditor in action, &lt;a href="http://community.devexpress.com/blogs/eaf/LayoutViewListEditor.zip"&gt;&lt;u&gt;download this video&lt;/u&gt;&lt;/a&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Tonyyang/aggbug/2261131.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Tonyyang/archive/2011/11/24/2261131.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Tonyyang/archive/2011/11/21/2256843.html</id><title type="text">Access 报表打印之分组页码实现(轉)</title><summary type="text">/Files/Tonyyang/报表分组页码V1.2.rarOptionCompareDatabaseOptionExplicit&amp;#39;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^&amp;#39;分组报表显示分组页码和页数类模块(方法一)&amp;#39;&amp;#39;功能:在有分组的报表的每一页上显示组页码和组页数，在预&amp;#39;览时改变页面设置后仍能正确显示。&amp;#39;作者:t小雨(tcl013@126.com)(t小宝)&amp;#39;版本:1.1&amp;#39;创建日期:2008-05-??&amp;#39;整理日期:20</summary><published>2011-11-21T02:43:00Z</published><updated>2011-11-21T02:43:00Z</updated><author><name>Tonyyang</name><uri>http://www.cnblogs.com/Tonyyang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Tonyyang/archive/2011/11/21/2256843.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Tonyyang/archive/2011/11/21/2256843.html"/><content type="html">&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;&lt;a href="http://files.cnblogs.com/Tonyyang/报表分组页码V1.2.rar"&gt;/Files/Tonyyang/报表分组页码V1.2.rar&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;Option&lt;/span&gt;&amp;nbsp;Compare&amp;nbsp;Database&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Option&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Explicit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;分组报表显示分组页码和页数类模块(方法一)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;功&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;能:在有分组的报表的每一页上显示组页码和组页数，在预&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;览时改变页面设置后仍能正确显示。&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;作&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;者:t小雨(tcl013@126.com)(t小宝)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;版&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;本:1.1&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;创建日期:2008-05-??&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;整理日期:2008-05-30&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;补充说明:这个代码是一年前做的，由于实现原理和过程有点复杂，&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;当时没有添加注释，已忘得差不多，加上表达能力有限，&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;现在勉强添加了不完全的注释，但能依照说明会用就行。&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;直接把代码放到报表中也是可以。&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;做成类模块只是为了好保存，以后调用方便，但由于在&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;类模块中不能使用报表的节的事件，调用起来还是有些&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;麻烦，不过总要比直接把代码放在报表简单一点。&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;实现原理：&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;通过报表上的辅助文本框获得组的总行数(记录数,后同)、1页的最大行数、当前页在当前组的截止行数，&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;在页面页脚_Format事件中通过计算得到分组页码和页数。&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;报表设计要求：&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;1、报表应包含组页眉、页面页眉、页面页脚&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;2、在组页眉上有一文本框，有如下属性&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ControlSource(控件来源)="=Count(*)"&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RunningSum(运行总和)=0(不)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;3、在主体有一文本框，有如下属性&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ControlSource(控件来源)="=1"&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RunningSum(运行总和)=1(工作组之上)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;调用方法，有2种：&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;第1种:&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;1、在报表用New关键字声明一个&amp;nbsp;CreateGroupPage1&amp;nbsp;类的新实例&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;2、在报表的打开事件执行实例的&amp;nbsp;Init&amp;nbsp;方法,传入全部参数&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;3、在页面页脚的&amp;nbsp;Format&amp;nbsp;(格式化)事件执行实例的&amp;nbsp;FormatPageFooter&amp;nbsp;方法&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;4、在页面页脚的&amp;nbsp;Print&amp;nbsp;(打印)事件执行实例的&amp;nbsp;PrintPageFooter&amp;nbsp;方法&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;这种方法在显示分组页码的标签上显示效果如&amp;nbsp;分组字段值:&amp;nbsp;1&amp;nbsp;/&amp;nbsp;2&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;在报表中的代码类似下面:&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Dim&amp;nbsp;newGroupPage&amp;nbsp;As&amp;nbsp;New&amp;nbsp;CreateGroupPage1&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Private&amp;nbsp;Sub&amp;nbsp;Report_Open(Cancel&amp;nbsp;As&amp;nbsp;Integer)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newGroupPage.Init&amp;nbsp;Me,&amp;nbsp;Me.TxtGrpRows,&amp;nbsp;Me.txtRunSum,&amp;nbsp;Me.LplGrpPages&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;End&amp;nbsp;Sub&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Private&amp;nbsp;Sub&amp;nbsp;页面页脚_Format(Cancel&amp;nbsp;As&amp;nbsp;Integer,&amp;nbsp;FormatCount&amp;nbsp;As&amp;nbsp;Integer)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newGroupPage.FormatPageFooter&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;End&amp;nbsp;Sub&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Private&amp;nbsp;Sub&amp;nbsp;页面页脚_Print(Cancel&amp;nbsp;As&amp;nbsp;Integer,&amp;nbsp;PrintCount&amp;nbsp;As&amp;nbsp;Integer)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newGroupPage.PrintPageFooter&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;End&amp;nbsp;Sub&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Private&amp;nbsp;Sub&amp;nbsp;组页眉0_Format(Cancel&amp;nbsp;As&amp;nbsp;Integer,&amp;nbsp;FormatCount&amp;nbsp;As&amp;nbsp;Integer)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newGroupPage.FormatGroupLevel1Header&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;End&amp;nbsp;Sub&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;第2种:&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;1、在报表用&amp;nbsp;WithEvents&amp;nbsp;关键字声明一个&amp;nbsp;CreateGroupPage1&amp;nbsp;类的变量&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;2、在报表的打开事件用&amp;nbsp;Set&amp;nbsp;New&amp;nbsp;语句创建新实例&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;3、在报表的打开事件执行实例的&amp;nbsp;Init&amp;nbsp;方法,不须传入最后一个参数(用于显示分组页码的标签)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;4、在页面页脚的&amp;nbsp;Format(格式化)&amp;nbsp;事件执行实例的&amp;nbsp;FormatPageFooter&amp;nbsp;方法&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;5、在页面页脚的&amp;nbsp;Print(打印)&amp;nbsp;事件执行实例的&amp;nbsp;PrintPageFooter&amp;nbsp;方法&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;6、在组页眉的&amp;nbsp;Format(格式化)&amp;nbsp;事件执行实例的&amp;nbsp;FormatGroupLevel1Header&amp;nbsp;方法&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;7、在类的&amp;nbsp;Current&amp;nbsp;事件过程将事件参数返回的分组页码和页数赋给用于显示的标签&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;在报表中的代码类似下面:&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Dim&amp;nbsp;WithEvents&amp;nbsp;newGroupPage&amp;nbsp;As&amp;nbsp;CreateGroupPage1&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Private&amp;nbsp;Sub&amp;nbsp;Report_Open(Cancel&amp;nbsp;As&amp;nbsp;Integer)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set&amp;nbsp;newGroupPage&amp;nbsp;=&amp;nbsp;New&amp;nbsp;CreateGroupPage1&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newGroupPage.Init&amp;nbsp;Me,&amp;nbsp;Me.TxtGrpRows,&amp;nbsp;Me.txtRunSum&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;End&amp;nbsp;Sub&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Private&amp;nbsp;Sub&amp;nbsp;页面页脚_Format(Cancel&amp;nbsp;As&amp;nbsp;Integer,&amp;nbsp;FormatCount&amp;nbsp;As&amp;nbsp;Integer)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newGroupPage.FormatPageFooter&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;End&amp;nbsp;Sub&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Private&amp;nbsp;Sub&amp;nbsp;页面页脚_Print(Cancel&amp;nbsp;As&amp;nbsp;Integer,&amp;nbsp;PrintCount&amp;nbsp;As&amp;nbsp;Integer)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newGroupPage.PrintPageFooter&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;End&amp;nbsp;Sub&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Private&amp;nbsp;Sub&amp;nbsp;组页眉0_Format(Cancel&amp;nbsp;As&amp;nbsp;Integer,&amp;nbsp;FormatCount&amp;nbsp;As&amp;nbsp;Integer)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newGroupPage.FormatGroupLevel1Header&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;End&amp;nbsp;Sub&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Private&amp;nbsp;Sub&amp;nbsp;newGroupPage_Current(GrpPage&amp;nbsp;As&amp;nbsp;Integer,&amp;nbsp;GrpPages&amp;nbsp;As&amp;nbsp;Integer)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Me.LplGrpPages.Caption&amp;nbsp;=&amp;nbsp;Me.类别名称&amp;nbsp;&amp;amp;&amp;nbsp;"&amp;nbsp;共&amp;nbsp;"&amp;nbsp;&amp;amp;&amp;nbsp;GrpPages&amp;nbsp;&amp;amp;&amp;nbsp;"&amp;nbsp;页,第&amp;nbsp;"&amp;nbsp;&amp;amp;&amp;nbsp;GrpPage&amp;nbsp;&amp;amp;&amp;nbsp;"&amp;nbsp;页"&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;End&amp;nbsp;Sub&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&amp;nbsp;Event&amp;nbsp;Current(GrpPage&amp;nbsp;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;,&amp;nbsp;GrpPages&amp;nbsp;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;在此自定义事件中可以获取分组页码信息，以便自定义显示页码格式&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&amp;nbsp;MyRpt&amp;nbsp;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&amp;nbsp;Report&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&amp;nbsp;txtRunSum&amp;nbsp;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&amp;nbsp;TextBox&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;取得每个组的记录数的文本框&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&amp;nbsp;TxtGrpRows&amp;nbsp;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&amp;nbsp;TextBox&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;取得每个组的记录在组中的序号的文本框&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&amp;nbsp;lblShowPage&amp;nbsp;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&amp;nbsp;Label&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;用于显示分组页码信息的标签&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&amp;nbsp;inMaxRows&amp;nbsp;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;1页的最大行数(记录数)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&amp;nbsp;inRptPage&amp;nbsp;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;报表本身页码&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&amp;nbsp;blPrint&amp;nbsp;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Boolean&lt;/span&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;&amp;nbsp;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;是否已经发生页面页脚的Print事件,为避免页面页脚的Format事件中的代码重复运行&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&amp;nbsp;blFistPage&amp;nbsp;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Boolean&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;当前页是否是所在组的第一页&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&amp;nbsp;Init(rpt&amp;nbsp;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&amp;nbsp;Report,&amp;nbsp;GrpRows&amp;nbsp;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&amp;nbsp;TextBox,&amp;nbsp;RunSum&amp;nbsp;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&amp;nbsp;TextBox,&amp;nbsp;Optional&amp;nbsp;ShowPage&amp;nbsp;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&amp;nbsp;Label)&lt;br /&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;过程中的检查参数代码不是必须的，仅为了防止以后忘记如何设计报表&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&amp;nbsp;st1&amp;nbsp;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&amp;nbsp;MyRpt&amp;nbsp;=&amp;nbsp;rpt&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&amp;nbsp;TxtGrpRows&amp;nbsp;=&amp;nbsp;GrpRows&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;With&lt;/span&gt;&amp;nbsp;TxtGrpRows&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&amp;nbsp;.Section&amp;nbsp;&amp;lt;&amp;gt;&amp;nbsp;acGroupLevel1Header&amp;nbsp;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;br /&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;st1&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;作为第二个参数的文本框必须在分组页眉节上！&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;ElseIf&lt;/span&gt;&amp;nbsp;.ControlSource&amp;nbsp;&amp;lt;&amp;gt;&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;=Count(*)&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;br /&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;st1&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;作为第二个参数的文本框的ControlSource属性必须是""=Count(*)""！&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;ElseIf&lt;/span&gt;&amp;nbsp;.RunningSum&amp;nbsp;&amp;lt;&amp;gt;&amp;nbsp;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;br /&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;st1&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;作为第二个参数的文本框的RunningSum属性必须是0！&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;With&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Len&lt;/span&gt;(st1)&amp;nbsp;&amp;gt;&amp;nbsp;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;MsgBox&lt;/span&gt;&amp;nbsp;st1,&amp;nbsp;vbExclamation,&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;参数错误&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Exit&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&amp;nbsp;txtRunSum&amp;nbsp;=&amp;nbsp;RunSum&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;With&lt;/span&gt;&amp;nbsp;txtRunSum&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&amp;nbsp;.Section&amp;nbsp;&amp;lt;&amp;gt;&amp;nbsp;acDetail&amp;nbsp;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;br /&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;&amp;nbsp;st1&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;作为第三个参数的文本框必须在报表主体节上！&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;ElseIf&lt;/span&gt;&amp;nbsp;.ControlSource&amp;nbsp;&amp;lt;&amp;gt;&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;=1&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;br /&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;st1&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;作为第三个参数的文本框的ControlSource属性必须是""=1""！&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;ElseIf&lt;/span&gt;&amp;nbsp;.RunningSum&amp;nbsp;&amp;lt;&amp;gt;&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;br /&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;st1&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;作为第三个参数的文本框的RunningSum属性必须是1！&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;With&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Len&lt;/span&gt;(st1)&amp;nbsp;&amp;gt;&amp;nbsp;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;MsgBox&lt;/span&gt;&amp;nbsp;st1,&amp;nbsp;vbExclamation,&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;参数错误&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Exit&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Not&lt;/span&gt;&amp;nbsp;(ShowPage&amp;nbsp;&lt;span style="color: #0000ff"&gt;Is&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;)&amp;nbsp;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&amp;nbsp;lblShowPage&amp;nbsp;=&amp;nbsp;ShowPage&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;End&amp;nbsp;Sub&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&amp;nbsp;FormatGroupLevel1Header()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&amp;nbsp;txtRunSum&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&amp;nbsp;blFistPage&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;为页面页脚Format事件作标记&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&amp;nbsp;Sub&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&amp;nbsp;FormatPageFooter()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&amp;nbsp;inGrpPage&amp;nbsp;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;组页码&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&amp;nbsp;inGrpPages&amp;nbsp;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;组页数&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&amp;nbsp;inLastRows&amp;nbsp;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;截止当前页,所在组的所有行数&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inLastRows&amp;nbsp;=&amp;nbsp;txtRunSum&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;从文本框获得截止行数&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&amp;nbsp;inLastRows&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&amp;nbsp;inLastRows&amp;nbsp;=&amp;nbsp;TxtGrpRows&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&amp;nbsp;MyRpt.Page&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;在第1页初始变量&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&amp;nbsp;MyRpt.Pages&amp;nbsp;&amp;gt;&amp;nbsp;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;And&lt;/span&gt;&amp;nbsp;MyRpt.Pages&amp;nbsp;=&amp;nbsp;inRptPage&amp;nbsp;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;这里已经是第2轮格式化第1页，报表加载时进行两轮格式化，第一轮Pages=0&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Else&lt;/span&gt;&lt;br /&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;inMaxRows&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inRptPage&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;blPrint&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;False&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Not&lt;/span&gt;&amp;nbsp;blPrint&amp;nbsp;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;仅在第1轮格式化中,获取每组第一页的行数&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&amp;nbsp;blFistPage&amp;nbsp;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;每组第一页的行数即是本组任一页的最大行数&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&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;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&amp;nbsp;inMaxRows&amp;nbsp;&amp;lt;&amp;nbsp;inLastRows&amp;nbsp;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&amp;nbsp;inMaxRows&amp;nbsp;=&amp;nbsp;inLastRows&lt;br /&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;blFistPage&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;False&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inRptPage&amp;nbsp;=&amp;nbsp;inRptPage&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&amp;nbsp;MyRpt.Pages&amp;nbsp;&amp;gt;&amp;nbsp;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inGrpPages&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;Int&lt;/span&gt;(TxtGrpRows&amp;nbsp;/&amp;nbsp;inMaxRows&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800080"&gt;0.9999&lt;/span&gt;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;组的总行数除以1页的行数，得到组的页数&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inGrpPage&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;Int&lt;/span&gt;(inLastRows&amp;nbsp;/&amp;nbsp;inMaxRows&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800080"&gt;0.9999&lt;/span&gt;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;截止当前页的累计行数除以1页的行数，得到当前页的页码&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Not&lt;/span&gt;&amp;nbsp;(lblShowPage&amp;nbsp;&lt;span style="color: #0000ff"&gt;Is&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;)&amp;nbsp;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;br /&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;lblShowPage.Caption&amp;nbsp;=&amp;nbsp;inGrpPage&amp;nbsp;&amp;amp;&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;&amp;amp;&amp;nbsp;inGrpPages&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RaiseEvent&amp;nbsp;Current(inGrpPage,&amp;nbsp;inGrpPages)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;End&amp;nbsp;Sub&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&amp;nbsp;PrintPageFooter()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;blPrint&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;End&amp;nbsp;Sub&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;方法二：&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;Option&amp;nbsp;Compare&amp;nbsp;Database&lt;br /&gt;Option&amp;nbsp;Explicit&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;分组报表显示分组页码和页数类模块(方法二)&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;功&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;能:在有分组的报表的每一页上显示组页码和组页数，在预&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;览时改变页面设置后仍能正确显示。&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;作&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;者:t小雨(tcl013@126.com)(t小宝)&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;版&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;本:1.1&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;创建日期:2008-05-??&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;整理日期:2008-05-30&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;补充说明:这个代码是一年前做的，由于实现原理和过程相当复杂，&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;当时没有添加注释，已忘得差不多，加上表达能力有限，&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;现在勉强添加了不完全的注释，但能依照说明会用就行。&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;直接把代码放到报表中也是可以。&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;做成类模块只是为了好保存，以后调用方便，但由于在&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;类模块中不能使用报表的节的事件，调用起来还是有些&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;麻烦，不过总要比直接把代码放在报表简单一点。&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;实现原理：&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;报表加载后：会发生两轮从第1页到最后1页每页的格式化事件，每轮结束后发生一次打印事件，&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;在第一轮格式化事件中报表的Pages属性始终为0。最后还会移到第一页。&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;重设纸张边距、方向或大小等后也发生类似上述过程，情况相对复杂一点，就不细说了。&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;在这些事件中把页码信息保存到数组中，数组元素和报表页数一样，每个元素代表一页的信息。&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;移动页后：也会发生一次格式化事件，在这些事件中把数组中页码的信息显示出来。&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;上面所说的事件都是页面页脚的事件。&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;报表设计要求：&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;很简单，有一个分组字段和页面页脚即可&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;调用方法有2种：&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;第1种:&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;1、在报表用New关键字声明一个&amp;nbsp;CreateGroupPage2&amp;nbsp;类的新实例&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;2、在报表的打开事件执行实例的&amp;nbsp;Init&amp;nbsp;方法,传入报表、分组字段和用于显示分组页码的标签&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;3、在页面页脚的&amp;nbsp;Format&amp;nbsp;(格式化)事件执行实例的&amp;nbsp;FormatPageFooter&amp;nbsp;方法&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;4、在页面页脚的&amp;nbsp;Print&amp;nbsp;(打印)事件执行实例的&amp;nbsp;PrintPageFooter&amp;nbsp;方法&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;这种方法在显示分组页码的标签上显示效果如&amp;nbsp;分组字段值:&amp;nbsp;1&amp;nbsp;/&amp;nbsp;2&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;在报表中的代码类似下面:&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;Dim&amp;nbsp;newGroupPage&amp;nbsp;As&amp;nbsp;New&amp;nbsp;CreateGroupPage2&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;Private&amp;nbsp;Sub&amp;nbsp;Report_Open(Cancel&amp;nbsp;As&amp;nbsp;Integer)&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newGroupPage.Init&amp;nbsp;Me,&amp;nbsp;Me.类别ID,&amp;nbsp;Me.LplGrpPages&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;End&amp;nbsp;Sub&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;Private&amp;nbsp;Sub&amp;nbsp;页面页脚_Format(Cancel&amp;nbsp;As&amp;nbsp;Integer,&amp;nbsp;FormatCount&amp;nbsp;As&amp;nbsp;Integer)&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newGroupPage.FormatPageFooter&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;End&amp;nbsp;Sub&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;Private&amp;nbsp;Sub&amp;nbsp;页面页脚_Print(Cancel&amp;nbsp;As&amp;nbsp;Integer,&amp;nbsp;PrintCount&amp;nbsp;As&amp;nbsp;Integer)&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newGroupPage.PrintPageFooter&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;End&amp;nbsp;Sub&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;br /&gt;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;第2种:&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;1、在报表用&amp;nbsp;WithEvents&amp;nbsp;关键字声明一个&amp;nbsp;CreateGroupPage2&amp;nbsp;类的变量&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;2、在报表的打开事件用&amp;nbsp;Set&amp;nbsp;New&amp;nbsp;语句创建新实例&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;3、在报表的打开事件执行实例的&amp;nbsp;Init&amp;nbsp;方法,传入报表、分组字段,不须传入用于显示分组页码的标签&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;4、在页面页脚的&amp;nbsp;Format(格式化)&amp;nbsp;事件执行实例的&amp;nbsp;FormatPageFooter&amp;nbsp;方法&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;5、在页面页脚的&amp;nbsp;Print(打印)&amp;nbsp;事件执行实例的&amp;nbsp;PrintPageFooter&amp;nbsp;方法&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;6、在类的&amp;nbsp;Current&amp;nbsp;事件过程将事件参数返回的分组页码和页数赋给用于显示的标签&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;在报表中的代码类似下面:&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;Dim&amp;nbsp;WithEvents&amp;nbsp;newGroupPage&amp;nbsp;As&amp;nbsp;CreateGroupPage2&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;Private&amp;nbsp;Sub&amp;nbsp;Report_Open(Cancel&amp;nbsp;As&amp;nbsp;Integer)&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set&amp;nbsp;newGroupPage&amp;nbsp;=&amp;nbsp;New&amp;nbsp;CreateGroupPage2&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newGroupPage.Init&amp;nbsp;Me,&amp;nbsp;Me.类别ID,&amp;nbsp;Me.LplGrpPages&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;End&amp;nbsp;Sub&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;Private&amp;nbsp;Sub&amp;nbsp;页面页脚_Format(Cancel&amp;nbsp;As&amp;nbsp;Integer,&amp;nbsp;FormatCount&amp;nbsp;As&amp;nbsp;Integer)&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newGroupPage.FormatPageFooter&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;End&amp;nbsp;Sub&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;Private&amp;nbsp;Sub&amp;nbsp;页面页脚_Print(Cancel&amp;nbsp;As&amp;nbsp;Integer,&amp;nbsp;PrintCount&amp;nbsp;As&amp;nbsp;Integer)&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newGroupPage.PrintPageFooter&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;End&amp;nbsp;Sub&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;Private&amp;nbsp;Sub&amp;nbsp;newGroupPage_Current(GrpPage&amp;nbsp;As&amp;nbsp;Integer,&amp;nbsp;GrpPages&amp;nbsp;As&amp;nbsp;Integer)&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Me.LplGrpPages.Caption&amp;nbsp;=&amp;nbsp;Me.类别名称&amp;nbsp;&amp;amp;&amp;nbsp;"&amp;nbsp;共&amp;nbsp;"&amp;nbsp;&amp;amp;&amp;nbsp;GrpPages&amp;nbsp;&amp;amp;&amp;nbsp;"&amp;nbsp;页,第&amp;nbsp;"&amp;nbsp;&amp;amp;&amp;nbsp;GrpPage&amp;nbsp;&amp;amp;&amp;nbsp;"&amp;nbsp;页"&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;End&amp;nbsp;Sub&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;br /&gt;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;这种方法在显示分组页码的标签上显示效果是自定义的&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Public&amp;nbsp;Event&amp;nbsp;Current(GrpPage&amp;nbsp;As&amp;nbsp;Integer,&amp;nbsp;GrpPages&amp;nbsp;As&amp;nbsp;Integer)&lt;br /&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;在此自定义事件中可以获取分组页码信息，以便自定义显示页码格式&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Dim&amp;nbsp;MyRpt&amp;nbsp;As&amp;nbsp;Report&lt;br /&gt;Dim&amp;nbsp;ctrGroup&amp;nbsp;As&amp;nbsp;Control&lt;br /&gt;Dim&amp;nbsp;lblShowPage&amp;nbsp;As&amp;nbsp;Label&lt;br /&gt;&lt;br /&gt;Dim&amp;nbsp;blPrint&amp;nbsp;As&amp;nbsp;Boolean&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;是否已经发生页面页脚的Print事件,为避免页面页脚的Format事件中的代码重复运行&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;Dim&amp;nbsp;stGroupText&amp;nbsp;As&amp;nbsp;String&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;分组字段值&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Dim&amp;nbsp;inRptPage&amp;nbsp;As&amp;nbsp;Integer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;报表页号&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;Dim&amp;nbsp;inGrpPage&amp;nbsp;As&amp;nbsp;Integer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;组页号&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Dim&amp;nbsp;ainGrpPage()&amp;nbsp;As&amp;nbsp;Integer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;保存组页号的数组,用于显示&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;Dim&amp;nbsp;ainGrpPages()&amp;nbsp;As&amp;nbsp;Integer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;保存每个组的总页数的数组,用于显示&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Dim&amp;nbsp;ainGrpPageTmp()&amp;nbsp;As&amp;nbsp;Integer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;保存组页号的数组,临时&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;Dim&amp;nbsp;ainGrpPagesTmp()&amp;nbsp;As&amp;nbsp;Integer&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;保存每个组的总页数的数组,临时&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Public&amp;nbsp;Sub&amp;nbsp;Init(rpt&amp;nbsp;As&amp;nbsp;Report,&amp;nbsp;Group&amp;nbsp;As&amp;nbsp;Control,&amp;nbsp;Optional&amp;nbsp;ShowPage&amp;nbsp;As&amp;nbsp;Label)&lt;br /&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;rpt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:报表本身,必须&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Group&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:用于分组的字段,必须&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;ShowPage&amp;nbsp;:用于显示分组页码的标签,可选&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set&amp;nbsp;MyRpt&amp;nbsp;=&amp;nbsp;rpt&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set&amp;nbsp;ctrGroup&amp;nbsp;=&amp;nbsp;Group&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If&amp;nbsp;Not&amp;nbsp;(ShowPage&amp;nbsp;Is&amp;nbsp;Nothing)&amp;nbsp;Then&amp;nbsp;Set&amp;nbsp;lblShowPage&amp;nbsp;=&amp;nbsp;ShowPage&lt;br /&gt;&lt;br /&gt;End&amp;nbsp;Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Public&amp;nbsp;Sub&amp;nbsp;FormatPageFooter()&lt;br /&gt;&lt;br /&gt;Dim&amp;nbsp;inShowGrpPage&amp;nbsp;As&amp;nbsp;Integer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;显示的组页码&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;Dim&amp;nbsp;inShowGrpPages&amp;nbsp;As&amp;nbsp;Integer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;显示的组页数&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;Dim&amp;nbsp;i&amp;nbsp;As&amp;nbsp;Integer,&amp;nbsp;j&amp;nbsp;As&amp;nbsp;Integer&lt;br /&gt;&lt;br /&gt;If&amp;nbsp;MyRpt.Page&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&amp;nbsp;Then&lt;br /&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;在第1页初始变量&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If&amp;nbsp;inRptPage&amp;nbsp;&amp;gt;&amp;nbsp;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&amp;nbsp;And&amp;nbsp;inRptPage&amp;nbsp;=&amp;nbsp;MyRpt.Pages&amp;nbsp;Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;报表加载后第一轮格式化完毕发生&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For&amp;nbsp;j&amp;nbsp;=&amp;nbsp;inRptPage&amp;nbsp;-&amp;nbsp;inGrpPage&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&amp;nbsp;To&amp;nbsp;inRptPage&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&lt;/span&gt;&lt;br /&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;ainGrpPagesTmp(j)&amp;nbsp;=&amp;nbsp;inGrpPage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReDim&amp;nbsp;ainGrpPage(&lt;span style="color: #800080"&gt;1&lt;/span&gt;&amp;nbsp;To&amp;nbsp;inRptPage)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;这一段代码与后面一段代码一样，因为后面无法判断加载完成&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReDim&amp;nbsp;ainGrpPages(&lt;span style="color: #800080"&gt;1&lt;/span&gt;&amp;nbsp;To&amp;nbsp;inRptPage)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For&amp;nbsp;i&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&amp;nbsp;To&amp;nbsp;inRptPage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;br /&gt;&lt;/span&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;ainGrpPage(i)&amp;nbsp;=&amp;nbsp;ainGrpPageTmp(i)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;br /&gt;&lt;/span&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;ainGrpPages(i)&amp;nbsp;=&amp;nbsp;ainGrpPagesTmp(i)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End&amp;nbsp;If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inRptPage&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inGrpPage&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stGroupText&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000"&gt;""&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;blPrint&amp;nbsp;=&amp;nbsp;False&lt;br /&gt;End&amp;nbsp;If&lt;br /&gt;&lt;br /&gt;If&amp;nbsp;Not&amp;nbsp;blPrint&amp;nbsp;Then&lt;br /&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;仅在第一轮格式化中获取页位置，保存到临时数组&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inRptPage&amp;nbsp;=&amp;nbsp;inRptPage&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReDim&amp;nbsp;Preserve&amp;nbsp;ainGrpPageTmp(&lt;span style="color: #800080"&gt;1&lt;/span&gt;&amp;nbsp;To&amp;nbsp;inRptPage)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReDim&amp;nbsp;Preserve&amp;nbsp;ainGrpPagesTmp(&lt;span style="color: #800080"&gt;1&lt;/span&gt;&amp;nbsp;To&amp;nbsp;inRptPage)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If&amp;nbsp;stGroupText&amp;nbsp;=&amp;nbsp;ctrGroup&amp;nbsp;Then&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;当前页与上一页在同一组&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inGrpPage&amp;nbsp;=&amp;nbsp;inGrpPage&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;累计本组页数，也即获得当前页在当前组中的页码&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Else&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;当前页与上一页不在同一组，换组&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For&amp;nbsp;j&amp;nbsp;=&amp;nbsp;inRptPage&amp;nbsp;-&amp;nbsp;inGrpPage&amp;nbsp;To&amp;nbsp;inRptPage&amp;nbsp;-&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;循环上一组的每一页&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&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;ainGrpPagesTmp(j)&amp;nbsp;=&amp;nbsp;inGrpPage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;每个元素都储存总页数，页在组中的最大序号即总页数&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inGrpPage&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;重新开始累计本组页数&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stGroupText&amp;nbsp;=&amp;nbsp;ctrGroup&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End&amp;nbsp;If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ainGrpPageTmp(inRptPage)&amp;nbsp;=&amp;nbsp;inGrpPage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;每个元素都储存页在组中的页码&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;End&amp;nbsp;If&lt;br /&gt;&lt;br /&gt;If&amp;nbsp;MyRpt.Page&amp;nbsp;=&amp;nbsp;MyRpt.Pages&amp;nbsp;Then&lt;br /&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;报表已打开后重设纸张边距大小方向等会发生&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If&amp;nbsp;inRptPage&amp;nbsp;=&amp;nbsp;MyRpt.Pages&amp;nbsp;Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;仅在最后一页把临时数组中的页码信息更新到用于显示页码的数组&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For&amp;nbsp;j&amp;nbsp;=&amp;nbsp;inRptPage&amp;nbsp;-&amp;nbsp;inGrpPage&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&amp;nbsp;To&amp;nbsp;inRptPage&lt;br /&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;ainGrpPagesTmp(j)&amp;nbsp;=&amp;nbsp;inGrpPage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;这个循环代码与上面有重复，因为上面无法判断最后一页&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReDim&amp;nbsp;ainGrpPage(&lt;span style="color: #800080"&gt;1&lt;/span&gt;&amp;nbsp;To&amp;nbsp;inRptPage)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;数组大小为报表页数&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReDim&amp;nbsp;ainGrpPages(&lt;span style="color: #800080"&gt;1&lt;/span&gt;&amp;nbsp;To&amp;nbsp;inRptPage)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For&amp;nbsp;i&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&amp;nbsp;To&amp;nbsp;inRptPage&lt;br /&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;ainGrpPage(i)&amp;nbsp;=&amp;nbsp;ainGrpPageTmp(i)&lt;br /&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;ainGrpPages(i)&amp;nbsp;=&amp;nbsp;ainGrpPagesTmp(i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End&amp;nbsp;If&lt;br /&gt;End&amp;nbsp;If&lt;br /&gt;&lt;br /&gt;On&amp;nbsp;Error&amp;nbsp;Resume&amp;nbsp;Next&lt;br /&gt;&lt;br /&gt;If&amp;nbsp;MyRpt.Pages&amp;nbsp;&amp;gt;&amp;nbsp;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&amp;nbsp;Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inShowGrpPages&amp;nbsp;=&amp;nbsp;ainGrpPages(MyRpt.Page)&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inShowGrpPage&amp;nbsp;=&amp;nbsp;ainGrpPage(MyRpt.Page)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000"&gt;'&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If&amp;nbsp;Not&amp;nbsp;(lblShowPage&amp;nbsp;Is&amp;nbsp;Nothing)&amp;nbsp;Then&amp;nbsp;lblShowPage.Caption&amp;nbsp;=&amp;nbsp;_&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctrGroup&amp;nbsp;&amp;amp;&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;&amp;amp;&amp;nbsp;inShowGrpPage&amp;nbsp;&amp;amp;&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;&amp;amp;&amp;nbsp;inShowGrpPages&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RaiseEvent&amp;nbsp;Current(inShowGrpPage,&amp;nbsp;inShowGrpPages)&lt;br /&gt;End&amp;nbsp;If&lt;br /&gt;&lt;br /&gt;End&amp;nbsp;Sub&lt;br /&gt;&lt;br /&gt;Public&amp;nbsp;Sub&amp;nbsp;PrintPageFooter()&lt;br /&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;区分两轮格式化&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;blPrint&amp;nbsp;=&amp;nbsp;True&lt;br /&gt;End&amp;nbsp;Sub&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/Tonyyang/aggbug/2256843.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Tonyyang/archive/2011/11/21/2256843.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Tonyyang/archive/2011/10/21/2220039.html</id><title type="text">XAF Store Model Differences in Database Using Complex Security</title><summary type="text">http://www.devexpress.com/Support/Center/p/Q341530.aspxhttp://www.devexpress.com/Support/Center/p/S38032.aspx</summary><published>2011-10-21T03:39:00Z</published><updated>2011-10-21T03:39:00Z</updated><author><name>Tonyyang</name><uri>http://www.cnblogs.com/Tonyyang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Tonyyang/archive/2011/10/21/2220039.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Tonyyang/archive/2011/10/21/2220039.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.devexpress.com/Support/Center/p/Q341530.aspx"&gt;http://www.devexpress.com/Support/Center/p/Q341530.aspx&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.devexpress.com/Support/Center/p/S38032.aspx"&gt;http://www.devexpress.com/Support/Center/p/S38032.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Tonyyang/aggbug/2220039.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Tonyyang/archive/2011/10/21/2220039.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Tonyyang/archive/2011/10/17/2215199.html</id><title type="text">XAF How to set size of a popup detail view</title><summary type="text">How to set size of a popup detail viewhttp://community.devexpress.com/forums/p/105313/356765.aspx#356765privatevoidApplication_CustomizeTemplate(objectsender,CustomizeTemplateEventArgse){this.Application.CustomizeTemplate-=this.Application_CustomizeTemplate;(e.TemplateasForm).Size=newSize(440,260);}</summary><published>2011-10-17T03:40:00Z</published><updated>2011-10-17T03:40:00Z</updated><author><name>Tonyyang</name><uri>http://www.cnblogs.com/Tonyyang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Tonyyang/archive/2011/10/17/2215199.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Tonyyang/archive/2011/10/17/2215199.html"/><content type="html">&lt;p&gt;How to set size of a popup detail view&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://community.devexpress.com/forums/p/105313/356765.aspx#356765"&gt;http://community.devexpress.com/forums/p/105313/356765.aspx#356765&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;Application_CustomizeTemplate(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;CustomizeTemplateEventArgs&amp;nbsp;e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Application.CustomizeTemplate&amp;nbsp;-=&amp;nbsp;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Application_CustomizeTemplate;&lt;br /&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;(e.Template&amp;nbsp;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&amp;nbsp;Form).Size&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;Size(&lt;span style="color: #800080"&gt;440&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080"&gt;260&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;font style="background-color: #ffffff"&gt;&lt;/font&gt;&lt;img src="http://www.cnblogs.com/Tonyyang/aggbug/2215199.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Tonyyang/archive/2011/10/17/2215199.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
