<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Lau Yee .Net</title><subtitle type="text"> 勤奋是最基础的素质。</subtitle><id>http://feed.cnblogs.com/blog/u/54261/rss</id><updated>2012-04-12T05:37:31Z</updated><author><name>Junior Lau</name><uri>http://www.cnblogs.com/lauyee/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lauyee/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/54261/rss"/><entry><id>http://www.cnblogs.com/lauyee/archive/2010/08/06/1794474.html</id><title type="text">&amp;quot;1px&amp;quot;不差—应用程序布局，适合CRM、ERP</title><summary type="text">适合CRM、ERP可以用到的框架布局，高度宽度都做到了自适应。右侧的iframe也是高度自适应 。调整了不同浏览器那几个px的差异,多种浏览器表现一模一样。只是使用的标准的简单的CSS代码，代码简单但是还是比较细致的。基本没有用到CSS hack。初学者，高手都只得一看。 我知道，一般程序员，都比较烦这个，不屑于做这个东西。如果觉得有用拿去用吧，如果觉得没用。仍几块砖给我。&lt;!DOCTYPE ht...</summary><published>2010-08-06T15:31:00Z</published><updated>2010-08-06T15:31:00Z</updated><author><name>Junior Lau</name><uri>http://www.cnblogs.com/lauyee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lauyee/archive/2010/08/06/1794474.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lauyee/archive/2010/08/06/1794474.html"/><content type="html">&lt;script type="text/javascript"&gt;// &lt;![CDATA[  function run_code() {    var code = document.getElementById("ohmy_code").value;    var new_win = window.open("", "", "");    new_win.opener = null;    new_win.document.write(code);    new_win.document.close();  }// ]]&gt;&lt;/script&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 适合CRM、ERP可以用到的框架布局，高度宽度都做到了自适应。右侧的iframe也是高度自适应 。调整了不同浏览器那几个px的差异,多种浏览器表现一模一样。只是使用的标准的简单的CSS代码，代码简单但是还是比较细致的。基本没有用到CSS hack。初学者，高手都只得一看。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我知道，一般程序员，都比较烦这个，不屑于做这个东西。如果觉得有用拿去用吧，如果觉得没用。仍几块砖给我。&lt;br /&gt;&lt;textarea cols="31" rows="20" id="ohmy_code" style="width: 630px; height: 359px;"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&amp;lt;head&amp;gt;    &amp;lt;title&amp;gt;无标题页&amp;lt;/title&amp;gt;    &amp;lt;style&amp;gt;       body, html        {            margin: 0;            height: 100%;            background-color: Aqua;            overflow: hidden;        }        #top        {            height: 80px;            width: auto;        }        #middle        {            border-style: solid;            border-width: 1px 0px;            border-color: #000000;            width: 100%;            height: auto;            top: 80px;            bottom: 20px;            position: absolute;            background-color: DarkGray;        }        #bottom        {            height: 20px;            width: auto;            bottom: 0;            position: absolute;        }        #left        {            float: left;            width: 200px;            border-right: solid 1px White;            overflow: auto;            height: 100%; /* 兼容代码 */            top: 0px;            bottom: 0px;            position: absolute;            left: 0px; /* 兼容代码 */        }        #right        {            background-color: #efefef;            overflow: auto;            height: 100%; /* 兼容代码 */            left: 201px;            top: 0px;            bottom: 0px;            position: absolute;            right: 0px; /* 兼容代码 */        }        #main        {            top: 0px;            bottom: 0px;            position: absolute;            width: 100%;            height: 100%;        }    &amp;lt;/style&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;    &amp;lt;form id="form1"&amp;gt;    &amp;lt;div id="divAll"&amp;gt;        &amp;lt;div id="top"&amp;gt;          &amp;lt;h3&amp;gt;Logo&amp;lt;/h3&amp;gt;        &amp;lt;/div&amp;gt;        &amp;lt;div id="middle"&amp;gt;            &amp;lt;div id="left"&amp;gt;                left&amp;lt;br /&amp;gt;                left&amp;lt;br /&amp;gt;                left&amp;lt;br /&amp;gt;                left&amp;lt;br /&amp;gt;                left&amp;lt;br /&amp;gt;导航                left&amp;lt;br /&amp;gt;导航                left&amp;lt;br /&amp;gt;导航导航                left&amp;lt;br /&amp;gt;导航                left&amp;lt;br /&amp;gt;导航导航                left&amp;lt;br /&amp;gt;                left&amp;lt;br /&amp;gt;                left&amp;lt;br /&amp;gt;                left&amp;lt;br /&amp;gt;                left&amp;lt;br /&amp;gt;                left&amp;lt;br /&amp;gt;                left&amp;lt;br /&amp;gt;                left&amp;lt;br /&amp;gt;                left&amp;lt;br /&amp;gt;                left&amp;lt;br /&amp;gt;                left&amp;lt;br /&amp;gt;            &amp;lt;/div&amp;gt;            &amp;lt;div id="right"&amp;gt;                &amp;lt;iframe src="http://www.cnblogs.com" frameborder="0"                  marginheight="0" id="main" name="main"&amp;gt;&amp;lt;/iframe&amp;gt;            &amp;lt;/div&amp;gt;        &amp;lt;/div&amp;gt;        &amp;lt;div id="bottom"&amp;gt;           版权信息        &amp;lt;/div&amp;gt;    &amp;lt;/div&amp;gt;    &amp;lt;/form&amp;gt;&amp;lt;/body&amp;gt;&lt;/textarea&gt;&lt;/p&gt;&lt;p&gt;&lt;input type="button" value="运行代码" onclick="run_code()" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 补：看到很多朋友提出疑问，说即用了绝对定位，有用了浮动。那是经过调了几次发现只有这样才能显示正常。如果你使用IE8浏览器，则注释和注释之间的部分都是可以省去的。对于CSS我其实也是门外汉，以上代码都是经过尝试做出的。能用就是王道。有些朋友说IE6下iframe会出现问题。这真是一个值得在修改尝试的问题，因为企业里用IE6的也不在少数。所以了解原理在加上实践才是最可行的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;在实际的应用中如果要做到精致，很难不用js再对样式做出调整，总之解决问题才是最重要的王道，其次是代码简洁。而技巧，我们也只能当它是技巧。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 补：另一件郁闷的事，博客园的这个&amp;ldquo;HTML 原始程序代码编辑器&amp;rdquo;在我把代码贴进去后自动生成了两套样式，不知是什么原因。已改正。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lauyee/aggbug/1794474.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lauyee/archive/2010/08/06/1794474.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lauyee/archive/2010/07/26/1783694.html</id><title type="text">Visual Studio2010 Microsoft 报表 #1</title><summary type="text">前段时间我负责的一个项目中因为报表的缘故让项目整整延期了3个月。虽然也有客户方的原因，而我们公司的领导也能体谅到项目组的难处。但是终究还是被扣掉了一些项目奖金。客户的报表太过重于格式了，这一点客户方也没有办法，因为他们的表格样式是集团公司指定好的，不能随意更改。我们的客户大多来自于有国企性质的公司。所以为了以后项目的快速实施，必须找到一种方便，快捷，最重要能满足需求的报表工具。在那个项目过后，我尝...</summary><published>2010-07-26T01:02:00Z</published><updated>2010-07-26T01:02:00Z</updated><author><name>Junior Lau</name><uri>http://www.cnblogs.com/lauyee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lauyee/archive/2010/07/26/1783694.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lauyee/archive/2010/07/26/1783694.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 前段时间我负责的一个项目中因为报表的缘故让项目整整延期了3个月。虽然也有客户方的原因，而我们公司的领导也能体谅到项目组的难处。但是终究还是被扣掉了一些项目奖金。客户的报表太过重于格式了，这一点客户方也没有办法，因为他们的表格样式是集团公司指定好的，不能随意更改。我们的客户大多来自于有国企性质的公司。所以为了以后项目的快速实施，必须找到一种方便，快捷，最重要能满足需求的报表工具。&lt;/p&gt;&lt;p&gt;&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;在那个项目过后，我尝试使用了很多种报表工具，但都觉得不是很能满足我们的要求。我们也曾经想过自己实现一种报表工具，但出于人手、时间、和经费、可行性的考虑最终还是打消了这个念头。这个时候微软发布了SQL Server&amp;nbsp;2008 R2,它另我为异常兴奋。这正是我们做要寻找的工具。但是很遗憾&lt;label for="Editor_Edit_APOptions_Advancedpanel1_cklCategories_4"&gt;Visual Studio 2008 的本地报表并不支持SQL Server&amp;nbsp;2008 R2的报表格式。(关于本地报表和服务器报表以及RDL和RDLC之间的互相转换下次再讲)由于我们的客户大多使用Oracle服务器，所以不能使用SQL Server报表服务，所以直到VS2010的正式发布，我们才能真正将这个非常好用的工具用于实际的项目之中。&lt;/label&gt;&lt;/p&gt;&lt;p&gt;&lt;label for="Editor_Edit_APOptions_Advancedpanel1_cklCategories_4"&gt;&lt;/label&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;label for="Editor_Edit_APOptions_Advancedpanel1_cklCategories_4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;本页里我将和大家分享一下VS2010 ReprotViewer所能够实现的功能，并以一个快速的实例让朋友们能够快速的上手。&lt;/label&gt;&lt;/p&gt;&lt;p&gt;&lt;label for="Editor_Edit_APOptions_Advancedpanel1_cklCategories_4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://files.cnblogs.com/lauyee/RdlcReports.rar"&gt;本文中的源代码下载&lt;/a&gt;，可以配合下面的step by step使用，如果你习惯阅读，那么可以不用看下面的部分。也节省不少时间。&lt;/label&gt;&lt;/p&gt;&lt;p&gt;&lt;label for="Editor_Edit_APOptions_Advancedpanel1_cklCategories_4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果你之前使用过水晶报表或类似工具可能会对理解次文很有帮助。但是我猜想，即使之前你没有有过报表工具也会很容易的上手使用微软报表。你可以单纯的把微软报表工具当成是一个普通的控件使用。可以使用在asp.net项目中，winforms项目中，和wpf项目中。让我们来以一个实际的例子来熟悉一下他的使用。（使用VS2010）&lt;/label&gt;&lt;/p&gt;&lt;p&gt;&lt;label for="Editor_Edit_APOptions_Advancedpanel1_cklCategories_4"&gt;&lt;/label&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;label for="Editor_Edit_APOptions_Advancedpanel1_cklCategories_4"&gt;1、创建一个asp.net 空 Web 应用程序。(当然你喜欢也可以创建网站、Windows窗体应用程序、WPF应用程序。本文以Web项目为例，再附带的源代码中你可以找到Winform和wpf的例子)&lt;/label&gt;&lt;/p&gt;&lt;p&gt;&lt;label for="Editor_Edit_APOptions_Advancedpanel1_cklCategories_4"&gt;2、添加一个aspx页面。&lt;/label&gt;&lt;/p&gt;&lt;p&gt;&lt;label for="Editor_Edit_APOptions_Advancedpanel1_cklCategories_4"&gt;3、在工具栏-报表选项卡找到ReportViewer控件拖到页面中，并调整控件的大小。&lt;/label&gt;&lt;/p&gt;&lt;p&gt;&lt;label for="Editor_Edit_APOptions_Advancedpanel1_cklCategories_4"&gt;4、组织一个数据源。&lt;/label&gt;&lt;/p&gt;&lt;p&gt;&lt;label for="Editor_Edit_APOptions_Advancedpanel1_cklCategories_4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;你可以使用你程序里现有的数据源，也可以直接用类型化的DataSet来连接数据库得到。这里我们使用2这两种方法分别做演示，如果你想使用EF或其他形式的数据源我们以后再做介绍。&lt;/label&gt;&lt;/p&gt;&lt;p&gt;&lt;label for="Editor_Edit_APOptions_Advancedpanel1_cklCategories_4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1）选择添加-新建项，创建一个数据集，我们为改名，就使用默认的名称DataSet1.xsd。&lt;/label&gt;&lt;/p&gt;&lt;p&gt;&lt;label for="Editor_Edit_APOptions_Advancedpanel1_cklCategories_4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2）使用TableAdapter 配置向导向DataSet1.xsd中添加一个DataTable.（选择一个你数据库中已有的表）下面是我创建的一个DataTable.&lt;/label&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img src="http://pic002.cnblogs.com/img/lauyee/201007/2010072601073530.png" /&gt;很抱歉都个小懒，我的表只有两个字段一个填充方法。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;我们在创建一个类用作对象数据源，很高兴微软报表支持一个报表内使用不同的数据源。下面是我的：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="padding-left: 30px;"&gt;namespace RdlcReports.Model&lt;br/&gt;{&lt;br/&gt;    public class info&lt;br/&gt;    {&lt;br/&gt;        public string Author { get; set; }&lt;br/&gt;        public string Blog { get; set; }&lt;br/&gt;        public string Email { get; set; }&lt;br/&gt;&lt;br/&gt;        public info(string author, string blog, string Email)&lt;br/&gt;        {&lt;br/&gt;            this.Author = author;&lt;br/&gt;            this.Blog = blog;&lt;br/&gt;            this.Email = Email;&lt;br/&gt;        }&lt;br/&gt;        public info()&lt;br/&gt;        { &lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;      public  List&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt; Getinfo()&lt;br/&gt;        {&lt;br/&gt;            List&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt; objdata = new List&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;&lt;info&gt;&lt;/info&gt;();&lt;br/&gt;            objdata.Add(new info("junior lau", "www.cnblogs.com", "Email:Lauyee@foxmail.com"));&lt;br/&gt;            return objdata;&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;5、接下来我们创建一个报表文件。选择添加-新建项-报表。我这里创建了一个名为Report1.rdlc的报表文件。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我有点迫不及待了，才到这里。下面是我的界面&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201007/2010072601313641.png" /&gt;&lt;/p&gt;&lt;p&gt;6、点击报表数据-新建-数据集，选择一个数据源。这时候我们可以把刚才创建的Dataset1的计划表添加到报表的数据源中。&lt;/p&gt;&lt;p&gt;1)你可以直接向上面那样用设计器添加一个类型化的DataSet到报表的数据源，但是我发现在Web项目中没有可以让你选择的可视化的操作。如果你使用WinForm做这个练习，很幸运设计器强帮你完成一切。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2）如果你想使用对象数据源，如用上面所创建的info类作为数据源，可以直接修改.rdlc源代码(用右键Report1.rdlc选择打开方式--XML（文本）编辑器要比直接右击-查看代码好一点)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;将下面代码拷贝到&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DataSources&amp;gt;&amp;lt;/DataSources&amp;gt;标签之间&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &amp;lt;DataSource Name="RdlcReportsModel"&amp;gt;&lt;br/&gt;      &amp;lt;ConnectionProperties&amp;gt;&lt;br/&gt;        &amp;lt;DataProvider&amp;gt;System.Data.DataSet&amp;lt;/DataProvider&amp;gt;&lt;br/&gt;        &amp;lt;ConnectString&amp;gt;/* Local Connection */&amp;lt;/ConnectString&amp;gt;&lt;br/&gt;      &amp;lt;/ConnectionProperties&amp;gt;&lt;br/&gt;      &amp;lt;rd:DataSourceID&amp;gt;bf49000a-37a9-4c7a-ae02-33575f080028&amp;lt;/rd:DataSourceID&amp;gt;&lt;br/&gt;    &amp;lt;/DataSource&amp;gt;&lt;br/&gt;&lt;/div&gt;&lt;p&gt;将下面代码拷贝到&amp;lt;DataSets&amp;gt;&amp;lt;/DataSets&amp;gt;之间&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;  &amp;lt;DataSet Name="DataSet2"&amp;gt;&lt;br/&gt;      &amp;lt;Fields&amp;gt;&lt;br/&gt;        &amp;lt;Field Name="Author"&amp;gt;&lt;br/&gt;          &amp;lt;DataField&amp;gt;Author&amp;lt;/DataField&amp;gt;&lt;br/&gt;          &amp;lt;rd:TypeName&amp;gt;System.String&amp;lt;/rd:TypeName&amp;gt;&lt;br/&gt;        &amp;lt;/Field&amp;gt;&lt;br/&gt;        &amp;lt;Field Name="Blog"&amp;gt;&lt;br/&gt;          &amp;lt;DataField&amp;gt;Blog&amp;lt;/DataField&amp;gt;&lt;br/&gt;          &amp;lt;rd:TypeName&amp;gt;System.String&amp;lt;/rd:TypeName&amp;gt;&lt;br/&gt;        &amp;lt;/Field&amp;gt;&lt;br/&gt;        &amp;lt;Field Name="Email"&amp;gt;&lt;br/&gt;          &amp;lt;DataField&amp;gt;Email&amp;lt;/DataField&amp;gt;&lt;br/&gt;          &amp;lt;rd:TypeName&amp;gt;System.String&amp;lt;/rd:TypeName&amp;gt;&lt;br/&gt;        &amp;lt;/Field&amp;gt;&lt;br/&gt;      &amp;lt;/Fields&amp;gt;&lt;br/&gt;      &amp;lt;Query&amp;gt;&lt;br/&gt;        &amp;lt;DataSourceName&amp;gt;RdlcReportsModel&amp;lt;/DataSourceName&amp;gt;&lt;br/&gt;        &amp;lt;CommandText&amp;gt;/* Local Query */&amp;lt;/CommandText&amp;gt;&lt;br/&gt;      &amp;lt;/Query&amp;gt;&lt;br/&gt;      &amp;lt;rd:DataSetInfo&amp;gt;&lt;br/&gt;        &amp;lt;rd:DataSetName&amp;gt;RdlcReports.Model&amp;lt;/rd:DataSetName&amp;gt;&lt;br/&gt;        &amp;lt;rd:TableName&amp;gt;info&amp;lt;/rd:TableName&amp;gt;&lt;br/&gt;        &amp;lt;rd:ObjectDataSourceType&amp;gt;RdlcReports.Model.info, RdlcReports.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null&amp;lt;/rd:ObjectDataSourceType&amp;gt;&lt;br/&gt;      &amp;lt;/rd:DataSetInfo&amp;gt;&lt;br/&gt;    &amp;lt;/DataSet&amp;gt;&lt;br/&gt;&lt;/div&gt;&lt;p&gt;现在你将得到以下的画面：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201007/2010072607514298.png" /&gt;&lt;/p&gt;&lt;p&gt;接下来，你可以自由设计你的报表了，下面是我的。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201007/2010072607580865.png" /&gt;&lt;/p&gt;&lt;p&gt;7、下来开始完成aspx页面。就是拖ReportViewer控件，更改其属性让其指向.rdlc文件。直接贴代码了。忘了一点页面上需要一个ScriptManager控件。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;body&amp;gt;&lt;br/&gt;    &amp;lt;form id="form1" runat="server"&amp;gt;&lt;br/&gt;    &amp;lt;div&amp;gt;&lt;br/&gt;    &lt;br/&gt;        &amp;lt;rsweb:ReportViewer ID="ReportViewer1" runat="server" Font-Names="Verdana" &lt;br/&gt;            Font-Size="8pt" Height="414px" InteractiveDeviceInfos="(集合)" &lt;br/&gt;            WaitMessageFont-Names="Verdana" WaitMessageFont-Size="14pt" Width="716px"&amp;gt;&lt;br/&gt;            &amp;lt;LocalReport ReportPath="Report1.rdlc"&amp;gt;&lt;br/&gt;             &lt;br/&gt;                &amp;lt;DataSources&amp;gt;&lt;br/&gt;                    &amp;lt;rsweb:ReportDataSource DataSourceId="ObjectDataSource1" Name="DataSet1" /&amp;gt;&lt;br/&gt;                    &amp;lt;rsweb:ReportDataSource DataSourceId="ObjectDataSource2" Name="DataSet2" /&amp;gt;&lt;br/&gt;                &amp;lt;/DataSources&amp;gt;&lt;br/&gt;             &lt;br/&gt;            &amp;lt;/LocalReport&amp;gt;&lt;br/&gt;        &amp;lt;/rsweb:ReportViewer&amp;gt;&lt;br/&gt;        &amp;lt;asp:ScriptManager ID="ScriptManager1" runat="server"&amp;gt;&lt;br/&gt;        &amp;lt;/asp:ScriptManager&amp;gt;&lt;br/&gt;        &amp;lt;asp:ObjectDataSource ID="ObjectDataSource1" runat="server" &lt;br/&gt;            SelectMethod="GetData" &lt;br/&gt;            TypeName="RdlcReports.Web.DataSet1TableAdapters.计划TableAdapter"&amp;gt;&lt;br/&gt;        &amp;lt;/asp:ObjectDataSource&amp;gt;&lt;br/&gt;     &amp;lt;asp:ObjectDataSource ID="ObjectDataSource2" runat="server"&lt;br/&gt;    SelectMethod="Getinfo" &lt;br/&gt;            TypeName="RdlcReports.Model.info"&amp;gt;&lt;br/&gt;    &lt;br/&gt;    &amp;lt;/asp:ObjectDataSource&amp;gt;&lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;&lt;br/&gt;    &amp;lt;/form&amp;gt;&lt;br/&gt;&amp;lt;/body&amp;gt;&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;后台没有写一句话，现在运行程序，就会出现以下的话面。(&lt;span style="color: #ff0000;"&gt;附带的原代码包含了一种，用代码在后台绑定的模式，而不是在页面使用ObjectDataSource控件&lt;/span&gt;)&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201007/2010072608430688.png" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 好了，好像写了好多，但是其实操作很简单，也没有多少难度，只是让大家对微软报表有一个基本的概念。本来来打算在讲一点功能介绍呢，就留到下一节吧。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 附带的原代码中不包含，win和wpf的代码，(win要比web简单些)如果你需要也可以回复向我索取，或者在下一节下载代码。我计划在这个可能结束的时候将代码发布为一个小的开源项目。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 编码愉快！！下次见。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lauyee/aggbug/1783694.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lauyee/archive/2010/07/26/1783694.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lauyee/archive/2010/07/18/1780124.html</id><title type="text">Visual Studio 2010 和中国式报表(RDLC)</title><summary type="text">在项目中选择一种好用的报表工具一直是一件很困扰的事情。由于国内项目报表的特殊需求所以要在.net环境下选择一种合适的报表，总是让人觉得不是那么的满意。 从常见项目中使用报表的角度出发，我们使用报表的需求其实很单一，大多数情况我们只需要这样一种报表。1、纯平面表格形式。 如果常见的报表都支持，纯文本、表格、列表、矩阵、图片、图表、仪表、子报表、嵌套报表的话。实际上真正常用的可能只是，表格、列表和矩阵...</summary><published>2010-07-18T09:04:00Z</published><updated>2010-07-18T09:04:00Z</updated><author><name>Junior Lau</name><uri>http://www.cnblogs.com/lauyee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lauyee/archive/2010/07/18/1780124.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lauyee/archive/2010/07/18/1780124.html"/><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在项目中选择一种好用的报表工具一直是一件很困扰的事情。由于国内项目报表的特殊需求所以要在.net环境下选择一种合适的报表，总是让人觉得不是那么的满意。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 从常见项目中使用报表的角度出发，我们使用报表的需求其实很单一，大多数情况我们只需要这样一种报表。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1、纯平面表格形式。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果常见的报表都支持，纯文本、表格、列表、矩阵、图片、图表、仪表、子报表、嵌套报表的话。实际上真正常用的可能只是，表格、列表和矩阵。首先、从客户的技术层次出发，过于复杂的表现表现形式，不见的对客户有用。一般报表的使用着都不是电脑的操作高手。此次、客户喜欢或习惯里看平面的报表，不是说下钻不好，而是客户希望你将所有可能的信息在一个见面里全部直观展现出来。按照以前我的一个客户的老板的说法就是，你最好我一打开什么信息都有了。所以往往设计出来的报表很不规则，虽然只是一个平面的表格报表。却难倒了一片报表工具。&lt;/p&gt;&lt;p&gt;典型的报表格式可能是这样：（下面是我做过的一个项目中的真实的报表，在这个项目中有共计报表进100张）&lt;/p&gt;&lt;p&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XXXXX集团主要销售指标完成情况&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201007/2010071814453537.png" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2、我们需要一个一个斜线、和多行表头&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在这一点上大多数的报表工具几乎都可能通过变通的方式来满足需求，但基本上在导出Excel或其他格式之后以及打印报表的时候，斜线全不见了。很多报表工具用拼接或表格套表格的方式达到目标，这时有产生了其他方面的问题。如果是像下面这种斜线，一般报表工具就更加为难了。应对于水晶报表等其他报表工具，很多用&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Delphi.html" style="color: #0000aa; text-decoration: none;"&gt;Delphi&lt;/a&gt;开发的国产的报表工具还表现不错，但是要在.net的项目中用这种报表总是让人觉得心里很别扭。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img src="http://pic002.cnblogs.com/img/lauyee/201007/2010071815012540.png" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3、报表工具的其他用途&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我们公司的一个项目经理喜欢借助报表的预览和打印功能来完成其他一些功能，如：合同的打印、单据的打印。谁说这不可以呢。这就要求报表工具最好能实现一些开放功能的API接口。这一方面外国的报表工具基本上都能支持。只是感觉好像他们提供的不恨是我们想要的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4、一些对报表工具的变态的要求&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;有一个同事来找我帮忙解决这样一个问题。客户在导出报表之后，要求用windows系统自带的搜索功能，搜索到某个指定关键字的文件。很奇怪，水晶报表导出的word格式文件中，搜索不到汉字在表格中的文件。例如：一个word文件中有一个表格，如果用表格中的汉字作为搜索的关键字，就搜不到了。经查看才知道，水晶报表导出的word文件，文字全部放在了一个文本框之中，而不是直接写到表格里。最后我给他提供了两种方案解决，1、让他自己实现一种导出word的方法。2、说服客户用系统自带的搜索功能。他最终选择了后者。之所以认为是变态的要求其实是报表工具的不完美，不是所有的客户都会妥协。既然我们也可以是报表工具的客户，我们也有权利向他们提出这种变态的要求。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 很多项目中我们都对报表的强大功能和丰富的表现力要求不是很强烈，根本就不需要什么这功能那功能，但我需要它能把它的基本的功能做到极致。很多时候客户不是上帝，而是我们的衣食父母。就算你能很快速的满足他们的90%的需求，但是只有有10%的需求不能满足，他们会认为你们不行。一种b/s下极端的通用的问题解决方案就是。所有的报表有美工完成静态的html表格.然后又开发人员在表格中插入数据，或者用asp.net 页面插入后台代码（&amp;lt;% &amp;nbsp;%&amp;gt;）的语法对表格进行循环。不幸的是真的有人这么做过。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #993d00;"&gt;&amp;nbsp;&lt;span style="color: #dd0314;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 做行业顾问、或者是做企业管理解决方案有时候是一种美丽的神话和骗局。我甚至不相信sap能真正教导他的大型客户管理，所做的也只是尽可能满足客户的需求罢了。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #dd0314;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在大型的产业中，软件公司不可能指导客户管理，更不可能对客户行业做出规范。我们的客户都是上亿资产的公司，可能发展了几十年。而我们只有几千万的资本，发展积累也只不过几年的时间，就算了解、和追赶也有好多年的差距，所以我们怎么可能去规范客户业务。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #dd0314;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果有行业顾问，不可能出自软件公司。真正能规范客户业务的不是软件公司，而是客户自己本身。所以我们所说的规范，也只是是规范我们的软件操作罢了，也可能是处于对复杂的业务环境的一种妥协。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #000000;"&gt;写了这么多发现有点扯的太多了，到现在为止还没有进入正题。好了长话短说，今天主要想说的是微软的报表，也就是Visual Studio自带的报表工具。既然是介绍它那必选先夸他一下。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;广告1：有了微软报表工具，我再也不为找报表工具发愁了。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;广告2：自从有了微软报表工具，斜线不用愁了，复合表头实现了，也在不怕和客户谈需求了。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;广告3：使用微软报表，是您.net项目下最佳的选择。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;广告4：小刘干嘛呢？&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;研究水晶报表。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 别研究了，我给你介绍一件新工具：微软报表。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 还在研究水晶报表？&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 水晶报表是什么？&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 要使用微软的报表，首先我们用到的是ReportViewer这个控件，然后要将这个控件指向一个报表文件，可以选择服务器报表和本地报表两种模式。及(RDLC和RDL)两种报表文件采用同一种XML格式。有2种工具可以产生报表文件。1是vs2010,另一个是&lt;em&gt;Report Builder 3.0&lt;/em&gt;后者采用office系列的外观模式，主要是面向的非开发人员自定义报表。微软视乎绝的像做报表这样简单的事情就不需要开发人员了。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果你使用过vs2008的微软报表工具，你会发现在vs2010中报表设计器发生了巨大的变更。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 编辑器的改良，更具有可操作性和实用性。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 集成了全球最好的dundas图表、仪表控件。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 解决了原来的纵向单元格不能合并的问题。使用起来就像操纵html编辑器。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 解决了矩阵中动态行、列和静态列共存的问题。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 增加了报表块的功能。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 更完美的互交式排序支持。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 更强浏览器的打印功能。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 行头、列头的冻结功能。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;加上原有的功能，与.net的浑然天成，强大的API接口。几乎是我心慕中完美的报表。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;最后贴几张图片，因为需要实际的复杂点的例子才能够说明问题，所以有机会将来用他做一个具体的案例在做说明了。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img src="http://pic002.cnblogs.com/img/lauyee/201007/2010071816545255.png" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201007/2010071816552740.png" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201007/2010071816561098.png" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201007/2010071816564765.png" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201007/2010071816571777.png" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MSDN中关于Visual Studio 2010版的帮助文档还没有更新，大家要学只能先看sql server 2008的文档了。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我这里收集了一些自定义RDL文件的资料和开源报表引擎项目，有需要的回复索取了。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lauyee/aggbug/1780124.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lauyee/archive/2010/07/18/1780124.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lauyee/archive/2010/06/21/1756978.html</id><title type="text">XAF中的自定义属性编辑器</title><summary type="text">XAF是什么，如果您没听说过，本文可能对你没有帮助，但如果你正在查找同样问题的解决方法希望对你有所帮助。(注：所举得例子全部是Web工程下的，Win工程原理相同)XAF自动从业务类生成UI。自动的根据业务类各属性的类型生成所需的属性编辑器。比如，对于一个业务类中的String型的属性，生成的是一个文本框(从界面看是那样)。对Datetime型的属性生成一个日期选择框。常用的属性编辑器类见下表（We...</summary><published>2010-06-21T12:39:00Z</published><updated>2010-06-21T12:39:00Z</updated><author><name>Junior Lau</name><uri>http://www.cnblogs.com/lauyee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lauyee/archive/2010/06/21/1756978.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lauyee/archive/2010/06/21/1756978.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XAF是什么，如果您没听说过，本文可能对你没有帮助，但如果你正在查找同样问题的解决方法希望对你有所帮助。(注：所举得例子全部是Web工程下的，Win工程原理相同)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XAF自动从业务类生成UI。自动的根据业务类各属性的类型生成所需的属性编辑器。比如，对于一个业务类中的String型的属性，生成的是一个文本框(从界面看是那样)。对Datetime型的属性生成一个日期选择框。&lt;/p&gt;&lt;p&gt;常用的属性编辑器类见下表（Web工程下）：&lt;/p&gt;&lt;table border="1" style="width: 784px; border-collapse: collapse; height: 35px; border: #333 1px solid;"&gt;&lt;tbody&gt;&lt;tr style="background: #eee;"&gt;&lt;td&gt;&lt;strong&gt;&lt;em&gt;Tpye&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;&lt;em&gt;PropertyEditorType&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;&lt;em&gt;备注&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;String&lt;/td&gt;&lt;td&gt;DevExpress.ExpressApp.Web.Editors.ASPx.ASPxStringProertyEditor&lt;/td&gt;&lt;td&gt;展示文本框&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Int32&lt;/td&gt;&lt;td&gt;DevExpress.ExpressApp.Web.Editors.ASPx.ASPxIntProertyEditor&lt;/td&gt;&lt;td&gt;展示可调整的数字输入框&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Boolean&lt;/td&gt;&lt;td&gt;DevExpress.ExpressApp.Web.Editors.ASPx.ASPxBooleanProertyEditor&lt;/td&gt;&lt;td&gt;选中按钮&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Datetime&lt;/td&gt;&lt;td&gt;DevExpress.ExpressApp.Web.Editors.ASPx.ASPxDatetimeProertyEditor&lt;/td&gt;&lt;td&gt;时间框&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Enum&lt;/td&gt;&lt;td&gt;DevExpress.ExpressApp.Web.Editors.ASPx.ASPxEnumProertyEditor&lt;/td&gt;&lt;td&gt;下拉框&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;lt;BaseObject&amp;gt;&lt;/td&gt;&lt;td&gt;DevExpress.ExpressApp.Web.Editors.ASPx.ASPxLookupPropertyEditor&lt;/td&gt;&lt;td&gt;下拉框,通常是同这个对象形成一对多的关系&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在创建业务类的时候这些对象自动和业务类的属性关联，不需要再做声明。还可以选择其他的属性编辑器。可以在Xafml文件的Application | Views | Items | PropertyEditor节点或Application | Views | Items | PropertyEditor节点找到。如：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;与 Rating 属性相应的 Application | Views | Items | PropertyEditor 节点:&lt;/li&gt;&lt;/ul&gt;&amp;lt;Application&amp;gt;&lt;br/&gt;   &amp;lt;Views&amp;gt;&lt;br/&gt;      &amp;lt;DetailView ID="Song_DetailView"&amp;gt;&lt;br/&gt;         &amp;lt;Items&amp;gt;&lt;br/&gt;            &amp;lt;PropertyEditor PropertyName="Rating" &lt;br/&gt;               PropertyEditorType="MySolution.Module.Web.MySolutionAspNetModule.WebStarRatingPropertyEditor" /&amp;gt;&lt;br/&gt;         &amp;lt;/Items&amp;gt;&lt;br/&gt;      &amp;lt;/DetailView&amp;gt;&lt;br/&gt;   &amp;lt;/Views&amp;gt;&lt;br/&gt;&amp;lt;/Application&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;与 Rating 属性相应的 Application | BOModel | Class | Member 节点:&lt;/li&gt;&lt;/ul&gt;&amp;lt;Application&amp;gt;&lt;br/&gt;   &amp;lt;Views&amp;gt;&lt;br/&gt;      &amp;lt;DetailView ID="Song_DetailView"&amp;gt;&lt;br/&gt;         &amp;lt;Items&amp;gt;&lt;br/&gt;            &amp;lt;PropertyEditor PropertyName="Rating" &lt;br/&gt;               PropertyEditorType="MySolution.Module.Web.MySolutionAspNetModule.WebStarRatingPropertyEditor" /&amp;gt;&lt;br/&gt;         &amp;lt;/Items&amp;gt;&lt;br/&gt;      &amp;lt;/DetailView&amp;gt;&lt;br/&gt;   &amp;lt;/Views&amp;gt;&lt;br/&gt;&amp;lt;/Application&amp;gt;&lt;br/&gt;&lt;p&gt;当然最好的做法是用可视化的模型编辑器，也是可以在两个节点下找到，如图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201006/2010061214475439.png" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201006/2010061214282397.png" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 针对属性的类型不同，允许选择的类型不同。上图是字符串类型允许选择的属性编辑器。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;所有的属性编辑器都要由PropertyEditor类继承。继承结构是这样的：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201006/2010061216483831.jpg" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 要实现一个自定义的属性编辑器，首先要确定从哪一个PropertyEditor的派生类继承，以及要是用的控件。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 现在我要做的是：实现一个一对多关系的下拉属性编辑框。下拉框的要实现成树状结构。一开始我打算从ASPxLookupPropertyEditor继承，他是业务类型默认的属性编辑器。但是这一次有点麻烦，ASPxLookupPropertyEditor类包含的控件是ASPxComboBox，ASPxComboBox控件中无法包含一颗树。因为绑定的是一个对象，而不是一个简单的值，所以上述列表中的PropertyEditor的派生类都不适合。这一次我选择继承的是ASPxObjectPropertyEditorBase类。这是对象属性编辑器的基类。ASPxLookupPropertyEditor类就由这个类继承。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 因为代码和方法相对比较少，重点只是在于你可能需要在好多个重写的方法中找到合适的那个，所以就不用画类图了。直接贴出代码：（再看代码的时候按所标注释的编号看，那是我完成代码的顺序）&lt;/p&gt; [PropertyEditor()]//为了在上图的模型编辑器中会出现你自定义的编辑器，要加上这句代码。可以有参数，表示编辑器的数据类型。&lt;br/&gt;    public class ASPxTreePropertyEditor : ASPxObjectPropertyEditorBase&lt;br/&gt;    {&lt;br/&gt;&lt;br/&gt;        private WebLookupEditorHelper helper;&lt;br/&gt;        public ASPxTreePropertyEditor(Type objectType, IModelMemberViewItem model)&lt;br/&gt;            : base(objectType, model)&lt;br/&gt;        {&lt;br/&gt;            skipEditModeDataBind = true;&lt;br/&gt;        }&lt;br/&gt;        //1、集成了借口之后你需要实现的只有这一个重写方法，目的就在于要返回一个自定义的属性编辑器(也就是一个控件)&lt;br/&gt;        protected override WebControl CreateEditModeControlCore()&lt;br/&gt;        {&lt;br/&gt;            return CreateTreeDropDown();&lt;br/&gt;        }&lt;br/&gt;        TreeDropDown CreateTreeDropDown()&lt;br/&gt;        {&lt;br/&gt;            try&lt;br/&gt;            {&lt;br/&gt;                //2、具体的控件需要用到一个下拉书的控件，我在另一个类中实现了这个控件。&lt;br/&gt;                TreeDropDown treeDropDown = new TreeDropDown();&lt;br/&gt;&lt;br/&gt;                treeDropDown.TreeList.DataSource = helper.CreateListView(CurrentObject).CollectionSource.List;&lt;br/&gt;                treeDropDown.TreeList.KeyFieldName = "Oid";&lt;br/&gt;                treeDropDown.TreeList.ParentFieldName = "Parent!Key";&lt;br/&gt;                treeDropDown.TreeList.ClientInstanceName = "TreeList";&lt;br/&gt;                treeDropDown.TreeList.Width = Unit.Parse("100%");&lt;br/&gt;                treeDropDown.ClientInstanceName = "DropDownEdit";&lt;br/&gt;                treeDropDown.TreeList.PreviewFieldName = "Name";&lt;br/&gt;                TreeListTextColumn col = new TreeListTextColumn();&lt;br/&gt;                col.Name = "Name";&lt;br/&gt;                col.FieldName = "Name";&lt;br/&gt;                treeDropDown.TreeList.Columns.Add(col);&lt;br/&gt;                treeDropDown.ReadOnly = true;&lt;br/&gt;                treeDropDown.TreeList.SettingsBehavior.AutoExpandAllNodes = true;&lt;br/&gt;                treeDropDown.TreeList.CustomCallback += new TreeListCustomCallbackEventHandler(TreeList_CustomCallback);&lt;br/&gt;                return treeDropDown;&lt;br/&gt;            }&lt;br/&gt;            catch (Exception e)&lt;br/&gt;            {&lt;br/&gt;                throw e;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        //7、由于ASPxTreeList没有节点点击时间，所以我用了客户端的点击事件，让他返回一个回调方法。&lt;br/&gt;        void TreeList_CustomCallback(object sender, TreeListCustomCallbackEventArgs e)&lt;br/&gt;        {&lt;br/&gt;            //这里是用户在用户改变选择项的时候，重新为属性赋值。以保存对象。&lt;br/&gt;            ((TreeDropDown)Editor).Value = helper.GetObjectByKey(CurrentObject, e.Argument);&lt;br/&gt;            EditValueChangedHandler(sender, EventArgs.Empty);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        // 6 、再绑定数据时需要用到一个helper对象，用来创建数据列表&lt;br/&gt;        public override void Setup(ObjectSpace objectSpace, XafApplication application)&lt;br/&gt;        {&lt;br/&gt;            base.Setup(objectSpace, application);&lt;br/&gt;            if (MemberInfo.IsPersistent)&lt;br/&gt;            {&lt;br/&gt;                helper = new WebLookupEditorHelper(application, objectSpace, MemberInfo.MemberTypeInfo, Model);&lt;br/&gt;            }&lt;br/&gt;            else&lt;br/&gt;            {&lt;br/&gt;                helper = new WebLookupNonPersistentEditorHelper(application, objectSpace, MemberInfo.MemberTypeInfo, Model);&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    //3、之后我生成了这个类。&lt;br/&gt;    class TreeDropDown : DevExpress.Web.ASPxEditors.ASPxDropDownEdit&lt;br/&gt;    {&lt;br/&gt;        ASPxTreeList treeList;&lt;br/&gt;        public ASPxTreeList TreeList&lt;br/&gt;        {&lt;br/&gt;            get&lt;br/&gt;            {&lt;br/&gt;                return treeList;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        public TreeDropDown()&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            treeList = new ASPxTreeList();&lt;br/&gt;            //4、在这个类中我需要向他添加一个包含有ASPxTreeList控件的模板，所以要实现一个ITemplate接口&lt;br/&gt;            this.DropDownWindowTemplate = new TreeListTemplate(treeList);&lt;br/&gt;        }&lt;br/&gt;        protected override void OnPreRender(EventArgs e)&lt;br/&gt;        {&lt;br/&gt;            string script = @" &amp;lt;script type='text/javascript'&amp;gt;&lt;br/&gt;            function RowClickHandler(s, e) {&lt;br/&gt;                DropDownEdit.SetKeyValue(e.nodeKey);&lt;br/&gt;                TreeList.GetNodeValues(e.nodeKey, 'Name', setDropDownText);&lt;br/&gt;                DropDownEdit.HideDropDown();&lt;br/&gt;                TreeList.PerformCallback(e.nodeKey);&lt;br/&gt;            }&lt;br/&gt;            function setDropDownText(value) {&lt;br/&gt;                DropDownEdit.SetText(value)&lt;br/&gt;            }&amp;lt;/script&amp;gt;  ";&lt;br/&gt;            this.RegisterScriptBlock("", script);&lt;br/&gt;            treeList.ClientSideEvents.NodeClick = "RowClickHandler";&lt;br/&gt;            base.OnPreRender(e);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        //5、实现ITemplate接口完成一个模板项&lt;br/&gt;        class TreeListTemplate : ITemplate&lt;br/&gt;        {&lt;br/&gt;            ASPxTreeList treeList;&lt;br/&gt;            public TreeListTemplate(ASPxTreeList treeList)&lt;br/&gt;            {&lt;br/&gt;                this.treeList = treeList;&lt;br/&gt;            }&lt;br/&gt;            public void InstantiateIn(Control container)&lt;br/&gt;            {&lt;br/&gt;                container.Controls.Add(treeList);&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 可以看得出我写代码的时候不是一气呵成，而是从抽象的顶层，从外到里。你用XAF不得不如此，框架逼着你不得不这样。会后完成的东西就是这样：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201006/2010062120264010.png" /&gt;&lt;/p&gt;&lt;p&gt;最后是打包的&lt;a target="_blank" href="http://files.cnblogs.com/lauyee/Editors.rar"&gt;源代码下载&lt;/a&gt;(我的的是XAF10.1.4版)。我没有提供数据库，你应当知道。那对XAF框架来说是不必要的，他会自动负责生成。可能你需要在下面这个界面输一些数据用于测试。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201006/2010062120261652.png" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;说明：本文原代码中，用了中文属性名和如上的代码注释，只是为了演示方便，并不代表我的编程风格。另：XAF是商业控件，所有代码演示所用的是官方下载的评估版本。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lauyee/aggbug/1756978.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lauyee/archive/2010/06/21/1756978.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lauyee/archive/2010/06/17/1759390.html</id><title type="text">【jQuery】 博客园标签云</title><summary type="text">可以替换导航栏的标签列表。 效果在右侧Tags，就不截图了。 使用方法如下：1、 在管理-&gt;设置-&gt;"通过CSS定制页面风格"文本框内, 添加:2、在"页脚Html代码""公告"文本框内, 添加: 在使用的时候记得把我的链接换成你的。 以上代码大部分来自于K#朋友的 TagCloud Improved 我增加了跨域的代码，使它能用于每个页面的公告栏里。没有学过jQuery，知识需要用就...</summary><published>2010-06-17T02:47:00Z</published><updated>2010-06-17T02:47:00Z</updated><author><name>Junior Lau</name><uri>http://www.cnblogs.com/lauyee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lauyee/archive/2010/06/17/1759390.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lauyee/archive/2010/06/17/1759390.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 可以替换导航栏的标签列表。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 效果在右侧Tags，就不截图了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 使用方法如下：&lt;/p&gt;&lt;p&gt;&amp;nbsp;1、&amp;nbsp; 在管理-&amp;gt;设置-&amp;gt;"&lt;b&gt;&lt;span style="color: #0000ff;"&gt;通过CSS定制页面风格&lt;/span&gt;&lt;/b&gt;"文本框内, 添加:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;#tagCloud &lt;br/&gt;{ &lt;br/&gt;   padding:2em;&lt;br/&gt;   text-align:center;&lt;br/&gt;}&lt;br/&gt;div#taglist&lt;br/&gt;{  &lt;br/&gt;   display:none;&lt;br/&gt;}&lt;br/&gt;&lt;p&gt;2、&amp;nbsp;&amp;nbsp;在&lt;span style="text-decoration: line-through;"&gt;"&lt;b&gt;&lt;span style="color: #0000ff;"&gt;页脚Html代码&lt;/span&gt;&lt;/b&gt;"&lt;/span&gt;"&lt;b&gt;&lt;span style="color: #0000ff;"&gt;公告&lt;/span&gt;&lt;/b&gt;"文本框内, 添加:&lt;/p&gt;&amp;lt;B&amp;gt;Tags&amp;lt;/B&amp;gt;&lt;br/&gt;&amp;lt;hr&amp;gt;&amp;lt;br&amp;gt;&lt;br/&gt;&amp;lt;div id="myTagList" style="width:270;height:300"&amp;gt;&amp;lt;/div&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;div id="myTag" style="width:270;display:none"&amp;gt;&amp;lt;/div&amp;gt;&lt;br/&gt;&amp;lt;br&amp;gt;&lt;br/&gt;&amp;lt;hr&amp;gt;&lt;br/&gt;&amp;lt;%--先添加两个div用作标签的容器和临时容器--%&amp;gt;&lt;br/&gt;&amp;lt;script type="text/javascript" src="http://visapi-gadgets.googlecode.com/svn/trunk/termcloud/tc.js"&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;script type="text/javascript" src="http://www.google.com/jsapi"&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;link rel="stylesheet" type="text/css" href="http://visapi-gadgets.googlecode.com/svn/trunk/termcloud/tc.css"/&amp;gt;&lt;br/&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br/&gt;&lt;br/&gt;             (function() {&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;             if ($("#taglist").length &amp;gt; 0) return;&lt;br/&gt;                $("#myTag").load("http://www.cnblogs.com/lauyee/tag/ #taglist");&lt;br/&gt;                //在http://www.cnblogs.com/lauyee/tag/ "页面读取#taglist对象，并加载到我们先前创建的myTag对象内。&lt;br/&gt;                 google.load("visualization", "1");&lt;br/&gt;                 google.setOnLoadCallback(draw);&lt;br/&gt;             })();&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;             function draw() {&lt;br/&gt;                 data = new google.visualization.DataTable();&lt;br/&gt;                 data.addColumn('string', 'Label');&lt;br/&gt;                 data.addColumn('number', 'Value');&lt;br/&gt;                 data.addColumn('string', 'Link');&lt;br/&gt;&lt;br/&gt;                 var tags = $("#myTag td").has("a").has("span");&lt;br/&gt;                 var tagLength = tags.length;&lt;br/&gt;                 data.addRows(tagLength);&lt;br/&gt;&lt;br/&gt;                 tags.each(function(i, x) {&lt;br/&gt;                     var tagLabel = $("a", this).text();&lt;br/&gt;                     var tagValue = parseInt($("span", this).text().replace(/[)(]/g, ""));&lt;br/&gt;                     var tagLink = "http://www.cnblogs.com/lauyee/tag/" + tagLabel + "/";&lt;br/&gt;&lt;br/&gt;                     data.setValue(i, 0, tagLabel);&lt;br/&gt;                     data.setValue(i, 1, tagValue);&lt;br/&gt;                     data.setValue(i, 2, tagLink);&lt;br/&gt;&lt;br/&gt;                     //console.log({"label":tagLabel, "value": tagValue, "link": tagLink});&lt;br/&gt;                 });&lt;br/&gt;                 $("&amp;lt;div id='tagCloud'&amp;gt;").appendTo("div#myTagList");&lt;br/&gt;                 //从myTag Td内提取连接，以及名称放入'tagCloud'，并追加到myTagList。&lt;br/&gt;                 var tc = new TermCloud($("#tagCloud")[0]);&lt;br/&gt;                 tc.draw(data, null);&lt;br/&gt;                &lt;br/&gt;             }&lt;br/&gt;&amp;lt;/script&amp;gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在使用的时候记得把我的链接换成你的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;以上代码大部分来自于K#朋友的 &lt;a href="http://www.cnblogs.com/k-sharp/archive/2010/06/12/1757358.html" class="postTitle2" id="ctl04_TitleUrl"&gt;TagCloud Improved&lt;/a&gt; 我增加了跨域的代码，使它能用于每个页面的公告栏里。没有学过jQuery，知识需要用就临时改改。有不妥的地方还希望大家指正。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lauyee/aggbug/1759390.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lauyee/archive/2010/06/17/1759390.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lauyee/archive/2010/06/16/1758983.html</id><title type="text">程序员这口饭-职业规划解决方案</title><summary type="text">有时候人经常会遗忘一些事情，过去的，未来的。有时会纠结于理想和现实。有时候是因为忙碌而忘记思考。有时候是因为无奈而选择忍受。 规划自己的职业道路，以及人生道路是，我们已经不必再来讨论他的重要性，只有谨慎对待。规划更要根据个人的理想，从实际出发。那么怎么才算实际呢？所谓的实际应当包含以往的经验、现有掌握的技术、教育背景、现实的工作环境、以及一些其他因素。如：婚姻、年龄、学习能力。花一些时间来思考这些...</summary><published>2010-06-16T15:21:00Z</published><updated>2010-06-16T15:21:00Z</updated><author><name>Junior Lau</name><uri>http://www.cnblogs.com/lauyee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lauyee/archive/2010/06/16/1758983.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lauyee/archive/2010/06/16/1758983.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 有时候人经常会遗忘一些事情，过去的，未来的。有时会纠结于理想和现实。有时候是因为忙碌而忘记思考。有时候是因为无奈而选择忍受。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 规划自己的职业道路，以及人生道路是，我们已经不必再来讨论他的重要性，只有谨慎对待。规划更要根据个人的理想，从实际出发。那么怎么才算实际呢？所谓的实际应当包含以往的经验、现有掌握的技术、教育背景、现实的工作环境、以及一些其他因素。如：婚姻、年龄、学习能力。花一些时间来思考这些问题，不能总是跟个感觉走，也不能总是太理想主义。&lt;/p&gt;&lt;p&gt;1、经验对一个人来说是绝对重要的，频繁的跳槽无疑是职业生涯的最大忌讳。如果是为了一点点工资而转移阵地那更不值得。所以不管当初是因为兴趣、还是因为无所选择而介入这个行业，这么多年的体会也绝对是一笔财富。如何运用我们的经验以及如何掌握更多才是值得考虑的。&lt;/p&gt;&lt;p&gt;2、衡量一下现有掌握的技术，要不要在学习新的技术。这一点也相当重要，就这个行业来说你不学习就势必落后。但新技术太多了，很多朋友还在感慨XXXX还没用熟，XXXX又出来了。在这一点上，我对新技术的定义是，你未知的技术都是新技术，也许它已经出来好多年了，但他很好用。我们的目的是在于解决问题。所以在学习新技术也就带有了一定的选择性，不能一味的追求，什么东西比较绚，什么东西强，永远从提高生产力和时间成本上考虑。总结这一点就是，要不断的学习，从而增强自己解决问题的能力，这样就永远不会out。(但如果你是绝对新手，还是多学点新技术好)&lt;/p&gt;&lt;p&gt;3、我的学历很低，要去自学考一个证吗？这个可以从成本和收益上考虑。考虑一下你现在的工作一年的收益是多少。如果考到一个证书，一年的机会收入是多少。继续受教育所花费的时间、以及其他成本是多少。还要考虑其他的影响因素。我的建议是，这个证书真正有用，让你能达到一个比别人更高的起点；你的志向中学历有最基本的要求，如果有这两点当中的任一点，你就应该去考取文凭。&lt;/p&gt;&lt;p&gt;4、如果现实的工作环境还不错，那在好不过了。每个人都应该珍惜自己的这份工作，首先是要干好自己本职的工作。希望能根据公司的制度的到晋升。现实当中可能并不会这么尽如人意，好多人努力工作不一定能得到回报。但大多数情况，你的努力领导会看在眼里，你应当在适当的时候向领导提一下。如果你的老板不太抠门，我想10有89还是能成功的。如果实在是不行，也不能怠慢工作，你应该在工作中得到更多的行业应验、提高综合素质。如果你的所做的工作，或者是你自身已经对公司来说具足轻重的时候，我想钱不是问题。&lt;/p&gt;&lt;p&gt;5、还得考虑一些现实的问题，你得花一些时间来找女朋友、陪老婆逛街。还有很多事情需要考虑。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 以上是在做职业规划之前需要考虑的一些实际的问题。接下来具体的分析如何实现，在最后你可以根据自身情况给出一套合理的解决方案。以下是一个帮助个人分析发展、学习的导图。其中你看得出有很强个人色彩，很多的地方都只是提到了微软的技术方案，而忽略了其他的，你也可以再此基础上加以补充。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201006/2010061617362643.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;一、在工作中寻求提升&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我给出了3类程序员可能发展的方向。其中最强调的就是在工作中得到提升。在工作中提成，一般对程序员说来有2个目标。一个是做架构设计-将来可以做产品的规划，或者项目规划和指导。另一个往管理发展，将来可能涉及的不知是单纯的技术。以下的步骤只是一些常规的做法。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;table style="width: 100%; border-collapse: collapse; border: #675b5f 1px solid;" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="background-color: #c0c0c0; font-style: italic; font-weight: bold;" width="8%"&gt;目标&lt;/td&gt;&lt;td style="background-color: #c0c0c0; font-style: italic; font-weight: bold;" width="21%"&gt;第一步&lt;/td&gt;&lt;td style="background-color: #c0c0c0; font-style: italic; font-weight: bold;" width="21%"&gt;第二步&lt;/td&gt;&lt;td style="background-color: #c0c0c0; font-style: italic; font-weight: bold;" width="21%"&gt;第三步&lt;/td&gt;&lt;td style="background-color: #c0c0c0; font-style: italic; font-weight: bold;" width="21%"&gt;第四步&lt;/td&gt;&lt;td style="background-color: #c0c0c0; font-style: italic; font-weight: bold;" width="8%"&gt;第五步&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;架构方向&lt;/td&gt;&lt;td rowspan="2"&gt;1、基础必备：至少看过2本语言基础书和一本领域技术书。&lt;br /&gt;2、部分参与项目1-2个。&lt;br /&gt;所需时间：3-12个月&lt;/td&gt;&lt;td rowspan="2"&gt;1、行业知识领悟、扩展相关应用知识。&lt;br /&gt;2、完整参与项目1-2个。&lt;br /&gt;3、可以指导新人完成工作。&lt;br /&gt;所需时间：6-12个月&lt;/td&gt;&lt;td&gt;1、深刻理解面对对象知识。熟悉常用架构，对公司采用的架构能提出改善意见。&lt;br /&gt;2、参与需求讨论并能提出简化方案。&lt;br /&gt;3、能为决策提出一些建议。&lt;/td&gt;&lt;td&gt;1、能够对整体需求方案做出精确描述。&lt;br /&gt;2、运用一种架构对项目、产品进行设计。&lt;br /&gt;3、评估项目风险、以及预留方案。&lt;br /&gt;4、实现核心组件、技术难关。&lt;br /&gt;5、行业技术指导。&lt;/td&gt;&lt;td rowspan="2"&gt;艺术领域&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;管理方向&lt;/td&gt;&lt;td&gt;1、学习常用项目管理工具。&lt;br /&gt;2、学会人际交往、协助项目管理。&lt;br /&gt;3、和三教九流交朋友学会喝酒。&lt;/td&gt;&lt;td&gt;1、熟练运用一种项目管理工具。&lt;br /&gt;2、能采用非技术手段实现需求（不用写代码的）&lt;br /&gt;3、了解行业动向。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 上表中第一步、第二步是基础阶段，都可以在制定的时间内明确的达到目标。当你进入第三步的时候，应该就有点主要开发人员或管理助理的意思。等到第四步的时候就应该上位，如果一直不上位也很难发展。至于怎么上位，也许还得学习一些其他方面的知识。后两步都跟具体的成长环境和个人领悟相关，更多地是需要你学习本行业的知识，然后运用你所学到的技能将他用软件的形式表述，具体的做法也只有到自己领悟了。到了最后就达到了艺术的领域。我的上图给出的一些知识点，关于企业级应用开发说的比较多一点。这些也最多只能让你达到第3步，如果和你所从事的领域一点不沾边，你需要针对自己所从事的行业，列出能解决自己行业需求的技能，划出主次，针对不同的步骤，找出重点学习的知识点。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 和人相处、与人沟通是当中隐含的，但非常重要的一个因素，只有掌握了这一点，才有可能达到艺术的领域。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 最后还是强调那句话，能够解决问题才是王道。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;二、树立自己的品牌形象&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这一点必须是在你经历了一定的磨练之后再能够进展，至少你应该在原先的企业内已经完成了前三步的目标。已经积累了很多的行业经验。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果你从开始就考虑要自己干，就要从上述表格第一步的时候开始准备。要将自己本身就看做是一个品牌。在和客户、和同行、和老板沟通的时候要处处注意维护你的形象。即使你没有任何产品，你的名字就是最好的产品，把自己推销出去。很多时候客户买你的产品不是因为你们的产品有多么的好，而是认可你的公司，或者是认可你们老板，或者单纯的喜欢你。所以一定要培养自己的行业名气，最重要的是合作机会。说不定就因为某个客户的一个单子，你就起来了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 一旦你树立了自己的形象，你还需要一个属于你自己的团队。得要有一些人愿意跟着你干。你需要一个很强的可以搞业务的伙伴，也后可能你从此再没机会写代码了。有更重要的事情等着你去做。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 不能总是在等待时机，永远没有100%的把握！一定要自己为自己创造条件。要闯出自己的事业，就不要彷徨、不要犹豫。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 具体的做什么，我觉得行业软件还是最有利可图的。至于开源项目、自己做控件、或者开发个什么小众软件、以及轮子工具，都似乎有些不靠谱，结合自己的经验做跟行业，企业打交道的产品。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;三、其他道路&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 好多人在感慨，程序员路在何方。路永远就在脚下，看我们怎么走。鲁迅说的，踩也要，踩他一条路出来。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当你有了一定的项目经验，并积累了一定数量的代码，不妨可以在网上找找有什么外包项目。但是我个人觉得私活很难做，通常你能够接到手的项目都是一些很小的不够塞牙的项目，即使有大点项目也一定是别人都挑剩下的，有的可能是二手、三手的项目。在这这种项目，你的利润又有多大，多半的利润是被一层层的拨掉了。即使有，你还是否还需要一个小小的团队。另外，你可以上英文网站上看看，很有可能能找见不错的项目。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;行业顾问是个不错的营生，在实际中，行业顾问还是兼职的好，因为只有你真正在这个行业里从业，人家觉得你才更可信。一般来说，这需要的不仅仅是行业知识，而且需要你有很好的人缘，不管是从客户方，还是你的委托方。你都是熟人，那就要办事了。有时候委托方需要的不是一个顾问，而是一个和他的客户协调关系的人，而正好你和双方都很熟，那你就不顾而问了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 很多高手都写书，也书不仅能成就自己，而且能帮助他人，是非常好的一件事。对于写书来说，我觉得现在很缺关于行业内解决方案的书。也许是因为业务太过繁杂，没有统一规范吧。新手的书最多，因为需求最大。从一个读者的角度出发，我希望看到这样的书。1、经验类的如：《asp.net 2.0 编程珠玑》、《走出软件作坊》。2、对于某种技术的整体介绍如：《Expert C# 2005 Business Objects中文版》这本就是作者为自己的开源框架CSLA所写的介绍。3、领域领导者的高手书：象Martin_Fowler、Jeffrey_Richter 的书。我不喜欢的书是这样的：1、伪文档书，一般书上千页，就是官方帮助的翻版。2、故弄玄虚：名字挺花，一看才知道都是被人写滥了的东西。3、教课书：这是比喻的说法，意思是作者的口吻太僵硬、学术化，即使作者的水平再高，我希望作者写作的口气能活泼一点，口语话一点。最后说的事，不一定我不喜欢的就赚不了钱。写书也需要名气和口碑，再加上一点宣传，就差不多了。有写书计划可与博客园联系。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 路肯定不止这些，这些也只是为你的职业计划所提出的一点点的建议。&lt;/p&gt;&lt;p&gt;&amp;nbsp;FQA:&lt;/p&gt;&lt;p&gt;1、如何成为高手。&lt;/p&gt;&lt;p&gt;答：把手放在头上，你就是高手了。&lt;/p&gt;&lt;p&gt;2、先就业还是先择业。&lt;/p&gt;&lt;p&gt;答：如果你有明确的目标，已经对这个行业有了一定的了解，一定要慎重选择。一定要高起点，一步走错，以后不好回头了。如果你什么都不知道，那随便选择个工作，看看形势吧。&lt;/p&gt;&lt;p&gt;3、我现在从事的工作不是我的兴趣。&lt;/p&gt;&lt;p&gt;答：明确目标，如果你的工作能促进你目标的达成，忘掉你的兴趣吧。（呵呵，我的兴趣是游戏开发，可是我做企业应用的）&lt;/p&gt;&lt;p&gt;4、我想换工作了。&lt;/p&gt;&lt;p&gt;答：1）为钱？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我没法建议。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2）离家远：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 想好是不是要回家的，还是决定在这个城市发展。早点决定。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3）我现在的公司没发展：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 小公司也是很有发展前途的，你能很快的进入更高一级目标。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4）公司环境不好，人都很垃圾：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 先学好跟人相处吧，那的人都差不多。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5）得罪了老板、老板对我有成见：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这混不下去了，早点撤。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6）领导水平一般，我学不了东西：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 自己学了，不要老乞求别人帮你。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7）其他原因：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 辞吧，你去意已决。&lt;/p&gt;&lt;p&gt;5、C# or Java&lt;/p&gt;&lt;p&gt;答：C#.&lt;/p&gt;&lt;p&gt;6、要学Silverlight /HTML5吗&lt;/p&gt;&lt;p&gt;答：这个现在火，你工作要是能用到，就学吧。如果你靠这个找工作，也学吧。&lt;/p&gt;&lt;p&gt;7、英语？&lt;/p&gt;&lt;p&gt;答：这个永远放到第一。&lt;/p&gt;&lt;p&gt;8、怎样推销自己。&lt;/p&gt;&lt;p&gt;答：学会喝酒，加入微软社区精英计划。&lt;/p&gt;&lt;p&gt;9、黑客、破解有搞头吗？&lt;/p&gt;&lt;p&gt;答：有、耐得住寂寞再说。&lt;/p&gt;&lt;p&gt;10、经常看博客能增长知识吗？&lt;/p&gt;&lt;p&gt;答：悄悄告诉你，经常看博客是浪费时间，读好的书和实践才是王道。博客是扩展你的知识面，一般时效性比较高，如果没有相应的书，可以从博客中找到一些资料，如果想系统的学习一门技术，还是找本好书吧。&lt;/p&gt;&lt;p&gt;11、我技术水平高工资低。&lt;/p&gt;&lt;p&gt;答：逐渐克服自己的心里弱点和性格缺陷！多疑，敏感，天真（贬义，并不可爱），犹豫不决，胆怯，多虑，脸皮太薄，心不够黑，教条式思维。。。只在床上想一想当然不可能，去帮朋友守一个月地摊，包准有效果，去实践，而不要只想！不克服这些缺点，一切不可能，甚至连项目经理都当不好--尽管你可能技术不错！&lt;/p&gt;&lt;p&gt;12、要学的东西太多了，不知道从何开始。&lt;/p&gt;&lt;p&gt;答：针对目标，划一条主线上面是必须要掌握的知识和工作中最需要的知识，先学。然后向两边扩充。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lauyee/aggbug/1758983.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lauyee/archive/2010/06/16/1758983.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lauyee/archive/2010/06/08/1754262.html</id><title type="text">Visual Studio IDE 实用小技巧(附打包下载)</title><summary type="text">看到《Visual Studio 2010 实用功能总结》2篇文章大家都比较喜欢，我也来补充一些Visual Studio的实用小技巧。1、Visual Studio配色方案。 如果你想让你的编辑器换一种风格显示，你可以在工具—〉选项—〉字体和颜色中进行设置，但是最好的方式是下载精选的这6套配色方案。 使用方法选择工具—〉导入和导出设置，然后按提示进行着设置。2、代码段按下Ctrl+K+S 或 C...</summary><published>2010-06-08T12:44:00Z</published><updated>2010-06-08T12:44:00Z</updated><author><name>Junior Lau</name><uri>http://www.cnblogs.com/lauyee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lauyee/archive/2010/06/08/1754262.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lauyee/archive/2010/06/08/1754262.html"/><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 看到《&lt;a target="_blank" href="http://www.cnblogs.com/gnielee/archive/2010/06/02/vs2010-features.html"&gt;Visual Studio 2010 实用功能总结&lt;/a&gt;》2篇文章大家都比较喜欢，我也来补充一些Visual Studio的实用小技巧。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1、Visual Studio配色方案。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果你想让你的编辑器换一种风格显示，你可以在工具&amp;mdash;〉选项&amp;mdash;〉字体和颜色中进行设置，但是最好的方式是&lt;a target="_blank" href="http://files.cnblogs.com/lauyee/VisualStudio%e9%85%8d%e8%89%b2%e6%96%b9%e6%a1%88.rar"&gt;下载&lt;/a&gt;精选的这&lt;a target="_blank" href="http://files.cnblogs.com/lauyee/VisualStudio%e9%85%8d%e8%89%b2%e6%96%b9%e6%a1%88.rar"&gt;6套配色方案&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 使用方法选择工具&amp;mdash;〉导入和导出设置，然后按提示进行着设置。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;table align="center" border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201006/2010060819064360.png" style="float: left;" /&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201006/2010060819071756.png" style="float: right;" /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201006/2010060819095773.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;img height="181" width="395" src="http://pic002.cnblogs.com/img/lauyee/201006/2010060819100832.png" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2、代码段&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;按下Ctrl+K+S 或 Ctrl+K+X 键会出现代码段提示。你可以选择需要的代码段按回车生成。或者直接输入代码段的快捷简写按下 TAB两次生成。例如输入：foreach,按两下&amp;nbsp;TAB会自动生成代码。可以在&lt;a target="_blank" href="http://msdn2.microsoft.com/zh-cn/vstudio/aa718338.aspx"&gt;这里下载&lt;/a&gt;C#的官方扩充代码段包。还可以在网上搜索网友编辑的代码段包。&lt;a href="http://snippetlibcsharp.codeplex.com/"&gt;http://snippetlibcsharp.codeplex.com/&lt;/a&gt;&amp;nbsp;是个不错的扩充。当然你可以编辑你自己的代码段。你不需要懂得描述代码段的XML语法。只需要&lt;a target="_blank" href="http://snippeteditor.codeplex.com/"&gt;下载这个&lt;/a&gt;现成的代码段编辑工具，很高兴它是作为VS的插件提供。更高兴这个工具是开源的。要使用你下载或自己编辑的代码段，解压他们放到 我的文档\Visual Studio 2XXX\Code Snippets\Visual C#目录下。或者在&lt;span class="ui"&gt;&amp;ldquo;工具&amp;rdquo;&amp;mdash;〉&lt;/span&gt;&lt;span class="ui"&gt;&amp;ldquo;代码段管理器&amp;rdquo;进行导入。(我的IDE工具菜单下没有，只能按Ctrl+k+B了)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img src="http://pic002.cnblogs.com/img/lauyee/201006/2010060819353285.png" /&gt;&lt;/p&gt;&lt;p&gt;3、扩展如果你用的不是VS2010便不能使用 VS2010-&amp;gt;Tools-&amp;gt;Extension Manager的扩展管理功能。但你同样可以在&lt;a s_oidt="0" s_oid="http://visualstudiogallery.msdn.microsoft.com/zh-cn/" href="http://visualstudiogallery.msdn.microsoft.com/zh-cn/" onclick="javascript:Track('ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl43',this);" title="Visual Studio 库" id="ctl00_mainContentContainer_ctl43"&gt;&lt;strong&gt;Visual Studio 库&lt;/strong&gt;&lt;/a&gt;找到1,789个扩展的项目。要想自己开发扩展，关注我的&lt;a href="http://www.cnblogs.com/lauyee/archive/2010/06/08/1753341.html" class="postTitle2" id="homepage1_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl00_TitleUrl"&gt;Visual Studio 扩展编程-#0：如何开始！&lt;/a&gt;系列文章(刚刚开始写)，里面介绍了更多资源。&lt;/p&gt;&lt;p&gt;&lt;img width="900" src="http://pic002.cnblogs.com/img/lauyee/201006/2010060819430740.png" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;4、其他更多技巧&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 编辑HTML时的属性值引号自动插入：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201006/2010060819483536.png" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这里设置自动排版格式，你可以定制缩进、大括号是否默认在方法括号之后，你可以&lt;a target="_blank" href="http://files.cnblogs.com/lauyee/CurrentSettings-2010-06-08.rar"&gt;下载我的&lt;/a&gt;IDE所有设置方案。然后用工具&amp;mdash;〉导入和导出设置导入它。&lt;/p&gt;&lt;p&gt;还有另一种代码段：将任意编辑器中的文本字节选定拖到工具箱，在需要的时候再拖下来。如图：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201006/2010060820275133.jpg" /&gt;&lt;/p&gt;&lt;p&gt;5、将"博客园精华区"加入Visual Studio起始页&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果你是一个开发人员，经常使用VS,和经常登录博客园可能喜欢这个。在你每次打开VS的时候可以方便的看到在博客园当前主页有什么文章更新。你会得到如图的效果。&lt;/p&gt;&lt;p&gt;&lt;img width="800" src="http://pic002.cnblogs.com/img/lauyee/201006/2010060609264543.jpg" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 要做的这一点我们只需做一下的一个简单的设置。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 打开 工具--选项窗口 ，定位到环境--启动项，会出现下图。进行如图设置，就OK了。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201006/2010060609363417.jpg" /&gt;&lt;/p&gt;&lt;p&gt;只是一个小技巧，但是挺有用处。&lt;/p&gt;&lt;table summary="vs通用快捷键" border="0" class="cnblogs_code_Collapse"&gt;&lt;caption&gt;附：（VS系统通用快捷键：）&lt;/caption&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;1、自动排版(类似VC6中的Alt+F8）&lt;/span&gt;&lt;br /&gt;编辑.格式化选定内容 Ctrl + K，Ctrl + F 根据周围的代码行，正确缩进选定的代码行。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;2、注释与去掉注释功能。&lt;/span&gt; &lt;br /&gt;编辑.注释选定内容 Ctrl + K，Ctrl + C 使用编程语言的正确注释语法将代码的当前行标记为注释。&lt;br /&gt;编辑.取消注释选定内容 Ctrl + K，Ctrl + U 从代码的当前行中移除注释语法。&lt;br /&gt;将插入点移动到文档中的下一个大括号处。 &lt;br /&gt;编辑.转到大括号 Ctrl + ] 将插入点移动到文档中的下一个大括号处。 &lt;br /&gt;编辑.向下滚动一行 Ctrl + 向下键 将文本向下滚动一行。仅可用于文本编辑器。&lt;br /&gt;编辑.向上滚动一行 Ctrl + 向上键 将文本向上滚动一行。仅可用于文本编辑器。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;3.怎么找到解决方案&lt;/span&gt; &lt;br /&gt;视图.解决方案资源管理器 Ctrl + Alt + L 显示解决方案资源管理器，它列出当前解决方案中的项目和文件&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;4.显示&amp;ldquo;工具箱&amp;rdquo;&lt;/span&gt; &lt;br /&gt;视图.工具箱 Ctrl + Alt + X 显示&amp;ldquo;工具箱&amp;rdquo;，其中包含可包括在代码中或与代码一起使用的控件和其他项。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;5.清除项目中的所有断点 &lt;/span&gt;&lt;br /&gt;调试.删除所有断点 Ctrl + Shift + F9 清除项目中的所有断点。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;调试.反汇编 Ctrl + Alt + D 显示&amp;ldquo;反汇编&amp;rdquo;窗口。 &lt;br /&gt;调试.切换断点 F9 在当前行设置或移除断点。&lt;br /&gt;&lt;span&gt;***********************************************&lt;/span&gt;&lt;br /&gt;&lt;span&gt;VS2008 快捷键&lt;/span&gt;&lt;br /&gt;&lt;span&gt;新建项目&lt;/span&gt; Ctrl+shift+N&lt;br /&gt;&lt;span&gt;新建网站&lt;/span&gt; shift+Alt+N&lt;br /&gt;&lt;span&gt;文件&lt;/span&gt; Ctrl+N&lt;br /&gt;&lt;span&gt;打开项目/解决方案&lt;/span&gt; Ctrl+shift+O&lt;br /&gt;&lt;span&gt;打开网站&lt;/span&gt; shift+Alt+O&lt;br /&gt;&lt;span&gt;打开文件&lt;/span&gt; Ctrl+O&lt;br /&gt;&lt;span&gt;保存当前文件&lt;/span&gt; Ctrl+S&lt;br /&gt;&lt;span&gt;全部保存&lt;/span&gt; Ctrl+Shift+S&lt;br /&gt;&lt;span&gt;添加新项&lt;/span&gt; Ctrl+Shift+A&lt;br /&gt;&lt;span&gt;添加现有项&lt;/span&gt; Shift+Alt+A&lt;br /&gt;&lt;span&gt;添加类&lt;/span&gt; Shift+Alt+C&lt;br /&gt;&lt;span&gt;撤消&lt;/span&gt; Ctrl+Z&lt;br /&gt;&lt;span&gt;重复&lt;/span&gt; Ctrl+Y&lt;br /&gt;&lt;span&gt;转到&lt;/span&gt; Ctrl+G&lt;br /&gt;&lt;span&gt;循环应用剪贴板中的复制项&lt;/span&gt;Ctrl+Shift+V&lt;br /&gt;&lt;span&gt;设置文档的格式&lt;/span&gt; Ctrl+E，D&lt;br /&gt;&lt;span&gt;设置选定内容的格式&lt;/span&gt;Ctrl+E，F&lt;br /&gt;&lt;span&gt;转换为大写&lt;/span&gt; Ctrl+Shift+U&lt;br /&gt;&lt;span&gt;转换为小写&lt;/span&gt; Ctrl+U&lt;br /&gt;&lt;span&gt;删除水平空白&lt;/span&gt;Ctrl+E，\&lt;br /&gt;&lt;span&gt;查看空白&lt;/span&gt;Ctrl+E,S&lt;br /&gt;&lt;span&gt;自动换行&lt;/span&gt;Ctrl+E,W&lt;br /&gt;&lt;span&gt;渐进式搜索&lt;/span&gt;Ctrl+I&lt;br /&gt;&lt;span&gt;注释选定内容&lt;/span&gt;Ctrl+E,C&lt;br /&gt;&lt;span&gt;取消注释选定内容&lt;/span&gt;Ctrl+E,U&lt;br /&gt;&lt;span&gt;快速查找&lt;/span&gt; Ctrl+F&lt;br /&gt;&lt;span&gt;快速替换&lt;/span&gt; Ctrl+H&lt;br /&gt;&lt;span&gt;在文件中查找&lt;/span&gt; Ctrl+Shift+F&lt;br /&gt;&lt;span&gt;查找下一个&lt;/span&gt; F3&lt;br /&gt;&lt;span&gt;查找上一个&lt;/span&gt; Shift+F3&lt;br /&gt;&lt;span&gt;在文件中替换&lt;/span&gt; Ctrl+Shift+H&lt;br /&gt;&lt;span&gt;查找符号&lt;/span&gt; Alt+F12&lt;br /&gt;&lt;span&gt;切换书签&lt;/span&gt; Ctrl+B，T&lt;br /&gt;&lt;span&gt;启用书签&lt;/span&gt; Ctrl+B，E&lt;br /&gt;&lt;span&gt;上一书签 &lt;/span&gt;Ctrl+B，P&lt;br /&gt;&lt;span&gt;下一书签 &lt;/span&gt;Ctrl+B，N&lt;br /&gt;&lt;span&gt;清除书签&lt;/span&gt; Ctrl+B，C&lt;br /&gt;&lt;span&gt;添加任务列表快捷方式&lt;/span&gt;Ctrl+E，T&lt;br /&gt;&lt;span&gt;切换大纲显示展开&lt;/span&gt;Ctrl+M，M&lt;br /&gt;&lt;span&gt;切换所有大纲显示&lt;/span&gt;Ctrl+M，L&lt;br /&gt;&lt;span&gt;停止大纲显示 &lt;/span&gt;Ctrl+M，P&lt;br /&gt;&lt;span&gt;折叠到定义&lt;/span&gt; Ctrl+M，O&lt;br /&gt;&lt;span&gt;生产方法存根&lt;/span&gt; Ctrl+K，M&lt;br /&gt;&lt;span&gt;列出成员&lt;/span&gt; Ctrl+K，L&lt;br /&gt;&lt;span&gt;参数信息&lt;/span&gt; Ctrl+K，P&lt;br /&gt;&lt;span&gt;快速信息&lt;/span&gt; Ctrl+K，I&lt;br /&gt;&lt;span&gt;完成单词&lt;/span&gt; Ctrl+K，W&lt;br /&gt;&lt;span&gt;插入代码段&lt;/span&gt; Ctrl+K，X&lt;br /&gt;&lt;span&gt;外侧代码&lt;/span&gt; Ctrl+K，S&lt;br /&gt;&lt;span&gt;代码&lt;/span&gt; F7&lt;br /&gt;&lt;span&gt;设计器 &lt;/span&gt;Shift+F7&lt;br /&gt;&lt;span&gt;服务器资源管理器 &lt;/span&gt;Ctrl+W，L&lt;br /&gt;&lt;span&gt;解决方案资源管理器&lt;/span&gt; Ctrl+W，S&lt;br /&gt;&lt;span&gt;类视图 &lt;/span&gt;Ctrl+W，c&lt;br /&gt;&lt;span&gt;代码定义窗口&lt;/span&gt;Ctrl+W，D&lt;br /&gt;&lt;span&gt;对象浏览器&lt;/span&gt; Ctrl+W，J&lt;br /&gt;&lt;span&gt;错误列表&lt;/span&gt; Ctrl+W，E&lt;br /&gt;&lt;span&gt;输出&lt;/span&gt; Ctrl+W，O&lt;br /&gt;&lt;span&gt;属性窗口&lt;/span&gt; Ctrl+W，P&lt;br /&gt;&lt;span&gt;任务列表&lt;/span&gt; Ctrl+W，T&lt;br /&gt;&lt;span&gt;工具箱&lt;/span&gt; Ctrl+W，X&lt;br /&gt;&lt;span&gt;全屏显示&lt;/span&gt;shift+Alt+Enter&lt;br /&gt;&lt;span&gt;向后定位&lt;/span&gt; Ctrl+-&lt;br /&gt;&lt;span&gt;向前定位&lt;/span&gt; Ctrl+Shift+-&lt;br /&gt;&lt;span&gt;属性页&lt;/span&gt; Shift+F4&lt;br /&gt;&lt;span&gt;查找符号结果&lt;/span&gt; Ctrl+W，Q&lt;br /&gt;&lt;span&gt;书签窗口&lt;/span&gt; Ctrl+W，B&lt;br /&gt;&lt;span&gt;命令窗口&lt;/span&gt; Ctrl+W，A&lt;br /&gt;&lt;span&gt;文档大纲&lt;/span&gt; Ctrl+W，U&lt;br /&gt;&lt;span&gt;资源视图&lt;/span&gt; Ctrl+W，R&lt;br /&gt;&lt;span&gt;宏资源管理器&lt;/span&gt; Alt+F8&lt;br /&gt;&lt;span&gt;Web浏览器&lt;/span&gt; Ctrl+W，W&lt;br /&gt;&lt;span&gt;重命名&lt;/span&gt; F2&lt;br /&gt;&lt;span&gt;提取方法&lt;/span&gt; Ctrl+R，M&lt;br /&gt;&lt;span&gt;封装字段&lt;/span&gt; Ctrl+R，E&lt;br /&gt;&lt;span&gt;提取接口&lt;/span&gt; Ctrl+R，I&lt;br /&gt;&lt;span&gt;将局部变量提升为参数&lt;/span&gt; Ctrl+R,P&lt;br /&gt;&lt;span&gt;移除参数&lt;/span&gt; Ctrl+R，V&lt;br /&gt;&lt;span&gt;重新排列参数&lt;/span&gt; Ctrl+R，O&lt;br /&gt;&lt;span&gt;生成解决方案&lt;/span&gt; F6&lt;br /&gt;&lt;span&gt;生成当前项目&lt;/span&gt; Shift+F6&lt;br /&gt;&lt;span&gt;启动调试&lt;/span&gt; F5&lt;br /&gt;&lt;span&gt;继续&lt;/span&gt; F5&lt;br /&gt;&lt;span&gt;全部中断&lt;/span&gt; Ctrl+Alt+Break&lt;br /&gt;&lt;span&gt;停止调试&lt;/span&gt; Shift+F5&lt;br /&gt;&lt;span&gt;重新启动&lt;/span&gt; Ctrl+Shift+F5&lt;br /&gt;&lt;span&gt;开始执行（不调试）&lt;/span&gt;Ctrl+F5&lt;br /&gt;&lt;span&gt;异常&lt;/span&gt; Ctrl+D，E&lt;br /&gt;&lt;span&gt;逐语句&lt;/span&gt; F11&lt;br /&gt;&lt;span&gt;跳出&lt;/span&gt; Shift+F11&lt;br /&gt;&lt;span&gt;逐过程&lt;/span&gt; F10&lt;br /&gt;&lt;span&gt;切换断点&lt;/span&gt; F9&lt;br /&gt;&lt;span&gt;删除所有断点&lt;/span&gt; Ctrl+Shift+F9&lt;br /&gt;&lt;span&gt;断点&lt;/span&gt; Ctrl+D，B&lt;br /&gt;&lt;span&gt;即时&lt;/span&gt; Ctrl+D，I&lt;br /&gt;&lt;span&gt;快速监视&lt;/span&gt; Ctrl+D，Q&lt;br /&gt;&lt;span&gt;监视1&lt;/span&gt; Ctrl+D，W&lt;br /&gt;&lt;span&gt;监视2&lt;/span&gt; Ctrl+D+W，2&lt;br /&gt;&lt;span&gt;监视3&lt;/span&gt; Ctrl+D+W，3&lt;br /&gt;&lt;span&gt;监视4&lt;/span&gt; Ctrl+D+W，4&lt;br /&gt;&lt;span&gt;自动窗口&lt;/span&gt;Ctrl+D，A&lt;br /&gt;&lt;span&gt;局部变量&lt;/span&gt; Ctrl+D，L&lt;br /&gt;&lt;span&gt;调用堆栈&lt;/span&gt; Ctrl+D，C&lt;br /&gt;&lt;span&gt;线程&lt;/span&gt; Ctrl+D，T&lt;br /&gt;&lt;span&gt;切换当前线程标志状态 &lt;/span&gt;Ctrl+8&lt;br /&gt;&lt;span&gt;仅显示标志的线程 &lt;/span&gt;Ctrl+9&lt;br /&gt;&lt;span&gt;模块&lt;/span&gt; Ctrl+D，M&lt;br /&gt;&lt;span&gt;进程&lt;/span&gt; Ctrl+D，P&lt;br /&gt;&lt;span&gt;反编译&lt;/span&gt; Ctrl+Alt+D&lt;br /&gt;&lt;span&gt;寄存器&lt;/span&gt; Ctrl+D，R&lt;br /&gt;&lt;span&gt;内存1&lt;/span&gt; Ctrl+D，Y&lt;br /&gt;&lt;span&gt;内存2&lt;/span&gt; Ctrl+Alt+M，2&lt;br /&gt;&lt;span&gt;内存3&lt;/span&gt; Ctrl+Alt+M，3&lt;br /&gt;&lt;span&gt;内存4&lt;/span&gt; Ctrl+Alt+M，4&lt;br /&gt;&lt;span&gt;附加到进程&lt;/span&gt; Ctrl+Alt+P&lt;br /&gt;&lt;span&gt;代码段管理器&lt;/span&gt; Ctrl+K，Ctrl+B&lt;br /&gt;&lt;span&gt;运行当前宏&lt;/span&gt; Ctrl+Shift+P&lt;br /&gt;&lt;span&gt;记录当前宏&lt;/span&gt; Ctrl+Shift+R&lt;br /&gt;&lt;span&gt;宏IDE&lt;/span&gt; Alt+F11&lt;br /&gt;&lt;span&gt;当前上下文中的测试&lt;/span&gt; Ctrl+R，T&lt;br /&gt;&lt;span&gt;解决方案中的所有测试&lt;/span&gt;Ctrl+R，A&lt;br /&gt;&lt;span&gt;如何实现&lt;/span&gt; Ctrl+F1，H&lt;br /&gt;&lt;span&gt;搜索&lt;/span&gt; Ctrl+F1,S&lt;br /&gt;&lt;span&gt;目录&lt;/span&gt; Ctrl+F1，C&lt;br /&gt;&lt;span&gt;索引&lt;/span&gt; Ctrl+F1，I&lt;br /&gt;&lt;span&gt;帮助收藏夹&lt;/span&gt; Ctrl+F1，F&lt;br /&gt;&lt;span&gt;动态帮助&lt;/span&gt; Ctrl+F1，D&lt;br /&gt;&lt;span&gt;索引结果&lt;/span&gt; Ctrl+F1，T&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lauyee/aggbug/1754262.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lauyee/archive/2010/06/08/1754262.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lauyee/archive/2010/06/08/1753341.html</id><title type="text">Visual Studio 扩展编程-#0：如何开始！</title><summary type="text">一、概要兴趣所在扩展VS的几种方法。如何选择？一个"Hello world!"例子。更多的资源和资料。二、正文 任何一个开发人员都可能对自己的IDE编程工具产生一种很浓厚的感情，我就经常会和我的同事（一个曾是Eclipse的使用在者）争辩Visual Studio的强大功能。这是我喜欢的工具，的确它有足够的资本值得人夸耀。我希望我所有的开发工作都能在这上面进行。为了使它能更方便，更加好用，有时候我...</summary><published>2010-06-07T19:11:00Z</published><updated>2010-06-07T19:11:00Z</updated><author><name>Junior Lau</name><uri>http://www.cnblogs.com/lauyee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lauyee/archive/2010/06/08/1753341.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lauyee/archive/2010/06/08/1753341.html"/><content type="html">&lt;p&gt;&lt;strong&gt;一、概要&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="#section1"&gt;兴趣所在&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#section2"&gt;扩展VS的几种方法。&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#section3"&gt;如何选择？&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#section4"&gt;一个"Hello world!"例子。&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#section5"&gt;更多的资源和资料。&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;二、正文&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a name="section1"&gt;&amp;nbsp; &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 任何一个开发人员都可能对自己的&lt;em&gt;IDE&lt;/em&gt;编程工具产生一种很浓厚的感情，我就经常会和我的同事（一个曾是&lt;em&gt;Eclipse&lt;/em&gt;的使用在者）争辩&lt;span lang="EN-US"&gt;&lt;span style="font-family: Times New Roman;"&gt;&lt;strong&gt;&lt;em&gt;Visual Studio&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;的强大功能。这是我喜欢的工具，的确它有足够的资本值得人夸耀。我希望我所有的开发工作都能在这上面进行。为了使它能更方便，更加好用，有时候我会希望去扩展它，我常常在网上下载一些名为：&amp;ldquo;&lt;em&gt;XXXX for &lt;/em&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: Times New Roman;"&gt;&lt;em&gt;&lt;strong&gt;Visual Studio&amp;rdquo; &lt;/strong&gt;&lt;/em&gt;的工具,大多数的工具用起来真的很方便。但是这仍然不够，我想通过自己的代码去自由的扩展我喜欢的功能。于是我上网找这方面的资料，遗憾的是能真正指导我的中文资料太少了，有的只是简单的介绍，当真正想要了解一些实际的功能的时候这些资料都不能提供了。当然MSDN上有很详细的资料，可能因为我不是机器人的缘故，我很难看得懂机器翻译的文章。的有一些人做这些事，我们需要一些关于这一方面的更多地中文资料。我希望有更多的人能够加入进来。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: Times New Roman;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我将在接下来的一段时间内花功夫去学习、研究怎么去扩展我的VS。这不光是很有意思，它将真正的能帮助我完成一些很无聊的事情。比如以下是一些很好的VS插件：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;1、CodeSmith --不想再多说&lt;/p&gt;&lt;p&gt;2、Assist X&amp;nbsp;&amp;nbsp;&amp;nbsp; --一个代码样式和智能提示工具(VB,C++开发者特别适合用，我把他卸了)&lt;/p&gt;&lt;p&gt;3、CodeRush&amp;trade; for Visual Studio --一个真正perfect的代码辅助工具，VisualStudio2010中提供了免费的CodeRushXpress许可。你可以到&lt;a href="http://www.devexpress.com/Products/Visual_Studio_Add-in/index.xml"&gt;Devexpress&lt;/a&gt;官方下载它。（题外话：DXCore&amp;trade; for Visual Studio提供针对VS扩展的很方便的项目类型和接口）&lt;/p&gt;&lt;p&gt;4、&lt;a href="http://visualstudiogallery.msdn.microsoft.com/zh-cn/e5f41ad9-4edc-4912-bca3-91147db95b99"&gt;PowerCommands for Visual Studio 2010&lt;/a&gt;(免费) 微软出品 为VS提供了一堆的命令扩展。&lt;/p&gt;&lt;p&gt;5、&lt;a href="http://clonedetectivevs.codeplex.com/"&gt;Clone Detective for Visual Studio&lt;/a&gt; （开源） 一个重复代码的分析工具。&lt;/p&gt;&lt;p&gt;6、&lt;a href="http://snippeteditor.codeplex.com/" class="externalLink"&gt;Snippet Editor &lt;/a&gt;（开源）我希望每一个开发人员都能够了解代码段的用法，他真正提高了你的代码编写速度，如果你不会使用留言给我，我很愿意告诉你它是什么。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 大概有2000个左右的VS扩展项目，以上是我用过的一些仅仅是为了辅助编程的扩展。在这段时间的学习之后，我的目标是至少可以独立完成一个类似与后两个项目的工具。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;要从哪里开始呢？我们先来看看常用的扩展VS的几种方法。这些方法都可以叫做Visual Studio Extensibility(VSX)。&lt;/p&gt;&lt;p&gt;&lt;a name="section2"&gt;&amp;nbsp; &lt;/a&gt;&lt;/p&gt;&lt;p&gt;1、宏(macro)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 宏是用代码扩展 Visual Studio 集成开发环境 (IDE) 的最简单方法。此方法不仅允许您记录 IDE 中的若干操作并以单个命令的形式播放它们，从而极大地提高了效率，而且还允许您在记录宏的同时了解 Visual Studio 自动化模型。宏还提供一个基于 Visual Studio IDE 的完备开发环境（称为&amp;ldquo;宏 IDE&amp;rdquo;）。该环境使用 Visual Basic 语言，可用于创建、编辑和调试宏。有关宏的更多信息，请参见 &lt;a href="http://msdn.microsoft.com/zh-cn/library/8h31zbch(v=VS.90).aspx"&gt;使用宏自动执行重复性操作&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 请允许我摘录MSDN的说法，由于我的机器上没有安装VB，所以怎么找也没有这个东西（宏）。和在Office中一样，如果你熟悉VB scripit一定会很快熟悉它，要想真正会用它最好的办法是你实际的录制一个。&lt;/p&gt;&lt;p&gt;2、插件(Addin)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果你使用Visual Studio专业版本或更高的版本你可以通过 创建新项目--其他项目类型--扩展性--Visual Studio外接程序&amp;nbsp;来创建它（右边共享的外接程序可以为你创建office系列产品的扩展）。外接程序更像是一个类库项目，你可以在项目中创建你自己的用户窗口，你可以将你自定义的命令插入Visual Studio菜单栏、工具栏，以及可以控制解决方案，各种属性窗口，文档窗口，以及创建文件类型。它最终将编译成为一个DLL，属于你的DLL。你可以将你的版权信息加入到Visual Studio的&amp;ldquo;关于&amp;rdquo;窗口中。Visual Studio为Addin提供了一整套很完善的编程模型，我们能很简单的调用它。用Addin进行插件开发，80%的时候你是在用自己的类库，然后用addin提供的模型接口，把它连接到VS上。Addin还可以用来创建向导，比如你在使用类型化DataSet的时候蹦出的那个很多个&amp;ldquo;下一步&amp;rdquo;的引导窗体，就可以用addin办到。&lt;/p&gt;&lt;p&gt;3、扩展包（Package）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这可能是最让人感觉到神秘的部分，整个visual studio的功能就是建立在以Visual studio外壳（shell）为核心的扩展包上的（即智能客户端以及微内核模型）。&lt;br /&gt;当你用扩展包开发的时候你就是一个真正的IDE开发人员。你可以在此基础上建立自己的编程语言，如：Ironpython就是一个用Visual studio作为python语言IDE的一个很好的例子，Package还可以创建一种领域描述语言工具（DSL Tool）。Visual studio2010的架构师工具就是建立在这个基础之上的。你将用任何CLR语言（F#\C#\C++\...）开发你的产品，并作为微软的合作伙伴，对你自己的工具享有完全的版权.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在你创建Package项目之前，你需要下载&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=47305cf4-2bea-43c0-91cd-1b853602dcc5&amp;amp;displaylang=en"&gt;Visual Studio 2010 SDK&lt;/a&gt;或&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=59EC6EC3-4273-48A3-BA25-DC925A45584D&amp;amp;displaylang=en"&gt;Visual Studio 2008 SDK 1.1&lt;/a&gt;并在你的机器上安装它。默认安装的有6种项目类型，将在以后介绍。&lt;/p&gt;&lt;p&gt;&lt;a name="section3"&gt;&amp;nbsp; &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如何选择？以下是MSDN的描述：&lt;/p&gt;&lt;table align="center" border="0" class="cnblogs_code_Collapse" style="background-color: #f5f5f4; width: 80%;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;h1 class="heading"&gt;&lt;span style="font-size: 12pt;"&gt;任务是否需要用户输入？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div name="collapseableSection" class="section" id="sectionSection2"&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;span class="label"&gt;不需要用户输入&lt;/span&gt; &amp;mdash; 适合使用宏或外接程序。有关更多信息，请参见 &lt;span sdata="link"&gt;&lt;mshelp:link keywords="4e394754-d519-4c48-9047-f537e4ab148d" tabindex="0"&gt;使用宏自动执行重复性操作&lt;/mshelp:link&gt;&lt;/span&gt; 或&lt;span sdata="link"&gt;创建外接程序和向导&lt;/span&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class="label"&gt;简单输入&lt;/span&gt; &amp;mdash; 适合使用宏、外接程序或向导。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class="label"&gt;复杂输入&lt;/span&gt; &amp;mdash; 如果输入步骤很多或者需要验证，则最适合使用向导。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h1 class="heading"&gt;&lt;span onclick="ExpandCollapse(sectionToggle3)" onkeypress="ExpandCollapse_CheckKey(sectionToggle3, event)" tabindex="0" style="cursor: default;"&gt;&lt;span style="font-size: 12pt;"&gt;任务自动化的复杂程度？&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div name="collapseableSection" class="section" id="sectionSection3"&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;span class="label"&gt;很简单&lt;/span&gt; &amp;mdash; 如果只用几行代码就能完成任务，则适合使用宏。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class="label"&gt;复杂&lt;/span&gt; &amp;mdash; 虽然宏可以包含窗体、引用和类，但使用外接程序或向导可能更合适。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h1 class="heading"&gt;&lt;span style="font-size: 12pt;"&gt;估计用户将怎样启动应用程序？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div name="collapseableSection" class="section" id="sectionSection4"&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;span class="label"&gt;菜单或命令栏&lt;/span&gt; &amp;mdash; 使用外接程序。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class="label"&gt;键盘快捷键或宏资源管理器&lt;/span&gt; &amp;mdash; 使用宏。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class="label"&gt;&amp;ldquo;新建项目&amp;rdquo;或&amp;ldquo;新建项&amp;rdquo;菜单项&lt;/span&gt; &amp;mdash; 一个用于将新项目或文件添加到应用程序的向导。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class="label"&gt;从 IDE 自动启动&lt;/span&gt; &amp;mdash; 使用外接程序。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h1 class="heading"&gt;&lt;span style="font-size: 12pt;"&gt;应用程序的生存期有多长？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div name="collapseableSection" class="section" id="sectionSection5"&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;span class="label"&gt;只使用一天&lt;/span&gt; &amp;mdash; 临时记录的宏可能已足够。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class="label"&gt;长期使用&lt;/span&gt; &amp;mdash; 宏、向导或外接程序都合适。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h1 class="heading"&gt;&lt;span style="font-size: 12pt;"&gt;需要开发什么？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div name="collapseableSection" class="section" id="sectionSection6"&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;span class="label"&gt;自动执行的任务&lt;/span&gt; &amp;mdash; 宏、外接程序和向导都可以用来自动执行任务。有关更多信息，请参见 &lt;span sdata="link"&gt;&lt;mshelp:link keywords="4e394754-d519-4c48-9047-f537e4ab148d" tabindex="0"&gt;使用宏自动执行重复性操作&lt;/mshelp:link&gt;&lt;/span&gt; 或&lt;span sdata="link"&gt;创建外接程序和向导&lt;/span&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class="label"&gt;&amp;ldquo;工具&amp;rdquo;、&amp;ldquo;选项&amp;rdquo;对话框的自定义属性页&lt;/span&gt; &amp;mdash; 外接程序和向导都支持此功能。有关更多信息，请参见&lt;span sdata="link"&gt;如何：创建自定义工具选项页&lt;/span&gt;。您也可以使用 Visual Studio 2010 SDK 创建它们。有关更多信息，请参见 &lt;a href="http://msdn.microsoft.com/vstudio/extend"&gt;http://msdn.microsoft.com/vstudio/extend&lt;/a&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class="label"&gt;自定义工具或文档窗口&lt;/span&gt; &amp;mdash; 外接程序和向导都支持此功能。有关更多信息，请参见&lt;span sdata="link"&gt;如何：创建和控制工具窗口&lt;/span&gt;。您也可以使用 Visual Studio 2010 SDK 创建它们。（请注意，&lt;span class="code"&gt;Document.Open()&lt;/span&gt; 成员只能在内部使用。）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class="label"&gt;新项目类型&lt;/span&gt; &amp;mdash; 使用 Visual Studio 2010 SDK。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class="label"&gt;支持 Visual Studio 中的新编程语言或新编辑器&lt;/span&gt;&amp;mdash; 使用 Visual Studio 2010 SDK。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 以上可以帮你做出选择，以我的经验是。宏太小儿科了，我们不去管它。如果你打算在1周--2个月内完成一个实用的小工具，使用（addin）可以满足你（比如，前段时间我一直在找一个能插入IDE的调试分析工具，可是一直没有合适的，于是我想自己做一个。也可能我们将会一起做一个有意思的其他工具，希望你能留言告诉我你的想法，我们一起来创建一个小的开源项目），要是你立志于做出一个真正强大的产品，无疑扩展包是最佳的选择，也希望到时你能算上我一份，来共同努力。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;到此我们是不是应该在创建一个"Hello world!"程序。以下是一个快速的介绍。&lt;br /&gt;&lt;a name="section4"&gt;&amp;nbsp; &lt;/a&gt;&lt;/p&gt;&lt;p&gt;在Visual Studio 中选择&amp;rdquo;新建项目&amp;mdash;〉其他项目类型&amp;mdash;〉扩展性&amp;mdash;〉Visual Studio外接程序&amp;rdquo;，按照向导狂点下一步(在第四步,就是下图圆圈的地方打上勾)，最后会生成一个类库项目。这个项目当中包含一个个connect.cs文件。大概在这个文件的末尾找到&lt;span style="background-color: #f0f0f0;"&gt;public void Exec(...)&lt;/span&gt;&lt;span style="background-color: #f0f0f0;"&gt;方法,将方法的内容用下述代码替换。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201006/2010060801245237.png" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;        public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)&lt;br/&gt;        {&lt;br/&gt;            handled = false;&lt;br/&gt;            if (executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)&lt;br/&gt;            {&lt;br/&gt;                if (commandName == "MyAddin1.Connect.MyAddin1")&lt;br/&gt;                {&lt;br/&gt;                    System.Windows.Forms.MessageBox.Show("wow,I can Develop the VSX.");&lt;br/&gt;                    handled = true;&lt;br/&gt;                    return;&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;注意：要使编译通过你需要给项目添加System.Windows.Forms的引用。然后调试或执行你的项目，会启动另一个VS的实例。点击工具菜单，你会发现在你的工具菜单下面多出了一个按钮，单击它。哈哈，熟悉的"Hello"窗口出来了。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201006/2010060801293822.png" /&gt;下一节我们会进一步讲解这个例子，看看我们到底做了一些什么工作，编译器为我们做了些什么，以及一些最主要的模型对象。&lt;/p&gt;&lt;p&gt;&lt;a name="section5"&gt;&amp;nbsp; &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 最后是，从哪里得到更多的资源和资料，事实上我对于VSX也只是个学习者，分享下面一些资源，希望我将和你一起进步。不要介意大部分来自于英文网站。&amp;nbsp;如果你自己要在google搜索，提供的关键字是：Visual Studio Extensibility(VSX),Macro,Addin,VsPackage,Code Snippet,plugin,T4,Template,DSL,Code Generator 。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;中文：&lt;/p&gt;&lt;p&gt;1、&lt;a href="http://www.cnblogs.com/default/" class="headermaintitle" id="Header1_HeaderTitle"&gt;明年我18&lt;/a&gt;&amp;nbsp;呵呵，这也是一个爱好者，有一系列翻译的VSX(VsPackage)入门文章。&lt;/p&gt;&lt;p&gt;2、&lt;a href="http://www.cnblogs.com/lonely7345/" class="headermaintitle" id="Header1_HeaderTitle"&gt;似水流年&lt;/a&gt;&amp;nbsp;Visual Studio DSL的一系列入门文章。&lt;/p&gt;&lt;p&gt;3、&lt;a href="http://msdn.microsoft.com/zh-cn/library/xc52cke4(v=VS.100).aspx"&gt;MSDN 关于addin的中文&lt;/a&gt;帮助文档&amp;nbsp;(vs2005 到现在没更新) 。&lt;/p&gt;&lt;p&gt;4、&lt;a href="http://www.cnblogs.com/team/VSX/"&gt;博客园VSX团队&lt;/a&gt;&amp;nbsp;将来会成为最佳的中文VSX学习园地。&lt;/p&gt;&lt;p&gt;5、&lt;a href="http://msdn.microsoft.com/zh-tw/vstudio/cc963628.aspx"&gt;DSL(中文)&lt;/a&gt;&amp;nbsp;台湾微软网站的DSL中文短片&lt;/p&gt;&lt;p&gt;6、我的博客，呵呵，别骂我。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;英文&lt;/p&gt;&lt;p&gt;1、&lt;b&gt;&lt;a href="http://dotneteers.net/blogs/divedeeper/default.aspx"&gt;Inovak&lt;/a&gt;&lt;/b&gt;（DiveDeeper's blog）最新的关于VSX,以及其他一些有意思的编程。他更新的速度远比你看得还快。&lt;/p&gt;&lt;p&gt;2、&lt;a s_oidt="0" s_oid="http://visualstudiogallery.msdn.microsoft.com/zh-cn/" href="http://visualstudiogallery.msdn.microsoft.com/zh-cn/" onclick="javascript:Track('ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl43',this);" title="Visual Studio 库" id="ctl00_mainContentContainer_ctl43"&gt;&lt;strong&gt;Visual Studio 库&lt;/strong&gt;&lt;/a&gt;&amp;nbsp;截至今天包含1,789个扩展的项目。&lt;/p&gt;&lt;p&gt;3、&lt;a href="http://www.codeproject.com/"&gt;http://www.codeproject.com/&lt;/a&gt;&amp;nbsp;寻找资源的最佳地方。有的项目很简单，简单的让你看了想哭。&lt;/p&gt;&lt;p&gt;4、&lt;a href="http://www.codeplex.com/Project/ProjectDirectory.aspx?ProjectSearchText=visual%20studio" onclick="javascript:Track('ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl47',this);" title="CodePlex" id="ctl00_mainContentContainer_ctl47"&gt;&lt;strong&gt;CodePlex&lt;/strong&gt;&lt;/a&gt;&amp;nbsp; Microsoft 的开源项目托管网站。&lt;/p&gt;&lt;p&gt;5、&lt;a href="http://www.olegsych.com/"&gt;&lt;span&gt;Oleg Sych&lt;/span&gt;&lt;/a&gt;&amp;nbsp; T4的丰富文章和资源。&lt;/p&gt;&lt;p&gt;6、&lt;a href="http://www.cnblogs.com/b/vsxteam/"&gt;VSX Team Blog&lt;/a&gt;&amp;nbsp;Visual Studio Extensibility - Visual Studio Ecosystem - Visual Studio SDK - msdn.com/vsx&lt;/p&gt;&lt;p&gt;7、&lt;a href="http://weblogs.asp.net/vga/default.aspx"&gt;Victor Garcia Aprea&lt;/a&gt;&amp;nbsp;虽然他本人是主要参透ASP.NET,但是他的博客也有许多关于T4,DSL,VSX的文章。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;好了，今天就这样结束吧。再有什么下次继续。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lauyee/aggbug/1753341.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lauyee/archive/2010/06/08/1753341.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lauyee/archive/2010/06/06/1752508.html</id><title type="text">小技巧：将&amp;quot;博客园精华区&amp;quot;加入Visual Studio起始页</title><summary type="text">如果你是一个开发人员，经常使用VS,和经常登录博客园可能喜欢这个。在你每次打开VS的时候可以方便的看到在博客园当前主页有什么文章更新。你会得到如图的效果。 要做的这一点我们只需做一下的一个简单的设置。 打开 工具--选项窗口 ，定位到环境--启动项，会出现下图。进行如图设置，就OK了。只是一个小技巧，但是挺有用处。</summary><published>2010-06-06T01:40:00Z</published><updated>2010-06-06T01:40:00Z</updated><author><name>Junior Lau</name><uri>http://www.cnblogs.com/lauyee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lauyee/archive/2010/06/06/1752508.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lauyee/archive/2010/06/06/1752508.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果你是一个开发人员，经常使用VS,和经常登录博客园可能喜欢这个。在你每次打开VS的时候可以方便的看到在博客园当前主页有什么文章更新。你会得到如图的效果。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201006/2010060609264543.jpg" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 要做的这一点我们只需做一下的一个简单的设置。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 打开 工具--选项窗口 ，定位到环境--启动项，会出现下图。进行如图设置，就OK了。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/lauyee/201006/2010060609363417.jpg" /&gt;&lt;/p&gt;&lt;p&gt;只是一个小技巧，但是挺有用处。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lauyee/aggbug/1752508.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lauyee/archive/2010/06/06/1752508.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lauyee/archive/2010/06/01/1747752.html</id><title type="text">程序员这口饭2-世纪预言</title><summary type="text">1、 java走弱、C#可持续发展、C++复兴、C语言王者归来。2、云平台之争不了了之。 3、 新的通讯设备代替现有的手持产品。 4、 企业应用程序将由懂业务的信息管理人员开发，而不是程序员。5、 WEB程序出现大量漏洞。 6、 中文不会成为IT信息的主要来源，中国IT崛起是因为越来越多的人会使用英文。 7、中国出现一位天才级伟大的程序员，方向是嵌入式。8、 人工智能突破，机器人操作系统盛行。 9...</summary><published>2010-06-01T14:46:00Z</published><updated>2010-06-01T14:46:00Z</updated><author><name>Junior Lau</name><uri>http://www.cnblogs.com/lauyee/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lauyee/archive/2010/06/01/1747752.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lauyee/archive/2010/06/01/1747752.html"/><content type="text">1、 java走弱、C#可持续发展、C++复兴、C语言王者归来。2、云平台之争不了了之。 3、 新的通讯设备代替现有的手持产品。 4、 企业应用程序将由懂业务的信息管理人员开发，而不是程序员。5、 WEB程序出现大量漏洞。 6、 中文不会成为IT信息的主要来源，中国IT崛起是因为越来越多的人会使用英文。 7、中国出现一位天才级伟大的程序员，方向是嵌入式。8、 人工智能突破，机器人操作系统盛行。 9...</content></entry></feed>
