<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_向鸭梨山大同志敬礼~</title><subtitle type="text">责任 专注 用心 成就个人口碑Android / Windows Phone / IOS</subtitle><id>http://feed.cnblogs.com/blog/u/41777/rss</id><updated>2012-03-23T01:30:23Z</updated><author><name>Jack Fan</name><uri>http://www.cnblogs.com/longqi293/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/longqi293/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/41777/rss"/><entry><id>http://www.cnblogs.com/longqi293/archive/2011/03/18/getCheckBoxOnTreeview.html</id><title type="text">[总结]关于Winform下，获取Treeview中CheckBox选中项的技巧</title><summary type="text">今天，在做一个指纹管理平台的界面上，遇到了一些问题，因为公司的基础库中没有针对Winform平台的操作，所以在一个部门选择的场景中，关于如何获取部门TreeView中被选中的项目被难住了。所幸还有一个神器叫做搜索引擎，故谷歌一番，发现Asp.net下的这个问题很好解决，但是关于Winform平台下的类似问题，如凤毛麟角啊！当然，今天我也是查了很久，终于发现了两篇不错的文章，帮助我解决了这个问题，不敢独享，结合自己对使用其方法的心得，特意记录下来，并通过一个小例子和大家一起分享。</summary><published>2011-03-18T08:01:00Z</published><updated>2011-03-18T08:01:00Z</updated><author><name>Jack Fan</name><uri>http://www.cnblogs.com/longqi293/</uri></author><link rel="alternate" href="http://www.cnblogs.com/longqi293/archive/2011/03/18/getCheckBoxOnTreeview.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/longqi293/archive/2011/03/18/getCheckBoxOnTreeview.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;span style="background-color: #c0c0c0;"&gt;背景&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;今天，在做一个指纹管理平台的界面上，遇到了一些问题，因为公司的基础库中没有针对Winform平台的操作，所以在一个部门选择的场景中，关于如何获取部门TreeView中被选中的项目被难住了。所幸还有一个神器叫做搜索引擎，故谷歌一番，发现Asp.net下的这个问题很好解决，但是关于Winform平台下的类似问题，如凤毛麟角啊！&lt;/p&gt;&lt;p&gt;当然，今天我也是查了很久，终于发现了两篇不错的文章，帮助我解决了这个问题，不敢独享，结合自己对使用其方法的心得，特意记录下来，并通过一个小例子和大家一起分享。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="background-color: #c0c0c0;"&gt;问题是这样的&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;有一个部门列表，多级的（或者说无限极），我们在Winform端列出来（这个很简单）后，需要对其进行部分的选择，然后通过一个按钮，提交选择好的部门，进入下一个业务操作场景，今天我遇到的问题就是，如何获取这个部门TreeView中，各个级别所选取的项目呢？如下图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/38209/2011031814540170.jpg" alt="问题描述" style="float: left;" /&gt;在这里只是用一个例子来说明，所以就简单一点吧，如左图所示，我们的任务就是通过程序获取被选中的部门，将其信息送到下一个业务场景之中，在传统的Asp.net中，Web.UI下的Treeview控件提供了很方便的接口方法，用于获取被选中的项目，但是来到了Winform下，瞬间杯催&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;发现不能用Asp.net的思路来做这个事情后，我立马谷歌了一下，发现如下这篇文章，说的很不错，基本上解决了我遇到的问题，原文地址如下：&amp;ldquo;&lt;span style="text-decoration: underline;"&gt;&lt;span style="color: #00ccff;"&gt;&lt;strong&gt;&lt;a href="http://www.cnblogs.com/suyan010203/archive/2010/05/22/1741595.html" target="_blank"&gt;时空隧道&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&amp;rdquo;&lt;/p&gt;&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;我总结了一下，原作者的大概思路应该如下：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/38209/2011031815021774.jpg" alt="流程图" style="display: block; margin-left: auto; margin-right: auto;" /&gt;&lt;strong&gt;图1-简单的流程图示意&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="background-color: #c0c0c0;"&gt;解决问题：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在页面（窗体）申明两个变量：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;第一个是用于存放被选项目的，文中是StringBuilder对象。&lt;/li&gt;&lt;li&gt;第二个是一个Tag标签，按照原文的话就是&amp;ldquo;&lt;em&gt;我们在TreeView的结点中用Tag来附加了CheckBox是否选中的标识信息&lt;/em&gt;&amp;rdquo;，字符串对象。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;用代码来描述就是如下形式：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; tag &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;True&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Tag标签&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;StringBuilder nodesTag;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;容器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;接下来，我们就开始去处理AfterCheck事件，让程序能够&amp;ldquo;记住&amp;rdquo;我们选择过的项目。无论大家有没有看过那篇文章，其中提到过&amp;ldquo;树的递归算法&amp;rdquo;，关于算法，大家可以参考如下这个链接：&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;&lt;a href="http://develop.csai.cn/sjjg_sf/200712180927511193.htm" target="_blank"&gt;&lt;span style="color: #00ccff;"&gt;点击穿越&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;在了解完算法后，相信大家能离家如下一段的代码了吧：这里就照搬这位博友的code了&lt;/p&gt;&lt;div onclick="cnblogs_code_show('5838cec2-5c38-494f-92df-022a4df6e273')" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;img style="display: none;" onclick="cnblogs_code_hide('5838cec2-5c38-494f-92df-022a4df6e273',event)" id="code_img_opened_5838cec2-5c38-494f-92df-022a4df6e273" class="code_img_opened" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" /&gt;&lt;div class="cnblogs_code_hide" id="cnblogs_code_open_5838cec2-5c38-494f-92df-022a4df6e273"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; TraversNodes(TreeNode parent)&lt;br /&gt;        {&lt;br /&gt;            TreeNode node &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; parent;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (node &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (node.Tag &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; node.Tag.ToString() &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; tag)&lt;br /&gt;                    nodesTag.AppendFormat(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;node:{0} has checked\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, node.Text);&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (node.FirstNode &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;/如果node节点还有子节点则进入遍历&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                {&lt;br /&gt;                    TraversNodes(node.FirstNode);&lt;br /&gt;                }&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (node.NextNode &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;/如果node节点后面有同级节点则进入遍历&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                {&lt;br /&gt;                    TraversNodes(node.NextNode);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;AfterCheck事件代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('5140861e-18ba-4bdf-b126-cbd0f46cd93c')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_5140861e-18ba-4bdf-b126-cbd0f46cd93c" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_5140861e-18ba-4bdf-b126-cbd0f46cd93c" onclick="cnblogs_code_hide('5140861e-18ba-4bdf-b126-cbd0f46cd93c',event)" style="display: none;" /&gt;&lt;div id="cnblogs_code_open_5140861e-18ba-4bdf-b126-cbd0f46cd93c" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; treeView1_AfterCheck(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, TreeViewEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (e.Action &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; TreeViewAction.Unknown)&lt;br /&gt;            {&lt;br /&gt;                TreeNode node &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; e.Node;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (node.Tag &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                    node.Tag &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; tag;&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;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                    node.Tag &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;                CheckAllChildNodes(e.Node, e.Node.Checked);&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;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; bol &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (e.Node.Parent &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; e.Node.Parent.Nodes.Count; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                    {&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;e.Node.Parent.Nodes[i].Checked)&lt;br /&gt;                            bol &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                    }&lt;br /&gt;                    e.Node.Parent.Checked &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; bol;&lt;br /&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;/记得如果父节点被选中或取消，记得设置它的tag哦&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (bol)&lt;br /&gt;                    {&lt;br /&gt;                        e.Node.Parent.Tag &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; tag;&lt;br /&gt;                    }&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                    {&lt;br /&gt;                        e.Node.Parent.Tag &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这个方法的调用时机应该是什么时候呢？对于我的场景来说，应该是再点击那个业务按钮之后，在之前，我们的AfterCheck事件代码唯一要做的事情就是如下图所示的一个流程：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/38209/2011031815262317.jpg" /&gt;&lt;/p&gt;&lt;p&gt;当我们点击业务按钮之后，为其添加如下代码即可：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('3406a9c4-e648-4989-8645-70c2553d3218')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_3406a9c4-e648-4989-8645-70c2553d3218" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_3406a9c4-e648-4989-8645-70c2553d3218" onclick="cnblogs_code_hide('3406a9c4-e648-4989-8645-70c2553d3218',event)" style="display: none;" /&gt;&lt;div id="cnblogs_code_open_3406a9c4-e648-4989-8645-70c2553d3218" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; button1_Click_1(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            nodesTag &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; StringBuilder();&lt;br /&gt;            TreeNode node &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; treeView1.TopNode;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;得到TreeView的根结点，注意根结点只有一个&lt;br /&gt;            &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;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; (node.PrevNode &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                node &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; node.PrevNode;&lt;br /&gt;            TraversNodes(node);&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;span style="color: #000000;"&gt;            MessageBox.Show(nodesTag.ToString());&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="background-color: #c0c0c0;"&gt;再好一点：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;到这里呢，按理说问题已经被解决完了。我们获取到了选中的部门，但是，按照常规来说，应该&amp;ldquo;&lt;span style="background-color: #ffff00;"&gt;选中节点的时候，如果节点存在子节点，可以选中全部的子节点；如果取消一个节点的选中状态，当前节点同时又存在父节点的话，就取消父节点的选中状态&lt;/span&gt;&amp;rdquo;，怎么办呢？&lt;/p&gt;&lt;p&gt;我觉得自己很懒，&amp;ldquo;搜&amp;rdquo;的一下，给大家链上一篇文章，我觉得写的很不错啊，如下：&lt;strong&gt;&lt;a target="_blank" href="http://www.cnblogs.com/virusswb/archive/2008/07/01/1233218.html"&gt;点此穿越&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;好啦，根据原文的意思，我们结合之前的获取选中状态的代码，修改如下：&lt;/p&gt;&lt;div onclick="cnblogs_code_show('fb6cf0ce-0100-4799-a291-709bfc04e9d9')" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;img style="display: none;" onclick="cnblogs_code_hide('fb6cf0ce-0100-4799-a291-709bfc04e9d9',event)" id="code_img_opened_fb6cf0ce-0100-4799-a291-709bfc04e9d9" class="code_img_opened" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" /&gt;&lt;div class="cnblogs_code_hide" id="cnblogs_code_open_fb6cf0ce-0100-4799-a291-709bfc04e9d9"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; treeView1_AfterCheck(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, TreeViewEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (e.Action &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; TreeViewAction.Unknown)&lt;br /&gt;            {&lt;br /&gt;                TreeNode node &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; e.Node;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (node.Tag &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                    node.Tag &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; tag;&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;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                    node.Tag &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;                CheckAllChildNodes(e.Node, e.Node.Checked);&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;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; bol &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (e.Node.Parent &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; e.Node.Parent.Nodes.Count; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                    {&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;e.Node.Parent.Nodes[i].Checked)&lt;br /&gt;                            bol &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                    }&lt;br /&gt;                    e.Node.Parent.Checked &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; bol;&lt;br /&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;/记得如果父节点被选中或取消，记得设置它的tag哦&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (bol)&lt;br /&gt;                    {&lt;br /&gt;                        e.Node.Parent.Tag &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; tag;&lt;br /&gt;                    }&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                    {&lt;br /&gt;                        e.Node.Parent.Tag &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;新的CheckAllChildNodes方法：&lt;/p&gt;&lt;p&gt;根据博友Flynn2009的提示，应该注意代码需要有修改，如下：&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ffff00;"&gt;&lt;strong&gt;node.Tag = nodeChecked ? (bool)tag : null;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;div onclick="cnblogs_code_show('b5fcd7f3-5e50-4683-86a2-be50888dcd4a')" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;img style="display: none;" onclick="cnblogs_code_hide('b5fcd7f3-5e50-4683-86a2-be50888dcd4a',event)" id="code_img_opened_b5fcd7f3-5e50-4683-86a2-be50888dcd4a" class="code_img_opened" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" /&gt;&lt;div class="cnblogs_code_hide" id="cnblogs_code_open_b5fcd7f3-5e50-4683-86a2-be50888dcd4a"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; CheckAllChildNodes(TreeNode treeNode, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; nodeChecked)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (TreeNode node &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; treeNode.Nodes)&lt;br /&gt;            {&lt;br /&gt;                node.Checked &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; nodeChecked;&lt;br /&gt;                node.Tag &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; tag;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;/记得在这里为选中的项目设置tag属性&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (node.Nodes.Count &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.CheckAllChildNodes(node, nodeChecked);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="background-color: #c0c0c0;"&gt;结束：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ffffff;"&gt;好啦，在这里呢，我们就完成了获取Treeview中CheckBox选中状态的小例子，并且呢，还人性化的设置了一个关于父子选项的效果。文章就到这里为止吧，希望能给大家带来收获。欢迎拍砖！！！&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ffffff;"&gt;最后附上本文的示例项目代码：Vs2008+.Net 2.0&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a target="_blank" href="http://files.cnblogs.com/longqi293/TreeView.zip"&gt;&lt;/a&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="color: #00ccff;"&gt;&lt;strong&gt;&lt;a target="_blank" href="http://files.cnblogs.com/longqi293/TreeView.zip"&gt;点击获取&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ffffff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/longqi293/aggbug/1988153.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/longqi293/archive/2011/03/18/getCheckBoxOnTreeview.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/longqi293/archive/2011/02/20/how-to-write-userfriendly-post.html</id><title type="text">【原创】如何写一篇“用户友好”的随笔</title><summary type="text">在今天的这篇随笔中，我们不再讨论技术问题，而是来稍微放松一下，我分享一些关于如何写一篇“用户友好”的博客的相关看法和个人经验吧，相信通过这篇随笔，能够让大家对写博有个更新的体会和思考。我通常在前言部分这里写一些本篇博客要阐述的要点，要点最好根据文章内容，采用逻辑顺序进行排列，为了和下面的正文对应整齐，方便阅读,更多精彩请点击……</summary><published>2011-02-20T02:33:00Z</published><updated>2011-02-20T02:33:00Z</updated><author><name>Jack Fan</name><uri>http://www.cnblogs.com/longqi293/</uri></author><link rel="alternate" href="http://www.cnblogs.com/longqi293/archive/2011/02/20/how-to-write-userfriendly-post.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/longqi293/archive/2011/02/20/how-to-write-userfriendly-post.html"/><content type="html">&lt;h1 id="top" class="First"&gt;本篇前言：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: normal; line-height: 21px; font-size: 14px;"&gt;在今天的这篇随笔中，我们不再讨论技术问题，而是来稍微放松一下，我分享一些关于如何写一篇&amp;ldquo;用户友好&amp;rdquo;的博客的相关看法和个人经验吧，相信通过这篇随笔，能够让大家对写博有个更新的体会和思考。我通常在前言部分这里写一些本篇博客要阐述的要点，要点最好根据文章内容，采用逻辑顺序进行排列，为了和下面的正文对应整齐，方便阅读，比如：&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;要点一&lt;/li&gt;&lt;li&gt;要点二&lt;/li&gt;&lt;li&gt;要点三&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;要点之后，开始正文。&lt;span style="font-size: 14px;"&gt;正文分别根据要点进行描述。&lt;/span&gt;&lt;/p&gt;&lt;h2 id="point1"&gt;要点一&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;整体格式，主要就是排版。&lt;/p&gt;&lt;p&gt;其中包括了你的段落格式、字体大小、特殊格式（比如超链接的颜色、样式），下面我们来看看一般我怎么来设置的。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #00ff00;"&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;ldquo;文字内容中的连接用这种颜色表示：&lt;a href="http://www.cnblogs.com/longqi293" target="_blank"&gt;&lt;span style="color: #00ccff;"&gt;相关链接演示&lt;/span&gt;&lt;/a&gt;（蓝色），如果需要强调某一句话，&lt;span style="background-color: #ffff00;"&gt;可以采用这种背景高亮来进行强调&lt;/span&gt;。当然，&lt;em&gt;你也可以使用斜体字来进行强调说明&lt;/em&gt;。格式不受统一的拘束，只要能达到效果即可！&amp;rdquo;&lt;/p&gt;&lt;p&gt;通过这样的设置之后，阅读者就能很容易的从你的文章中，提取、识别不同的重点、内容，让阅读更加容易和生动。当然，这里的颜色、字体样式，均可以根据大家的喜好进行调整，程序员每天和代码打交道的时候很多，代码英文写的，密密麻麻一大堆，所以，我建议大家，照顾我们程序员的眼睛，将自己博客的字体设置的大一些吧，我个人感觉比较舒服的字体大小是：&lt;span style="background-color: #ffff00;"&gt;14&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;很多时候，有人写了篇很好的随笔，但是由于字体和排版非常&amp;ldquo;&lt;strong&gt;随意&lt;/strong&gt;&amp;rdquo;，导致我真的看不下去&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;说完了排版，我们来看看格式，从这篇文章就看出来，以要点作为章节分界点，所以，如果标题是文章标题，那么这些要点名称则作为副标题，当然，标题和副标题的格式应该有所区别，比如副标题的颜色要统一，但是字体应该稍微比标题小&amp;hellip;&amp;hellip;再有了这些格式之后，整个文章略看起来，就很整齐、舒服了，就像在VS中按了Ctrl+K+D，怎一个舒服了得！！&lt;/p&gt;&lt;p&gt;&lt;strong&gt;要点二&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;每篇技术性的随笔，&lt;strong&gt;我觉得都多多少少应该辅以两个左右的图片作为说明&lt;/strong&gt;，你肯定看过那种通篇文字的随笔吧，除了正文，其他都没有，这里我不是说要鄙视没图的技术性随笔，我只是在想，&lt;span style="text-decoration: underline;"&gt;运行结果截图、样式效果图、架构设计图甚至流程图都是图&lt;/span&gt;，我们在从事技术性工作的同时，难道一张图都没有？&lt;/p&gt;&lt;p&gt;也许两个人都写同一个技术问题，一个人配图说明，而另一个则文字大片，我相信，不论是从阅读后的效果还是用户体验来说，配图的朋友的文章应该点击量会稍微高些，甚至很高很高&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;好了，废话不多说，我们看看怎么配图吧。最好每段文字都配有图片说明，图片上最好还有一些箭头、标示用来帮助读者更好的结合文章对你所描述的内容进行理解。比如：下图就是直接使用上传并插入图片而形成的一个普通效果图。&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: normal; line-height: 21px; font-size: 14px;"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/images/2010/38209/2010122211274990.png" alt="带箭头描述的图片" width="416" height="219" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: normal; line-height: 21px; font-size: 14px;"&gt;图1&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: normal; line-height: 21px; font-size: 14px;"&gt;&lt;em&gt;如果我们把图1的箭头去掉，相信大家就能感觉到这种效果的反差了，这会让用户更多的依赖我们的文字描述来理解这个图，而不是通过图片来理解文章，我们会被要求进行更详细精确地用文字来描述图片（反效果）。&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: normal; line-height: 21px; font-size: 14px;"&gt;在看完了上个图片后，我们也许会在一片技术博文中插入很多素材图片，最后，你将会发现，这些图片和文字的关系就是&amp;ldquo;上、中、下&amp;rdquo;，图片介于文字和文字中间，感觉看着没啥新意，或者会让阅读者产生&amp;ldquo;审美疲劳&amp;rdquo;，呵呵，我们可以通过编辑器，给插入文章的图片设置一个格式，如下所示：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: normal; line-height: 21px; font-size: 14px;"&gt;&lt;img style="float: left;" src="http://pic002.cnblogs.com/images/2010/38209/2010122211282269.gif" alt="四周环绕" width="156" height="129" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: normal; line-height: 21px; font-size: 14px;"&gt;图片一般居中显示吧，如果有条件，请给图片进行编号和标识如上图。当然了，如果你希望图文并茂之后，有更好的用户体验，我建议你花点时间，对图片的文字环绕进行设置。比如如下的设置，相信会让整个博客看起来更加舒服！设置了四周环绕后，一些图片附在文字周围，让你的文章看起来更有层次感，并且表现形式丰富，这难道不是我们平常所强调的么。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: normal; line-height: 21px; font-size: 14px;"&gt;那&lt;/span&gt;么，如何设置这种格式呢？很简单，右键单击插入的图片，出现菜单，点击&amp;ldquo;插入/编辑图片&amp;rdquo;，进入新的菜单窗口后，选择&amp;ldquo;外观&amp;rdquo;选项卡，将图片外观选择至&amp;ldquo;居左&amp;rdquo;或者&amp;ldquo;居右&amp;rdquo;，即可！&lt;/p&gt;&lt;p&gt;&lt;img style="vertical-align: text-bottom;" src="http://pic002.cnblogs.com/images/2011/38209/2011022010211469.jpg" alt="" /&gt;------------------------------》&lt;img src="http://pic002.cnblogs.com/images/2011/38209/2011022010224150.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2 style="text-align: left;"&gt;要点三&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在说完了图片后，还有一个比较重要的部分就是阅读体验！什么？难道刚才所说的不是阅读体验么？呵呵，一半一半吧，以上所说的只是一部分阅读体验，就像用户体验一样，一个网站看起来舒服、布局清爽整齐是一回事儿，但是还应该考虑到用户的使用体验，感官体验之后就是使用了吧。&lt;/p&gt;&lt;p&gt;那么一篇博客怎么搞用户体验呢？我说个我觉得比较有意思的吧，我们肯定看过那些篇幅非常长的技术文章吧，他们格式整齐、图文并茂，但是，当我的滚动条滑到一定位置，我又记不得上文是如何描述某个概念的，这时，我想向上阅读这个概念定义，一般我都是使用查找功能（浏览器自带的）这个用户体验够糟了，为什么我们不使用锚点呢，比如我在这里说道&amp;ldquo;&lt;a title="锚点-要点一" href="#point1"&gt;&lt;span style="color: #ff0000;"&gt;如上文所提及的要点一&lt;/span&gt;&lt;/a&gt;&amp;rdquo;，你们点击要点一，直接定位到那个锚点。如此这般&amp;hellip;&amp;hellip;就不一一举例了，应该按照实际情况而定。&lt;/p&gt;&lt;p&gt;当然，你可以在某些地方插入像下面的那个Top，并定位锚点到文章开头，呵呵。是不是很方便呢？（锚点设置请看具体的网页源代码，比如要点一标签的Name和ID属性，以及插入锚点的地方的href地址格式）&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ffffff; background-color: #c0c0c0;"&gt;&lt;a title="锚点-页头" href="#top"&gt;top&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;这就是一个最简单的使用体验吧。好了，说完了文章内的使用体验，我们在聊个题外话：博客的用户体验。&lt;/p&gt;&lt;p&gt;我们也许在浏览别人的博客时，很容易就能找到这位博友的&amp;ldquo;&lt;span style="background-color: #ffff00;"&gt;&lt;strong&gt;索引贴&lt;/strong&gt;&lt;/span&gt;&amp;rdquo;，这是一个大家都比较喜欢的方式，也为用户体验带来不少加分，那么我要补充的是，我们其实可以为每篇博客加上一个图文并茂的&amp;ldquo;&lt;strong&gt;&lt;span style="background-color: #ffff00;"&gt;摘要&lt;/span&gt;&lt;/strong&gt;&amp;rdquo;。&lt;/p&gt;&lt;p&gt;就用我举个例子吧，我写的文章涉及面很杂，从Mobile到Winform再到xxxx，每次我自己上我的博客都很头疼，必需看标题才知道这篇随笔大概是说什么事儿，后来我为这些分类定义了一些个图标，&lt;a onclick="window.open('http://www.cnblogs.com/longqi293/','快显窗口','resizable=yes,width=980,height=400,left='+(screen.availWidth/2-490)+',top='+(screen.availHeight/2-200)+'');return false;" href="http://www.cnblogs.com/longqi293/"&gt;&lt;span style="color: #ff0000;"&gt;点此快速查看&lt;/span&gt;&lt;/a&gt;(这里将快速为你导航到首页，并查看我所说的效果)，每每我自己进入博客首页，我就能很清楚的看到每篇博客大概是那个分类，这样，不仅仅丰富了博客首页的内容，也让阅读者能够很容易的看到他想看到的东西。&lt;/p&gt;&lt;p&gt;好啦，今天周日，希望这篇随笔能为大家带来一些新鲜的空气，如果你有自己的想法、建议，欢迎讨论！！！祝大家周末愉快！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/longqi293/aggbug/1958833.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/longqi293/archive/2011/02/20/how-to-write-userfriendly-post.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/longqi293/archive/2011/02/10/vstoforexcel3.html</id><title type="text">[VSTO系列]三、简单的UI设计/QQ联系人导出（下）</title><summary type="text">接上一篇：http://www.cnblogs.com/longqi293/archive/2010/12/22/vstoforexcel2.html，我们通过VSTO，简单的使用了Ribbon控件，以及如何从QQ邮箱导出联系人。在有了这些基础之后，我们来开始一个比较复杂的实验吧，这回，我们将对那个生成的联系人Excel文档进行处理，提取出每个好友的QQ号码，然后再将这些号码对应的复制到这些联系人后面。具体效果如何，还是慢慢来看。</summary><published>2011-02-10T06:57:00Z</published><updated>2011-02-10T06:57:00Z</updated><author><name>Jack Fan</name><uri>http://www.cnblogs.com/longqi293/</uri></author><link rel="alternate" href="http://www.cnblogs.com/longqi293/archive/2011/02/10/vstoforexcel3.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/longqi293/archive/2011/02/10/vstoforexcel3.html"/><content type="html">&lt;p&gt;接上一篇：&lt;a target="_blank" href="http://www.cnblogs.com/longqi293/archive/2010/12/22/vstoforexcel2.html"&gt;http://www.cnblogs.com/longqi293/archive/2010/12/22/vstoforexcel2.html&lt;/a&gt;，我们通过VSTO，简单的使用了Ribbon控件，以及如何从QQ邮箱导出联系人。&lt;/p&gt;&lt;p&gt;在有了这些基础之后，我们来开始一个比较复杂的实验吧，这回，我们将对那个生成的联系人Excel文档进行处理，提取出每个好友的QQ号码，然后再将这些号码对应的复制到这些联系人后面。具体效果如何，还是慢慢来看。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;慢慢来&amp;mdash;&amp;mdash;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;首先，还是建立一个Excel2007的外接程序项目，然后向项目中添加项，选择Office&amp;mdash;&amp;mdash;&amp;gt;功能区（可视化设计），如下图：&lt;/p&gt;&lt;p&gt;&lt;img alt="功能区" height="219" width="416" src="http://pic002.cnblogs.com/images/2010/38209/2010122211274990.png" /&gt;&lt;/p&gt;&lt;p&gt;我们双击新添加的那个文件，即可打开UI设计界面。&lt;/p&gt;&lt;p&gt;&lt;img alt="双击" height="129" width="156" src="http://pic002.cnblogs.com/images/2010/38209/2010122211282269.gif" /&gt;&lt;/p&gt;&lt;p&gt;接下来呢，我们就要开始编辑Ribbon1的设计界面了，拖放一个Button空间到Group中，如下图：&lt;/p&gt;&lt;p&gt;&lt;img alt="拖放" height="361" width="181" src="http://pic002.cnblogs.com/images/2010/38209/2010122211285829.gif" /&gt;&lt;/p&gt;&lt;p&gt;我们的程序见面如下所示：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/38209/2011021014155754.jpg" /&gt;&lt;/p&gt;&lt;p&gt;粗略的设计就是如此，大家可以花点时间，慢慢研究Ribbon自带的各类控件的使用，相信通过一段时间，大家能够设计出自己所喜欢的外观。在这里就仅作演示吧。&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;我们要做什么&amp;mdash;&amp;mdash;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;接下来，我们开始最关键的代码编写工作了，首先，我们要明白三件事：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;获取某一列的所有单元格数据&lt;/li&gt;&lt;li&gt;处理每一个单元格的数据&lt;/li&gt;&lt;li&gt;把处理后的数据添加到指定列中进行显示&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;所以，很明确，我们的代码也分为这几步，首先，获取当前的工作薄，其中的某一个区域，我们使用get_range方法来实现，就本例子而言呢，腾讯邮箱生成的那个联系人表格，B列，是每个人的QQ邮箱，我们的QQ号码就从这里提取，提取到邮箱后，把@符号及之后的字符去掉，保留前端的QQ号码，并把处理过后的结果，放到该表格的指定列里面。大致意图，如下所示：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/38209/2011021014220844.jpg" /&gt;&lt;/p&gt;&lt;p&gt;当然了，上图所示，绿色区域为指定的显示列，红色区域为待处理，实际中，绿色的部分可以随意指定。在这里也是举个例子罢了。好啦，有图了，接下来是寻求真相的过程。&lt;/p&gt;&lt;p&gt;通过之前的分析，我们需要先铺垫个小知识：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如何获取一定区域（范围）的单元格？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个相信大家谷歌一下绝对能找出方法，这里就不在赘述，此文的方法为使用Worksheet的get_range方法，在MSDN中，详细的介绍了此方法的使用，小弟也给出地址，大家可以慢慢参考：&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.worksheet.get_range(v=VS.100).aspx"&gt;http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.worksheet.get_range(v=VS.100).aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这是一个英文地址，为什么呢？主要是它比较关键的说道，在这个方法的参数中，可以使用语意参数，比如，我要获取A1到C4这个4x4区域范围的所有单元格，你可以这么写get_range("A1:C4",Type.Missing)。&lt;/p&gt;&lt;p&gt;反而中文版的文档中，却没提到&amp;hellip;&amp;hellip;不知道是不是我没找到还是什么的&amp;hellip;&amp;hellip;&amp;gt;_&amp;lt;|||.&lt;/p&gt;&lt;p&gt;这个问题一解决了，那后面的事情就好办了，看代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetRidOfQQ()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;/初始化一个Worksheet实例，用于获取当前激活的工作薄&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            Microsoft.Office.Interop.Excel.Worksheet ws &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (Microsoft.Office.Interop.Excel.Worksheet)Globals.ThisAddIn.Application.ActiveSheet;&lt;br /&gt;            &lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;/计算目标列的行数，这里不是很科学，推荐使用UsedRange属性进行统计&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; rows &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ws.get_Range(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;B2:B125&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, Type.Missing).Count;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;/初始化一个数组，用于保存处理后的号码&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] QQNum &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;[rows];&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; j &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; j &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; rows; )&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (Range rng &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; ws.get_Range(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;B2:B125&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, Type.Missing))&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取指定范围内的单元格集合&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                {&lt;br /&gt;                    QQNum[j] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; rng.Value2.ToString().Replace(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@qq.com&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;                    j&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            Globals.ThisAddIn.Application.Cells[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;11&lt;/span&gt;&lt;span style="color: #000000;"&gt;] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;QQ号码&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; QQNum.Count(); i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;/注意，这里的Cells索引值从1开始计算&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                Globals.ThisAddIn.Application.Cells[i &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;11&lt;/span&gt;&lt;span style="color: #000000;"&gt;] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; QQNum[i &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;/往指定单元格赋值&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;相信注释已经比较详细了，代码不太美观，也仅仅作为演示使用了。&lt;/p&gt;&lt;p&gt;之后，为那个Ribbon上的按钮添加单击事件代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;            try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            {&lt;br /&gt;                GetRidOfQQ();&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (Exception ex)&lt;br /&gt;            {&lt;br /&gt;                System.Windows.Forms.MessageBox.Show(ex.Message);&lt;br /&gt;            }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;ok，至此，这个程序就制作完毕了，下面就是来看看运行效果对不对，测试结果如下图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/38209/2011021014432849.jpg" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/38209/2011021014435493.jpg" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/38209/2011021014440849.jpg" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;小结：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;大家也许看到了吧，如果联系人用了一个文字类的邮箱替代了QQ号码邮箱，则这个结果是文字的，并不能够当做QQ号码来用，所以，这次示例的局限性也很明显，收到了联系人表格的限制，不过，我们也从简单的RibbonUI设计，走到了具体的Excel对象操作，接下来，还有各种各样的Excel对象操作，内容包罗万象，可想而知不是一个系列就能写完的，我们关注的是VSTO能给我们带来什么新的变化。&lt;/p&gt;&lt;p&gt;试想，客户已经基于Office套件，进行着各类业务数据的存储、处理，相对来说，比较成熟。但是某一天，他需要对Excel表格数据进行一些不大不小的分析，比如报表、统计等等。难道我们给他从Asp.net开始&amp;hellip;&amp;hellip;Bla&amp;hellip;&amp;hellip;Bla。&lt;/p&gt;&lt;p&gt;我们换个思路，紧紧抓住客户最关心的业务来开展我们的工作，直接为Excel客户端开发Add-In级别的插件，以解决最实际的需求为目标，这不是更好吗？当然，效率、可维护性、可扩展性&amp;hellip;&amp;hellip;等等一大堆话题将会被引入&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;这只是我一己之见吧，希望广大园友热烈拍砖~~&lt;/p&gt;&lt;p&gt;下一节，将会带来一些部署方面的说明和探讨。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/longqi293/aggbug/1950762.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/longqi293/archive/2011/02/10/vstoforexcel3.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/longqi293/archive/2010/12/22/vstoforexcel2.html</id><title type="text">[VSTO系列]二、简单的UI设计/QQ联系人导出（上）</title><summary type="text">接上一篇：http://www.cnblogs.com/longqi293/archive/2010/12/08/vstoforexcel1.html在日常的生活中，QQ已经是联系我们人际关系的一条重要纽带，就像我们的手机，手机中存在很多联系人，并且现在提供了很多软件对不同平台的手机作联系人的备份，可是对于QQ呢？除了会员以外，好像要导出联系人进行备份有点麻烦。在这里，结合我们的文章，给出一个比较“牵强的”解决方案，主要针对于非QQ会员的朋友。</summary><published>2010-12-22T03:33:00Z</published><updated>2010-12-22T03:33:00Z</updated><author><name>Jack Fan</name><uri>http://www.cnblogs.com/longqi293/</uri></author><link rel="alternate" href="http://www.cnblogs.com/longqi293/archive/2010/12/22/vstoforexcel2.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/longqi293/archive/2010/12/22/vstoforexcel2.html"/><content type="html">&lt;p&gt;接上一篇：&lt;a href="http://www.cnblogs.com/longqi293/archive/2010/12/08/vstoforexcel1.html" target="_blank"&gt;http://www.cnblogs.com/longqi293/archive/2010/12/08/vstoforexcel1.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在日常的生活中，QQ已经是联系我们人际关系的一条重要纽带，就像我们的手机，手机中存在很多联系人，并且现在提供了很多软件对不同平台的手机作联系人的备份，可是对于QQ呢？除了会员以外，好像要导出联系人进行备份有点麻烦。在这里，结合我们的文章，给出一个比较&amp;ldquo;牵强的&amp;rdquo;解决方案，主要针对于非QQ会员的朋友。&lt;/p&gt;&lt;p&gt;当然，在这里主要还是为了介绍VSTO For Excel这门技术，也许这个例子举得不很恰当，也请大家多多包涵，毕竟条条大道通罗马&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;回到今天的主题，我们还是进一步的了解VSTO为我们提供的强大功能吧。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;什么是Ribbon&lt;/strong&gt;&lt;strong&gt;？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;自Office 2007以来，Ribbon UI得到了越来越广泛的应用。&lt;/p&gt;&lt;p&gt;Ribbon UI的历史&lt;/p&gt;&lt;p&gt;Ribbon主要来自于此前的Office组件。当时由于原有的界面已经过时，并且用户抱怨经常找不到要用的功能。因此微软寻求各种方法用于代替传统的基于菜单和工具栏的界面。在进行了大量的测试之后，微软的程序员找到了如今我们熟悉的Ribbon界面。&lt;/p&gt;&lt;p&gt;Ribbon剖析&lt;/p&gt;&lt;p&gt;Ribbon的菜单和按钮主要集中在程序最上方，以tab和分类的形式展现，功能的布局很有条理。某些按钮平时是隐藏的，只有需要用时才会自动出来。此外，据微软称，Ribbon专门为1024X768的分辨率做过优化。之前的ALT+F组合键打开程序菜单的方法依然有效。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://www.actiprosoftware.com/Products/DotNet/WPF/Ribbon/Images/Ribbon.gif" alt="Ribbon jack" width="584" height="255" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为我们的Add-in&lt;/strong&gt;&lt;strong&gt;添加Ribbon&lt;/strong&gt;&lt;strong&gt;&amp;mdash;&amp;mdash;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们看到，创建好的Add-in项目只有代码文件，要添加RibbonUI界面，则需要右键单击项目，使用&amp;ldquo;添加Windows窗体&amp;rdquo;功能进行添加，如下图:&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/images/2010/38209/2010122211274990.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;再添加好窗体后，我们双击新添加的那个文件，即可打开UI设计界面。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/38209/2010122211282269.gif" alt="" /&gt;&lt;/p&gt;&lt;p&gt;哈哈，是不是很熟悉啊，对了，这就是我们的Add-in插件所使用的UI，我们可以像设计桌面程序一样去做Ribbon的设计，具体内容在这里就不赘述了，大家可以自己研究研究，比较容易上手。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/38209/2010122211284169.png" alt="" /&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/38209/2010122211285829.gif" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;开始我们的VSTO&lt;/strong&gt;&lt;strong&gt;代码设计&amp;mdash;&amp;mdash;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们的Addin程序中，我们把逻辑代码写到那个&amp;ldquo;功能按钮&amp;rdquo;之下，主要逻辑代码如下：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('f332b821-2220-430d-9d4f-859960a7a739')"&gt;&lt;div id="cnblogs_code_open_f332b821-2220-430d-9d4f-859960a7a739" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; button1_Click(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, RibbonControlEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            Excel.Worksheet activeWorksheet &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (Excel.Worksheet)Globals.ThisAddIn.Application.ActiveSheet;&lt;br /&gt;            &lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (Excel.Range rng &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; activeWorksheet.get_Range(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;A1:A3&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,Type.Missing))&lt;br /&gt;            {&lt;br /&gt;                MessageBox.Show(rng.Value2.ToString());&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;看了很简单吧，如果在这里你还不熟悉Range，Excel，ActiveSheet这些关键词，建议你先回到上一篇文章中，查阅一下Excel对象模型的相关内容，相信就能很快回忆起来了&lt;a href="http://www.cnblogs.com/longqi293/archive/2010/12/08/vstoforexcel1.html" target="_blank"&gt;http://www.cnblogs.com/longqi293/archive/2010/12/08/vstoforexcel1.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在这里，我们的代码主要完成了一件事情，就是当用户点击那个功能按钮后，我们就显示单元格A1到A3的内容。那结果是不是如我们所说呢？在调试后，的确能够达到效果。那么，我们今天的路就走完一半了。来回顾一下：&lt;/p&gt;&lt;p&gt;1、&amp;nbsp; 我们知道如何为Add-in项目添加RibbonUI&lt;/p&gt;&lt;p&gt;2、&amp;nbsp; 知道了用代码获取某一区域的单元格内容&lt;/p&gt;&lt;p&gt;那接下来，我们就跳出技术的圈圈，看看QQ联系人这回事儿吧。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;怎么导出联系人？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这是个问题，方法种类繁多，会员直接跳过&amp;hellip;&amp;hellip;在这里我提供一个思路吧，QQ邮箱想必大家都用过，他有一个同步联系人的功能，最后还有一个导出联系人的功能，看了我是很激动啊。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/38209/2010122211305261.gif" alt="" /&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/38209/2010122211313095.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;经过试验，导出的这份QQ邮箱联系人的Excel文档，包含了我所有QQ联系人的邮箱号，刚好大家的邮箱号基本都是用QQ号做的账户名&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;恩，到这里，这篇文章就写到这吧。暂且卖个关子（其实是工作太忙了，写不完，不好意思啊&amp;hellip;&amp;hellip;）&lt;/p&gt;&lt;p&gt;下一篇文章，将会和大家一起实现那个联系人的处理功能，谢谢大家。如果平常有什么联系人导出导入的工具提供就好了，发现如果不给疼讯缴纳几个会员费，这个功能怎么就那么麻烦呢&amp;hellip;&amp;hellip;求免费好用的工具&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/longqi293/aggbug/1913595.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/longqi293/archive/2010/12/22/vstoforexcel2.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/longqi293/archive/2010/12/08/vstoforexcel1.html</id><title type="text">[VSTO系列]一、VSTO For Excel Getting Start!</title><summary type="text">我们的目标：在这次的系列文章中，我们通过一些小例子，来循序渐进的学习VSTO for excel这个已经出现很久的技术，在平常的使用时，我很少发现比较全面或者具体的文章作介绍，当然，除了MSDN。在我的博客开始这个系列，一为了巩固自己的相关技术知识，二也是为了和大家一起交流分享自己的技术心得和体会，希望能够获得更多宝贵的经验！</summary><published>2010-12-08T05:00:00Z</published><updated>2010-12-08T05:00:00Z</updated><author><name>Jack Fan</name><uri>http://www.cnblogs.com/longqi293/</uri></author><link rel="alternate" href="http://www.cnblogs.com/longqi293/archive/2010/12/08/vstoforexcel1.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/longqi293/archive/2010/12/08/vstoforexcel1.html"/><content type="html">&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;我们的目标：&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;在这次的系列文章中，我们通过一些小例子，来循序渐进的学习VSTO for excel这个已经出现很久的技术，在平常的使用时，我很少发现比较全面或者具体的文章作介绍，当然，除了MSDN。&lt;/p&gt;&lt;p&gt;在我的博客开始这个系列，一为了巩固自己的相关技术知识，二也是为了和大家一起交流分享自己的技术心得和体会，希望能够获得更多宝贵的经验！&lt;/p&gt;&lt;p&gt;这个系列第一期大致有如下文章：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Getting Start(Add-In级别)&lt;/li&gt;&lt;li&gt;&lt;a title="Ribbon jackfan longqi293" href="http://www.cnblogs.com/longqi293/archive/2010/12/22/vstoforexcel2.html" target="_blank"&gt;简单的UI设计（Robbin）&lt;/a&gt;&lt;/li&gt;&lt;li&gt;批量操作（附带一个qq联系人导出例子，Add-In级别）J&lt;/li&gt;&lt;li&gt;丰富的自定义UI交互(Add-In级别)&lt;/li&gt;&lt;li&gt;部署Add-In组件到客户端&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;第二期将根据第一期的情况做灵活修改和调整，欢迎大家拍砖！&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;什么是VSTO：&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;是啊，什么是VSTO呢，其实很多朋友包括MSDN都给出了很好的定义，在此我就不再罗嗦，请大家通过如下网址进行查阅吧：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;引用：&lt;a href="http://blog.csdn.net/v_jzho/archive/2007/09/29/1806904.aspx" target="_blank"&gt;http://blog.csdn.net/v_jzho/archive/2007/09/29/1806904.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;引用（官方对比）：&lt;a href="http://msdn.microsoft.com/zh-cn/library/zcfbd2sk(v=VS.80).aspx" target="_blank"&gt;http://msdn.microsoft.com/zh-cn/library/zcfbd2sk(v=VS.80).aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;Excel对象模型：&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;在了解一个开发对象前，了解这个对象的模型是至关重要的，所以，再次还是照例，从MSDN搬来了对象模型介绍，全部是中文的，相信大家能够看懂。也请大家耐心的学习，毕竟这是日后很重要的一点！&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;引用：&lt;a href="http://msdn.microsoft.com/zh-cn/library/wss56bz7(VS.80).aspx" target="_blank"&gt;http://msdn.microsoft.com/zh-cn/library/wss56bz7(VS.80).aspx&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;开发环境：&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size: 12pt;"&gt;﻿&lt;/span&gt; &lt;/ul&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;既然做开发嘛，开发环境当然是要搭建的了，下面是摘抄自MSDN的一段介绍。在这里只做简单的介绍，因为当我们安装好VS08，并且装有Office2007时，这个开发环境已经基本上搭建完毕了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在开发计算机上安装设计工具&lt;/p&gt;&lt;ol&gt;&lt;li&gt;安装 Office，包括主互操作程序集。有关更多信息，请参见 &lt;a href="http://msdn.microsoft.com/zh-cn/library/kh3965hw(v=VS.80).aspx"&gt;如何：安装 Office 主互操作程序集&lt;/a&gt;。&lt;/li&gt;&lt;li&gt;安装 Office 2003 SP1 或更高版本。有关更多信息，请参见 Office 2003 Service Pack 1 网站 (&lt;a href="http://office.microsoft.com/zh-cn/officeupdate/default.aspx"&gt;http://office.microsoft.com/zh-cn/officeupdate/default.aspx&lt;/a&gt;)。&lt;/li&gt;&lt;li&gt;安装 VSTO 2005，或安装 Visual Studio Team System 产品，包括编程语言 Visual Basic 或 Visual C#。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;默认情况下，安装 Visual Basic 或 Visual C# 时 VSTO 2005 随 Visual Studio Team System 产品一起安装。&lt;/p&gt;&lt;ol&gt;&lt;li&gt;如果 Visual Studio 为英语版本，但使用的是非英语 Windows 设置，可安装 Visual Studio Tools for Office 语言包来以 Windows 使用的语言查看 Visual Studio Tools for Office 运行库消息。Visual Studio Tools for Office 语言包可从 Microsoft 下载中心 (&lt;a href="http://www.microsoft.com/downloads/search.aspx?displaylang=zh-cn"&gt;http://www.microsoft.com/downloads/search.aspx?displaylang=zh-cn&lt;/a&gt;) 获得。Visual Studio Tools for Office 的非英语版本会自动安装该语言包。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;如果在安装 Office 之前安装 Visual Studio Team System 产品，则必须通过运行运行库安装文件 (VSTOR.exe) 修复 Visual Studio Tools for Office 运行库。有关更多信息，请参见 &lt;a href="http://msdn.microsoft.com/zh-cn/library/ms178739(v=VS.80).aspx"&gt;如何：安装 Visual Studio Tools for Office 运行库&lt;/a&gt;。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 12pt;"&gt;第一个Add-In项目：&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;span style="font-size: 12pt;"&gt;好了，在之前一大堆的铺垫完毕后，想必大家很想小露一手。请慢慢来，关于新建Office项目相信已经不是很难得了，如下图，我们建立一个以c#语言为基础的Office Excel Add-In（外接程序）项目。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" title="jack fan" src="http://pic002.cnblogs.com/images/2010/38209/2010120812483842.png" alt="vsto for excel" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 宋体;"&gt;因为在下的机器上没有&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: Calibri;"&gt;03&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 宋体;"&gt;的&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: Calibri;"&gt;office&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 宋体;"&gt;，不过放心，你也可以使用&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: Calibri;"&gt;03&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 宋体;"&gt;的模板进行开发，这里为了方便，我使用&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: Calibri;"&gt;07&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 宋体;"&gt;的模板（虽然需要&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: Calibri;"&gt;.Net 3.5&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 宋体;"&gt;的框架&amp;hellip;&amp;hellip;）&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"&gt;然后打开后，我们看到项目结构如下：&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"&gt;&lt;img title="jack fan" src="http://pic002.cnblogs.com/images/2010/38209/2010120812502251.png" alt="vsto for excel" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;很简单的内容，这个ThisAddIn.CS是什么呢？且听我慢慢道来。&lt;/p&gt;&lt;p&gt;这个ThisAddIn文件类似于一个外接程序（AddIn）的入口，所有比较重要的操作，包括对象的获取，均要在这里进行。&lt;/p&gt;&lt;p&gt;在MSDN里说的很明了：&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff; text-decoration: underline;"&gt;&lt;em&gt;When you create an Excel add-in project, Visual Studio generates a class, called ThisAddIn, which is the foundation of your solution. This class provides a starting point for writing your code, and it also exposes the object model of Excel to your add-in.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;哈哈，多的就不罗嗦了。继续我们的代码吧。从最简单的开始，我们看到ThisAddIn中，有个StartUp方法，我们在这个方法里主要写一些在外接程序加载时的处理函数，比如注册事件、初始化对象等等，如下：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #000000;"&gt; &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;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Application.WorkbookBeforeSave &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Microsoft.Office.Interop.Excel.AppEvents_WorkbookBeforeSaveEventHandler(Application_WorkbookBeforeSave);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;我们注册了一个自定义事件，这导致在保存完毕之前，插件对我们进行响应。然后，在ThisAddIn类中，添加刚才注册事件的实现函数代码如下：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('c4ed3998-9b75-4e6d-926e-fd99cb2373e3')"&gt;&lt;div id="cnblogs_code_open_c4ed3998-9b75-4e6d-926e-fd99cb2373e3" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 保存前的函数代码&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="Wb"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;Workbook参数&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="SaveAsUI"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;保存选项&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="Cancel"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;接受取消？&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;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Application_WorkbookBeforeSave(Microsoft.Office.Interop.Excel.Workbook Wb, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; SaveAsUI, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;ref&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; Cancel)&lt;br /&gt;        {&lt;br /&gt;            Excel.Worksheet activeWorksheet &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ((Excel.Worksheet)Application.ActiveSheet);&lt;br /&gt;            Excel.Range firstRow &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; activeWorksheet.get_Range(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;A1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, missing);&lt;br /&gt;            firstRow.EntireRow.Insert(Excel.XlInsertShiftDirection.xlShiftDown, System.Type.Missing);&lt;br /&gt;            Excel.Range newFirstRow &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; activeWorksheet.get_Range(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;A1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, missing);&lt;br /&gt;            newFirstRow.Value2 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;This text was added by using code&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;至此，一个简单的Add-In程序就完成了，还等什么，让我们一起来F5一下吧！&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;程序在调试时，打开一个空白的工作薄，然后我们点击保存后，注意，A1格的值被填充了。代表插件运行正常。到这里，第一篇文章就结束了，希望大家能有收获。（每一篇尽量简短干练）&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="font-family: 新宋体; font-size: 12pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;至此，一个简单的&lt;span lang="EN-US"&gt;Add-In&lt;/span&gt;程序就完成了，还等什么，让我们一起来&lt;span lang="EN-US"&gt;F5&lt;/span&gt;一下吧！&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 新宋体; font-size: 12pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;程序在调试时，打开一个空白的工作薄，然后我们点击保存后，注意，&lt;span lang="EN-US"&gt;A1&lt;/span&gt;格的值被填充了。代表插件运行正常。到这里，第一篇文章就结束了，希望大家能有收获。（每一篇尽量简短干练）&amp;mdash;&amp;mdash;别走开，后面还有小Tips~~~&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 新宋体; font-size: 12pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/images/2010/38209/2010120812563264.png" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;小Tips:&lt;/p&gt;&lt;p&gt;每次调试之后，我们最好都养成一个好习惯就是：回收！不然这些插件会莫名其妙的出问题，具体什么原因我实在说不上来，所以在这里先说说回收的习惯吧。&lt;/p&gt;&lt;p&gt;怎么回收呢？简单&amp;mdash;&amp;mdash;&amp;ldquo;清理解决方案&amp;rdquo;、&amp;ldquo;清理项目&amp;rdquo;，这样，就ok了！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/longqi293/aggbug/1900124.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/longqi293/archive/2010/12/08/vstoforexcel1.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/longqi293/archive/2010/09/15/WindowsMobile-AutoComplete.html</id><title type="text">『原创』让.Net CF实现智能提示（AutoComplete）功能</title><summary type="text">最近，一直在做Winform方面的开发，有一个公交信息查询的场景，用户在起始站输入框输入部分站点名称，系统能够自动给他建议和提示，类似Google中的自动补全、智能提示之类的功能，在Winform或者WebForm下，.Net都提供了不错的解决方案，甚至可以直接用Ajax中的AutoComplete控件。但是，问题来了，这个功能要移植到WM平台，我们平常在使用WM手机都可以知道，输入是一件比较麻烦的事情，总是喜欢点点、滑滑、拖拖……反正就是不喜欢输入吧……平常查公交站点，在谷歌里面，都是输入几个关键字就能“被”补全，也许，我有时候都不记得站点的全名了&gt;_&lt;|||。本想直接用Combox的，发现其没有自</summary><published>2010-09-15T12:12:00Z</published><updated>2010-09-15T12:12:00Z</updated><author><name>Jack Fan</name><uri>http://www.cnblogs.com/longqi293/</uri></author><link rel="alternate" href="http://www.cnblogs.com/longqi293/archive/2010/09/15/WindowsMobile-AutoComplete.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/longqi293/archive/2010/09/15/WindowsMobile-AutoComplete.html"/><content type="html">&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;最近，一直在做Winform方面的开发，有一个公交信息查询的场景，用户在起始站输入框输入部分站点名称，系统能够自动给他建议和提示，类似Google中的自动补全、智能提示之类的功能，在Winform或者WebForm下，.Net都提供了不错的解决方案，甚至可以直接用Ajax中的AutoComplete控件。&lt;/p&gt;&lt;p&gt;但是，问题来了，这个功能要移植到WM平台，我们平常在使用WM手机都可以知道，输入是一件比较麻烦的事情，总是喜欢点点、滑滑、拖拖&amp;hellip;&amp;hellip;反正就是不喜欢输入吧&amp;hellip;&amp;hellip;平常查公交站点，在谷歌里面，都是输入几个关键字就能&amp;ldquo;被&amp;rdquo;补全，也许，我有时候都不记得站点的全名了&amp;gt;_&amp;lt;|||。&lt;/p&gt;&lt;p&gt;本想直接用Combox的，发现其没有自动补全功能，谷歌百度一把，发现没有太好的&amp;ldquo;轮子&amp;rdquo;，于是，我只有自己造一个带自动补全功能的Combox了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;正文&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;虽然没有正式的去研究过AutoComplete这个功能，不过，自己想想，也能山寨一个吧。我的思路如下：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;先把站点列表填充好，等待用户输入的关键词&lt;/li&gt;&lt;li&gt;用户输入关键词，每输入一个字，进行站点列表遍历，查找符合条件的站点，并把它们加入&amp;ldquo;候补列表&amp;rdquo;&lt;/li&gt;&lt;li&gt;用户可以通过Combox的下拉按钮展开Items，查看系统给出的&amp;ldquo;建议&amp;rdquo;站点&lt;/li&gt;&lt;li&gt;用户修改关键词，系统重新比对、填充&amp;ldquo;候补列表&amp;rdquo;&lt;/li&gt;&lt;li&gt;用户关键词越详细，候补列表越精确&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;有了思路，好像还不错，于是就开始Coding吧。和所有WM项目一样，在设计界面，拖放一个Combox控件到窗体内，并设置Combox的Dock为Top。就这么简单吧。当然，在这里，我们还是一切从简，我没有把站点数据库加载到程序中（实际上，客户下载了程序后，自带了一个SQLite数据库存储站点信息），各位看了我的代码，估计基本能够理解了吧。&lt;/p&gt;&lt;p&gt;定义两个泛型变量，用于存储List信息：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('8e3a63af-17f4-4d62-83ac-a04d7d6713ee')"&gt;&lt;div id="cnblogs_code_open_8e3a63af-17f4-4d62-83ac-a04d7d6713ee" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #008000;"&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 这个List用于存放站点列表，实际中&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #008000;"&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 站点可能是字符串类型也可能是整型，视具体情况而定&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #008000;"&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; liStops;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #008000;"&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 这个List用于存放候选的站点，也即自动补全的建议项&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #008000;"&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 类似于google的候选项目&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #008000;"&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; liSuggest;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;关键的AutoComplete代码（个人感觉山寨到不行&amp;hellip;&amp;hellip;cbInput为Combox控件）：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('01bf65ed-a76b-4001-a401-2df5d40accb3')"&gt;&lt;div id="cnblogs_code_open_01bf65ed-a76b-4001-a401-2df5d40accb3" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt;              &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #008000;"&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 此方法用于自动补全Combox的Items，让Items的项目和用户输入的&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #008000;"&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 关键字相匹配&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #008000;"&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #008000;"&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="text"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;用户输入的关键字/词&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;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; FillListBox(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; text)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; item &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; liStops)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (item.IndexOf(text) &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;如果该站点包含关键词，则往候补Items中添加这个站点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    liSuggest.Add(item);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; obj &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; liSuggest)&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;把候补List中的项目填充到Combox中，让用户感觉是Combox自动完成填补&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;                cbInput.Items.Add(obj.ToString());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;然后，为Combox的KeyUp事件添加如下代码：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('64f3b9d1-199a-4b63-877b-2cc5fd2fe069')"&gt;&lt;div id="cnblogs_code_open_64f3b9d1-199a-4b63-877b-2cc5fd2fe069" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; cbInput_KeyUp(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, KeyEventArgs e)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;            liSuggest &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;            liSuggest.Clear();&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;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;            cbInput.Items.Clear();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; text &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (e.KeyCode)&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取本次用户按下的按钮code&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; Keys.Left:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; Keys.Up:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; Keys.Right:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; Keys.Down:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; Keys.Delete:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    text &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; cbInput.Text.Trim();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    FillListBox(text);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;注意，为了简化操作，我的站点列表在Form_Load事件中进行填充：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('08f45434-6b4a-4ca0-90f4-b2b1c9d5415b')"&gt;&lt;div id="cnblogs_code_open_08f45434-6b4a-4ca0-90f4-b2b1c9d5415b" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt;              &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Form1_Load(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, System.EventArgs e)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt; &lt;span style="color: #000000;"&gt;            liStops &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;299&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;我定义了窗体Load时，填充站点List，实际中，我们需要选择最佳时机来填充这个List&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;6&lt;/span&gt; &lt;span style="color: #000000;"&gt;                liStops.Add(i.ToString());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;7&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;8&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Ok，至此，一个.Net CF版带AutoComplete功能的、山寨的Combox就实现了。效果如下，感觉还不错&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/longqi293/201009/2010091520042831.gif" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/longqi293/201009/2010091520045723.gif" alt="" /&gt;&lt;/p&gt;&lt;p&gt;好了，演示结束，实际上，使用中发现，&lt;strong&gt;站点列表用什么方式、怎么放到Combox的Items中是一个很有意思的问题，它会影响到用户体验，比如动态加载的时候会有明显延时，都待大家讨论了哦&amp;hellip;&amp;hellip;&lt;/strong&gt;Jack就暂时先写到这里吧。&lt;/p&gt;&lt;p&gt;最后，推荐一篇&lt;a href="http://www.cnblogs.com/jeffreyzhao" target="_blank"&gt;老赵&lt;/a&gt;的文章&lt;a href="http://www.cnblogs.com/jeffreyzhao/archive/2009/05/29/generic-performance-test.html" target="_blank"&gt;《泛型真的会降低性能吗？》&lt;/a&gt;&amp;nbsp;虽然有点年头，不过，很值得一品！&lt;/p&gt;&lt;p&gt;也许，你也应该到这里看看dalelane朋友的这篇文章，也许，这就是正牌的AutoComplete了吧：&lt;a href="http://dalelane.co.uk/blog/?p=166"&gt;http://dalelane.co.uk/blog/?p=166&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/longqi293/aggbug/1827387.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/longqi293/archive/2010/09/15/WindowsMobile-AutoComplete.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/longqi293/archive/2010/08/30/1812155.html</id><title type="text">『翻译』为什么.Net CF在调用HTTPS 的Web服务时失败？！</title><summary type="text">今天，随便翻阅了一下.net framework compact小组的Blog，发现一篇非常有用的博文，作者是：Andarno，原文地址是：http://blogs.msdn.com/andrewarnottms/archive/2007/11/19/why-net-compact-framework-fails-to-call-some-https-web-servers.aspx下面，小弟就按照自己的理解和词典的解释，把文章翻译过来，和大家一起分享一下关于这个问题的产生原因和解决经验（来自Andarno）吧。在.Net CF 2.0（SP2或更早版本）和3.5版本中发现了一个Bug</summary><published>2010-08-29T16:15:00Z</published><updated>2010-08-29T16:15:00Z</updated><author><name>Jack Fan</name><uri>http://www.cnblogs.com/longqi293/</uri></author><link rel="alternate" href="http://www.cnblogs.com/longqi293/archive/2010/08/30/1812155.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/longqi293/archive/2010/08/30/1812155.html"/><content type="html">&lt;p&gt;为什么.Net CF在调用HTTPS 的Web服务时失败？！&lt;/p&gt;&lt;p&gt;开白：&lt;/p&gt;&lt;p&gt;今天，随便翻阅了一下.net framework compact小组的Blog，发现一篇非常有用的博文，作者是：Andarno，&lt;/p&gt;&lt;p&gt;原文地址是：&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.msdn.com/andrewarnottms/archive/2007/11/19/why-net-compact-framework-fails-to-call-some-https-web-servers.aspx"&gt;http://blogs.msdn.com/andrewarnottms/archive/2007/11/19/why-net-compact-framework-fails-to-call-some-https-web-servers.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;下面，小弟就按照自己的理解和词典的解释，把文章翻译过来，和大家一起分享一下关于这个问题的产生原因和解决经验（来自Andarno）吧。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;正文：&lt;/p&gt;&lt;p&gt;在.Net CF 2.0（SP2或更早版本）和3.5版本中发现了一个Bug，它主要造成了程序使用HttpWebRequest方法进行HTTPS服务请求失败时，返回的一个提示：（对于Web服务）&lt;/p&gt;&lt;p&gt;System.Net.WebException: Unable to read data from the transport connection. ---&amp;gt; System.Net.Sockets.SocketException: Unknown error (0x0). &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; at System.Net.HttpWebRequest.fillBuffer(HttpWebRequest request, Connection connection, CoreResponseData data) &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; at System.Net.HttpWebRequest.getLine(HttpWebRequest request, Connection connection, CoreResponseData data) &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; at System.Net.HttpWebRequest.parseResponse(HttpWebRequest request, Connection connection, Boolean defaultKeepAlive) &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; at System.Net.HttpWebRequest.startReceiving(Connection connection) &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; at System.Net.Connection.startReceiving(Object ignored) &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; at System.Threading.ThreadPool.WorkItem.doWork(Object o) &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; at System.Threading.Timer.ring() &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; at System.Net.HttpWebRequest.finishGetResponse() &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; at System.Net.HttpWebRequest.GetResponse() &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; // ... &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; at Program.Main(String[] args)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;虽然异常提示的内容以及产生原因是相同的，但是从你的程序中进行标准HttpWebRequest调用时，Stack trace信息将是不同的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;然而，产生这个异常的原因有很多，其中一个原因就是服务端发送了一个空的加密数据包给.NetCF客户端。下面是一个在HTTPS服务端加密的过程图示：&lt;/p&gt;&lt;p&gt;首先，服务端会初始化一个将通过网络要发送到客户端的、未加密的数据包，并存放到Memory Buffer中。&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0" width="400"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="99" valign="top"&gt;&lt;p&gt;Step 1: &lt;/p&gt;&lt;/td&gt;&lt;td width="99" valign="top"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td width="132" valign="top"&gt;&lt;p&gt;未加密的数据&lt;/p&gt;&lt;/td&gt;&lt;td width="68" valign="top"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;其次，服务端调用EncryptMessage方法，在适当的位置为这个未加密的数据包进行加密。主要是给这个数据包加入了一个Header和Footer：&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0" width="400"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="99" valign="top"&gt;&lt;p&gt;Step 2: &lt;/p&gt;&lt;/td&gt;&lt;td width="99" valign="top"&gt;&lt;p&gt;header&lt;/p&gt;&lt;/td&gt;&lt;td width="132" valign="top"&gt;&lt;p&gt;加密后的数据&lt;/p&gt;&lt;/td&gt;&lt;td width="68" valign="top"&gt;&lt;p&gt;footer&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;这个Header的长度可能是5bytes，那么Footer则要更长一些。对于这个数据包，它的长度肯定已经大于未加密的数据长度，在接下来的时候，它将被发送到接收端，并被执行DecryptMessage方法进行解密。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;现在，当服务端把一个0长度的流加密成一个数据包发送到客户端时，.NetCF的SSL堆栈就产生问题了。&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0" width="400"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="100" valign="top"&gt;&lt;p&gt;Step 1: &lt;/p&gt;&lt;/td&gt;&lt;td width="99" valign="top"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td width="133" valign="top"&gt;&lt;p&gt;0 byte的未加密数据&lt;/p&gt;&lt;/td&gt;&lt;td width="68" valign="top"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="100" valign="top"&gt;&lt;p&gt;Step 2: &lt;/p&gt;&lt;/td&gt;&lt;td width="99" valign="top"&gt;&lt;p&gt;header&lt;/p&gt;&lt;/td&gt;&lt;td width="133" valign="top"&gt;&lt;p&gt;非0 byte的加密后数据&lt;/p&gt;&lt;/td&gt;&lt;td width="68" valign="top"&gt;&lt;p&gt;footer&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;显然，加密前后，数据包长度已经发生变化。当这个数据包被发送到.NetCF客户端时，当前版本（&lt;strong&gt;译者按：2.0/3.5&lt;/strong&gt;）的.NetCF将会解密这个数据包，并且返回一个0长度的数据流给调用者（&lt;strong&gt;译者按：我认为是上文中的Server端，下文提到的调用者也应该是Server端&lt;/strong&gt;）。&lt;/p&gt;&lt;p&gt;通常意义上，对于一个网络中的Read方法而言（&lt;strong&gt;译者按：网络通信应该是互相往来，就如上文所提到的，服务端发送一个数据给客户端，那么客户端按照一定的规则返回一个结果到服务端，服务端使用Read方法进行接收&lt;/strong&gt;），只有在收到数据后才执行，否则一直处于阻塞状态，如果收到的数据是一个0长度的数据流，那么则意味着这个socket连接已经被关闭。&lt;/p&gt;&lt;p&gt;因为.NetCF在解密收到的数据包后，返回给服务端的是一个空数据流（&lt;strong&gt;译者按：为什么要像这样返回呢，我人为这就是文章开始提及的bug了吧，貌似我们很难从根本上解决&lt;/strong&gt;），调用者会将这个返回的空数据流误认为是一个socket连接断开的信号，所以它也就终止了这一次和客户端的连接。&lt;/p&gt;&lt;p&gt;事实上，这就是在.NetCF程序中通过SSL调用Web Service时，收到空数据包响应的整个过程。结果就是在服务器响应前，连接就失败了，并且抛出一个异常信息。&lt;/p&gt;&lt;p&gt;那么，是什么导致了服务端传送这样的空加密数据包呢？技术上来说，是由于这些空数据包被允许进行传送（虽然它们毫无意义），所以，这都看你的服务端如何配置，以确保这样的情况不会发生或极少发生。&lt;/p&gt;&lt;p&gt;但不幸的是，现在还没有办法让.NetCF去忽略这样的空数据包（&lt;strong&gt;译者按：我认为这里的.NetCF是指客户端程序&lt;/strong&gt;），所以，只有用如下的变通方法来解决了，从简单到复杂：&lt;/p&gt;&lt;p&gt;1、&amp;nbsp; 不使用SSL进行请求（由于请求和响应采用明文，会产生安全隐患）&lt;/p&gt;&lt;p&gt;2、&amp;nbsp; 重新配置现有的服务端程序，让其避免产生空加密数据包。&lt;/p&gt;&lt;p&gt;3、&amp;nbsp;&amp;nbsp; Build a new web server that will forward your device's requests on a separate connection to the ultimate target server and forward the responses back to the device.&amp;nbsp; This would work for web sites and web services.&amp;nbsp; But this new front-end server (which serves something of the role of a proxy server) would have to be configured to &lt;em&gt;not &lt;/em&gt;generate these empty encryption packets. &lt;/p&gt;&lt;p&gt;4、&amp;nbsp;&amp;nbsp; &lt;strong&gt;[Added 1/2/08] &lt;/strong&gt;Build a device-side web proxy that calls into the SSPI functions itself (native would probably be easier than managed for this).&amp;nbsp; Then have your managed app call into the proxy.&amp;nbsp; This proxy would be responsible for consuming the empty packets and re-encrypting everything (if necessary to secure IPC) for the app on the same device without any empty SSL packets. &lt;/p&gt;&lt;p&gt;5、&amp;nbsp;&amp;nbsp; Wait until a future version of NetCF that fixes this bug. &lt;/p&gt;&lt;p&gt;6、&amp;nbsp;&amp;nbsp; Write your own HTTPS client using native code or P/Invoke'ing from NetCF (difficult to get right). &lt;/p&gt;&lt;p&gt;翻译完！&lt;/p&gt;&lt;p&gt;哈哈，没想到吧，后几条Jack还是留给大家理解一下吧，感觉英语来的更直接！感觉时不时看看这些blogs很有帮助，在这里还是感谢Andarno为我们做出的贡献，虽然这是很早之前的问题了，希望这篇文章对大家有用。我会继续努力地。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;很久没有看E文了，这篇文章其实光看、理解，只用了10多分钟，但是翻译却花了30多分钟，感觉很多时候，英文很直接、很明白，往往到了中文这里却卡到阴。我尽量把这个原因归咎于自己的中文词汇和专业知识不够吧。嘿嘿&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/longqi293/aggbug/1812155.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/longqi293/archive/2010/08/30/1812155.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/longqi293/archive/2010/08/27/1810122.html</id><title type="text">『原创』设置SQL Server 2005自动备份——数据库邮件设置（图文）</title><summary type="text">最近公司的web服务器上线了，每天都会有一定的数据插入量，所以，数据库备份成为每天必备的工作，起初由于本人经验缺乏，每天都是上班时间去做这件备份的事情，无外乎也就是远程桌面到服务器，鼠标点击几下，就备份完成了。后来，发现这个办法太笨了，自己研究了一下SQL的作业调度方式，同样可以实现数据库自动备份，并且配合数据库邮件，可以同时让作业结果通过邮件方式通知你状态。所以，文章分为两个部分，此文为第一部分，配置数据库邮件，下一篇文章将分析如何设置作业并自动备份。</summary><published>2010-08-27T06:36:00Z</published><updated>2010-08-27T06:36:00Z</updated><author><name>Jack Fan</name><uri>http://www.cnblogs.com/longqi293/</uri></author><link rel="alternate" href="http://www.cnblogs.com/longqi293/archive/2010/08/27/1810122.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/longqi293/archive/2010/08/27/1810122.html"/><content type="html">&lt;p&gt;&lt;strong&gt;开白：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;最近公司的web服务器上线了，每天都会有一定的数据插入量，所以，数据库备份成为每天必备的工作，起初由于本人经验缺乏，每天都是上班时间去做这件备份的事情，无外乎也就是远程桌面到服务器，鼠标点击几下，就备份完成了。&lt;/p&gt;&lt;p&gt;后来，发现这个办法太笨了，自己研究了一下SQL的作业调度方式，同样可以实现数据库自动备份，并且配合数据库邮件，可以同时让作业结果通过邮件方式通知你状态。所以，文章分为两个部分，此文为第一部分，配置数据库邮件，下一篇文章将分析如何设置作业并自动备份。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;正文：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;首先，数据库服务器应该是SQL Server 2005正式版的，进入数据库服务器管理界面如下：我们点击管理&amp;mdash;&amp;mdash;》数据库邮件&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/longqi293/201008/2010082713494540.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;然后，右键单击，选择&amp;ldquo;配置数据库邮件&amp;rdquo;，然后弹出向导窗口，选择下一步，然后按照下图进行选择：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/longqi293/201008/2010082713522518.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;点击下一步后，可能会出现如下图的提示，选择&amp;ldquo;是&amp;rdquo;即可&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/longqi293/201008/2010082713543160.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;然后来到了新建配置文件窗口，我们输入配置文件名称以及说明，点击SMTP账户旁边的添加按钮，进入账户添加窗口：记住，这里我们填写的是发送邮件的服务器信息，也即我们使用哪个邮箱进行发送，设置方式参照如下，其实和Foxmail很类似啦。主要难点在身份验证一栏。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;img src="http://pic002.cnblogs.com/img/longqi293/201008/2010082713580314.jpg" alt="" /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;填好了，我们一直让向导走完即可（记得勾选默认的配置文件哦）。回到管理面板，我们邮件单击&amp;ldquo;数据库邮件&amp;rdquo;，选择&amp;ldquo;发送测试电子邮件&amp;rdquo;，在新打开的窗口，选择刚才新建的配置文件，填写收邮件的邮箱，发送后，应该能收到一份数据库服务器发送过来的邮件。&lt;/p&gt;&lt;p&gt;Trouble Shooting:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、由于邮件服务器故障，无法将邮件发送给收件人。 (使用帐户 1 (2010-08-27T14:03:24) 发送邮件。 异常邮件: 无法连接到邮件服务器。 (您的主机中的软件放弃了一个已建立的连接。 xxx.xxx.xxx.xxx:25)。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;其实，这个问题很可能是服务器的防火墙做了拦截，我们使用卖咖啡的防火墙，所以很有可能是它限制了25端口的访问和对外连接，我们进入卖咖啡控制台，在&amp;ldquo;访问控制&amp;rdquo;这一栏，有一条规则叫做：禁止大量发送邮件的蠕虫病毒发送邮件。我们看到这里限制了25端口的使用，在这里，可以设置sql 邮件进程为例外，即可发送邮件，以SQL 2005为例，它的邮件进程是DatabaseMail90.exe，再加入了例外列表中后，在进行发送测试，即可在收件箱中看到发送过来的测试邮件了。&lt;/p&gt;&lt;p&gt;貌似这是目前最大的一个问题，其实有网友问我关于那个身份验证的选择，我曾经勾选过：基本，可以发送。对于第一个验证模式，还没有测试过。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2、由于邮件服务器故障，无法将邮件发送给收件人。 (使用帐户 1 (2010-08-27T14:16:41) 发送邮件。 异常邮件: 无法将邮件发送到邮件服务器。 (服务器不支持安全连接。)。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;还记得账号配置页面吗，去掉那个&amp;ldquo;此服务器要求安全连接(SSL)&amp;rdquo;这个选项就行了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3、由于邮件服务器故障，无法将邮件发送给收件人。 (使用帐户 1 (2010-08-27T14:22:02) 发送邮件。 异常邮件: 无法将邮件发送到邮件服务器。 (不允许使用邮箱名称。 服务器响应为: authentication is required,wmsvr1,LWR4CkCZpkJ9WXdMq+YDAA--.5071S2 1282890110)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;你可能在账号配置界面中没有正确的配置身份验证信息，比如你选择了基本身份验证，那么账号那里得特别注意，有时候只需要填写@符号前的账号信息即可，有时却需要完整填写整个邮箱名称作为账号，或者邮箱密码不对，请认证查找原因。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;暂时先写到这里，大家看看还有什么问题吧，下一篇文章将通过SQL作业功能，执行定时备份数据库功能，并邮件通知。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/longqi293/aggbug/1810122.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/longqi293/archive/2010/08/27/1810122.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/longqi293/archive/2010/08/04/1792214.html</id><title type="text">『原创』记一次“偷盗”别人的CSS和Js</title><summary type="text">通过自己的一些亲身经历，和大家分享关于“拿”别人CSS和JS的一些有趣的经验。主要用到的工具就是IE浏览器和记事本。当然，也欢迎大家继续分享自己的相关经验和技巧！</summary><published>2010-08-04T07:30:00Z</published><updated>2010-08-04T07:30:00Z</updated><author><name>Jack Fan</name><uri>http://www.cnblogs.com/longqi293/</uri></author><link rel="alternate" href="http://www.cnblogs.com/longqi293/archive/2010/08/04/1792214.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/longqi293/archive/2010/08/04/1792214.html"/><content type="html">&lt;p&gt;今天下午，公司网站要求改版，需要做一个和51Job类似的职位选择和行业类别选择JS特效，偏偏这个任务落到了我这个最不懂Js的人的手上！苍天、大地&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;别提我自己写了，先是上网一搜，哎，很多例子嘛，而且有源码，HIA HIA HIA&amp;hellip;&amp;hellip;最终，确定了用下面这个网站提供的例子：&lt;a href="http://app.soche8.com/show/51job/" target="_blank"&gt;http://app.soche8.com/show/51job/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;当然，人家页面代码中就有Js和Css了，而且还有详细使用说明，真的要感谢这位兄弟！&lt;/p&gt;&lt;p&gt;在这里说说，怎么&amp;ldquo;拿&amp;rdquo;人家的Js和Css吧。&lt;/p&gt;&lt;p&gt;首先，右键单击这个页面，查看源文件，记事本打开源代码后，我们看到如下一段：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;link rel="stylesheet" type="text/css" href="css.css" /&amp;gt;&lt;br/&gt;&amp;lt;script type="text/javascript" src="jquery.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&amp;lt;script type="text/javascript" src="drag.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&amp;lt;script type="text/javascript" src="city_arr.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&amp;lt;script type="text/javascript" src="nationality_arr.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&amp;lt;script type="text/javascript" src="funtype_arr.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&amp;lt;script type="text/javascript" src="industry_arr.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&amp;lt;script type="text/javascript" src="major_arr.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&lt;/div&gt;&lt;p&gt;然后，通过网址和SRC属性，确定了js文件和css文件的路径地址后，在浏览器中（小弟用的是360），输入这个文件的完整路径，比如最后一个Js文件的路径应该是：&lt;a href="http://app.soche8.com/show/51job/" target="_blank"&gt;http://app.soche8.com/show/51job/marjor_arr.js&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这样，浏览器会自动打开下载窗口&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/longqi293/201008/2010080415173154.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;啊哈~这样，把这些文件下载吧&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;有了这些Js文件，自己建个页面，照葫芦画瓢也能搞出个123来了，等等，怎么样式不对呢？按钮没有背景图片，弹出的Div层没有样式了&amp;hellip;&amp;hellip;但是我已经下载到了人家的Css了啊？！&lt;/p&gt;&lt;p&gt;别急，不知道用了什么技术，有些css不会在页面代码中显示，那么，是不是我们就没辙了呢？不是，请耐心听我分析。经验告诉我，只要是打开过的网页，都应该留下痕迹，我们选择工具&amp;mdash;&amp;mdash;》IE选项&amp;mdash;&amp;mdash;&amp;gt;然后点击浏览历史记录的设置按钮&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ff9900;"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/img/longqi293/201008/2010080415212549.jpg" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ff9900;"&gt;&lt;strong&gt;然后再&amp;ldquo;查看文件&amp;rdquo;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ff9900;"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/img/longqi293/201008/2010080415214832.jpg" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ff9900;"&gt;&lt;strong&gt;打开一个资源管理器，啊哈，看到啥了？！&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ff9900;"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/img/longqi293/201008/2010080415220650.jpg" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ff9900;"&gt;&lt;strong&gt;还有一个漏网之鱼啊！！！&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Ok，到此，也就&amp;ldquo;拿&amp;rdquo;的差不多了，再用之前的方法，把这个文件拿下，看看里面，还有些按钮背景图片，再把这些图片按图索骥！Ok，拿完收工了！&lt;/p&gt;&lt;p&gt;在这里，小弟特别不明白，为什么有些Css、Js文件不会显示在源代码中呢？期望能够找到答案！后来，把那些代码拿下来，居然编码不是utf-8的，全乱码了，先是拿记事本一个一个另存为，不过被我发现一个很好用的批量编码转换程序，在这里也分享给大家，反正很好用！强烈推荐！&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.cnblogs.com/longqi293/gb2utf8.zip" target="_blank"&gt;点击下载&lt;/a&gt;&lt;/p&gt;&lt;p&gt;希望大家能够分享一些&amp;ldquo;拿&amp;rdquo;和&amp;ldquo;防拿&amp;rdquo;的经验吧！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/longqi293/aggbug/1792214.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/longqi293/archive/2010/08/04/1792214.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/longqi293/archive/2010/07/23/1783672.html</id><title type="text">『原创』c#实现文件加密、解密及文件拖拽至程序图标直接打开</title><summary type="text">通过一个小程序，和大家分享在.net下对各类文件进行加密、解密的操作，并且与大家分享拖拽文件到程序图标自动处理的操作代码。</summary><published>2010-07-23T05:35:00Z</published><updated>2010-07-23T05:35:00Z</updated><author><name>Jack Fan</name><uri>http://www.cnblogs.com/longqi293/</uri></author><link rel="alternate" href="http://www.cnblogs.com/longqi293/archive/2010/07/23/1783672.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/longqi293/archive/2010/07/23/1783672.html"/><content type="html">&lt;p&gt;最近，工作特别忙，一直没空子来写Blog，这不，忙里偷闲，顺手写了个文件加解密的小程序，本来公司市场部的同事出去带着合同，怕弄丢了，所以让我们开发个小程序，用于加密合同文件，到客户那里解密打开，然后签订合同，最后加密，带回公司保存。&lt;/p&gt;&lt;p&gt;时间不充裕，也就一上午时间吧，下午就要去签合同了，嘿嘿，于是我亲自试验了一把，下面和大家分享一下吧。&lt;/p&gt;&lt;p&gt;首先，这是个winform的程序，部署在市场部同事的笔记本上面，基于.Net 2.0做的，它的功能大致如下：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;加密合同文档（*.doc）&lt;/li&gt;&lt;li&gt;在客户处解密此合同文档，进行编辑，再次加密&lt;/li&gt;&lt;li&gt;回到公司可以通过密码打开它&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;由于时间关系，只是很粗略的做了个大概。打开vs2008，建立一个winform项目，设计程序界面如下：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;img src="http://pic002.cnblogs.com/img/longqi293/201007/2010072313250355.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;很简单的，待会儿在文章最后会有下载地址。我们可以把任意文件，拖入程序界面，即可进行加密，在此暂不作说明，大家可以待会儿下载回去试试，很简单的。&lt;/p&gt;&lt;p&gt;下面分享一下加密代码吧：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('4a4d922d-fcea-4f27-81c6-43a9a0c16ce7')"&gt;&lt;div id="cnblogs_code_open_4a4d922d-fcea-4f27-81c6-43a9a0c16ce7" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Text;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Security.Cryptography;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.IO;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; FileLock&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 异常处理类&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; CryptoHelpException : ApplicationException&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; CryptoHelpException(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; msg) : &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;(msg) { }&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; CryptoHelp&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;ulong&lt;/span&gt;&lt;span style="color: #000000;"&gt; FC_TAG &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0xFC010203040506CF&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; BUFFER_SIZE &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;128&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1024&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 检验两个Byte数组是否相同&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="b1"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;Byte数组&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="b2"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;Byte数组&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;true－相等&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; CheckByteArrays(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] b1, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] b2)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (b1.Length &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; b2.Length)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; b1.Length; &lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;i)&lt;br /&gt;                {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (b1[i] &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; b2[i])&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                }&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 创建Rijndael SymmetricAlgorithm&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="password"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;密码&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="salt"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;加密对象&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; SymmetricAlgorithm CreateRijndael(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; password, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] salt)&lt;br /&gt;        {&lt;br /&gt;            PasswordDeriveBytes pdb &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; PasswordDeriveBytes(password, salt, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;SHA256&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;1000&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;            SymmetricAlgorithm sma &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Rijndael.Create();&lt;br /&gt;            sma.KeySize &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;256&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            sma.Key &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; pdb.GetBytes(&lt;/span&gt;&lt;span style="color: #800080;"&gt;32&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;            sma.Padding &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; PaddingMode.PKCS7;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; sma;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 加密文件随机数生成&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; RandomNumberGenerator rand &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; RNGCryptoServiceProvider();&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 生成指定长度的随机Byte数组&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="count"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;Byte数组长度&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;随机Byte数组&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] GenerateRandomBytes(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; count)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] bytes &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[count];&lt;br /&gt;            rand.GetBytes(bytes);&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; bytes;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 加密文件&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="inFile"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;待加密文件&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="outFile"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;加密后输入文件&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="password"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;加密密码&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;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; EncryptFile(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; inFile, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; outFile, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; password)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; (FileStream fin &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; File.OpenRead(inFile),&lt;br /&gt;                fout &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; File.OpenWrite(outFile))&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; lSize &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; fin.Length; &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;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; size &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;)lSize;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] bytes &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[BUFFER_SIZE]; &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;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; read &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &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;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; value &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&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; 获取IV和salt&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] IV &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; GenerateRandomBytes(&lt;/span&gt;&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] salt &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; GenerateRandomBytes(&lt;/span&gt;&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;span style="color: #000000;"&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;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                SymmetricAlgorithm sma &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; CryptoHelp.CreateRijndael(password, salt);&lt;br /&gt;                sma.IV &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; IV;&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 在输出文件开始部分写入IV和salt&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                fout.Write(IV, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, IV.Length);&lt;br /&gt;                fout.Write(salt, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, salt.Length);&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;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                HashAlgorithm hasher &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; SHA256.Create();&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; (CryptoStream cout &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; CryptoStream(fout, sma.CreateEncryptor(), CryptoStreamMode.Write),&lt;br /&gt;                    chash &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; CryptoStream(Stream.Null, hasher, CryptoStreamMode.Write))&lt;br /&gt;                {&lt;br /&gt;                    BinaryWriter bw &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; BinaryWriter(cout);&lt;br /&gt;                    bw.Write(lSize);&lt;br /&gt;&lt;br /&gt;                    bw.Write(FC_TAG);&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;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; ((read &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; fin.Read(bytes, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, bytes.Length)) &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                    {&lt;br /&gt;                        cout.Write(bytes, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, read);&lt;br /&gt;                        chash.Write(bytes, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, read);&lt;br /&gt;                        value &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; read;&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;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                    chash.Flush();&lt;br /&gt;                    chash.Close();&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;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] hash &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; hasher.Hash;&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;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                    cout.Write(hash, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, hash.Length);&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;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                    cout.Flush();&lt;br /&gt;                    cout.Close();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 解密文件&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &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;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="inFile"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;待解密文件&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="outFile"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;解密后输出文件&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="password"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;解密密码&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;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; DecryptFile(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; inFile, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; outFile, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; password)&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;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; (FileStream fin &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; File.OpenRead(inFile),&lt;br /&gt;                fout &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; File.OpenWrite(outFile))&lt;br /&gt;            {&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; size &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;)fin.Length;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] bytes &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[BUFFER_SIZE];&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; read &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; value &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; outValue &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] IV &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;                fin.Read(IV, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] salt &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;                fin.Read(salt, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;                SymmetricAlgorithm sma &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; CryptoHelp.CreateRijndael(password, salt);&lt;br /&gt;                sma.IV &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; IV;&lt;br /&gt;&lt;br /&gt;                value &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;32&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; lSize &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&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;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                HashAlgorithm hasher &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; SHA256.Create();&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;using (CryptoStream cin = new CryptoStream(fin, sma.CreateDecryptor(), CryptoStreamMode.Read),&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;    chash = new CryptoStream(Stream.Null, hasher, CryptoStreamMode.Write))&lt;br /&gt;                &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;span style="color: #000000;"&gt;                CryptoStream cin &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; CryptoStream(fin, sma.CreateDecryptor(), CryptoStreamMode.Read), chash &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; CryptoStream(Stream.Null, hasher, CryptoStreamMode.Write);&lt;br /&gt;                &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;span style="color: #000000;"&gt;                BinaryReader br &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; BinaryReader(cin);&lt;br /&gt;                lSize &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; br.ReadInt64();&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;ulong&lt;/span&gt;&lt;span style="color: #000000;"&gt; tag &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; br.ReadUInt64();&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (FC_TAG &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; tag)&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; CryptoHelpException(&lt;/span&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;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; numReads &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; lSize &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt; BUFFER_SIZE;&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; slack &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt;)lSize &lt;/span&gt;&lt;span style="color: #000000;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt; BUFFER_SIZE;&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; numReads; &lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;i)&lt;br /&gt;                {&lt;br /&gt;                    read &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; cin.Read(bytes, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, bytes.Length);&lt;br /&gt;                    fout.Write(bytes, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, read);&lt;br /&gt;                    chash.Write(bytes, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, read);&lt;br /&gt;                    value &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; read;&lt;br /&gt;                    outValue &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; read;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (slack &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                {&lt;br /&gt;                    read &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; cin.Read(bytes, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;)slack);&lt;br /&gt;                    fout.Write(bytes, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, read);&lt;br /&gt;                    chash.Write(bytes, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, read);&lt;br /&gt;                    value &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; read;&lt;br /&gt;                    outValue &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; read;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                chash.Flush();&lt;br /&gt;                chash.Close();&lt;br /&gt;&lt;br /&gt;                fout.Flush();&lt;br /&gt;                fout.Close();&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] curHash &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; hasher.Hash;&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;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] oldHash &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[hasher.HashSize &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;8&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;                read &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; cin.Read(oldHash, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, oldHash.Length);&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; ((oldHash.Length &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; read) &lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;CheckByteArrays(oldHash, curHash)))&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; CryptoHelpException(&lt;/span&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;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;                cin.Flush();&lt;br /&gt;                cin.Close();&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;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (outValue &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; lSize)&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; CryptoHelpException(&lt;/span&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;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;是不是很明了呢？当然了，网上一搜一大把，我这个也是不小心搜到的，感觉比较不错的代码，后来经过我少许加工，即可使用了。当然，在这里，还要提一句，这个小程序，为了让它更方便，直接拖拽文件到其图标之上，就默认打开程序，加载该文件，并进行加密操作，听起来是不是很cool!?呵呵，下面再和大家分享一下如何实现吧：&lt;/p&gt;&lt;p&gt;在窗体的DragDrop和DragEnter事件下，添加如下代码：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('4d37f265-7913-4244-82ae-a818f9bfcd1a')"&gt;&lt;div id="cnblogs_code_open_4d37f265-7913-4244-82ae-a818f9bfcd1a" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; MainForm_DragEnter(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, DragEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (e.Data.GetDataPresent(DataFormats.FileDrop))&lt;br /&gt;                e.Effect &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; DragDropEffects.Move;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; e.Effect &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; DragDropEffects.None;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; MainForm_DragDrop(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, DragEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; path &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;).ToString();&lt;br /&gt;            extension &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.IO.Path.GetExtension(path);&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;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (extension &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;.encrypted&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            {&lt;br /&gt;                btnEncy.Enabled &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                btnDecy.Enabled &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            {&lt;br /&gt;                btnEncy.Enabled &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                btnDecy.Enabled &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            }&lt;br /&gt;            txtInFile.Text &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; path;&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Ok，是不是很简单，这样，在程序未启动时，拖拽一个目标文件到程序图标上，程序会自动打开，并进行相应操作。具体的操作，大家可以自己创造更有意义的代码来进行操作！&lt;/p&gt;&lt;p&gt;最后，献上下载地址，源代码：&lt;a href="http://files.cnblogs.com/longqi293/%e6%96%87%e4%bb%b6%e5%8a%a0%e5%af%86%e7%a8%8b%e5%ba%8f.rar" target="_blank"&gt;点击下载。&lt;/a&gt;&lt;/p&gt;&lt;p&gt;希望对大家有用哦&lt;/p&gt;&lt;img src="http://www.cnblogs.com/longqi293/aggbug/1783672.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/longqi293/archive/2010/07/23/1783672.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
