﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-liuyz2006-文章分类-aspx</title><link>http://www.blogjava.net/liuyz2006/category/51599.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 30 Jul 2012 04:09:05 GMT</lastBuildDate><pubDate>Mon, 30 Jul 2012 04:09:05 GMT</pubDate><ttl>60</ttl><item><title>一点点对WebResource.axd的配置及使用[转] </title><link>http://www.blogjava.net/liuyz2006/articles/383263.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Mon, 16 Jul 2012 15:54:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/383263.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/383263.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/383263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/383263.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/383263.html</trackback:ping><description><![CDATA[<p align="center">&nbsp;</p>
<div>申明文笔不好，不过看完你肯定会有收获。废话少说，下面开始。按照WebResource.axd是什么，为什么，怎么样 科学思路进行。&nbsp;</div>
<div></div>
<div>看到页面中有&lt;/scriptsrc"/WebResource.axd?d=Bdl2sEQMgrMj6AITjzrcgZbPgTObB4ykXx6CSfzqrXWcfOyu_NiIQ6E3upD_Pk1W8jYtP47x6aWIKT3u_pHTk5MhN9AHHLH_d7enHWD6g_mWKWu1McSvPengCcNlniVWCG7PTQ2&amp;amp;t=634725230533545912"type"text/javascript"&gt;script&gt;</div>
<div></div>
<div>&nbsp;不知道WebResource.axd 为何物，，遂百度一番，，资料甚少,,未果。。问题依旧，绕开不是办法，解决才是王道。百度继续。。</div>
<div></div>
<div></div>
<div>随着东一片文章片段，西一简短说明，拼装起来慢慢了解了大概。 下面的有此片段是本人从网上摘抄而成，读完你也许大概可能会知道如何时使用此物。</div>
<div>&nbsp;</div>
<div>一、WebResource.axd 是什么&nbsp;</div>
<div>//摘抄 &nbsp; http://blog.csdn.net/heker2007/article/details/2078117</div>
<div>&nbsp; &nbsp; &nbsp; 很多ASP.NET server控件都需要另外的外部资源来实现某些功能.比如，使用任何一个ASP.NET validation验证控件时，都需要一系列的JavaScript functions来执行它们的客户端验证.虽然可以在页面上添加这些JavaScript functions，不过更高效的方法是将这些函数封装在一个外部的JavaScript文件里，然后在页面通过&lt;script src="PathToExternalJavaScriptFile" type="text/javascript" &gt;的形式来将该文件包含在页面里.这样一来不仅可以实现对页面的瘦身，还可以允许浏览器对该JavaScript文件施行缓存(这样就不用每个页面在登录/回传时向浏览器发送该JavaScript代码了)</div>
<div>&nbsp; </div>
<p>&nbsp; &nbsp; &nbsp;在ASP.NET 2.0之前，用户浏览器要访问这种外部资源的话，我们必须将它们作为具体的文件放在文件系统里.如果你使用ASP.NET 1.x的验证控件的话，你的页面必须添加一个对JavaScript文件的引用，如/aspnet_client/system_web/version/WebUIValidation.js.这些外部文件有碍最后的部署.</p>
<div>为解决这个问题，ASP.NET 2.0允许将外部资源植入控件的装配件里，通过一个指定的URL对其访问.将外部images, JavaScript files，CSS files植入控件的装配件后，部署就容易了，因为所有的资源都包含在.dll文件里了. 完成植入操作后，在ASP.NET 2.0页面里我们可以通过一个指定的URL(WebResource.axd)来实现对这些资源的访问.&nbsp;</div>
<div>&nbsp;</div>
<div>上面这段告诉你 WebResource.axd是什么！<strong>说白了，就是将一些js,jpg,bmp等封装或叫植入到类库里面。&nbsp;</strong></div>
<div>&nbsp;</div>
<div>二、为什么</div>
<div>为什么WebResource.axd要使用这个东西，不使用这个东西可能吗？，，答案当然是：可以。那样你就按你老套的办法，将js文件，使用&lt;script src="xxx" type="test/javascript"&gt;&lt;/script&gt;这种方法</div>
<div>，引入外部文件。这些外部文件有碍最后的部署。</div>
<div>而使用WebResource.axd这个东西，则可以轻易解决上面的问题，而且好处多多，，因为js等文件是放在类库中的，所以在类里面，可以随时方便调出来，有指那打那的感觉。</div>
<div>&nbsp;</div>
<div>三、怎么样</div>
<div>这部分才是重中之重！有了js文件，怎么将他植入面类库中，，然后又在页面上调出来里面的函数。</div>
<p>1，我们新建一个类库，名称为Sun.Controls，，命名空间也为Sun.Controls。这名子你随便起。</p>
<p>2，然后在里面建一个类WebDemo.cs。此类里面有如下方法</p>
<div>public class&nbsp;&nbsp;WebDemo&nbsp;: Page //继承自Page类</div>
<p>&nbsp;{&nbsp;</p>
<div><span class="Apple-tab-span" style="white-space: pre"></span>protected override void OnPreRender(EventArgs e)</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; base.OnPreRender(e);</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string key = base.GetType().ToString();</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!base.ClientScript.IsClientScriptBlockRegistered(key))</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp;&nbsp;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; base.ClientScript.RegisterClientScriptResource(typeof(FormPage), "Sun.Controls.demo.js"); &nbsp; //这时就是将js文件注册到页面，，注意js文件名称的写法：命名空间+文件夹名子（如果没有放在文件夹中可以省略）+文件名称 &nbsp; &nbsp; &nbsp;如Sun.Controls.demo.js &nbsp;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div>
<p>&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;</p>
<p>&nbsp;}</p>
<p>&nbsp;</p>
<p>3 ,再新建一个js文件，，demo.js。demo.js文件里面有一个方法</p>
<p>&nbsp;function HellowWeb() {</p>
<div>&nbsp; &nbsp; alert("我来自类库中的js文件");</div>
<p align="center">}&nbsp; </p>
<p>&nbsp;</p>
<p>&nbsp;然后将这个文件放到Sun.Controls这个类库的根目录下.</p>
<p>&nbsp;OK,下面就是配置WebResource.axd这个东西，让这个东西起作用，指那打那。</p>
<p>4，在你的"解决方法资源管理器"中找到WebDemo.cs类，在类中找到&nbsp;demo.js这个文件 ，右击查看&#8220;属性&#8221;，，将&#8220;生成操作&#8221;设为&#8220;嵌入的资源&#8221;。此属性默认是&#8220;内容&#8221;，如果你不改为&#8220;&nbsp;嵌入的资源&nbsp;&#8221;的话，页面底下会有一个常伴你的黄色感叹号，提示你&#8220;未找到对象&#8221;，，让你明年你也调不到这个js文件里的方法。</p>
<p><img height="165" alt="" src="http://images.cnblogs.com/cnblogs_com/suncms/2012-05-13_170442.gif" width="300" border="0" />&nbsp;</p>
<p>&nbsp;</p>
<p>5,在&nbsp;WebDemo.cs类的Properties文件夹中，找到AssemblyInfo.cs这个类，，双击打开。。。添加一句&nbsp;[assembly: WebResource("Sun.Controls.demo.js&nbsp;<br />", "application/x-javascript")] &nbsp;这里如果&nbsp;WebResource不是淡蓝色的话，引入using System.Web.UI。。后面的参数写&#8220;&nbsp;<span style="text-indent: -0.5em">text/javascript&#8221;或&#8220;</span> application/x-javascript<br /><span style="text-indent: -0.5em">&#8221;都可以，不过写后的这个感觉牛X一点，，至于 为什么？你打IIS里面的 &#8220;MIME类型&#8221;，双击.js就可以看到，，里面就是这么写的。</span></p>
<p>&nbsp;&nbsp;</p>
<p>6,好了，，在解决方案中新建一个网站， 新建一个index.asp页面，不要index.aspx.cs这个文件。。</p>
<p>&nbsp;</p>
<div>&lt;%@ Page Language="C#" inherits="Sun.Controls.WebDemo" %&gt;</div>
<div></div>
<div>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;</div>
<div></div>
<div>&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;</div>
<div>&lt;head runat="server"&gt;</div>
<div>&nbsp; &nbsp; &lt;title&gt;&lt;/title&gt;</div>
<div>&lt;/head&gt;</div>
<div>&lt;body&gt;</div>
<div>&nbsp; &nbsp; &lt;form id="from1" runat="server"&gt;</div>
<div>&nbsp; &nbsp; &lt;div&gt; &nbsp; &nbsp; &nbsp;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &lt;input id="Button2" onclick="HellowWeb();" type="button" value="button" /&gt;</div>
<div>&nbsp; &nbsp; &lt;/div&gt;</div>
<div>&nbsp; &nbsp; &lt;/form&gt;</div>
<div>&lt;/body&gt;</div>
<p>&lt;/html&gt;&nbsp;</p>
<p>&nbsp;</p>
<p>这里要注意，1.最上面的一句inherits="Sun.Controls.WebDemo" ，意思是本页面是继承这个类的,因为只在这个类中，我们注册了js文件。2.一定要有一个form，并且这个 form必须是 &nbsp;runat="server"的。</p>
<p>&nbsp;</p>
<p>好了，可以启动测试这个页面了，，击点页面中的按钮，看是不是能掉到deom.js里面的方法了。。</p>
<p>如果出错在web.config &lt;system.web&gt;下加一句&lt;pages validateRequest="false" enableEventValidation="false" pageBaseType="Sun.Controls.WebDemo&nbsp;<br />,Sun.Controls" /&gt;&nbsp;</p>
<p align="center">&nbsp;</p><img src ="http://www.blogjava.net/liuyz2006/aggbug/383263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-07-16 23:54 <a href="http://www.blogjava.net/liuyz2006/articles/383263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用WebResource.axd通过一个URL来访问装配件的内置资源 </title><link>http://www.blogjava.net/liuyz2006/articles/383258.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Mon, 16 Jul 2012 15:06:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/383258.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/383258.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/383258.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/383258.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/383258.html</trackback:ping><description><![CDATA[<div class="article_title" sizset="19" sizcache="1">利用WebResource.axd通过一个URL来访问装配件的内置资源<br /></div>
<div class="article_content" id="article_content" sizset="24" sizcache="1">
<p>导言：</p>
<p>很多ASP.NET server控件都需要另外的外部资源来实现某些功能.比如，使用任何一个ASP.NET validation验证控件时，都需要一系列的JavaScript functions来执行它们的客户端验证.虽然可以在页面上添加这些JavaScript functions，不过更高效的方法是将这些函数封装在一个外部的JavaScript文件里，然后在页面通过&lt;script src="PathToExternalJavaScriptFile" type="text/javascript" &gt;的形式来将该文件包含在页面里.这样一来不仅可以实现对页面的瘦身，还可以允许浏览器对该JavaScript文件施行缓存(这样就不用每个页面在登录/回传时向浏览器发送该JavaScript代码了)</p>
<p>在ASP.NET 2.0之前，用户浏览器要访问这种外部资源的话，我们必须将它们作为具体的文件放在文件系统里.如果你使用ASP.NET 1.x的验证控件的话，你的页面必须添加一个对JavaScript文件的引用，如/aspnet_client/system_web/version/WebUIValidation.js.这些外部文件有碍最后的部署.</p>
<p>为解决这个问题，ASP.NET 2.0允许将外部资源植入控件的装配件里，通过一个指定的URL对其访问.将外部images, JavaScript files，CSS files植入控件的装配件后，部署就容易了，因为所有的资源都包含在.dll文件里了. 完成植入操作后，在ASP.NET 2.0页面里我们可以通过一个指定的URL(WebResource.axd)来实现对这些资源的访问.</p>
<p>本文我们探讨如何将外部资源植入装配件以及如何通过一个指定的URL来对其访问，该技术简化了安装和部署.</p>
<p>一个Custom Control示例...</p>
<p>为了考察ASP.NET 2.0里的外部资源特性，我们需要构建一个包含外部资源的自定义控件.就本文而言，我将创建一个很简单的控件来对TextBox控件的基本函数进行扩充.该控件&#8212;FunkyTextBox，在其客户端的onkeypress event事件里，用一个color数组里定义的颜色随机的改变TextBox的底色.</p>
<p>该行为需要一些客户端脚本：首先，我们要添加一个函数来获取一个随机数，然后根据该随机数设置TextBox的背景颜色.第二，我们要定义要用到的color数组.我们可以轻而易举的绕开外部文件，直接向页面注入要用到的JavaScript.下面的代码显示了FunkyTextBox控件的完整代码(为简化起见，using声明、命名空间、以及定义好的colors数组都省略掉了)</p>
<p>public class FunkyTextBox : TextBox<br />{<br />&nbsp;&nbsp;&nbsp; protected override void AddAttributesToRender(System.Web.UI.HtmlTextWriter writer)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Wire up the onkeypress event handler to the ChangeBackgroundColor() JavaScript function<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.AddAttribute("onkeypress", "ChangeBackgroundColor(this);");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.AddAttributesToRender(writer);<br />&nbsp;&nbsp;&nbsp; }</p>
<p><br />&nbsp;&nbsp;&nbsp; protected override void OnPreRender(EventArgs e)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Dump in the JavaScript directly into the page<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // (Although the external JavaScript approach is more efficient)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "FunkyTextBox",<br />@"<br />function ChangeBackgroundColor(ctrl)<br />{<br />&nbsp; var rndNum = Math.floor(Math.random() * 256);<br />&nbsp; if (ctrl &amp;&amp; funkyTextBoxColors.length &gt; rndNum)<br />&nbsp;&nbsp;&nbsp; ctrl.style.backgroundColor = funkyTextBoxColors[rndNum];<br />}</p>
<p>var funkyTextBoxColors =&nbsp; new Array('#89C142', '#EF14E5', '#75762C', '#BB9E24', '#BF4A44', '#9D4A77', ...);<br />", true);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.OnPreRender(e);<br />&nbsp;&nbsp;&nbsp; }<br />} </p>
<p>该server control继承自ASP.NET的TextBox，重写了2个方法.第一，在AddAttributesToRender方法里，添加了一个客户端特性(client-side attribute),那么任何时候，当用户在textbox控件里键入字符时，就会调用名为ChangeBackgroundColor的JavaScript function，传入对该textbox的引用.第二， 在FunkyTextBox的PreRender event事件里，通过 Page.ClientScript class's RegisterScriptBlock method方法直接将所需要的JavaScript注入到页面里.具体来说，定义了ChangeBackgroundColor function和funkyTextBoxColor数组，而ChangeBackgroundColor function获取一个随机值，再根据该值用funkyTextBoxColor数组里对应的颜色来设置背景色.</p>
<p>当把FunkyTextBox添加到一个ASP.NET页面后，最终页面将包含如下的代码：</p>
<p>&lt;script type="text/javascript"&gt;<br />&lt;!--</p>
<p>function ChangeBackgroundColor(ctrl)<br />{<br />&nbsp;&nbsp;&nbsp; var rndNum = Math.floor(Math.random() * 256);<br />&nbsp;&nbsp;&nbsp; if (ctrl &amp;&amp; funkyTextBoxColors.length &gt; rndNum)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ctrl.style.backgroundColor = funkyTextBoxColors[rndNum];<br />}</p>
<p>var funkyTextBoxColors =&nbsp; new Array('#89C142', '#EF14E5', '#75762C', '#BB9E24', '#BF4A44', '#9D4A77', ...);<br />// --&gt;<br />&lt;/script&gt;</p>
<p><br />Here is a FunkyTextBox:<br />&lt;input onkeypress="ChangeBackgroundColor(this);" name="MyTextBox" type="text" id="MyTextBox" /&gt; </p>
<p>通过OnPreRender method方法将JavaScript注入到页面，而FunkyTextBox控件呈现为一个 &lt;input type="text"&gt;标记，其onkeypress event事件调用ChangeBackgroundColor function函数.</p>
<p>将JavaScript转移到一个外部文件以对页面瘦身</p>
<p>该FunkyTextBox控件使用的JavaScript很简单，稍微复杂点的控件为实现其功能所需的JavaScript远不止这么多.直接将JavaScript植入页面将增大页面的size，也会让用户花更多的时间加载页面. 为了对页面瘦身，应将JavaScript转移到一个外部文件里，再在页面里添加一个&lt;script&gt;标签，以实现对JavaScript file的引用，比如：</p>
<p>&lt;script src="PathToExternalJavaScriptFile" type="text/javascript" &gt; </p>
<p>用&lt;script&gt;元素来替换JavaScript就达到了对页面瘦身的目的.此外，如果浏览器对外部文件实施缓存的话，那么我们就只需要下载一次就可以了(如果直接将JavaScript植入页面的话，每个页面每次登陆/加载时都要进行加载)</p>
<p>在ASP.NET 1.x里，对这些外部资源文件&#8212;&#8212;JavaScript文件、CSS classes, images等，都需要与custom control一起加载和展开.在ASP.NET 2.0里我们可以将这些外部资源植入该控件的装配件，再通过一个指定的URL实现对这些资源的访问.</p>
<p>将外部文件植入控件的Assembly</p>
<p>要将资源植入控件的装配件，我们需要在Visual Studio里把资源添加到你的server control project里(本文结尾处可下载的代码里，包含了FunkyTextBox Web control Project，以及一个test website).对FunkyTextBox控件来说，我添加了一个名为Funky.js的文件，它包含的JavaScript就是我们在前面的OnPreRender方法向页面注入的那个JavaScript..</p>
<p>完成添加后，在Solution Explorer里选中它并打开Properties窗口，将Build Action设置为"Embedded Resource", 如下图：</p>
<p><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/heker2007/363288/o_5.bmp" /></p>
<p>图</p>
<p>这样一来，一旦你生成解决方案时，该文件就会被植入最终的assembly里.</p>
<p>通过一个URL来访问Embedded Assembly </p>
<p sizset="25" sizcache="1"><br />对这些内置资源，我们可以通过WebResource.axd HTTP Handler来进行访问。通过一个URL，比如<a href="http://yoursite/WebResource.axd?d=assemblyKey&amp;t=dateTimeOfLastAssemblyWrite">http://yoursite/WebResource.axd?d=assemblyKey&amp;t=dateTimeOfLastAssemblyWrite</a>, 其中，assemblyKey是要访问的装配件的名称的加密处理后的string， 而dateTimeOfLastAssemblyWrite描述了该装配件最后一次被修改的日期.给定一个有效的assemblyKey，那么WebResource.axd HTTP Handler就可以返回内置资源的内容.</p>
<p>使用WebResource.axd HTTP Handler，我们要面临3个问题：</p>
<p>1.通过WebResource.axd HTTP Handler，使一个内置资源允许被访问.<br />2.向WebResource.axd HTTP Handler传递准确的querystring值，以便检索某个特定的内置资源<br />3.将第2步生成的URL放置在ASP.NET页面恰当的位置</p>
<p>默认情况下是不允许WebResource.axd HTTP Handler对装配件里的内置资源进行访问的，为重写该行为，我们必须向server control project的AssemblyInfo文件添加一个特性(attribute)，具体来说，要添加一个WebResource特性，比如：</p>
<p>[assembly: WebResource(webResource, contentType, performSubstitution)]&nbsp; </p>
<p>注意:如果你使用的是Visual Basic,那么你需要用&#8220;&lt;&#8221;和&#8220;&gt;&#8221;来限定装配件，比如&lt;assembly: WebResource(...)&gt;.要看该AssemblyInfo文件的话，在Solution Explorer里选"Show All Files"，它出现在 "My Project"文件夹下；再者，WebResource特性位于System.Web.UI命名空间，因此我们要在AssemblyInfo.cs文件顶端添加using System.Web.UI声明(如果是VB的话，用Imports System.Web.UI).</p>
<p>其中webResource参数指定了要访问的资源的名称，其命名模式为：RootNamespace.PathToFile.对本文示例而言，根命名空间为FunkyTextBox;又因资源文件在工程的根目录下，那么PathToFile就是Funky.js(假如Funky.js位于根目录的Scripts文件夹，那么PathToFile值就变成了Scripts.Funky.js).因此，webResource参数的值就为FunkyTextBox.Funky.js.</p>
<p>而contentType参数指定了要检索的资源的MIME type.当查询一个外部资源时，浏览器单独向服务器发出一个HTTP request.而MIME type就告知浏览器要返回的数据的类型.对JavaScript文件而言，其对应的contentType类型为text/javascript，有关MIME Media Types的更多信息，请参阅官方的MIME types清单. </p>
<p>最后，performSubstitution是一个可选的布尔值，用于指明该资源是否可以被其它的外部资源引用.比如，你可能将image文件和一个JavaScript文件植入到了装配件里，而该脚本文件可能需要引用某些image资源.如果确实需要的话，就将performSubstitution参数设为True.</p>
<p>对本文用到的控件而言，我们用如下的attribute声明来对Funky.js外部文件注册：</p>
<p>[assembly: WebResource("FunkyTextBox.Funky.js", "text/javascript")] </p>
<p>对资源进行注册后，我们就可以用WebResource.axd HTTP Handler来对其进行访问了.剩下的工作就是写代码来生成该外部资源对应的相应URL.</p>
<p>为此，我们使用ClientScriptManager class类里的GetWebResourceUrl(type, webResource) method方法.其中type参数就是该控件的类型，</p>
<p>webResource参数就是前面的WebResource特性里使用的webResource的值. 比如，要获取一个从该server control里访问内置的Funky.js资源的URL，我这样实现：</p>
<p>Page.ClientScript.GetWebResourceUrl(this.GetType(), "FunkyTextBox.Funky.js") </p>
<p>另外，我们在FunkyTextBox控件的OnPreRender事件里，将RegisterClientScriptInclude 方法和GetWebResourceUrl方法搭配使用，将相应的JavaScript包含进来(&lt;script src="PathToExternalJavaScriptFile" type="text/javascript" &gt;)，如下:</p>
<p>protected override void OnPreRender(EventArgs e)<br />{<br />&nbsp;&nbsp;&nbsp; // When pre-rendering, add in external JavaScript file<br />&nbsp;&nbsp;&nbsp; Page.ClientScript.RegisterClientScriptInclude("FunkyJavaScript", <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Page.ClientScript.GetWebResourceUrl(this.GetType(), <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "FunkyTextBox.Funky.js"));</p>
<p>&nbsp;&nbsp;&nbsp; base.OnPreRender(e);<br />} </p>
<p>通过这个重写的OnPreRender方法，控件将向页面添加如下的标记：</p>
<p>&lt;script src="/TestWebsite/WebResource.axd?d=NLu6bm6a2XinJZt4M-ujmQ13X5ALig6NEAZa1-AxV0HCbE3M-</p>
<p>VHNomDQt_qnxjdT0&amp;t=632902136868023078" type="text/javascript"&gt;&lt;/script&gt; </p>
<p>Here is a FunkyTextBox:<br />&lt;input onkeypress="ChangeBackgroundColor(this);" name="MyTextBox" type="text" id="MyTextBox" /&gt; </p>
<p>这样就将JavaScript引进来了.WebResource.aspx HTTP Handler获取该内置资源并将其发送回客户端.</p>
<p>结语</p>
<p>本文我们考察了如何将资源植入一个自定义ASP.NET server control的装配件里，以及如何通过一个URL来访问这些资源.这是ASP.NET 2.0里的新技术，便于开发者将外部资源植入装配件.<br /></p></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/383258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-07-16 23:06 <a href="http://www.blogjava.net/liuyz2006/articles/383258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ashx与axd相同点与区别 </title><link>http://www.blogjava.net/liuyz2006/articles/383128.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 15 Jul 2012 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/383128.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/383128.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/383128.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/383128.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/383128.html</trackback:ping><description><![CDATA[<span class="ico ico_type_Repost"></span>&nbsp; 
<h3><span class="link_title"><a href="http://blog.csdn.net/lulu_jiang/article/details/6213634">ashx与axd相同点与区别 </a></span></h3>
<div class="article_manage"><span class="link_categories">分类： <a href="http://blog.csdn.net/lulu_jiang/article/category/662810">C# ASP.NET</a> </span><span class="link_postdate">2011-02-28 16:56</span> <span class="link_view" title="阅读次数">112人阅读</span> <span class="link_comments" title="评论次数"><a href="http://blog.csdn.net/lulu_jiang/article/details/6213634#comments">评论</a>(0)</span> <span class="link_collect"><a title="收藏" href="javascript:void(0);">收藏</a></span> <span class="link_report"><a title="举报" href="http://blog.csdn.net/lulu_jiang/article/details/6213634#report">举报</a></span> </div>
<div class="article_content" id="article_content">
<div id="cnblogs_post_body">
<p><span class="Apple" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; widows: 2; orphans: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple" style="font-size: 14px; line-height: 21px; font-family: verdana, sans-serif; text-align: left"></span></span>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px">其实扩展名为ashx与为axd基本上是一样的，都是用于写web handler，可以通过它来调用IHttpHandler类，它免去了普通.aspx页面的控件解析以及页面处理的过程。</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px">唯一不同的地方是：<span style="color: #ff00ff; line-height: 21px">axd扩展名的必须要在web.config中的&lt;httpHandlers&gt;中进行注册，而ashx直接在项目中当成aspx那样添加使用即可。</span></p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px">所以在项目的添加文件中，向导只有添加ashx文件的模板，而没有添加axd文件的模板。那微软为什么这么无聊搞两个后缀，全部使用ashx不就行了么？干脆利落。原来，如果你的web handler代码不在Web的项目中的话，那你就不能使用ashx了，因为如果不在web.config中注册的话，系统根本不知道要在那个dll库中才能找到相应的代码。<br />如：<br /><span style="color: #ff00ff; line-height: 21px">&lt;add verb="*" path="OpenSearch.axd" type="Company.Components.HttpHandler.OpenSearchHandler,<span class="Apple">&nbsp;</span><span style="color: #000000; line-height: 21px">（命名空间.类名）</span>Company.Extensions<span style="color: #000000; line-height: 21px">（.dll文件名）<span style="color: #ff00ff; line-height: 21px">"</span></span><span class="Apple">&nbsp;</span>validate="false"/&gt;<br />只有注册了，web才知道OpenSearch.axd原来是在Company.Extensions.dll中</span>，使用Company.Components.HttpHandler.OpenSearchHandler类处理。<br />当然你搞个&lt;add verb="*" path="OpenSearch.ashx" type=.... 那也未免不可，习惯规范而已。&nbsp;</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px">在服务器的IIS里有个默认的映射：就是将*.axd映射到aspnet_isapi.dll上。 &nbsp;<span class="Apple">&nbsp;</span><br />&nbsp; webconfig里那么写的原理是，首先iis会把.axd的文件handle，然后就交给FreeTextBoxControls.AssemblyResourceHandler, &nbsp; FreeTextBox这个命名的类来处理而不是让aspnet去处理。 &nbsp;<span class="Apple">&nbsp;</span><br />&nbsp; &nbsp;<span class="Apple">&nbsp;</span><br />&nbsp; 但是你的服务器提供商可能为了安全起见，把.axd到aspnet_isapi.dll的映射去掉了，所以你在服务器运行就错误了。你现在唯一能做的就是联系你的服务器提供商，让他们恢复这个映射。 &nbsp;<span class="Apple">&nbsp;</span><br /></p></div></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/383128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-07-15 10:38 <a href="http://www.blogjava.net/liuyz2006/articles/383128.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>asp.net  ashx IHttpHandler c#</title><link>http://www.blogjava.net/liuyz2006/articles/383127.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 15 Jul 2012 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/383127.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/383127.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/383127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/383127.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/383127.html</trackback:ping><description><![CDATA[<div class="articalTitle">
<h2 class="titName SG_txta" id="t_6ee5a22c0100pm2m">asp.net&nbsp;&nbsp;ashx&nbsp;IHttpHandler&nbsp;c#</h2></div><!-- 正文开始 -->

<div class="articalContent  " id="sina_keyword_ad_area2">能和我一样，很多Asp.Net开发人员都有过Asp的背景，以至于我们在开发程序的时候，通常都是在&#8220;页面级&#8221;上思考，也就是说我们现在正在做的这个页面应该有什么样的功能，是进行一个问卷调查还是一个数据库查询等等。而很少在&#8220;请求级&#8221;思考，考虑有没有办法来通过编码的方式来操控一个Http请求。 
<p>实际上，Framework提供了一系列的接口和类，允许你对于Http请求进行编程，而实现这一操作的一个主要的接口，就是 IHttpHandler(另一个是IHttpModule)。</p>
<p>应该还记得第一节中我们提到过 ISAPI，它根据文件名后缀把不同的请求转交给不同的处理程序。但是仔细看看就会发现：几乎一大半的文件都交给 aspnet_isapi.dll 去处理了。很明显，aspnet_isapi.dll 不可能对每种文件采用同一种方式处理，那么 aspnet_isapi.dll 是如何更进一步处理不同的文件，交由谁去处理呢？为了搞清楚这个问题，我们需要打开机器上C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\ 目录下的web.config 文件。</p>
<p><strong>NOTE：</strong>我查阅了很多资料，都说是在 machine.config 中，但实际上 v2.0.50727 下的machine.config中httpHandlers结点是这样的：&lt;httpHandlers /&gt;，并没有给出详细的处理程序，在Web.config中才能看到。而v1.1.4322 下的machine.config中却有。</p>
<p>找到httpHandlers结点，应该可以看到如下这样的代码(做了省略)：</p>
<p>&lt;httpHandlers&gt;<br />... ... <span style="color: #008000">//略<br /></span>&lt;add path="*.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" /&gt;&lt;add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="True" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr> &lt;add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr> &lt;add path="*.asax" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" /&gt;<br />&lt;add path="*.ascx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr> &lt;add path="*.config" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr> &lt;add path="*.cs" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr> &lt;add path="*" verb="GET,HEAD,POST" type="System.Web.DefaultHttpHandler" validate="True" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr> ... ... <span style="color: #008000">//略<br /></span>&lt;/httpHandlers&gt;</p>
<p>可以看到，在&lt;httpHandlers&gt;结点中将不同的文件类型映射给不同的Handler去处理，对于.aspx来说，是由System.Web.UI.PageHandlerFactory来处理。而对于.cs来说，是由System.Web.HttpForbiddenHandler 处理，从ForbiddenHandler名字中出现的Forbidden (翻译过来是&#8220;禁止&#8221;)可以看出，这个Handler可以避免我们的源码被看到。</p>
<p><strong>NOTE：</strong>System.Web.UI.PageHandlerFactory 是一个IHttpHandlerFactory，而不是一个单一的HttpHandler，IHttpHandlerFactory用来做什么后面会说明。</p>
<p>上面列出的是.Net Framework在处理Http请求时的所采用的默认Handler。而如果我们要用编程的方式来操控一个Http请求，我们就需要实现IHttpHandler接口，来定制我们自己的需求。</p>
<p>IHttpHandler的定义是这样的：</p>
<p><span style="color: #00f">public</span> <span style="color: #00f">interface</span> <span style="color: #2b91af">IHttpHandler</span>{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">void</span> ProcessRequest(HttpContext context);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">bool</span> IsReusable { get; }<br />}</p>
<p>由上面可以看出IHttpHandler要求实现一个方法和一个属性。其中 ProcessRequest，从名字(处理请求)看就知道这里应该放置我们处理请求的主要代码。</p>
<p>IsReusable属性，MSDN上是这样解释的：获取一个值，该值指示其他请求是否可以使用 IHttpHandler 实例。也就是说后继的Http请求是不是可以继续使用实现了该接口的类的实例，一般来说，我把它设置成true。</p>
<p>那么实现此接口的类形式应该是这样的：</p>
<p><span style="color: #00f">public</span> <span style="color: #00f">class</span> <span style="color: #2b91af">CustomHandler</span> : <span style="color: #2b91af">IHttpHandler</span>{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">public</span> <span style="color: #00f">void</span> ProcessRequest(HttpContext context) {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #008000">// 处理请求的代码<br /></span>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">public</span> <span style="color: #00f">bool</span> IsReusable {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> get { <span style="color: #2b91af"><span style="color: #00f">return</span></span> <span style="color: #00f">true</span>; }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />}</p>
<p>而为了能使用这个自定义的HttpHandler，我们需要在应用程序目录下的Web.config中注册它。</p>
<p>&lt;system.web&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;httpHandlers&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;add path="*.jpg" verb="*" type="MyNameSpace.MyClass, MyDllName" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/httpHandlers&gt;<br />&lt;/system.web&gt;</p>
<p>应该发现这与之前在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\目录下web.config中看到的几乎完全一样。这里，path指的是请求的文件名称，可以使用通配符扩大范围，也可以明确指定这个handler仅用于处理某个特定的文件(比如说：filename.aspx)的请求。verb指的是请求此文件的方式，可以是post或get，用*代表所有访问方式。type属性由&#8220;,&#8221;分隔成两部分，第一部分是实现了接口的类名，第二部分是位于Bin目录下的编译过的程序集名称。</p>
<p><strong>NOTE：</strong>如果你新建一个项目，并且在项目下创建HandlerTest.cs，然后让站点引用该项目，那么在生成解决方案的时候会自动将编译好的.dll文件添到Bin目录中。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <strong>NOTE：</strong>MyDll只写程序集名，不要加后面的.dll。</p>
<h2>使用HttpHandler实现图片防盗链</h2>
<p>有了之前这么多的准备知识，实现现在的目标就容易得多了：</p>
<p><strong>NOTE：</strong>这个例子，以及下面的一个例子均来自于《Maximizing ASP.NET Real World, Object-Oriented Development》一书：</p>
<h3>Step.1：创建文件 CustomHandler.cs，代码如下：</h3>
<p><span style="color: #2b91af"><span style="color: #00f">using</span></span> System;<br /><span style="color: #00f">using</span> System.Web;<br /><br /><span style="color: #00f">namespace</span> CustomHandler{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">public</span> <span style="color: #00f">class</span> <span style="color: #2b91af">JpgHandler</span> : <span style="color: #2b91af">IHttpHandler</span>{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">public</span> <span style="color: #00f">void</span> ProcessRequest(HttpContext context){<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #008000">// 获取文件服务器端物理路径<br /></span>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #2b91af"><span style="color: #00f">string</span></span> FileName = context.Server.MapPath(context.Request.FilePath);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #008000">// 如果UrlReferrer为空，则显示一张默认的禁止盗链的图片<br /></span>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">if</span> (context.Request.UrlReferrer.Host == <span style="color: #00f">null</span>){<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> context.Response.ContentType = <span style="color: #a31515">"image/JPEG"</span>;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> context.Response.WriteFile(<span style="color: #a31515">"/error.jpg"</span>);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<span style="color: #00f">else</span>{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #008000">// 如果 UrlReferrer中不包含自己站点主机域名，则显示一张默认的禁止盗链的图片<br /></span>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">if</span> (context.Request.UrlReferrer.Host.IndexOf(<span style="color: #a31515">"yourdomain.com"</span>) &gt; 0){<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> context.Response.ContentType = <span style="color: #a31515">"image/JPEG"</span>;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> context.Response.WriteFile(FileName);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<span style="color: #00f">else</span>{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> context.Response.ContentType = <span style="color: #a31515">"image/JPEG"</span>;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> context.Response.WriteFile(<span style="color: #a31515">"/error.jpg"</span>);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">public</span> <span style="color: #00f">bool</span> IsReusable{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> get{ <span style="color: #2b91af"><span style="color: #00f">return</span></span> <span style="color: #00f">true</span>; }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />}</p>
<h3>Step.2 编译这个文件</h3>
<p>csc /t:library /r:System.Web.dll CustomHandler.cs</p>
<h3>Step.3 将编译好的 CustomHandler.dll 拷贝到站点的 Bin 目录下。</h3>
<h3>Step.4 在Web.Config 中注册这个Handler。</h3>
<p>&lt;system.web&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;httpHandlers&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;add path="*.jpg" verb="*" type="CustomHandler.JpgHandler, CustomHandler" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/httpHandlers&gt;<br />&lt;/system.web&gt;</p>
<p>OK，诸位可以按步骤自行测试一下，这里就不赘述了。</p>
<h2>通过IhttpHandler实现图片验证码</h2>
<p>也可以在一个.ashx文件中实现IHttpHandler，而不是采用这种提前编译的方式。</p>
<h3>Step.1 打开Vs2005，&#8220;添加新项&#8221;，&#8220;一般处理程序&#8221;。新建文件后，VS会自动在文件中添加如下的代码：</h3>
<p>&lt;%@ WebHandler Language="C#" Class="Handler" %&gt;<br /><br /><span style="color: #2b91af"><span style="color: #00f">using</span></span> System;<br /><span style="color: #00f">using</span> System.Web;<br /><br /><span style="color: #00f">public</span> <span style="color: #00f">class</span> <span style="color: #2b91af">Handler</span> : <span style="color: #2b91af">IHttpHandler</span> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">public</span> <span style="color: #00f">void</span> ProcessRequest (HttpContext context) {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> context.Response.ContentType = <span style="color: #a31515">"text/plain"</span>;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> context.Response.Write(<span style="color: #a31515">"Hello World"</span>);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">public</span> <span style="color: #00f">bool</span> IsReusable {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> get {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #2b91af"><span style="color: #00f">return</span></span> <span style="color: #00f">false</span>;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />}</p>
<h3>Step.2 将代码改写成如下所示：</h3>
<p>&lt;%@ WebHandler Language="C#" Class="Handler" %&gt;<br /><br /><span style="color: #2b91af"><span style="color: #00f">using</span></span> System;<br /><span style="color: #00f">using</span> System.Drawing;<br /><span style="color: #00f">using</span> System.Drawing.Imaging;<br /><span style="color: #00f">using</span> System.Text;<br /><span style="color: #00f">using</span> System.Web;<br /><span style="color: #00f">using</span> System.Web.SessionState;<br /><br /><span style="color: #00f">public</span> <span style="color: #00f">class</span> <span style="color: #2b91af">Handler</span> : <span style="color: #2b91af">IHttpHandler, IRequiresSessionState</span> {<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">public</span> <span style="color: #00f">void</span> ProcessRequest(HttpContext context) {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> context.Response.ContentType = <span style="color: #a31515">"image/gif"</span>;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #008000">//建立Bitmap对象，绘图<br /></span>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #2b91af">Bitmap</span> basemap = <span style="color: #00f">new</span> <span style="color: #2b91af">Bitmap</span>(200, 60);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #2b91af">Graphics</span> graph = Graphics.FromImage(basemap);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> graph.FillRectangle(<span style="color: #00f">new</span> SolidBrush(Color.White), 0, 0, 200, 60);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #2b91af">Font</span> font = <span style="color: #00f">new</span> <span style="color: #2b91af">Font</span>(FontFamily.GenericSerif, 48, FontStyle.Bold, GraphicsUnit.Pixel);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Random r = <span style="color: #00f">new</span> Random();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #2b91af"><span style="color: #00f">string</span></span> letters = <span style="color: #a31515">"ABCDEFGHIJKLMNPQRSTUVWXY<wbr>Z"</span>;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #2b91af"><span style="color: #00f">string</span></span> letter;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> StringBuilder s = <span style="color: #00f">new</span> StringBuilder();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #008000">//添加随机的五个字母<br /></span>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">for</span> (<span style="color: #00f">int</span> x = 0; x &lt; 5; x++) {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> letter = letters.Substring(r.Next(0, letters.Length - 1), 1);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> s.Append(letter);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> graph.DrawString(letter, font, <span style="color: #00f">new</span> SolidBrush(Color.Black), x * 38, r.Next(0, 15));<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #008000">//混淆背景<br /></span>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #2b91af">Pen</span> linePen = <span style="color: #00f">new</span> <span style="color: #2b91af">Pen</span>(<span style="color: #00f">new</span> SolidBrush(Color.Black), 2);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">for</span> (<span style="color: #00f">int</span> x = 0; x &lt; 6; x++)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> graph.DrawLine(linePen, <span style="color: #00f">new</span> Point(r.Next(0, 199), r.Next(0, 59)), <span style="color: #00f">new</span> Point(r.Next(0, 199), r.Next(0, 59)));<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #008000">//将图片保存到输出流中&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br /></span>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> basemap.Save(context.Response.OutputStream, ImageFormat.Gif);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> context.Session["CheckCode"] = s.ToString();&nbsp;<wbr>&nbsp;<wbr> <span style="color: #008000">//如果没有实现IRequiresSessionState，则这里会出错，也无法生成图片<br /></span>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> context.Response.End();&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">public</span> <span style="color: #00f">bool</span> IsReusable {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> get { <span style="color: #2b91af"><span style="color: #00f">return</span></span> <span style="color: #00f">true</span>; }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />}</p>
<p>需要特别注意的是，Handler类不仅需要实现 IHttpHandler接口(这个显然)，为了在这个Handler类中使用SessionState，还需要实现IRequiresSessionState接口，对于这个接口，MSDN的解释是这样的：Specifies that the target HTTP handler requires read and write access to session-state values. This is a marker interface and has no methods.(翻译过来是：指定当前Http Handler需要对SessionState值的读写访问权。这是一个标记接口，没有任何方法)。</p>
<p>而实际上，IRequiresSessionState的接口定义是这样的：</p>
<p><span style="color: #00f">public</span> <span style="color: #00f">interface</span> <span style="color: #2b91af">IRequiresSessionState</span>{}</p>
<p>可见，这个接口没有任何需要实现的方法或属性，大家只要记得：<strong>如果想在HttpHandler中使用SessionState，必须实现这个接口，实际上也就是在类的标头将这个接口加进去。</strong></p>
<h3>Step.3 新建一个ImageCode.aspx页面，在HTML代码中写下：</h3>
<p>&lt;img src="Handler.ashx" alt="图片验证码" /&gt;</p>
<p>OK，在浏览器中打开ImageCode.aspx，应该可以看到如下所示：</p>
<p><img title="asp.net&nbsp;<wbr  alt="" />&nbsp;<wbr>ashx&nbsp;<wbr>IHttpHandler&nbsp;<wbr>c#" height=93 alt="asp.net&nbsp;<wbr>&nbsp;<wbr>ashx&nbsp;<wbr>IHttpHandler&nbsp;<wbr>c#" src="http://www.tracefact.net/graph/HttpHandler/01.gif" width=215 real_src="http://www.tracefact.net/graph/HttpHandler/01.gif"></p>
<h2>利用HttpHandler创建自定义后缀Rss源</h2>
<p>RSS如今已经可以说是随处可见，而RSS的实现方式，通常是在一个.aspx的CodeBehind文件中写一个XML文件，然后加载到Response的OutputStream中， Rss源通常是Rss.aspx这种形式的。通过第一章学到的ISAPI的知识，再结合本章学到的关于HttpHandler的知识，很容易想到：我们可以自定一个以 .rss 作为后缀名的文件来实现 Rss 源，比如说Article.rss。现在我们就一步步来实现它：</p>
<p><strong>NOTE：</strong>关于RSS的更多内容，可以参阅我编译的 <a href="http://www.tracefact.net/Asp-Net/Creating-Consuming-Rss-Feeds-on-Your-Web-Site.aspx"><font color="#4c7d08">在Web站点中创建和使用RSS源</font></a>。本文不再解释Rss是什么，如何创建Rss源，为了文章的独立性，仅给出创建过程。</p>
<h3>Step.1 创建范例数据库</h3>
<p>Create Table RssSample<br />(<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> SampleId&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Int Identity(1,1) &nbsp;<wbr>&nbsp;<wbr> Not Null,<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Title&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Varchar(100)&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Not Null Constraint uq_Title Unique,<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Author&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Varchar(50)&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Not Null,<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> PubDate&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> DateTime&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Not Null Default GetDate(),<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> [Description] Varchar(500)&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Not Null,<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Link&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Varchar(150)&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Not Null<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Constraint pk_RssSample Primary Key(SampleId)<br />)<br />-- 插入范例数据<br />Insert Into RssSample(Title, Author, [Description], Link)<br />Values('标题1', '作者1', '文章摘要1', 'http://127.0.0.1/#' )<br /><br />-- 省略 ....</p>
<h3>Step.2 建立站点，在App_Code目录下建立RssFeedsLib.cs文件。</h3>
<p><span style="color: #2b91af"><span style="color: #00f">using</span></span> System;<br /><span style="color: #00f">using</span> System.Data;<br /><span style="color: #00f">using</span> System.Data.SqlClient;<br /><span style="color: #00f">using</span> System.IO;<br /><span style="color: #00f">using</span> System.Web;<br /><span style="color: #00f">using</span> System.Xml;<br /><span style="color: #00f">using</span> System.Text;<br /><br /><span style="color: #00f">namespace</span> RssFeadsLib {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">public</span> <span style="color: #00f">class</span> <span style="color: #2b91af">RssGenerator</span> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">public</span> <span style="color: #00f">static</span> <span style="color: #00f">string</span> GetRSS() {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #2b91af">MemoryStream</span> ms = <span style="color: #00f">new</span> <span style="color: #2b91af">MemoryStream</span>();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #2b91af">XmlTextWriter</span> writer = <span style="color: #00f">new</span> <span style="color: #2b91af">XmlTextWriter</span>(ms, <span style="color: #00f">null</span>);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #2b91af">SqlConnection</span> conn = <span style="color: #00f">new</span> <span style="color: #2b91af">SqlConnection</span>(<span style="color: #a31515">"Data Source=.;Initial Catalog=Sample;User ID=sa;Password=sa"</span>);&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #008000">//修改这里成你的数据库连接<br /></span>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #2b91af">SqlCommand</span> cmd = <span style="color: #00f">new</span> <span style="color: #2b91af">SqlCommand</span>(<span style="color: #a31515">"select * from RssSample order by pubdate desc"</span>, conn);<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> conn.Open();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #2b91af">SqlDataReader</span> reader = cmd.ExecuteReader();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.WriteStartElement(<span style="color: #a31515">"rss"</span>);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.WriteAttributeString(<span style="color: #a31515">"version", "2.0"</span>);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.WriteStartElement(<span style="color: #a31515">"channel"</span>);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #008000">// Channel 下的结点静态写入<br /></span>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.WriteElementString(<span style="color: #a31515">"title", "TraceFact.Net 技术文章"</span>);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.WriteElementString(<span style="color: #a31515">"link", "http:<span style="color: #008000">//www.tracefact.net"</span>);<br /></span>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.WriteElementString(<span style="color: #a31515">"description", "Dedicated to asp.net..."</span>);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.WriteElementString(<span style="color: #a31515">"copyright", "Copyright (C) 2007"</span>);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.WriteElementString(<span style="color: #a31515">"generator", "My RSS Generator"</span>);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #008000">// Item 结点从数据库读取<br /></span>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">while</span> (reader.Read()) {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.WriteStartElement(<span style="color: #a31515">"item"</span>);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.WriteElementString(<span style="color: #a31515">"author", reader.GetString(reader.GetOrdinal("Author"</span>)));<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.WriteElementString(<span style="color: #a31515">"title",&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> reader.GetString(reader.GetOrdinal("title"</span>)));<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.WriteElementString(<span style="color: #a31515">"link", reader.GetString(reader.GetOrdinal("Link"</span>)));<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.WriteElementString(<span style="color: #a31515">"description", reader.GetString(reader.GetOrdinal("Description"</span>)));<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.WriteElementString(<span style="color: #a31515">"pubDate", reader.GetDateTime(reader.GetOrdinal("PubDate")).ToString(@"ddd, dd MMM yyyy 12:00:00 tt "</span>));<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.WriteEndElement();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.WriteEndElement();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.WriteEndElement();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> reader.Close();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> conn.Close();<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.BaseStream.Flush();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> writer.Flush();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ms.Flush();<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #008000">// 将流转换成String并返回<br /></span>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">byte</span>[] data = <span style="color: #00f">new</span> <span style="color: #2b91af"><span style="color: #00f">byte</span></span>[ms.Length];<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ms.Seek(0, SeekOrigin.Begin);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ms.Read(data, 0, data.Length);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ms.Close();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">return</span> UTF8Encoding.UTF8.GetString(data);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />}</p>
<h3>Step.3 创建可以处理 .rss 后缀名的 RssHandler</h3>
<p>我们在这个 RssFeedsLib命名空间下，再添加一个类，这个类用于处理对 .rss 后缀名文件的Http请求。</p>
<p><span style="color: #00f">public</span> <span style="color: #00f">class</span> <span style="color: #2b91af">RSSHandler</span>:<span style="color: #2b91af">IHttpHandler</span>{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">public</span> <span style="color: #00f">bool</span> IsReusable<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> get {<span style="color: #2b91af"><span style="color: #00f">return</span></span> <span style="color: #00f">false</span>;}<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">public</span> <span style="color: #00f">void</span> ProcessRequest(HttpContext context){<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> context.Response.ContentType = <span style="color: #a31515">"text/xml"</span>;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #2b91af"><span style="color: #00f">string</span></span> str = RssGenerator.GetRSS();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> context.Response.Write(str);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />}</p>
<h3>Step.4 在Web.config中进行配置</h3>
<p>&lt;httpHandlers&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;add path="*.rss" type="RssFeadsLib.RSSHandler" verb="GET" /&gt;<br />&lt;/httpHandlers&gt;</p>
<p>&nbsp;<wbr></p>
<p><strong>NOTE：</strong>因为这个类和命名空间位于App_Code中，这里就不需要再手动编译RssFeadsLib.cs然后将编译好的.dll应用程序集放到Bin目录中了。至于为什么可以这样，将会在《Asp.Net 构架与安全机制 Part.5 &#8211; 页面生存周期与编译模型》中解释。</p>
<h3>Step.5 在IIS 对ISAPI进行设置。</h3>
<p>应该还记得在Part.1中如何在IIS中设置ISAPI来进行文件与处理程序映射：</p>
<ol><li>打开IIS，选择本范例所用的站点，右键，选择&#8220;属性&#8221;。</li><li>选择&#8220;主目录&#8221;选项卡，点击&#8220;配置...&#8221;按钮。</li><li>点击&#8220;添加&#8221;，设置&#8220;可执行文件&#8221;为&#8220;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll&#8221;，设置&#8220;扩展名&#8221;为&#8220;.rss&#8221;，点&#8220;确定&#8221;。</li><li>注意，不要勾选&#8220;检查文件是否存在&#8221;复选框，这样不用创建文件，只要在地址栏输入任意以.rss后缀结尾的文件名，均会交由上面创建的Handler去处理，而不管这个文件是否存在，也不管请求的是Article.rss还是Sample.rss。 </li></ol>
<p>进行了这些设置以后，现在IIS就知道如何去处理对.rss后缀名文件的请求了。</p>
<h3>Step.6 测试范例</h3>
<p>这个时候，随便打开一个页面，比如空白的Default.aspx，然后我们在地址栏将文件改为：Article.rss(改成abc.rss也是一样)，敲回车，应该可以看到如下的画面。</p>
<p><img title="asp.net&nbsp;<wbr  alt="" />&nbsp;<wbr>ashx&nbsp;<wbr>IHttpHandler&nbsp;<wbr>c#" height=465 alt="asp.net&nbsp;<wbr>&nbsp;<wbr>ashx&nbsp;<wbr>IHttpHandler&nbsp;<wbr>c#" src="http://www.tracefact.net/graph/HttpHandler/02.gif" width=615 real_src="http://www.tracefact.net/graph/HttpHandler/02.gif"></p>
<h2>IHttpHandlerFactory 概述</h2>
<p>现在假设我们有这样的需求，我们不仅想要处理 .rss 后缀名，还想要能够处理 .atom后缀名，假设处理atom的类命名为AtomHandler，那么我们的Web.config该如何设置呢？我想应该是这样的：</p>
<p>&lt;httpHandlers&gt;<br />&lt;add path="*.rss" type="RssFeadsLib.RSSHandler" verb="GET" /&gt;<br />&lt;add path="*.atom" type="RssFeadsLib.AtomHandler" verb="GET" /&gt;<br />&lt;/httpHandlers&gt;</p>
<p>如果我们有很多个HttpHandler分别映射不同后缀名的请求，这样我们的Web.config会变得很冗长，或者，我们只有在程序运行时才能确切地知道使用哪个Handler，这个时候，可以考虑实现 IHttpHandlerFactory来完成这一过程。</p>
<p>IHttpHandlerFactory的定义是这样的：</p>
<p><span style="color: #00f">public</span> <span style="color: #00f">interface</span> <span style="color: #2b91af">IHttpHandlerFactory</span>{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> IHttpHandler GetHandler(HttpContext context, <span style="color: #00f">string</span> requestType, <span style="color: #00f">string</span> url, <span style="color: #00f">string</span> pathTranslated);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">void</span> ReleaseHandler(IHttpHandler handler);<br />}</p>
<p>可见，需要实现两个方法，分别是 GetHandler() 和 ReleaseHandler()。</p>
<ul><li>GetHandler()，返回实现了IHttpHandler接口的类的实例。</li><li>ReleaseHandler()，使得Factory可以重复使用一个已经存在的Handler实例。 </li></ul>
<p>对于上面 .atom 和 .rss 的问题，我们可以这样来实现 IHttpHandlerFactory接口：</p>
<p><span style="color: #00f">class</span> <span style="color: #2b91af">HandlerFactory</span>:<span style="color: #2b91af">IHttpHandlerFactory</span>{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f"><span style="color: #00f"></span>public</span> IHttpHandler GetHandler(HttpContext context, <span style="color: #00f">string</span> requestType, <span style="color: #00f">string</span> url, <span style="color: #00f">string</span> pathTranslated){<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #2b91af"><span style="color: #00f">string</span></span> path = context.Request.PhysicalPath;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">if</span> (Path.GetExtension(path) == <span style="color: #a31515">".rss"</span>){<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">return</span> <span style="color: #00f">new</span> RSSHandler();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">if</span> (Path.GetExtension(path) == <span style="color: #a31515">".atom"</span>){<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">return</span> <span style="color: #00f">new</span> ATOMHandler();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #2b91af"><span style="color: #00f">return</span></span> <span style="color: #00f">null</span>;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <span style="color: #00f">public</span> <span style="color: #00f">void</span> ReleaseHandler(IHttpHandler handler){<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />}</p>
<p>这时，在Web.Config 中&lt;system.web&gt;节点下进行如下设置即可：</p>
<p>&lt;httpHandlers&gt;<br />&lt;add path="*.rss,*.atom" type=" RssFeadsLib.HandlerFactory" verb="GET" /&gt;<br />&lt;/httpHandlers&gt;</p>
<p>但是，这不能简化IIS中ISAPI的设置，还是需要手动去对.rss和.atom分别设置。</p>
<h2>总结</h2>
<p>在本文中，我们首先讨论了aspnet_isapi.dll 如何将对不同后缀名文件的请求分发给相应的处理程序，如何查看Framework默认的处理程序Handler。</p>
<p>然后，我们通过三个实例，图片防盗链、图片验证码、处理自定义后缀名请求，详细讲解了IHttpHandler的实现方法和使用过程。</p>
<p>最后，我向大家概要地介绍了IHttpHandlerFactory接口。</p></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/383127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-07-15 10:34 <a href="http://www.blogjava.net/liuyz2006/articles/383127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Gridview使用</title><link>http://www.blogjava.net/liuyz2006/articles/380557.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Tue, 12 Jun 2012 00:28:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/380557.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/380557.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/380557.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/380557.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/380557.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Gridview是ASP.NET中比较常用的一个控件，像我这种懒人，不记住常用操作，所以经常好多操作都需要上网现找。     这是找到一个比较全的介绍，赶快转来，以后省下找了。。 -------------------以下为博客原文------------------------------- GridView使用详解 01&nbsp;&nbsp; GridView无代码分页排序 02&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/liuyz2006/articles/380557.html'>阅读全文</a><img src ="http://www.blogjava.net/liuyz2006/aggbug/380557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-06-12 08:28 <a href="http://www.blogjava.net/liuyz2006/articles/380557.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ViewState与Session </title><link>http://www.blogjava.net/liuyz2006/articles/380458.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 10 Jun 2012 14:24:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/380458.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/380458.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/380458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/380458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/380458.html</trackback:ping><description><![CDATA[<div class="postTitle"><a id="cb_post_title_url" href="http://www.cnblogs.com/yzxchoice/archive/2006/09/08/498499.html">ViewState与Session</a> </div>
<div class="postText">
<div id="cnblogs_post_body">
<p><font style="background-color: #efefef">昨天偶然看到网上有人讨论究竟是该用viewstate还是session来保存信息. 忽然觉得有必要去深入的研究一下这两个东东了.</font></p>
<p><font style="background-color: #efefef">我们先来看深入分析一下viewstate, 为了分析的相对完整性,先从简单的说起:</font></p>
<p><font style="background-color: #efefef">在asp时代, 大家都知道一个html控件的值,比如input 控件值,当我们把表单提交到服务器后, 页面再刷新回来的时候, input里面的数据已经被清空. 这是因为web的无状态性导致的, 服务端每次把html输出到客户端后就不再于客户端有联系. </font></p>
<p><font style="background-color: #efefef">asp.net巧妙的改变了这一点. 当我们在写一个asp.net表单时, 一旦标明了 form runat=server ,那么,asp.net就会自动在输出时给页面添加一个隐藏域 </p><pre><div twffan="done"><span style="color: #0000ff" twffan="done">&lt;</span><span style="color: #800000" twffan="done">input </span><span style="color: #ff0000" twffan="done">type</span><span style="color: #0000ff" twffan="done">="hidden"</span><span style="color: #ff0000" twffan="done"> name</span><span style="color: #0000ff" twffan="done">="__VIEWSTATE"</span><span style="color: #ff0000" twffan="done"> value</span><span style="color: #0000ff" twffan="done">=""</span><span style="color: #0000ff" twffan="done">&gt;</span></div>
</pre>
<p>那么,有了这个隐藏域,页面里其他所有的控件的状态,包括页面本身的一些状态都会保存到这个控件值里面. 每次页面提交时一起提交到后台,asp.net对其中的值进行解码,然后输出时再根据这个值来恢复各个控件的状态. 我们再看这个控件的value值,它可能类似如下的形式:Oz4+O2w8aTwxPjs+O2w8.... <br />很多人会认为这是加密的信息,其实不是, ms仅仅是给各个控件和页面的状态存入适当的对象里面,然后把该对象序列化, 最后再做一次base64编码,直接赋值给viewstate控件. </p>
<p>说到这,想必你一定想看看这个viewstate里面到底存了哪些东西, 嗯,你是可以写一个base64 to string的转换代码来实现.不过,viewstate是有层次之分的,普通的转换后,你看到的也是很乱的文字. 这里提供了一个专门转换viewstate值的地方 <a title="" href="http://www.wilsondotnet.com/Demos/ViewState.aspx"><u><font color="#0000ff">http://www.wilsondotnet.com/Demos/ViewState.aspx</font></u></a>&nbsp;. 你可以去将自己的viewstate输入进去,让它给你转化一下,这可是带结构的哦 :)</p>
<p>好, 以上说的这些你可能会觉得: 这与session有什么关系? 这个viewstate不是由asp.net自动去维护吗? 是的, 如果仅仅是保存控件的状态, 你可以感觉不到它与session有什么瓜葛( 呵呵,其实它们就没有瓜葛),不过,接下来,我们看看这种使用方法: 在后台aspx.cs代码里:</p><pre><div twffan="done"><span style="color: #0000ff" twffan="done">private</span><span style="color: #000000" twffan="done"> </span><span style="color: #0000ff" twffan="done">void</span><span style="color: #000000" twffan="done"> Page_Load(</span><span style="color: #0000ff" twffan="done">object</span><span style="color: #000000" twffan="done"> sender, System.EventArgs e)
{
ViewState[</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">myvalue</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">] </span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done"> </span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">viewstatevalue</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">;
</span><span style="color: #008000" twffan="done">//</span><span style="color: #008000" twffan="done">.....</span><span style="color: #008000" twffan="done">
</span><span style="color: #000000" twffan="done">}</span></div>
</pre>
<p>呵呵, 可以在页面后台直接给viewstate集合赋值, 现在你是不是觉得和session的使用方法差不多了呢? 对,这一点就是几乎所有初学asp.net的人的疑惑. 会认为asp.net也像session那样把这个值保存到服务器内存里面, 其实不是! </p>
<p>那么,这里的viewstate值是属于谁?又存在哪里? 其实,它和上面的其他控件的状态保存一样,也是存储到那个隐藏的viewstate控件值里面, 上面已经说了, viewstate用来保存状态,包括页面本身, 那么,这里的viewstate就属于页面本身的状态. </p>
<p>分析到此,估计大家对viewstate的使用应该是没有什么疑问了. 那么,我们可以来与session做一下类比, session值是保存在服务器内存上,那么,可以肯定,大量的使用session将导致服务器负担加重. 而viewstate由于只是将数据存入到页面隐藏控件里,不再占用服务器资源,因此, 我们可以将一些需要服务器"记住"的变量和对象保存到viewstate里面. 而sesson则只应该应用在需要跨页面且与每个访问用户相关的变量和对象存储上. 另外,session在默认情况下20分钟就过期,而viewstate则永远不会过期. </p>
<p>但viewstate并不是能存储所有的.net类型数据,它仅仅支持String、Integer、Boolean、Array、ArrayList、Hashtable 以及自定义的一些类型.</p>
<p>当然,任何事物都有两面性, 使用viewstate会增加页面html的输出量,占用更都的带宽,这一点是需要我们慎重考虑的. 另外, 由于所有的viewstate都是存储在一个隐藏域里面,用户可以很容易的通过查看源码来看到这个经过base64编码的值.然后再经过转换就可以获取你存储其中的对象和变量值.</p>
<p>其实,对于viewstate的安全性问题,asp.net还给我们提供了更多的选择.一般如果要保护viewstate有两种方式: 一种是防篡改,一种是加密. 一说到防篡改,我们就想起了使用散列代码. 没错, 我们可以在页面顶部加入如下代码:Page EnableViewStateMAC=true</p>
<p>这样asp.net就会自动的在viewstate中追加一个散列码,在页面回传时,服务器根据回传的viewstate生成一个散列码,再与回传的散列码相比较,如果不对,则丢弃该viewstate,同时控件将恢复初试状态. (默认情况下asp.net是通过SHA1算法而不是md5算法来生成散列,不过这个可以在machine.config里面配置machineKey validation="MD5"即可)</p>
<p>而viewstate加密就更简单了, 只要在machine.config里设置一下machineKey validation="3DES"即可实现用des加密viewstate了.</p>
<p>呵呵,至此,我们对viewstate应该有个很清晰的认识了, 不过,初步研究viewstate, 理解有误之处还望大家多指教 :)</font></p></div></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/380458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-06-10 22:24 <a href="http://www.blogjava.net/liuyz2006/articles/380458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DataKeyNames,DataKeys 用法浅谈(转)</title><link>http://www.blogjava.net/liuyz2006/articles/380457.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 10 Jun 2012 14:09:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/380457.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/380457.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/380457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/380457.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/380457.html</trackback:ping><description><![CDATA[<div class="posthead">
<h2><a class="singleposttitle" id="cb_post_title_url" href="http://www.cnblogs.com/amos/archive/2010/07/16/1778796.html">DataKeyNames,DataKeys 用法浅谈</a> </h2></div>
<div class="postbody">
<div id="cnblogs_post_body">
<p>DataKeyNames作为GridView中的一个属性，我们可以利用这个属性结合DataKeys方便的访问GridView中每个字段的值。</p>
<p>先说怎么用</p>
<p>DataKeyNames可以直接在GridView属性中设置，多个字段之间用逗号分隔，如：Id,Name,Sex 。</p>
<p>在用代码绑定GridView时，也可以设置DataKeyNames：</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" href="javascript:void(0);"><img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif" /></a></span></div><pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span> <span style="color: #000000">gv.DataSource </span><span style="color: #000000">=</span><span style="color: #000000"> Bind();<br /></span><span style="color: #008080">2</span> <span style="color: #000000"><br /></span><span style="color: #008080">3</span> <span style="color: #000000">gv.DataKeyNames </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> </span><span style="color: #0000ff">string</span><span style="color: #000000">[]<br /></span><span style="color: #008080">4</span> <span style="color: #000000">{<br /></span><span style="color: #008080">5</span> <span style="color: #000000">　　</span><span style="color: #800000">"</span><span style="color: #800000">Id</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #800000">"</span><span style="color: #800000">Name</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #800000">"</span><span style="color: #800000">Sex</span><span style="color: #800000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">6</span> <span style="color: #000000">};<br /></span><span style="color: #008080">7</span> <span style="color: #000000"><br /></span><span style="color: #008080">8</span> <span style="color: #000000">gv.DataBind();</span></div></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" href="javascript:void(0);"><img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif" /></a></span></div></div>
<p>DataKeyNames设置好以后，就可以用DataKeys来访问DataKeyNames中每个字段的值了，假如写在RowDeleting事件中</p>
<div class="cnblogs_code"><pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span> <span style="color: #0000ff">protected</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> gv_RowDeleting(</span><span style="color: #0000ff">object</span><span style="color: #000000"> sender, GridViewDeleteEventArgs e)<br /></span><span style="color: #008080">2</span> <span style="color: #000000">{<br /></span><span style="color: #008080">3</span> <span style="color: #000000">　　</span><span style="color: #0000ff">string</span><span style="color: #000000"> id </span><span style="color: #000000">=</span><span style="color: #000000"> gv.DataKeys[e.RowIndex].Value.ToString();</span><span style="color: #008000">//</span><span style="color: #008000">对象中索引0位置的对象值</span><span style="color: #008000"><br /></span><span style="color: #008080">4</span> <span style="color: #008000"></span><span style="color: #000000">}</span></div></pre></div>
<p>这样写也是对的：</p>
<div class="cnblogs_code"><pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span> <span style="color: #0000ff">string</span><span style="color: #000000"> id </span><span style="color: #000000">=</span><span style="color: #000000"> gv.DataKeys[e.RowIndex].Values[</span><span style="color: #800000">"</span><span style="color: #800000">Id</span><span style="color: #800000">"</span><span style="color: #000000">].ToString();</span></div></pre></div>
<p>按照索引同样可以取：</p>
<div class="cnblogs_code"><pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span> <span style="color: #0000ff">string</span><span style="color: #000000"> id </span><span style="color: #000000">=</span><span style="color: #000000"> gv.DataKeys[e.RowIndex][</span><span style="color: #800080">0</span><span style="color: #000000">].ToString();</span><span style="color: #008000">//</span><span style="color: #008000">取Id</span><span style="color: #008000"><br /></span><span style="color: #008080">2</span> <span style="color: #008000"></span><span style="color: #0000ff">string</span><span style="color: #000000"> name</span><span style="color: #000000">=</span><span style="color: #000000"> gv.DataKeys[e.RowIndex][</span><span style="color: #800080">1</span><span style="color: #000000">].ToString();</span><span style="color: #008000">//</span><span style="color: #008000">取Name</span><span style="color: #008000"><br /></span><span style="color: #008080">3</span> <span style="color: #008000"></span><span style="color: #0000ff">string</span><span style="color: #000000"> sex </span><span style="color: #000000">=</span><span style="color: #000000"> gv.DataKeys[e.RowIndex][</span><span style="color: #800080">2</span><span style="color: #000000">].ToString();</span><span style="color: #008000">//</span><span style="color: #008000">取Sex</span></div></pre></div>
<p>可以这样用的原因：</p>
<p>当你设置了DataKeyNames属性，它保存了指定数据库中想要获取值的列名，该属性会自动填充到GridView控件的DataKeys集合</p></div></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/380457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-06-10 22:09 <a href="http://www.blogjava.net/liuyz2006/articles/380457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>出现&lt;authentication mode="Windows"/&gt;错误解决办法</title><link>http://www.blogjava.net/liuyz2006/articles/379000.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Thu, 24 May 2012 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/379000.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/379000.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/379000.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/379000.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/379000.html</trackback:ping><description><![CDATA[<div><h1> 			<a id="cb_post_title_url" href="http://www.cnblogs.com/sjrhero/articles/1814518.html"><span style="font-size: 12pt;">出现&lt;authentication mode="Windows"/&gt;错误解决办法</span></a> 		</h1> 		 		 			<p>网上下载的asp.net源码出现 &lt;authentication mode="Windows"/&gt;错误信息</p> <p>authentication 元素（ASP.NET 设置架构） <br /><br />属性 说明 <br />mode <br />必选的属性。<br /><br />指定应用程序的默认身份验证模式。此属性可以为下列值之一。 <br /><br />值 说明 <br />Windows <br />将  Windows 验证指定为默认的身份验证模式。将它与以下任意形式的 Microsoft Internet 信息服务 (IIS)  身份验证结合起来使用：基本、摘要、集成 Windows 身份验证 (NTLM/Kerberos)  或证书。在这种情况下，您的应用程序将身份验证责任委托给基础 IIS。<br /><br />Forms <br />将 ASP.NET 基于窗体的身份验证指定为默认身份验证模式。<br /><br />Passport <br />将 Microsoft Passport Network 身份验证指定为默认身份验证模式。<br /><br />None <br />不指定任何身份验证。您的应用程序仅期待匿名用户，否则它将提供自己的身份验证。<br /><br /><br />默认值为 Windows。</p> <p><span style="color: #ff0000;">解决方法&lt;一&gt;：</span>在IIS将该目录做成应用程序：打开IIS &#8212;&gt; 默认Web站点 &#8212;&gt; 找到该目录右键打开属性页 &#8212;&gt; 目录（或虚拟目录）卡 &#8212;&gt; 在下半部分&#8220;应用程序设置&#8221;处点第一项的&#8220;创建&#8221;，把该目录做成应用程序。</p> <span style="color: #ff0000;">解决方法&lt;二&gt;：</span> <br />1、若IIS中没有应用程序 名，先创建，若还不行把C:\WINDOWS  \Microsoft.NET\work\v2.0.50727\CONFIG\machine.config中的所有  allowDefinition="MachineToApplication"改为allowDefinition="Everywhere" <br />2、在网站对应的虚拟目录上右键，选属性，然后在应用程序名后点创建。</div><img src ="http://www.blogjava.net/liuyz2006/aggbug/379000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-24 10:08 <a href="http://www.blogjava.net/liuyz2006/articles/379000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>asp.net 连接oracle</title><link>http://www.blogjava.net/liuyz2006/articles/378870.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Tue, 22 May 2012 12:52:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/378870.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/378870.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/378870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/378870.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/378870.html</trackback:ping><description><![CDATA[<div class="tit">asp.net连接Oracle的方法</div>
<div class="date">2012-03-13 19:39</div>
<table style="table-layout: fixed; width: 100%">
<tbody>
<tr>
<td>
<div class="cnt" id="blog_text">
<p><br />方式1：直接利用.NET的oracle驱动连接 <br />引用System.data.oracleclient; <br />1 using System.data.oracleclient; <br />2 string oradb = "Data Source=water;User Id=modis;Password=modis;Integrated Security=no"; <br />3 OracleConnection conn = new OracleConnection(oradb); <br />4 conn.Open(); <br />（我的环境为VS2005，oracle数据源连接只支持到10g以下。） <br />方式2：安装完ODP.net（Oracle Data Provider.NET)，通过OLEDB连接。 <br />引用System.Data.OleDb; <br />1 using System.Data.OleDb; <br />2 string oradb = "Provider=OraOLEDB.Oracle;Data Source=water;User Id=modis;Password=modis;"; <br />3 OleDbConnection myConnection = new OleDbConnection(oradb); <br />4 myConnection.Open(); <br />方式3：安装完ODP.net，通过Oracle的连接器 <br />引用动态链接库Oracle.DataAccess.Client. <br />1 using Oracle.DataAccess.Client; <br />2 string oradb = "Data Source=water;User Id=modis;Password=modis;"; <br />3 OracleConnection conn = new OracleConnection(oradb); // C# <br />4 conn.Open(); </p>
<p>上面的连接字符串只适用于在本地配置了环境的情况，如果想连接远程服务器中的数据库，而你在本地有没有配置环境，你需要参考下面的连接字符串</p>
<p>//OracleConnextion方式</p>
<p>1，string strConnection = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)));User Id=system;Password=system";</p>
<p>//OleDbConnection方式</p>
<p>2，string strConnection = "Provider=MSDAORA.1;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST =127.0.0.1)(PORT=1521)))(CONNECT_DATA =(SERVICE_NAME =orcl)));Persist Security Info=False;User ID=system;Password=system;Unicode=True;pooling = true Connect providerName=System.Data.OracleClient";</p></div></td></tr></tbody></table><img src ="http://www.blogjava.net/liuyz2006/aggbug/378870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-22 20:52 <a href="http://www.blogjava.net/liuyz2006/articles/378870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DefaultView 的作用 </title><link>http://www.blogjava.net/liuyz2006/articles/378833.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Tue, 22 May 2012 06:06:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/378833.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/378833.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/378833.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/378833.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/378833.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: DefaultView 的作用    DefaultView  的作用  收藏 &nbsp;&nbsp;  一直以来在对数据进行排序,  条件查询都是直接重复构建SQL来进行,  在查询次数和数据量不多的情况下倒没觉得什么,  但慢慢得,  当程序需要对大量数据椐不同条件进行多次查廛或排序时,  使用这种方式显然对程序的性能影响将会是十分明显的,  在网上找了一下,  发现DATAVIEW能很好的...&nbsp;&nbsp;<a href='http://www.blogjava.net/liuyz2006/articles/378833.html'>阅读全文</a><img src ="http://www.blogjava.net/liuyz2006/aggbug/378833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-22 14:06 <a href="http://www.blogjava.net/liuyz2006/articles/378833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Gridview FindControl的使用</title><link>http://www.blogjava.net/liuyz2006/articles/378622.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 20 May 2012 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/378622.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/378622.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/378622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/378622.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/378622.html</trackback:ping><description><![CDATA[<div class="articalTitle">
<div class="articalTitle">
<h2 class="titName SG_txta" id="t_701a9e090100nkci"><span style="font-size: 12pt">Gridview&nbsp;FindControl的使用</span></h2></div><!-- 正文开始 -->

<div class="articalContent  " id="sina_keyword_ad_area2"><pre><font color="#1000a0">//先看看FindControl的源码<br />protected</font> <font color="#1000a0">virtual</font> Control <strong>FindControl</strong>(string id, int pathOffset) { string <strong>str</strong>; <font color="#1000a0">this</font>.EnsureChildControls(); <font color="#1000a0">if</font> (!<font color="#1000a0">this</font>.flags[<font color="#800000">0x80</font>]) { Control <strong>namingContainer</strong> = <font color="#1000a0">this</font>.NamingContainer; <font color="#1000a0">if</font> (namingContainer != <font color="#800000">null</font>) { <font color="#1000a0">return</font> namingContainer.FindControl(id, pathOffset);<font color="#38761d">//向上递归</font> } <font color="#1000a0">return</font> <font color="#800000">null</font>; } <font color="#1000a0">if</font> (<font color="#1000a0">this</font>.HasControls() &amp;&amp; (<font color="#1000a0">this</font>._occasionalFields.NamedControls == <font color="#800000">null</font>)) { <font color="#1000a0">this</font>.EnsureNamedControlsTable<wbr>(); } <font color="#1000a0">if</font> ((<font color="#1000a0">this</font>._occasionalFields == <font color="#800000">null</font>) || (<font color="#1000a0">this</font>._occasionalFields.NamedControls == <font color="#800000">null</font>)) { <font color="#1000a0">return</font> <font color="#800000">null</font>; } char[] <strong>anyOf</strong> = <font color="#1000a0">new</font> char[] { <font color="#800000">'$'</font>, <font color="#800000">':'</font> };<font color="#38761d">//name，id</font> int <strong>num</strong> = id.IndexOfAny(anyOf, pathOffset); <font color="#1000a0">if</font> (num == <font color="#800000">-1</font>)<font color="#38761d">//不再存在父控件（容器）时，获得该查找ID的控件</font> { str = id.Substring(pathOffset); <font color="#1000a0">return</font> (<font color="#1000a0">this</font>._occasionalFields.NamedControls[str] <font color="#1000a0">as</font> Control); } str = id.Substring(pathOffset, num - pathOffset);<font color="#38761d">//否则，继续寻找父控件（容器），调用其FindControl方法</font> Control <strong>control2</strong> = <font color="#1000a0">this</font>._occasionalFields.NamedControls[str] <font color="#1000a0">as</font> Control; <font color="#1000a0">if</font> (control2 == <font color="#800000">null</font>) { <font color="#1000a0">return</font> <font color="#800000">null</font>; } <font color="#1000a0">return</font> control2.FindControl(id, num + <font color="#800000">1</font>);<font color="#38761d">//pathOffset往上一级</font> }</pre><pre>//再看GridView列</pre><pre>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:GridView ID="GridView1" runat="server" onrowdatabound="GridView1_RowDataBound" Width="1680px"&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;Columns&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:TemplateField HeaderText="编码"&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;ItemTemplate&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:Literal ID="Literal1" runat="server" Text='&lt;%# eval_r("ID") %&gt;' Visible="false"&gt;&lt;/asp:Literal&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:HyperLink ID="HyperLink1" runat="server" <br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> NavigateUrl='&lt;%# eval_r("ID", "Edit.aspx?Id={0}") %&gt;' Text='&lt;%# eval_r("ID") %&gt;'&gt;&lt;/asp:HyperLink&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/ItemTemplate&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/asp:TemplateField&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:BoundField DataField="FindDeptName" HeaderText="发现单位" &gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;ItemStyle Width="80px" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/asp:BoundField&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:BoundField DataField="FindUserName" HeaderText="发现人" &gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;ItemStyle Width="50px" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/asp:BoundField&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:BoundField DataField="FindWay" HeaderText="发现方式" &gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;ItemStyle Width="60px" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/asp:BoundField&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:BoundField HeaderText="所在装置" DataField="SZZZ" &gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;ItemStyle Width="90px" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/asp:BoundField&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:BoundField HeaderText="隐患内容" DataField="YHNR" &gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;ItemStyle HorizontalAlign="Left" Width="280px" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/asp:BoundField&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:BoundField HeaderText="所属专业" DataField="SSZY" &gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;ItemStyle Width="60px" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/asp:BoundField&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:BoundField HeaderText="类别" DataField="Kind" &gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;ItemStyle Width="40px" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/asp:BoundField&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:BoundField HeaderText="危害后果" DataField="WHHG" &gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;ItemStyle Width="60px" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/asp:BoundField&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:BoundField HeaderText="整改措施" DataField="ZGCS" &gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;ItemStyle HorizontalAlign="Left" Width="220px" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/asp:BoundField&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:BoundField HeaderText="整改责任人" DataField="ZGFZR" &gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;ItemStyle Width="80px" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/asp:BoundField&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:BoundField HeaderText="计划完成时间" DataField="PLANDATE" HtmlEncode="false" DataFormatString="{0:d}" &gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;ItemStyle Width="80px" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/asp:BoundField&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:BoundField HeaderText="整改完成时间" DataField="FINISHDATE" HtmlEncode="false" DataFormatString="{0:d}" &gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;ItemStyle Width="80px" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/asp:BoundField&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:TemplateField HeaderText="监督人验收"&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;ItemTemplate&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:Label ID="Label2" runat="server" Text='&lt;%# eval_r("JDR")%&gt;'&gt;&lt;/asp:Label&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:LinkButton ID="lbYS" runat="server" Text="验收" CommandName="Submit" <br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> CommandArgument='&lt;%#eval_r("ID") %&gt;' <br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Visible='&lt;%#Bll.SessionManage.IsYSRole &amp;&amp; (DateTime.Parse(eval_r("PLANDATE").ToString()) &gt;=DateTime.Now.Date) &amp;&amp; eval_r("JDR").ToString()==""?true:false %&gt;' oncommand="lbYS_Command"&gt;&lt;/asp:LinkButton&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/ItemTemplate&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/asp:TemplateField&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:TemplateField HeaderText="验收状态"&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;ItemTemplate&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:Label ID="Label1" runat="server" Text='&lt;%# (DateTime.Parse(eval_r("PLANDATE").ToString()) &lt;DateTime.Now.Date) &amp;&amp; (eval_r("JDR").ToString() =="")?"已列入考核":"" %&gt;' &gt;&lt;/asp:Label&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/ItemTemplate&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/asp:TemplateField&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:TemplateField HeaderText="确认提交"&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;ItemTemplate&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:HiddenField ID="HiddenField1" runat="server" Value='&lt;%#eval_r("WTKZT") %&gt;' /&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;asp:LinkButton ID="lbTJ" runat="server" Text="提交" CommandName="Submit"<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> CommandArgument='&lt;%#eval_r("ID") %&gt;' oncommand="LinkButton1_Command" Visible='&lt;%#eval_r("WTKZT").ToString()==""?true:false %&gt;'&gt;&lt;/asp:LinkButton&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/ItemTemplate&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/asp:TemplateField&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/Columns&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/asp:GridView&gt;</pre><pre>//最后看GridView的一行html源码</pre><pre>&lt;tr align="center" onmousemove="this.style.backgroundColor='#EDF7F8'" onmouseout="this.style.backgroundColor='#ffffff'"&gt;<br />&lt;td&gt;20100426112155&lt;/td&gt;<br />&lt;td style="width:80px;"&gt;动力&lt;/td&gt;<br />&lt;td style="width:50px;"&gt;管理员&lt;/td&gt;<br />&lt;td style="width:60px;"&gt;监控&lt;/td&gt;<br />&lt;td style="width:90px;"&gt;2#煤气化&lt;/td&gt;<br />&lt;td align="left" style="width:280px;"&gt;a&lt;/td&gt;<br />&lt;td style="width:60px;"&gt;设备&lt;/td&gt;<br />&lt;td style="width:40px;"&gt;设备&lt;/td&gt;<br />&lt;td style="width:60px;"&gt;轻&lt;/td&gt;<br />&lt;td align="left" style="width:220px;"&gt;&amp;nbsp;&lt;/td&gt;<br />&lt;td style="width:80px;"&gt;&amp;nbsp;&lt;/td&gt;<br />&lt;td style="width:80px;"&gt;2010-5-11&lt;/td&gt;<br />&lt;td style="width:80px;"&gt;2010-5-11&lt;/td&gt;<br />&lt;td&gt;&lt;span id="GridView1_ctl03_Label2"&gt;&lt;/span&gt;&lt;/td&gt;<br />&lt;td&gt;&lt;span id="GridView1_ctl03_Label1"&gt;&lt;/span&gt;&lt;/td&gt;<br />&lt;td&gt;&lt;input type="hidden" name="<strong><font color="#ff9900">GridView1</font></strong><font color="#ff0000">$</font><strong><font color="#9900ff">ctl03</font></strong><font color="#ff0000">$</font><strong><font color="#0000ff">HiddenField1</font></strong>" id="<strong><font color="#ff9900">GridView1</font></strong><font color="#ff0000">_</font><strong><font color="#9900ff">ctl03</font></strong><font color="#ff0000">_</font><strong><font color="#0000ff">HiddenField1</font></strong>" value="1" /&gt;<br />&lt;/td&gt;<br />&lt;/tr&gt;</pre><pre>结论：</pre><pre>当使用Cell[n].FindControl方法时，是从最低一级开始查，如Cell[n].FindControl("<strong><font color="#0000ff">HiddenField1</font></strong>")<br />然后Cell会自动调用Rows[n].FindControl("<font color="#9900ff"><strong>ctl03</strong></font><font color="#ff0000">$</font><strong><font color="#0000ff">HiddenField1</font></strong>")，pathOffset加1，因为每行控件名称都不一样，这是自动<br />将控件名称补全，pathOffset再加1，最后调用GridView.FindControl("<font color="#ff9900"><strong>GridView1</strong></font><font color="#ff0000">$</font><strong><font color="#9900ff">ctl03</font></strong><font color="#ff0000">$</font><strong><font color="#0000ff">HiddenField1</font></strong>")</pre><pre>所以我们使用Cell[1]和Cell[20]的FindControl方法时，返回结果是一样的。<br />但是Rows[1]和Rows[20]的FindControl方法时，返回结果是不一样的。因为向上级反映的ctl(n)是不一样的。</pre><pre> </pre><pre>例子：上述控件的部分代码<br />protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if (e.Row.RowType == DataControlRowType.DataRow)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> //超期、未验收 红色停止、已列入考核<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if ((e.Row.<strong>Cells[14].</strong>FindControl("Label1") as Label).Text == "已列入考核")<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> e.Row.Attributes.Clear();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> e.Row.Attributes["style"] = "background-color:red; color:white;";<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> HyperLink hl = (e.Row.<strong>Cells[0]</strong>.FindControl("HyperLink1") as HyperLink);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if (hl !=null)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> hl.Attributes["style"] = "color:white";<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }</pre><pre>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> LinkButton lb = (e.Row.<strong>Cells[15]</strong>.FindControl("lbTJ") as LinkButton);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if (lb != null)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> lb.Attributes["style"] = "color:white";<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }</pre><pre>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> //已验收 绿色通过<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if ((e.Row.<strong>Cells[13]</strong>.FindControl("Label2") as Label).Text != "")<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> e.Row.Attributes.Clear();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> e.Row.Attributes["style"] = "background-color:#00A600; color:white;";</pre><pre>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> HyperLink hl = (e.Row.<strong>Cells[0]</strong>.FindControl("HyperLink1") as HyperLink);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if (hl != null)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> hl.Attributes["style"] = "color:white";<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }</pre><pre>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> LinkButton lb = (e.Row.<strong>Cells[15]</strong>.FindControl("lbTJ") as LinkButton);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if (lb != null)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> lb.Attributes["style"] = "color:white";<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> } <br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }</pre><pre>可以更改为如下代码，好处是不用再挨个去数某个单元格，然后调用其FindControl方法了。</pre><pre>protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if (e.Row.RowType == DataControlRowType.DataRow)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> //超期、未验收 红色停止、已列入考核<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if ((e.Row.FindControl("Label1") as Label).Text == "已列入考核")<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> e.Row.Attributes.Clear();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> e.Row.Attributes["style"] = "background-color:red; color:white;";<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> HyperLink hl = (e.Row.FindControl("HyperLink1") as HyperLink);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if (hl !=null)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> hl.Attributes["style"] = "color:white";<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }</pre><pre>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> LinkButton lb = (e.Row.FindControl("lbTJ") as LinkButton);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if (lb != null)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> lb.Attributes["style"] = "color:white";<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }</pre><pre>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> //已验收 绿色通过<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if ((e.Row.FindControl("Label2") as Label).Text != "")<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> e.Row.Attributes.Clear();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> e.Row.Attributes["style"] = "background-color:#00A600; color:white;";</pre><pre>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> HyperLink hl = (e.Row.FindControl("HyperLink1") as HyperLink);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if (hl != null)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> hl.Attributes["style"] = "color:white";<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }</pre><pre>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> LinkButton lb = (e.Row.FindControl("lbTJ") as LinkButton);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if (lb != null)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> lb.Attributes["style"] = "color:white";<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> } <br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }</pre></div></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/378622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-20 16:44 <a href="http://www.blogjava.net/liuyz2006/articles/378622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FindControl 找控件  </title><link>http://www.blogjava.net/liuyz2006/articles/378621.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 20 May 2012 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/378621.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/378621.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/378621.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/378621.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/378621.html</trackback:ping><description><![CDATA[<h3 class="title pre fs1"><span class="tcnt"><font face="微软雅黑" size="5">FindControl 找控件</font></span>&nbsp;&nbsp;<span class="bgc0 fc07 fw0 fs0"></span></h3>
<p class="tdep clearfix nbw-act fc06" style="line-height: 20px"><br />&nbsp;</p>
<div class="bct fc05 fc11 nbw-blog ztag js-fs2" __1337499916859__="ev_4832123169">
<p style="text-indent: 2em">FindControl 是 ASP.NET 工程師十分常用的 Method，但初學者應該常常會遇到使用 FindControl 卻找不到 Control 的狀況！</p>
<p style="text-indent: 2em">首先，在 ASP.NET 中有所謂 NamingContainer (命名容器) 的觀念，在使用 Data-bound Control ( 資料控制項 ) 時，會用到 ItemTemplate 之類(ITemplate)的標籤，裡面還會包含許多 Control，這些包含在 Template 裡面的 Control 其實是跟原本頁面(Page)中的控制項是不同階層的！而這些被 ITemplate 包含的 Controls 其 NamingContainer 就是這個 Data-bound Control 的每一個 ItemTemplate！</p>
<p style="text-indent: 2em">在這種情況下，若要在 Code behind 中使用 Page.FindControl 想直接找到這些 Data-bound Control 的 Template 中的 Control 的話，就沒辦法直接用 Control ID 找到這個 Control。</p>
<p style="text-indent: 2em">例如：</p><br />[code:html]<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt; asp:repeater ID ="Repeater1" runat ="serer" &gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt; ItemTemplate &gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt; asp:TextBox ID ="TextBox1" runat ="server" Text ="Text on row" /&gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/ ItemTemplate &gt;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/ asp:repeater &gt;<br />[/code]<br />
<p style="text-indent: 2em">在 Code behind 的 Page_Load 事件中要尋找 Repeater1 中第一個 TextBox1 時，使用以下的程式碼就會出錯，因為找不到 TextBox1：</p><br />[code:c#]<br />using System;<br />using System.Data;<br />using System.Configuration;<br />using System.Collections;<br />using System.Web;<br />using System.Web.Security;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />using System.Web.UI.WebControls.WebParts;<br />using System.Web.UI.HtmlControls;<br />public partial class _Default : System.Web.UI.Page<br />{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> protected void Page_Load(object sender, EventArgs e)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> System.Collections.ArrayList a = new ArrayList();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> a.Add("List 1");<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> a.Add("List 2");<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Repeater1.DataSource = a;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Repeater1.DataBind();<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> TextBox txt1 = (TextBox)Page.FindControl("TextBox1");&nbsp;<wbr> // txt1 會是 null<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Response.Write(txt1.Text); // 因為 txt1 是 null 而無法取得 txt1.Text 屬性而發生例外(Exception)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />}<br />[/code]<br />
<p style="text-indent: 2em">如果要透過 FindControl 找到控制項的話，我是有以下 4 種技巧分享給大家：</p>
<p style="text-indent: 2em">1. 透過實做 Repeater1 的 ItemDataBound 事件來取得每一個 ItemTemplate 中 TextBox1 的控制項</p><br />
<p style="text-indent: 2em">這是最常見的用法！</p><br />[code:c#]<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> TextBox txt1 = (TextBox)e.Item.FindControl("TextBox1");<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Response.Write(txt1.Text);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />[/code]<br />
<p style="text-indent: 2em">2. 透過 Repeater1.Items[0].FindControl("TextBox1") 找到第一個 ItemTemplate 中的 TextBox1 控制項</p><br />
<p style="text-indent: 2em">這是取得第一個 ItemTemplate 中的 TextBox1 的常見用法！</p><br />
<p style="text-indent: 2em">3. 透過 Page.FindControl("Repeater1$ctl00$TextBox1") 找到第一個 ItemTemplate 中的 TextBox1 控制項</p><br />
<p style="text-indent: 2em">&nbsp;<wbr>這算是使用 FindControl 的小技巧，因為 ASP.NET 的控制項如果沒有 ID 的話，都是從 ctl00 開始算起的。<br />&nbsp;<wbr>因為 ItemTemplate 是 NamingContainer 但卻沒有設定 ID，所以第一筆就是 ctl00 第二筆就是 ctl01 依此類推。</p><br />
<p style="text-indent: 2em">4. 透過 FindControl&lt;TextBox&gt;("TextBox1") 找到整個頁面中第一個出現的 TextBox1 控制項（不一定在 Repeater1 裡面）</p><br />
<p style="text-indent: 2em">這是透過一個自訂的泛型遞迴方法(Generic Recursive Method)達成。<br />&nbsp;<wbr><br />要使用這段程式比需將以下的程式碼複製到你的頁面的類別(Code behind)中。<br />( 以下程式碼參考自：<a href="http://blogs.interfacett.com/michael-palermo/2007/4/13/recursive-findcontrolt.html" rel="nofollow">http://blogs.interfacett.com/michael-palermo/2007/4/13/recursive-findcontrolt.html</a> &nbsp;<wbr>)</p><br />[code:c#]<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> public T FindControl&lt;T&gt;(string id) where T : Control<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> return FindControl&lt;T&gt;(Page, id);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> } 
<p style="text-indent: 2em">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> public static T FindControl&lt;T&gt;(Control startingControl, string id) where T : Control<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> // 取得 T 的預設值，通常是 null<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> T found = default (T);</p>
<p style="text-indent: 2em">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> int controlCount = startingControl.Controls.Count;</p>
<p style="text-indent: 2em">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if (controlCount &gt; 0)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> for (int i = 0; i &lt; controlCount; i++)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Control activeControl = startingControl.Controls[i];<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if (activeControl is T)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> found = startingControl.Controls[i] as T;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if (string .Compare(id, found.ID, true ) == 0) break ;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> else found = null ;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> else<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> found = FindControl&lt;T&gt;(activeControl, id);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if (found != null ) break ;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> return found;<br /></p></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/378621.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-20 16:36 <a href="http://www.blogjava.net/liuyz2006/articles/378621.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何使用FindControl查找内容页上的某个控件？</title><link>http://www.blogjava.net/liuyz2006/articles/378619.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 20 May 2012 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/378619.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/378619.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/378619.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/378619.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/378619.html</trackback:ping><description><![CDATA[<div class="postTitle">
<h1><a class="postTitle2" id="cb_post_title_url" href="http://www.cnblogs.com/movingboy/archive/2006/07/06/444690.html"><span style="font-size: 12pt"></span></a>&nbsp;</h1></div>
<div id="cnblogs_post_body">
<p>有以下两个页面Default.aspx和Result.aspx，代码如下：<br />
<table style="width: 540px; border-collapse: collapse; height: 27px" cellspacing="0" cellpadding="3" border="1">
<tbody>
<tr>
<td>&lt;!-- Default.aspx --&gt;<br />&lt;%@ Page Language="C#" AutoEventWireup="true" MasterPageFile="~/Default.master"&nbsp; CodeFile="Default.aspx.cs" Inherits="_Default" %&gt; 
<p>&lt;asp:Content ID="Content1" runat="server" ContentPlaceHolderID="ContentPlaceHolder1"&gt;<br />&nbsp;&nbsp;&nbsp; &amp;nbsp;&lt;asp:Label ID="Label1" runat="server" Text="Please input a string here"&gt;&lt;/asp:Label&gt;<br />&nbsp;&nbsp;&nbsp; &lt;asp:TextBox ID="TextBox1" runat="server"&gt;&lt;/asp:TextBox&gt;<br />&nbsp;&nbsp;&nbsp; &lt;asp:Button ID="Button1" runat="server" Text="Button" PostBackUrl="~/Result.aspx" /&gt;&lt;/asp:Content&gt;</p>
<p>//Default.aspx.cs<br />using System;<br />using System.Data;<br />using System.Configuration;<br />using System.Web;<br />using System.Web.Security;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />//using System.Web.UI.WebControls.WebParts;<br />using System.Web.UI.HtmlControls;</p>
<p>public partial class _Default : System.Web.UI.Page<br />{<br />&nbsp;&nbsp;&nbsp; protected void Page_Load(object sender, EventArgs e)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; }<br />}</p></td></tr></tbody></table><br />
<table style="width: 540px; border-collapse: collapse; height: 27px" cellspacing="0" cellpadding="3" border="1">
<tbody>
<tr>
<td>&lt;!-- Result.aspx --&gt;<br />&lt;%@ Page Language="C#" MasterPageFile="~/Default.master" AutoEventWireup="true" CodeFile="Result.aspx.cs" Inherits="Result" Title="Untitled Page" %&gt;<br />&lt;asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;asp:Label ID="Label1" runat="server" Text="The string you input in the previous page is"&gt;&lt;/asp:Label&gt;<br />&nbsp;&nbsp;&nbsp; &lt;asp:TextBox ID="TextBox1" runat="server"&gt;&lt;/asp:TextBox&gt;<br />&lt;/asp:Content&gt; 
<p>//Result.aspx.cs<br />using System;<br />using System.Data;<br />using System.Configuration;<br />using System.Collections;<br />using System.Web;<br />using System.Web.Security;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />using System.Web.UI.WebControls.WebParts;<br />using System.Web.UI.HtmlControls;</p>
<p>public partial class Result : System.Web.UI.Page<br />{<br />&nbsp;&nbsp;&nbsp; protected void Page_Load(object sender, EventArgs e)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (PreviousPage != null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextBox tb = (TextBox)PreviousPage.FindControl("TextBox1");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tb != null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextBox1.Text = tb.Text;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}</p></td></tr></tbody></table><br />这两个页面都指定了MasterPageFile属性。因为该MasterPage中的内容无关紧要，就不列出来了。在Default.aspx上有两个控件：TextBox1用于接受用户的输入，Button1用于提交页面，其PostBackUrl指向Result.aspx。在Result.aspx.cs的Page_Load方法中尝试在TextBox1中显示用户在前一页面的TextBox1中输入的字符串。当执行以下语句时：</p>
<p>TextBox tb = (TextBox)PreviousPage.FindControl("TextBox1");</p>
<p>tb的值为null。将以上语句更改为如下代码：</p>
<p>Content con = (Content)PreviousPage.FindControl("Content1");<br />if (con == null)<br />&nbsp;&nbsp;&nbsp; return;</p>
<p>TextBox tb = (TextBox)con.FindControl("TextBox1");</p>
<p>但con的值为null，这样后续的语句也不可能执行了。问题出在哪里呢？<br /><br />经过一番搜索，在forums.asp.net中找到了答案，以下引用的是bitmask的说法：<br />
<table style="width: 539px; border-collapse: collapse; height: 27px" cellspacing="0" cellpadding="3" border="1">
<tbody>
<tr>
<td>...becasue the Content controls themselves dissapear after the master page rearranges the page. You can use the ContentPlaceHolders, or the &lt;form&gt; on the MasterPage if there are no INamingContainers between the form and the control you need.</td></tr></tbody></table></p>所以以上的代码应该改成：<br /><br />TextBox tb = (TextBox)PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("TextBox1");<br /><br />bitmask还在他的博客上写了一篇文章来阐述FindControl方法和INamingContainers接口：<br /><a href="http://www.odetocode.com/Articles/116.aspx">http://www.odetocode.com/Articles/116.aspx</a><br /><br />在他的另一篇文章里给出了一张图片，显示出了运行时母版页与内容页合并后的页面上各个控件的关系，我冒昧地贴在这里了：<br /><img height="300" alt="" src="http://images.cnblogs.com/cnblogs_com/movingboy/controltree.png" width="322" border="0" /><br />原文：<a href="http://odetocode.com/Blogs/scott/archive/2006/01/12/2726.aspx">http://odetocode.com/Blogs/scott/archive/2006/01/12/2726.aspx</a> </div>
<div id="MySignature"></div>
<div id="blog_post_info_block">
<div id="blog_post_info">&nbsp;</div></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/378619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-20 16:17 <a href="http://www.blogjava.net/liuyz2006/articles/378619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FindControl方法误区和解析 </title><link>http://www.blogjava.net/liuyz2006/articles/378617.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 20 May 2012 08:05:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/378617.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/378617.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/378617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/378617.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/378617.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/liuyz2006/aggbug/378617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-20 16:05 <a href="http://www.blogjava.net/liuyz2006/articles/378617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP.NET内幕 - IIS处理模型</title><link>http://www.blogjava.net/liuyz2006/articles/378608.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 20 May 2012 05:07:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/378608.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/378608.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/378608.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/378608.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/378608.html</trackback:ping><description><![CDATA[<p align="left">
<table height="1" cellspacing="0" cellpadding="0" width="100%" bgcolor="#ffffff" border="0">
<tbody>
<tr>
<td>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
<tr>
<td width="19" bgcolor="#f5f5f5"></td>
<td bgcolor="#cecece"><img height="1" src="http://www.uml.org.cn/images/spacern.gif" width="1"  alt="" /></td>
<td width="19" bgcolor="#f5f5f5"></td></tr></tbody></table></td></tr></tbody></table>
<table class="content" cellspacing="0" cellpadding="0" width="100%" bgcolor="#ffffff" border="0">
<tbody>
<tr valign="top">
<td style="width: 1024px; height: 3571px">
<table class="content" cellspacing="0" cellpadding="0" width="100%" bgcolor="#ffffff" border="0">
<tbody>
<tr valign="top">
<td class="content" width="20" background="/images/wzhleft22012.jpg" bgcolor="#f5f5f5">
<table class="content" height="8" cellspacing="0" cellpadding="0" width="20" align="center" border="0"><!--DWLayoutTable-->

<tbody>
<tr>
<td valign="top" width="20" height="8">&nbsp;</td></tr></tbody></table></td>
<td class="left" width="864">
<table cellspacing="0" cellpadding="0" width="100%" align="center" border="0">
<tbody>
<tr>
<td bgcolor="#ffffff" height="18">　</td></tr>
<tr>
<td bgcolor="#ffffff">
<div class="title" align="center">ASP.NET内幕 - IIS处理模型<br /></div></td></tr>
<tr>
<td bgcolor="#ffffff" height="17">　</td></tr>
<tr>
<td style="width: 454px; height: 23px" bgcolor="#ffffff">
<div class="formtitle" align="center">
<p>&nbsp;</p></div></td></tr>
<tr>
<td bgcolor="#ffffff" height="16">　</td></tr>
<tr>
<td valign="top" bgcolor="#ffffff">
<table cellspacing="1" cellpadding="3" width="95%" align="center" border="0">
<tbody>
<tr>
<td class="content" valign="top" bgcolor="#ffffff">
<p>微软的Active ServerPages，即ASP，自1996年首次发布以来，为Web开发者构建Web应用提供了一个丰富、复杂的框架。过去的几年它的基础架构发展的如此迅速，成为目前大家了解的ASP.NET，已经不再象它的前身。ASP.NET是构建Web应用的框架，就是说应用程序运行在Web上，客户-服务器端模式表现为浏览器向Web服务器发送各种资源的请求。象CGI、PHP、JSP、ASP等动态服务器端资源生成技术出现以前，所有Web服务器必须接受客户端静态资源请求，将其发送给请求者。随着动态技术的发展，Web服务器开始承担更多的职责，因为它们必须采取一些方式在服务器端生成动态资源，将结果返回给客户端，这已经是一项不同于以前的任务。</p>
<p>从菜鸟的角度来看，客户端和服务器端的交互很简单，就是出现了使用HTTP（超文本传输协议）的Web通讯。HTTP是一种依赖TCP、IP，在异构网络，即万维网的两个连接节点间传输数据的应用层协议。</p>
<p>每一种动态服务器端技术都完全了解特定的Web服务器实现，ASP.NET跟微软的因特网信息服务器，即IIS紧密结合在一起。</p>
<p>不同的服务器使用不同的方法生成动态资源，我们需要检验的是，IIS怎样在服务器上处理某个请求的路径，将结果返回给客户端。</p>
<p><strong>IIS和ISAPI扩展</strong></p>
<p>前面提到，静态资源不需要服务器处理，一旦接收到静态资源请求，服务器只需要从文件系统获取它的内容，按照HTTP协议向客户端发送内容的字节流。静态资源可以是图片、脚本文件、css样式表，或者html页面。很明显服务器需要知道怎样区别静态和动态资源，因为后者需要经过某些处理，而不是直接将其发送给客户端。这就是ISAPI出现的原因，ISAPI表示因特网应用程序接口（Internet Server ApplicationProgramming Interface）。ISAPI扩展是使用Win32.dll实现的模块，IIS使用它处理特定的资源。ISAPI扩展和文件之间的映射通过IIS插件配置，存储在IIS元数据中。每一个文件扩展可以和特定的ISAPI扩展关联，就是说，当这种文件的请求到达后，IIS将它交给相应的ISAPI扩展，认为它能够处理。</p>
<p>图1：在IIS 5.0中配置ISAPI扩展映射</p>
<p><img height="455" src="http://www.uml.org.cn/net/images/aspnet_iis_process_mode_isapi.gif" width="406"  alt="" /></p>
<p>很明显ISAPI需要实现一个公共接口，IIS能够使用详细描述请求的数据进行调用，生成响应。</p>
<p>如图1的演示，.asp扩展被映射到asp.dll的ISAPI扩展。对于ASP页面，这个组建负责处理所有的请求任务，生成输出，包括收集请求信息，通过 Request、Response以及其它公共ASP内置对象将这些信息传递给ASP页面，解析执行ASP页面，返回结果HTML。</p>
<p>实际上与CGI这样的技术相比，这是一个极大的改进，但ASP.NET采取了更进一步的做法，引入抽象方法，避免开发者必须关注这个过程中到底发生了什么。</p>
<p>安装完后，ASP.NET配置IIS，将特定的ASP.NET文件请求重定向到一个叫做aspnet_isapi.dll的ISAPI扩展。这个ISAPI 扩展的处理跟之前的asp.dll扩展有点不一样，asp.dll扩展只是负责解析和执行请求的ASP页面。普通ISAPI模块处理请求的步骤完全被 IIS隐藏，因此为了处理请求，ISAPI扩展可以采用不同的模式。</p>
<p>表1：aspnet_isapi.dll的IIS应用程序映射</p>
<table class="content" id="__01" height="163" cellspacing="0" cellpadding="3" width="550" bgcolor="#ffffff" border="1"><!--DWLayoutTable-->

<tbody>
<tr>
<td valign="top" bgcolor="#ffffff" height="23"><strong>扩展名</strong></td>
<td valign="top" bgcolor="#ffffff"><strong>资源类型</strong></td></tr>
<tr>
<td valign="top" bgcolor="#ffffff">.asax</td>
<td valign="top" bgcolor="#ffffff">ASP.NET application files. Usually global.asax.</td></tr>
<tr>
<td valign="top" bgcolor="#ffffff">.ascx</td>
<td valign="top" bgcolor="#ffffff">ASP.NET user control files.</td></tr>
<tr>
<td valign="top" bgcolor="#ffffff">.ashx</td>
<td valign="top" bgcolor="#ffffff">HTTP handlers, the managed counterpart of ISAPI extensions.</td></tr>
<tr>
<td valign="top" bgcolor="#ffffff">.asmx</td>
<td valign="top" bgcolor="#ffffff">ASP.NET web services.</td></tr>
<tr>
<td valign="top" bgcolor="#ffffff">.aspx</td>
<td valign="top" bgcolor="#ffffff">ASP.NET web pages.</td></tr>
<tr>
<td valign="top" width="81" bgcolor="#ffffff">.axd</td>
<td valign="top" width="451" bgcolor="#ffffff">ASP.NET internal HTTP handlers.</td></tr></tbody></table>
<p>除了表1中的文件扩展列表，ASP.NET ISAPI扩展也管理其它一些不支持浏览器请求的文件扩展，例如Visual Studio工程文件、源代码和配置文件等。</p>
<p><strong>ASP.NET处理模型</strong></p>
<p>目前为止我们已经了解，IIS接收到ASP.NET文件请求时，将其传给aspnet_isapi.dll这个ASP.NET相关处理的主入口点。实际上 ISAPI扩展怎样进行处理，依赖于操作系统的IIS版本，不同版本的处理模型可能很不一样。处理模型指ASP.NET运行时为了处理请求、生成响应而进行的操作序列。</p>
<p>当运行在IIS5.x时，所有ASP.NET相关的请求被ISAPI扩展分发到一个叫做aspnet_wp.exe的外部工作进程。运行在IIS进程inetinfo.exe中的ASP.NETISAPI扩展将控制转给aspnet_wp.exe，并传递请求相关的所有信息。它们之间的通讯通过命名管道进行，即众所周知的IPC（进程间通讯Inter ProcessCommunication）机制。ASP.NET工作进程与ISAPI扩展一起，执行一定数量的任务，它们是ASP.NET请求背后处理的主要承担者。介绍一下后面会讨论的一个主题，注意对应于IIS上不同虚拟目录的每一个web应用程序，都是在同一个进程的上下文中执行的，即 ASP.NET工作进程。为了在执行上下文中提供隔离，ASP.NET模型引入了应用程序域的概念，简写为AppDomain。它们可以看作是轻量级的进程，更多的讨论在后面。</p>
<p>另一方面如果运行在IIS6，不会使用aspnet_wp.exe，而是另外一个叫做w3wp.exe的进程。另外，inetinfo.exe不再向ISAPI传递HTTP请求，但它仍然处理其他请求协议。尽管IIS 6能够以兼容模式运行，模拟前一个版本IIS的行为，但与IIS5相比处理模型上很多细节改变了。一个大的改进是，与运行在IIS5上的处理模型相比，到达的请求将在较低的内核层级处理，然后传递给适当的ISAPI扩展。这避免了进程间通讯技术，从性能和资源消耗角度来看，进程间通讯是一个昂贵的操作。我们在下面的章节中深入探讨这个。</p>
<p><strong>IIS 5.0处理模型</strong></p>
<p>这是Windows 2000和XP机器上默认的处理模型。前面提到它位于IIS inetinfo.exe进程中，默认监听TCP80端口接收HTTP请求，将请求排列到一个队列中，等待接受处理。如果请求是ASP.NET类型，这个处理被委托给ASP.NETISAPI扩展，即aspnet_isapi.dll。接下来通过命名管道与ASP.NET工作进程 aspnet_wp.exe通讯，最后由工作进程将请求交给ASP.NET HTTP运行时环境。图2以图形方式展现这个处理过程。</p>
<p>图2：IIS 5.0处理模型</p>
<p><img height="333" src="http://www.uml.org.cn/net/images/aspnet_iis_process_mode_iis5-model.gif" width="600"  alt="" /></p>
<p>图 2中出现了一个我们还没有提到过的额外元素，ASP.NETHTTP运行时环境。这不是本文的主题，会在后续的文章中详细解释，但为了本文的讨论，可以把 HTTP运行时环境看作一个黑箱，ASP.NET相关的处理在这儿完成，所有托管代码位于这，开发者可以在这进行处理，从直接的HttpRuntime到 HttpHandler等，在这处理请求，生成响应。这也被称为ASP.NET管道，或者HTTP运行时管道。</p>
<p>这个处理模型中有意思的一点是，所有的请求一旦被ISAPI扩展处理，就被传给ASP.NET工作进程。同一时间只有一个ASP.NET进程实例是活动状态，不过有一个例外，后面会讨论。因此运行在IIS中的所有ASP.NETweb应用程序实际上也是运行在工作进程上的，然而这并不意味着所有的应用程序运行在相同的上下文中，共享所有的数据。前面提到，ASP.NET引入了AppDomain的概念，它其实是一种托管的轻量级进程，提供隔离和安全边界。每个IIS虚拟目录在独立的AppDomain中执行，当属于这个应用的任何一个资源在第一次请求时，这个AppDomain被自动加载到工作进程中。AppDomain被加载之后，就是说所有用于处理这个请求所需的程序集被加载到AppDomain中，然后控制权被传给ASP.NET管道进行实际的处理。多个AppDomain 可以运行在同一个进程中，同一个AppDomain的请求可以用多个线程来处理，然而线程并不属于AppDomain，它可以服务于不同 AppDomain的请求，但在给定的时间一个线程只会属于一个AppDomain。</p>
<p>出于性能原因，工作进程可能会依据某些条件进行回收，可以从位于C:\windows\microsoft.net\Framework\[frameworkversion]\CONFIG目录中的 machine.config文件看到这些描述性的条件，包括进程生存时间、正在处理以及队列中的请求数、空闲时间以及内存消耗。一旦达到这些参数中的某个预设值，ISAPI扩展为工作进程创建一个新的实例，用它继续处理请求。只有在这个时候多个工作进程并发运行，实际上老的进程实例并没有被结束掉，允许它处理剩余的请求。</p>
<p><strong>IIS 6.0处理模型</strong></p>
<p>IIS 6处理模型是运行Windows 2003 Server操作系统的机器上默认的模型，它在IIS5处理模型的基础上引入了几个改进，最大的改变之一是引入了应用程序池的概念。在IIS5.x上，所有的web应用程序，即所有的AppDomain运行在ASP.NET工作进程中，为了实现更好的安全边界粒度以及定制能力，IIS6处理模式允许应用程序运行在不同的工作进程中，即w3wp.exe。每个应用程序池可以包含多个AppDomain，运行在独立的工作进程中，换句话说就是从单个进程运行所有的应用程序切换到每个工作进程运行一个应用程序池。这个模式也叫做工作进程隔离模式（worker processisolation mode）。</p>
<p>与之前的模式相比，另一个大的改变是IIS监听请求的方式。IIS5模式中，由IIS进程inetinfo.exe来监听特定的TCP端口，接收HTTP请求，在IIS6架构中，通过一个叫做http.sys的内核驱动，在内核层级而不是之前的用户模式下处理和排队请求，这种方式比老的模式有一些优点，叫做内核级请求队列（kernel-level request queuing）。</p>
<p>图3：IIS 6.0处理模型</p>
<p><img height="397" src="http://www.uml.org.cn/net/images/aspnet_iis_process_mode_iis6-model.gif" width="600"  alt="" /></p>
<p>图 3演示了使用IIS6模式处理请求的主要组建。请求到达后，内核级的设备驱动http.sys将其传递到正确的应用程序池队列中，每个队列属于特定的应用程序池，也就是说属于特定的工作进程，接下来工作进程从队列中接收请求。这种方式极大的降低了IIS5模式中引入的命名管道的开销，因为不再需要进程间通讯，请求直接从内核级驱动传递给工作进程，这样有很多的优点，例如可靠性。因为运行在内核模式中，请求分发不受用户模式，即工作进程中宕机和故障的影响，因此即使工作进程宕机了，系统仍然能够接收请求，重起宕机的进程。</p>
<p>工作进程负责加载ASP.NET ISAPI扩展，它依次加载CLR，将所有的工作委托给HTTP运行时。</p>
<p>w3wp.exe工作进程不同于IIS 5模式中的aspnet_wp.exe进程，跟ASP.NET不相关，它用于处理任何类型的请求，然后工作进程根据它需要处理的资源类型决定加载哪些ISAPI模块。</p>
<p>出于简化目的在图3中有一个细节没有标出来，到达的请求通过IIS 6中加载的一个叫做Web管理服务（WAS）的模块，从应用程序池队列传递给正确的工作进程。这个模块负责从IIS元数据读取工作进程与web应用程序的邦定信息，将请求传递给正确的工作进程。 </p></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></p><img src ="http://www.blogjava.net/liuyz2006/aggbug/378608.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-20 13:07 <a href="http://www.blogjava.net/liuyz2006/articles/378608.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP.NET中三种操作SQLServer方式</title><link>http://www.blogjava.net/liuyz2006/articles/378572.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sat, 19 May 2012 10:47:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/378572.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/378572.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/378572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/378572.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/378572.html</trackback:ping><description><![CDATA[<h2><a href="http://applelure.wordpress.com.cn/2008/06/26/net%e4%b8%ad%e4%b8%89%e7%a7%8d%e6%93%8d%e4%bd%9csqlserver%e6%96%b9%e5%bc%8f/"><span style="font-size: 10pt">ASP.NET中三种操作SQLServer方式</span></a></h2>
<p>ASP.NET中三种操作SQLServer方式:</p>
<p><span id="more-120"></span></p>
<h3>SqlDataSource:</h3>
<p><code><br /><span style="color: #000080"><em>SqlDataSource sds = new SqlDataSource();</em></span></code></p>
<p><span style="color: #000080"><em>Label lbl = new Label();<br />sds.SelectCommandType = SqlDataSourceCommandType.Text;<br />sds.SelectCommand = &#8220;SELECT * FROM guidtest&#8221;;<br />sds.ConnectionString = &#8220;Data Source=.;Database=test;uid=sa;pwd=123&#8243;;<br />sds.DataSourceMode = SqlDataSourceMode.DataSet;<br />sds.ID = &#8220;ds&#8221;;</em></span></p>
<p><span style="color: #ff6600"><span style="color: #000080"><em>GridView gw = new GridView();<br />gw.ID = &#8220;gw&#8221;;<br />form1.Controls.Add(gw);<br />gw.DataSource = sds;<br /></em></span></span></p>
<p><span style="color: #ff6600"><span style="color: #000080"><em>gw.DataBind();</em></span></span></p>
<h3><span style="color: #ff6600"></span></h3>
<h3>SqlDataAdapter:</h3>
<p><code><br /><span style="color: #000080"><em>DbConnection connection = new System.Data.SqlClient.SqlConnection();<br />connection.ConnectionString = "Data Source=.;Database=test;uid=sa;pwd=123";<br />System.Data.SqlClient.SqlCommand cmd = (System.Data.SqlClient.SqlCommand)connection.CreateCommand();<br />cmd.CommandType = CommandType.Text;<br />cmd.CommandText = "SELECT * FROM guidtest";<br />System.Data.SqlClient.SqlDataAdapter sda = new System.Data.SqlClient.SqlDataAdapter(cmd);<br />DataSet ds = new DataSet();<br />sda.Fill(ds, "guid");<br />GridView gw = new GridView();</em><br /><em>gw.DataSource = ds;<br />gw.DataBind();<br />form1.Controls.Add(gw);</em><br /></span></code></p>
<h3>DbDataReader:</h3>
<p><code><br /><span style="color: #000080"><em>System.Data.Common.DbConnection conn = new System.Data.SqlClient.SqlConnection();<br />string connection = "Data Source=.;Database=test;uid=sa;pwd=123";<br />string str;<br />Label lbl = new Label();<br />conn.ConnectionString = connection;<br />System.Data.Common.DbCommand cmd = new System.Data.SqlClient.SqlCommand();<br />cmd.CommandType = CommandType.Text;<br />cmd.CommandText = "SELECT * FROM guidtest";<br />cmd.Connection = conn;<br />conn.Open();<br />System.Data.Common.DbDataReader ddr = cmd.ExecuteReader() ;<br />while (ddr.Read())<br />{<br />lbl.Text += "Guid:" + ddr["guid"].ToString();<br />}</em></span></code></p>
<p><span style="color: #000080"><em>conn.Close();<br />form1.Controls.Add(lbl);</em></span></p><img src ="http://www.blogjava.net/liuyz2006/aggbug/378572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-19 18:47 <a href="http://www.blogjava.net/liuyz2006/articles/378572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>asp.net学习之SqlDataSource 2 select的四种参数赋予形式的解释 </title><link>http://www.blogjava.net/liuyz2006/articles/378565.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sat, 19 May 2012 07:38:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/378565.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/378565.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/378565.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/378565.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/378565.html</trackback:ping><description><![CDATA[<div class="article_title"><span class="ico ico_type_Original"></span>
<h3><span class="link_title"><a href="http://blog.csdn.net/goodshot/article/details/6003608"><span style="font-size: 10pt">asp.net学习之SqlDataSource 2 select的四种参数赋予形式的解释 </span></a></span></h3></div>
<div class="article_manage"><span class="link_postdate">2010-11-11 21:37</span> <span class="link_view" title="阅读次数">604人阅读</span> <span class="link_comments" title="评论次数"><a href="http://blog.csdn.net/goodshot/article/details/6003608#comments">评论</a>(0)</span> <span class="link_collect"><a title="收藏" href="javascript:void(0);">收藏</a></span> <span class="link_report"><a title="举报" href="http://blog.csdn.net/goodshot/article/details/6003608#report">举报</a></span> </div>
<div class="article_content" id="article_content">
<p>&nbsp; 通过 SqlDataSource 控件，可以使用 Web 服务器控件访问位于关系数据库中的数据。其中可以包括 Microsoft SQL Server 和 Oracle 数据库以及 OLE DB 和 ODBC 数据源。您可以将 SqlDataSource 控件与数据绑定控件（如 GridView、FormView 和 DetailsView 控件）一起使用，用极少代码或甚至不用代码来在 ASP.NET 网页上显示和操作数据。</p>
<p>1. 总述 <br />&nbsp;&nbsp; SqlDataSource是基于ADO.net构建的，会使用ADO.NET中的DataSet、DataReader和Command对象，我们看不见它们只不过是被封装起来了。SqlDataSource是一个控件，所以允许以声明控件的方式，而不是编程的方式使用这些ADO.NET对象。 <br />&nbsp;&nbsp; SqlDataSource需要与其它数据绑定控件结合起来，以显示数据。关于数据绑定控件，见<a href="http://www.cnblogs.com/shipfi/archive/2009/10/15/1584054.html">http://www.cnblogs.com/shipfi/archive/2009/10/15/1584054.html</a> </p>
<p><br />2.一些常用的属性 <br />&nbsp;&nbsp; 这些属性不光可以在程序代码中进行设定，也可以在画面中像使用控件方式一样进行设定。 <br />&nbsp;&nbsp; 2.1 ConnectionString属性 ： 获取或设置特定于 ADO.NET 提供程序的连接字符串 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果是控件形式，可以在aspx页面中进行设定，代码如下： </p>
<p><br />&lt;!-- 连接字符串直接写入ConnectionString属性中 --&gt; <br />&lt;asp:SqlDataSource ID="srcMovies" runat="server" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConnectionString="Data Source=PC-200907130922;Initial Catalog=DawnEnterpriseDB;User ID=sa;Password=****" &gt; <br />&lt;!-- 连接字符串直接在web.config中 --&gt; <br />&lt;asp:SqlDataSource ID="srcMovies" runat="server" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConnectionString="&lt;%$ ConnectionStrings:DawnEnterpriseDBConnectionString %&gt;" &gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果是编程方式，在aspx.cs中，代码如下： </p>
<p><br />SqlDataSource srcMov = new SqlDataSource(); <br />srcMov.ConnectionString = <br />&nbsp;&nbsp;&nbsp;&nbsp; WebConfigurationManager.ConnectionStrings["DawnEnterpriseDBConnectionString"].ConnectionString; </p>
<p><br />&nbsp;&nbsp; 2.2 ProviderName属性：获取或设置 .NET Framework 数据提供程序的名称，使用该提供程序来连接基础数据源。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果不进行设定，默认的为 Microsoft SQL Server 的 ADO.NET 提供程序的名称。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以设定的值有："System.Data.SqlClient"、"System.Data.OleDb"、"System.Data.Odbc"、"System.Data.OracleClient" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MSDN上记载：如果更改 ProviderName 属性，会引发 DataSourceChanged 事件，从而导致所有绑定到 SqlDataSource 的控件重新进行绑定。 </p>
<p>&nbsp;&nbsp; 2.3 执行四个SQL语句的Command及相应的CommandType <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679;SelectCommand、InsertCommand、UpdateCommand、DeleteCommand <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上四个属性都是String类型，可以提供SQL语句及存储过程名称。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果是提供的存储过程，则需要把相应的SelectCommandType,InsertCommandType,UpdateCommandType,DeleteCommandType设定为"StoredProcedure" </p>
<p>&nbsp;&nbsp; 2.4 进行过滤的FilterExpression属性 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设定FilterExpression属性，可以过滤控件返回的行，例如： </p>
<p><br />&lt;asp:SqlDataSource ID="SqlDataSource1" runat="server"&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConnectionString="&lt;%$ ConnectionStrings:DawnEnterpriseDBConnectionString %&gt;"&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SelectCommand="SELECT [product_id], [product_code], [product_name] FROM [product_main]&#8221; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FilterExpression=&#8221;Product_name like &#8216;{0}%&#8217; &#8221; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Runat=&#8221;server&#8221;&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;FilterParameters&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:ControlParameter Name=&#8221;Title&#8221; ControlID=&#8221;txtTitle&#8221; /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/FilterParameters&gt; <br />&lt;/asp:SqlDataSource&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; 2.5 改变数据源模型DataSourceMode属性 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以改变数据源模型有："DataReader",&#8221;DataSet&#8221;,默认是DataSet.相比DataSet,DataReader可以更快速，但是，只有DataSet提供了缓存、过滤、分页和排序功能</p>
<p>&nbsp;&nbsp; 2.6 ASP.NET参数对象属性 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通常，SQL 语句和存储过程包括运行时计算的参数。使用参数编写的 SQL 语句称作参数化 SQL 语句 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ASP.NET 数据源控件可以接受输入参数，这样就可以在运行时将值传递给这些参数。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数值可以从多种源中获取。通过 Parameter 对象，可以从 Web 服务器控件属性、Cookie、会话状态、QueryString 字段、用户配置文件属性及其他源中为参数化数据操作提供值。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相应的参数对象包括： <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679; Parameter:表示任意一个静态值 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679; ControlParameter:表示控件值或页面的属性值 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679; CookieParameter:表示浏览器的Cookie值 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679; FormParameter:表示一个HTML表单字段的值 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679; ProfileParameter:表示一个配置文件属性值 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679; QueryStringParameter:表示一个查询字符串字段中的值 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679; SessionParameter:表示一个存储在会话状态中的值 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上参数对象也具有相关属性，包括ConvertEmptyStringToNull、DefaultValue、Direction、Name、Size、Type。参数对象可以显式的声明，对于GridView、DetailsView数据绑定控件，无需显式的声明参数，原因是因为以下这句话的说明： </p>
<p><br />如果 GridView 控件等数据绑定控件绑定到 SqlDataSource 控件，在执行更新或删除操作期间，该数据绑定控件会同时将当前记录值和原始记录值传递到 SqlDataSource 控件。当前值传递到 Values 字典中。原始值传递到 Keys 或 OldValues 字典中。对于给定的数据操作，这些字典的内容将会追加到基础 DbCommand 对象的 Parameters 集合中。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 更具体的详见以下MSDN说明： <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679;对 SqlDataSource 控件使用参数:ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_vwdcon/html/403ff44a-dd0b-484d-968e-dcd1dcd4c295.htm <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679;对数据源控件使用参数: ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_vwdcon/html/88622d04-2989-484e-93fe-594cd98dcf5f.htm <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679;数据源控件如何为数据绑定字段创建参数:ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_vwdcon/html/aa3f28c5-fd99-4978-8a66-c7709e0816c4.htm</p>
<p>&nbsp;&nbsp; 2.7 缓存属性EnableCaching与CacheDuration <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EnableCaching属性表示是否需要缓冲，CacheDuration表示缓存的失效时间。更多的缓存说明，会另外进行讲述。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下是MSDN中对于缓存的说明： </p>
<p><br />&nbsp;&nbsp;&nbsp; 当 EnableCaching 属性设置为 true 且 CacheDuration 属性设置为一个大于 0 的值（该值指示在放弃缓存项之前，缓存存储数据的秒数）时，SqlDataSource 控件将自动缓存数据。值 0 表示无限期缓存。 </p>
<p>&nbsp;&nbsp;&nbsp; 缓存的行为取决于持续时间和 CacheExpirationPolicy 属性的组合。如果 CacheExpirationPolicy 属性设置为 Absolute 值，则 SqlDataSource 将缓存第一次数据检索操作的数据，并将其保留在内存中一段时间，这段时间最长为 CacheDuration 属性所指定的时间量。如果需要内存，可以在持续时间结束前释放数据。然后，缓存在下一操作期间被刷新。如果 CacheExpirationPolicy 属性设置为 Sliding 值，数据源控件将缓存第一次数据检索操作的数据，但是对于后面的每个操作，它都重置保留缓存的时间窗口。自上次 Select 操作以后，如果在等于 CacheDuration 值的时间段内没有任何活动，缓存将过期。 </p>
<p>&nbsp;&nbsp; 仅当 SqlDataSource 控件处于 DataSet 模式时，它才可缓存数据。如果 SqlDataSource 控件设置为 DataReader 值并且启用了缓存，则 Select 方法将引发 NotSupportedException 异常。 </p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 更多的MSDN说明，请参见：ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/fxref_system.web/html/5bfd5e37-43e6-8dca-4323-8454d465bd0b.htm </p>
<p><br />3. 详叙sqlDataSource中的ASP.NET参数对象</p>
<p>&nbsp;&nbsp;&nbsp; 本段落是对2.6节探讨的ASP.NET参数对象的扩充说明,在2.6节说过，参数对象有Parameter、ControlParameter、CookieParameter&#8230; <br />&nbsp;&nbsp;&nbsp; 这些asp.net参数对象有以下共通属性： <br />&nbsp;&nbsp;&nbsp;&nbsp; &#9679; ConvertEmptyStringToNull : 当值为真时，如果参数接受一个空字符，空字符被转换为NULL <br />&nbsp;&nbsp;&nbsp;&nbsp; &#9679; DefaultValue : 参数默认值 <br />&nbsp;&nbsp;&nbsp;&nbsp; &#9679; Direction : 参数方向，可以为INPUT、OUTPUT、InputOutput、ReturnValue <br />&nbsp;&nbsp;&nbsp;&nbsp; &#9679; Name : 参数名称 <br />&nbsp;&nbsp;&nbsp;&nbsp; &#9679; Size : 参数数据大小 <br />&nbsp;&nbsp;&nbsp;&nbsp; &#9679; Type : 参数类型，可以为TypeCode枚举值 </p>
<p>&nbsp;&nbsp; 3.1 ControlParameter对象 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ControlParmeter对象可以表示一个控件的属性值。可以表示任意一个与SqlDataSource控件位于同一页面的控件的值 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 除了具备父类Parameter所有的属性外，还具备以下属性： <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679; ControlID : 控件ID <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679; PropertyName : 获取或设置由ControlParameter 对象绑定到的ControlID 属性标识的控件的属性名 </p>
<p><br />&nbsp;&nbsp; 对于PropertyName, 这里说明一下，假设需要从一个DropdownList1控件获得参数，关于DropdownList会有两个值，一是SelectedText,一是 SelectValue.那是想要取参数时取DropdownList1.SelectedText值呢，还是 DropdownList1.SelectValue值？PropertyName就是设置控件的相应属性值，从控件的哪个属性里取参数。对于 DropdownList控件，它的属性还比较少。如果对于GridView控件，它的属性就很多啦，包括PageIndex，Rows等等都可以作为参数来提取。Understand? <br />&nbsp;&nbsp; 另外，对于PropertyName值并不必须要设定，如果不设定，控件参数对象会自动查找ControlVlaueProperty属性装饰的属性。 DropdownList控件的这个属性就是SelectedValue。关于这点，请参考： <br />&nbsp;&nbsp; ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/fxref_system.web/html/f8be313f-8426-a7e7-904a-5a70cc816410.htm </p>
<p><br />例1：设置ControlParameter参数</p>
<p>&lt;!--从DropdownList控件中提取参数--&gt; <br />&lt;asp:DropDownList id=&#8221;ddlMovies&#8221; <br />DataSourceID=&#8221;srcMovies&#8221; DataTextField=&#8221;Title&#8221; DataValueField=&#8221;Id&#8221; Runat=&#8221;server&#8221; /&gt; </p>
<p>&lt;asp:SqlDataSource id=&#8221;srcMovieDetails&#8221; <br />SelectCommand=&#8221;SELECT * FROM Movies WHERE <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#73;&#100;&#61;&#64;&#73;&#100;">Id=@Id</a>&#8221; <br />ConnectionString=&#8221;&lt;%$ ConnectionStrings:Movies %&gt;&#8221; Runat=&#8221;server&#8221;&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;SelectParameters&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:ControlParameter Name=&#8221;Id&#8221; ControlID=&#8221;ddlMovies&#8221; PropertyName=&#8221;SelectedValue&#8221; /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;/SelectParameters&gt; <br />&lt;/asp:SqlDataSource&gt; </p>
<p><br />&nbsp;&nbsp;&nbsp; 还有一种方法，就是参数想取得cs代码类中相应变量作为参数的值，是否可以？其实，作为cs中的类，是继承自System.Web.UI.Page的对象，而Page类又是自Control类继承，所以可以使用ControlParameter对象来表示Page属性的值 <br />例2：从Page对象属性中取得相应ControlParameter对象 </p>
<p><br />&lt;script runat=&#8221;server&#8221;&gt; <br />public string IPAddress <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp; get { return Request.UserHostAddress; } <br />} <br />&lt;/script&gt; </p>
<p>&lt;asp:SqlDataSource id=&#8221;srcGuestBook&#8221; <br />&nbsp;&nbsp;&nbsp; SelectCommand=&#8221;SELECT * FROM GuestBook ORDER BY Id DESC&#8221; <br />&nbsp;&nbsp;&nbsp; InsertCommand=&#8221;INSERT GuestBook (IPAddress,Name,Comments) <br />&nbsp;&nbsp;&nbsp; VALUES (@IPAddress,@Name,&nbsp; ConnectionString=&#8221;&lt;%$ ConnectionStrings:GuestBook %&gt;&#8221; <br />&nbsp;&nbsp;&nbsp; Runat=&#8221;server&#8221;&gt; <br />&lt;InsertParameters&gt; <br />&nbsp;&nbsp;&nbsp; &lt;asp:ControlParameter Name=&#8221;IPAddress&#8221; ControlID=&#8221;__page&#8221;&nbsp;&nbsp; PropertyName=&#8221;IPAddress&#8221; /&gt; <br />&lt;/InsertParameters&gt; <br />&lt;/asp:SqlDataSource&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上，表示本页Page的控件对象ID是__page，这个值是Page类自动生的的ID。PropertyName的值为IPAddress，是在后台代码中定义的一个属性。 </p>
<p>例3：动态在代码中加入ControlParmeter对象 </p>
<p><br />1private void Page_Load(object sender, System.EventArgs e) <br />2{ <br />3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataSource sqlSource = new SqlDataSource( <br />4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConfigurationManager.ConnectionStrings["MyNorthwind"].ConnectionString, <br />5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "SELECT FirstName, LastName FROM Employees WHERE Country = @country;"); <br />6 <br />7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ControlParameter country = new ControlParameter(); <br />8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; country.Name = "country"; <br />9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; country.Type = TypeCode.String; <br />10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; country.ControlID = "DropDownList1"; <br />11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; country.PropertyName = "SelectedValue"; <br />12 <br />13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // If the DefaultValue is not set, the DataGrid does not <br />14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // display anything on the first page load. This is because <br />15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // on the first page load, the DropDownList has no <br />16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // selected item, and the ControlParameter evaluates to <br />17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // String.Empty. <br />18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; country.DefaultValue = "USA"; <br />19 <br />20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sqlSource.SelectParameters.Add(country); <br />21 <br />22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Add the SqlDataSource to the page controls collection. <br />23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Page.Controls.Add(sqlSource); <br />24 <br />25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataGrid1.DataSource = sqlSource; <br />26&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataGrid1.DataBind(); <br />27}</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; 3.2 CookieParameter对象&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CookieParameter对象表示浏览器端的Cookie,除了具备父类Parameter的所有属性外，还具备以下属性： <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679; CookieName : 浏览器cookie的名称 <br />例4：如何使用CookieParameter</p>
<p>&lt;script runat=&#8221;server&#8221;&gt; <br />void Page_Load() <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp; if (Request.Cookies[&#8220;VoterId&#8221;] == null) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 创建VoterId Cookie对象 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string identifier = Guid.NewGuid().ToString(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpCookie voteCookie = new HttpCookie(&#8220;VoterId&#8221;, identifier); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; voteCookie.Expires = DateTime.MaxValue; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.AppendCookie(voteCookie); <br />&nbsp;&nbsp;&nbsp;&nbsp; } <br />} <br />&lt;/script&gt; </p>
<p>&lt;asp:FormView id=&#8221;frmVote&#8221; DataSourceID=&#8221;srcVote&#8221; DefaultMode=&#8221;Insert&#8221; Runat=&#8221;server&#8221;&gt; <br />&lt;InsertItemTemplate&gt; <br />&nbsp;&nbsp;&nbsp; &lt;asp:Label&nbsp; id=&#8221;lblFavoriteColor&#8221;&nbsp; AssociatedControlID=&#8221;rdlFavoriteColor&#8221; Runat=&#8221;server&#8221; /&gt; <br />&nbsp;&nbsp;&nbsp; &lt;asp:RadioButtonList id=&#8221;rdlFavoriteColor&#8221; SelectedValue=&#8217;&lt;%#Bind(&#8220;Color&#8221;)%&gt;' Runat=&#8221;server&#8221;&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:ListItem Value=&#8221;Red&#8221; Text=&#8221;Red&#8221; Selected=&#8221;True&#8221; /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:ListItem Value=&#8221;Blue&#8221; Text=&#8221;Blue&#8221; /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:ListItem Value=&#8221;Green&#8221; Text=&#8221;Green&#8221; /&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/asp:RadioButtonList&gt; <br />&nbsp;&nbsp;&nbsp; &lt;asp:Button id=&#8221;btnSubmit&#8221; Text=&#8221;Submit&#8221; CommandName=&#8221;Insert&#8221; Runat=&#8221;server&#8221; /&gt; <br />&lt;/InsertItemTemplate&gt; <br />&lt;/asp:FormView&gt; <br />&lt;asp:SqlDataSource id=&#8221;srcVote&#8221; <br />&nbsp;&nbsp;&nbsp; SelectCommand=&#8221;SELECT * FROM Vote ORDER BY Id DESC&#8221; <br />&nbsp;&nbsp;&nbsp; InsertCommand=&#8221;INSERT Vote (VoterId,Color) VALUES (@VoterId,@Color)&#8221;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--Color参数从FormView中得到，VoterId参数从Cookie中得到--&gt; <br />&nbsp;&nbsp;&nbsp; ConnectionString=&#8221;&lt;%$ ConnectionStrings:Vote %&gt;&#8221;&nbsp; Runat=&#8221;server&#8221;&gt; <br />&lt;InsertParameters&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:CookieParameter Name=&#8221;VoterId&#8221;&nbsp; CookieName=&#8221;VoterId&#8221; /&gt; <br />&lt;/InsertParameters&gt; <br />&lt;/asp:SqlDataSource&gt;</p>
<p><br />&nbsp;&nbsp; 3.3 FormParameter对象&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; FormParameter对象表示一个提效给WEB服务器的表单字段，通常，在asp.net中不用像asp中需要直接处理浏览器中的表单，因为表单处理功能已经封装在表单控件中了。 <br />例5：如何使用FormParameter </p>
<p><br />&lt;script runat=&#8221;server&#8221;&gt; <br />void Page_Load() <br />{ <br />&nbsp;&nbsp;&nbsp; // 如果是点击了AddMove按钮 <br />&nbsp;&nbsp;&nbsp; if (Request.Form[&#8220;AddMovie&#8221;] != null) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; srcMovies.Insert();&nbsp; // 触发sqlDatasource的Insert事件 <br />} <br />&lt;/script&gt; </p>
<p>&lt;body&gt; <br />&nbsp;&nbsp;&nbsp; &lt;form action=&#8221;ShowFormParameter.aspx&#8221; method=&#8221;post&#8221;&gt; &lt;!-- 需要提交的表单 --&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label for=&#8221;txtTitle&#8221;&gt;Movie Title:&lt;/label&gt;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input name=&#8221;txtTitle&#8221; /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label for=&#8221;txtDirector&#8221;&gt;Movie Director:&lt;/label&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input name=&#8221;txtDirector&#8221; /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input name=&#8221;AddMovie&#8221; type=&#8221;submit&#8221; value=&#8221;Add Movie&#8221; /&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/form&gt; </p>
<p>&nbsp;&nbsp;&nbsp; &lt;form id=&#8221;form1&#8221; runat=&#8221;server&#8221;&gt;&nbsp;&nbsp;&nbsp; &lt;!--服务器Form控件 --&gt; <br />&nbsp;&nbsp;&nbsp; &lt;asp:GridView id=&#8221;grdMovies&#8221; DataSourceID=&#8221;srcMovies&#8221; Runat=&#8221;server&#8221; /&gt; &lt;!--GirdView控件，显示数据 --&gt; <br />&nbsp;&nbsp;&nbsp; &lt;asp:SqlDataSource id=&#8221;srcMovies&#8221; SelectCommand=&#8221;SELECT * FROM Movies&#8221; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InsertCommand=&#8221;INSERT Movies (Title,Director,CategoryId,DateReleased)&nbsp; VALUES (@Title,@Director,0,&#8217;12/25/1966&#8217;)&#8221; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConnectionString=&#8221;&lt;%$ ConnectionStrings:Movies %&gt;&#8221;&nbsp; Runat=&#8221;server&#8221;&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;InsertParameters&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:FormParameter Name=&#8221;Title&#8221; FormField=&#8221;txtTitle&#8221; DefaultValue=&#8221;Untitled&#8221; /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:FormParameter Name=&#8221;Director&#8221;&nbsp; FormField=&#8221;txtDirector&#8221; DefaultValue=&#8221;Allen Smithee&#8221; /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/InsertParameters&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/asp:SqlDataSource&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/form&gt; <br />&lt;/body&gt;</p>
<p><br />&lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="ShowFormParameter.aspx.cs" Inherits="ShowFormParameter" %&gt;<br />&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>"&gt;<br />&lt;html xmlns="<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>"&gt;<br />&lt;head&gt;<br />&lt;title&gt;&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt; <br />&nbsp;&nbsp;&nbsp; &lt;form action="ShowFormParameter.aspx" method="post"&gt; &lt;!-- 需要提交的表单 --&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label for="txtName"&gt;Movie Title:&lt;/label&gt;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input name="txtName" /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label for="txtDirector"&gt;Movie Director:&lt;/label&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input name="txtDirector" /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input name="AddMovie" type="submit" value="Add Movie" /&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/form&gt; <br />&nbsp;&nbsp;&nbsp; &lt;form id="form1" runat="server"&gt;&nbsp;&nbsp;&nbsp; &lt;!--服务器Form控件 --&gt; <br />&nbsp;&nbsp;&nbsp; &lt;asp:GridView id="grdMovies" DataSourceID="SqlDataSource1" runat="server" /&gt; &lt;!--GirdView控件，显示数据 --&gt; <br />&nbsp;<br />&nbsp;&nbsp;&nbsp; &lt;asp:SqlDataSource ID="SqlDataSource1" runat="server" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConnectionString="&lt;%$ ConnectionStrings:sssConnectionString %&gt;" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DeleteCommand="DELETE FROM [K] WHERE [id] = @id" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InsertCommand="INSERT INTO [K] ( [name], [keyname]) VALUES ( @name, @keyname)" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SelectCommand="SELECT * FROM [K] WHERE ([name] = @name)" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UpdateCommand="UPDATE [K] SET [name] = @name, [keyname] = @keyname WHERE [id] = @id"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;SelectParameters&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:FormParameter DefaultValue="CHEN" FormField="txtName" Name="name"&nbsp; Type="String" /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/SelectParameters&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;DeleteParameters&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Parameter Name="id" Type="Int32" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/DeleteParameters&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;UpdateParameters&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Parameter Name="name" Type="String" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Parameter Name="keyname" Type="String" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Parameter Name="id" Type="Int32" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/UpdateParameters&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;InsertParameters&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Parameter Name="id" Type="Int32" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Parameter Name="name" Type="String" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Parameter Name="keyname" Type="String" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/InsertParameters&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/asp:SqlDataSource&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/form&gt; <br />&lt;/body&gt;</p>
<p>&nbsp;</p>
<p><br />&nbsp;&nbsp; 3.4 ProfileParameter对象&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProfileParameter对象可以用来提取web.config中的Profile属性，ProfileParameter除包含Parameter基类的所有属性外，还具备以下属性： <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679; ProfileName: Profile属性的名称 <br />例6：如何使用ProfileParameter对象 </p>
<p><br />&lt;!-- web.config配置 --&gt; <br />&lt;system.web&gt; <br />&nbsp;&nbsp;&nbsp; &lt;profile enabled=&#8221;true&#8221;&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;properties&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add name=&#8221;DisplayName&#8221; defaultValue=&#8221;Anonymous&#8221; /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/properties&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;/profile&gt; <br />&lt;/system.web&gt; </p>
<p>&nbsp;</p>
<p>&lt;!-- aspx处理页面 &#8211;&gt; <br />&lt;!-- 留言版的输入框 --&gt; <br />&lt;asp:FormView id=&#8221;frmGuestBook&#8221; DataSourceID=&#8221;srcGuestBook&#8221; DefaultMode=&#8221;Insert&#8221; Runat=&#8221;server&#8221;&gt; <br />&nbsp; &lt;InsertItemTemplate&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Label id=&#8221;lblComments&#8221; Text=&#8221;Enter Your Comments:&#8221; Runat=&#8221;server&#8221; /&gt; &lt;br /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:TextBox id=&#8221;txtComments&#8221; Text=&#8217;&lt;%# Bind(&#8220;Comments&#8221;) %&gt;' TextMode=&#8221;MultiLine&#8221; Columns=&#8221;50&#8221; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rows=&#8221;4&#8221; Runat=&#8221;server&#8221; /&gt; &lt;br /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Button id=&#8221;btnInsert&#8221; Text=&#8221;Add Comments&#8221; CommandName=&#8221;Insert&#8221; Runat=&#8221;server&#8221; /&gt; <br />&nbsp; &lt;/InsertItemTemplate&gt; <br />&lt;/asp:FormView&gt; </p>
<p>&lt;!-- SqlDataSource处理 --&gt; <br />&lt;asp:SqlDataSource id=&#8221;srcGuestBook&#8221; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SelectCommand=&#8221;SELECT Name,Comments,EntryDate FROM GuestBook ORDER BY Id DESC&#8221; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InsertCommand=&#8221;INSERT GuestBook (Name,Comments) VALUES (@Name,@Comments)&#8221; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConnectionString=&#8221;&lt;%$ ConnectionStrings:GuestBook %&gt;&#8221;&nbsp; Runat=&#8221;server&#8221;&gt; <br />&nbsp; &lt;InsertParameters&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:ProfileParameter Name=&#8221;Name&#8221; PropertyName=&#8221;DisplayName&#8221; /&gt; <br />&nbsp;&nbsp; &lt;/InsertParameters&gt; <br />&lt;/asp:SqlDataSource&gt; </p>
<p><br />&nbsp;&nbsp; 3.5 QueryStringParameter对象&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QueryStringParameter对象可以表示传递给页面的任何查询字符串，QueryStringParameter除包含Parameter基类的所有属性外，还具备以下属性： <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679; QueryStringField: 所表示查询字符串的名称 <br />例7：如何使用QueryStringField对象 </p>
<p><br />&lt;!-- 链接页面 --&gt; <br />&lt;asp:GridView id=&#8221;grdMovies&#8221; DataSourceId=&#8221;srcMovies&#8221; AutoGenerateColumns=&#8221;false&#8221; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowHeader=&#8221;false&#8221;&nbsp; Runat=&#8221;server&#8221;&gt; <br />&nbsp;&nbsp;&nbsp; &lt;Columns&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:HyperLinkField DataTextField=&#8221;Title&#8221; DataNavigateUrlFields=&#8221;Id&#8221; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataNavigateUrlFormatString=&#8221;ShowQueryStringParameterDetails.aspx?id={0}&#8221; /&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/Columns&gt; <br />&lt;/asp:GridView&gt; </p>
<p>&lt;asp:SqlDataSource id=&#8221;srcMovies&#8221; SelectCommand=&#8221;SELECT * FROM Movies&#8221; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConnectionString=&#8221;&lt;%$ ConnectionStrings:Movies %&gt;&#8221; Runat=&#8221;server&#8221; /&gt; </p>
<p>&nbsp;</p>
<p><br />&lt;!-- 链接后的处理页面 --&gt; <br />&lt;asp:SqlDataSource id=&#8221;srcMovie&#8221; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SelectCommand=&#8221;SELECT * FROM Movies WHERE <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#73;&#100;&#61;&#64;&#73;&#100;">Id=@Id</a>&#8221; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConnectionString=&#8221;&lt;%$ ConnectionStrings:Movies %&gt;&#8221;&nbsp; Runat=&#8221;server&#8221;&gt; <br />&nbsp;&nbsp;&nbsp; &lt;SelectParameters&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:QueryStringParameter Name=&#8221;Id&#8221; QueryStringField=&#8221;Id&#8221; /&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/SelectParameters&gt; <br />&lt;/asp:SqlDataSource&gt;</p>
<p>&nbsp;&nbsp; 3.6 SessionParameter对象&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SessionParameter对象表示存储在Session状态中的项目，SessionParameter除包含Parameter基类的所有属性外，还具备以下属性： <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679; SessionField: 所表示会话状态中的项目名称 <br />例8：如何使用SessionParameter对象 </p>
<p><br />&lt;script runat=&#8221;server&#8221;&gt; <br />void Page_Load() <br />{ <br />&nbsp;&nbsp;&nbsp; Session[&#8220;MovieCategoryName&#8221;] = &#8220;Animation&#8221;; <br />} <br />&lt;/script&gt; </p>
<p>&lt;asp:SqlDataSource id=&#8221;srcMovies&#8221; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SelectCommand=&#8221;SELECT Name As Category,Title,Director FROM Movies <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INNER JOIN MovieCategories ON CategoryId = MovieCategories.id <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#78;&#97;&#109;&#101;&#61;&#64;&#78;&#97;&#109;&#101;">Name=@Name</a>&#8221; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConnectionString=&#8221;&lt;%$ ConnectionStrings:Movies %&gt;&#8221;&nbsp;&nbsp; Runat=&#8221;server&#8221;&gt; <br />&nbsp;&nbsp;&nbsp; &lt;SelectParameters&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:SessionParameter Name=&#8221;Name&#8221; SessionField=&#8221;MovieCategoryName&#8221; /&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/SelectParameters&gt; <br />&lt;/asp:SqlDataSource&gt;<br />&nbsp;</p>
<p>4. 通过程序控制SqlDataSource对象 <br />&nbsp;&nbsp; SqlDataSource控件一般都与数据绑定控件一起使用，在本节中，可以知道、 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679; 如何通过在代码中直接使用SqlDataSource控件的属性和方法来创建参数、 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9679; 如何执行选择、插入、更新和删除命令 </p>
<p>&nbsp;&nbsp; 4.1 添加ADO.NET参数 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataSource并没有直接与数据交互，它是通过ADO.NET对象与数据库交互的。当和SqlDataSource控件一起使用时，所有声明的ASP.NET参数也应转换成相应的ADO.NET参数 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在某些情况下，希望直接处理ADO.NET参数，可以通过在执行相应的命令前通过程序增加额外的ADO.NET参数 <br />例9:通过程序增加SqlDataSource的SelectCommand参数&nbsp; </p>
<p><br />&lt;script runat=&#8221;server&#8221;&gt;<br />protected void srcGuestBook_Inserting(object sender, SqlDataSourceCommandEventArgs e)<br />{<br />&nbsp;&nbsp;&nbsp; // SqlDataSourceCommandEventArgs 为 SqlDataSource 控件的 Updating、Deleting 和 Inserting 事件提供数据。<br />&nbsp;&nbsp;&nbsp; // MSDN上这样解释SqlDataSourceCommandEventArgs参数:<br />&nbsp;&nbsp;&nbsp; /* 因为 SqlDataSourceCommandEventArgs 类是从 CancelEventArgs 类派生的，所以可以通过将 Cancel 属性设置为 true，<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取消挂起的 SqlDataSource 数据库命令。通过访问由 Command 属性公开的 DbCommand 对象，可以在运行此命令之前，<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 检查和操作 CommandText、Parameters 集合以及其他命令属性。*/<br />&nbsp;&nbsp;&nbsp; e.Command.Parameters.Add(new SqlParameter(<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#8220;&#64;&#78;&#97;&#109;&#101;">&#8220;@Name</a>&#8221;, User.Identity.Name));&nbsp;&nbsp; // 为Insert操作添加一个参数<br />}<br />&lt;/script&gt;<br />&lt;!-- aspx处理页面 &#8211;&gt;<br />&lt;!-- 留言版的输入框 --&gt;<br />&lt;asp:FormView id=&#8221;frmGuestBook&#8221; DataSourceID=&#8221;srcGuestBook&#8221; DefaultMode=&#8221;Insert&#8221; Runat=&#8221;server&#8221;&gt;<br />&nbsp; &lt;InsertItemTemplate&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Label id=&#8221;lblComments&#8221; Text=&#8221;Enter Your Comments:&#8221; Runat=&#8221;server&#8221; /&gt; &lt;br /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:TextBox id=&#8221;txtComments&#8221; Text=&#8217;&lt;%# Bind(&#8220;Comments&#8221;) %&gt;' TextMode=&#8221;MultiLine&#8221; Columns=&#8221;50&#8221;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rows=&#8221;4&#8221; Runat=&#8221;server&#8221; /&gt; &lt;br /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Button id=&#8221;btnInsert&#8221; Text=&#8221;Add Comments&#8221; CommandName=&#8221;Insert&#8221; Runat=&#8221;server&#8221; /&gt;<br />&nbsp; &lt;/InsertItemTemplate&gt;<br />&lt;/asp:FormView&gt;</p>
<p>&lt;!-- SqlDataSource处理 --&gt;<br />&lt;asp:SqlDataSource id=&#8221;srcGuestBook&#8221;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SelectCommand=&#8221;SELECT Name,Comments,EntryDate FROM GuestBook ORDER BY Id DESC&#8221;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InsertCommand=&#8221;INSERT GuestBook (Name,Comments) VALUES (@Name,@Comments)&#8221;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConnectionString=&#8221;&lt;%$ ConnectionStrings:GuestBook %&gt;&#8221;&nbsp; Runat=&#8221;server&#8221;&nbsp; OnInserting=&#8221;srcGuestBook_Inserting&#8221;&gt;<br />&lt;!-- 与例6不同的是，这里无需添加相应的参数对象，参数对象通过srcGuestBook_Inserting事件进行追加 --&gt;<br />&lt;/asp:SqlDataSource&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外，需要说明的是，Inserting、Updating、Deleting操作传递给函数的都是SqlDataSourceCommandEventArgs参数，但Filtering传递给函数的却是SqlDataSourceFilteringEventArgs对象，使用以下方法取得已和设定的参数： </p>
<p><br />protected void SqlDataSource1_Filtering(object sender, SqlDataSourceFilteringEventArgs e)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; if (e.ParameterValues.Count &gt; 0)<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Label1.Text = e.ParameterValues[0].ToString();<br />&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp; if (Textbox1.Text == "")<br />&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; // 添加参数:第一个为参数名，第二个为参数Value。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.ParameterValues.Clear();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.ParameterValues.Add("FullName", "Nancy Davolio");<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />}</p>
<p><br />&nbsp;&nbsp;&nbsp; 4.2 执行Insert、Update、Delete命令 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实，执行相应的命令，只要调用SqlDataSource对象的Insert()、Update()、Delete()方法就可以了。 <br />例10:通过程序，执行SqlDataSource Insert命令 </p>
<p><br />&lt;script runat=&#8221;server&#8221;&gt;</p>
<p>protected void btnAddEntry_Click(object sender, EventArgs e)<br />{<br />&nbsp;&nbsp;&nbsp; srcGuestBook.InsertParameters[&#8220;Name&#8221;].DefaultValue = txtName.Text;<br />&nbsp;&nbsp;&nbsp; srcGuestBook.InsertParameters[&#8220;Comments&#8221;].DefaultValue = txtComments.Text;<br />&nbsp;&nbsp;&nbsp; srcGuestBook.Insert();<br />}<br />&lt;/script&gt;</p>
<p>&lt;asp:TextBox id=&#8221;txtName&#8221; Runat=&#8221;server&#8221; /&gt; &lt;!-- 输入值1 --&gt;<br />&lt;asp:TextBox id=&#8221;txtComments&#8221; TextMode=&#8221;MultiLine&#8221;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Columns=&#8221;50&#8221; Rows=&#8221;2&#8221; Runat=&#8221;server&#8221; /&gt;&nbsp; &lt;!-- 输入值2 --&gt;<br />&lt;asp:Button id=&#8221;btnAddEntry&#8221; Text=&#8221;Add Entry&#8221;&nbsp; Runat=&#8221;server&#8221; OnClick=&#8221;btnAddEntry_Click&#8221; /&gt;</p>
<p>&lt;asp:SqlDataSource id=&#8221;srcGuestBook&#8221; ConnectionString=&#8221;&lt;%$ ConnectionStrings:GuestBook %&gt;&#8221;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SelectCommand=&#8221;SELECT Name,Comments FROM GuestBook ORDER BY Id DESC&#8221;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InsertCommand=&#8221;INSERT GuestBook (Name,Comments) VALUES (@Name,@Comments)&#8221;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Runat=&#8221;server&#8221;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;InsertParameters&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Parameter Name=&#8221;Name&#8221; /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Parameter Name=&#8221;Comments&#8221; /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/InsertParameters&gt;<br />&lt;/asp:SqlDataSource&gt; </p>
<p><br />&nbsp;&nbsp; 4.3 执行Select命令 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行Select命令与其它命令不同，因为Select需要返回数据。SqlDataSource的Select方法返回一个实现IEnumerable的接口，DataView和DataReader都实现了这个接口，可以创建一个DataView或DataReader对象接受该数据。<br /></p></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/378565.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-19 15:38 <a href="http://www.blogjava.net/liuyz2006/articles/378565.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GridView内容详解(转载) </title><link>http://www.blogjava.net/liuyz2006/articles/378151.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Mon, 14 May 2012 15:37:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/378151.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/378151.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/378151.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/378151.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/378151.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: GridView内容详解(转载) GridView是ASP.NET界面开发中的一个重要的控件，对GridView使用的熟练程度直接影响软件开发的进度及功能的实现。(车延禄)GridView的主要新特性：&nbsp;&nbsp;&nbsp; 1.与DataSource控件结合实现了显示与数据操作的分离，大大减化了代码的编写量;&nbsp;&nbsp;&nbsp; 2.实现"双向绑定"，无...&nbsp;&nbsp;<a href='http://www.blogjava.net/liuyz2006/articles/378151.html'>阅读全文</a><img src ="http://www.blogjava.net/liuyz2006/aggbug/378151.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-14 23:37 <a href="http://www.blogjava.net/liuyz2006/articles/378151.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅谈DataKeyNames，DataKeys  </title><link>http://www.blogjava.net/liuyz2006/articles/378062.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 13 May 2012 15:25:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/378062.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/378062.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/378062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/378062.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/378062.html</trackback:ping><description><![CDATA[<h3 class="title pre fs1"><span class="tcnt"><font face="微软雅黑" size="5"><span style="font-size: 12pt">浅谈DataKeyNames，DataKeys</span></font></span>&nbsp;&nbsp;<span class="bgc0 fc07 fw0 fs0"></span></h3>
<div></div>
<div class="nbw-blog-start"></div>
<div class="bct fc05 fc11 nbw-blog ztag js-fs2" __1336922141953__="ev_7517122398">
<p><strong>1.DataKeyNames 属性指定表示数据源主键的字段。</strong></p>
<p>当设置了 DataKeyNames 属性时，GridView 控件用来自指定字段的值（数据库中表的值）填充它的 DataKeys 集合，这提供了一种访问每个行的主键的便捷方法。（因为表中的ID列一般不显示给网页上，如对表中的列更新时，就需要ID列了）</p>
<p>DataKeyNames就是数据库表的字段，可以设置多个。注意 若要以声明方式设置此属性，请使用以逗号分隔的字段名列表。</p>
<p>设置DataKeyNames属性，它保存了指定数据库中的想要获取值的列名，该属性会自动填充到GridView控件的DataKeys集合，</p>
<p>例如：</p>
<p>事件： protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)<br />&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //通过DataKeyNames属性里设置的字段名获得了数据库表中的ID值</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int id =int.Parse( this.GridView1.DataKeys[e.RowIndex][0].ToString());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获得GridView中被更改的单元格中的值</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string a1 = ((TextBox)this.GridView1.Rows[e.RowIndex].Cells[0].Controls[0]).Text.ToString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string a2 = ((TextBox)this.GridView1.Rows[e.RowIndex].Cells[1].Controls[0]).Text.ToString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string a3 = ((TextBox)this.GridView1.Rows[e.RowIndex].Cells[2].Controls[0]).Text.ToString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string a4 = ((TextBox)this.GridView1.Rows[e.RowIndex].Cells[3].Controls[0]).Text.ToString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string a5 = ((TextBox)this.GridView1.Rows[e.RowIndex].Cells[4].Controls[0]).Text.ToString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string a6 = ((TextBox)this.GridView1.Rows[e.RowIndex].Cells[5].Controls[0]).Text.ToString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UpdateUser(id, a1, a2, a3, a4, a5, a6);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.GridView1.EditIndex = -1;//取消编辑状态<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetData();//重新绑定<br />&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p><br /><strong>2.DataKeys[e.RowIndex]</strong><br />e实际上是一个事件参数，当你点哪行e就是哪行，可以用RowIndex属性来取得该行的索引，而DataKeys是GridView的主键，可以使用DataKeys[行号]的方式取得，它返回一个DataKey对象，然后就可以用DataKey.Value得到该行的主键值。 <br />但是应该注意，在将数据源绑定到GridView上时，应该指定它的DataKeyField属性，才能正常使用。 <br />例如： <br />GridView.DataKeyFields=new string[]{"id"}; <br />&#8220;id&#8221;就是表中的主键列名</p>
<p>------------------------------------------------------------------------------------------------------------------------------------------</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>GridView 中DataKeyNames 存储数据键值</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在我们使用GridView的过程中，经常会遇到这样对问题，我们选择某一行进行编辑，或选择某一行删除或者.......时，我们需要获取当前行的某些信息，尤其是当前行的主键信息，主键信息一般不显示在页面，此时我们有三种方法来处理。<br />第一种是使用DataKeyNames ，这里要重点介绍的。<br />第二种是使用按钮的CommandArgument属性邦定需要的信息。<br />第三种是最古老最通用的方法使用隐藏的方法显示。</p>
<p>第一种方法：使用DataKeyNames，DataKeyNames可邦定一列，也可邦定多列<br />前台：DataKeyNames="FID"&nbsp;&nbsp; 绑定一个值<br />后台：GridView1.DataKeys[e.Row.RowIndex].Value.ToString();</p>
<p>前台：DataKeyNames="FID,FName"&nbsp;&nbsp; 绑定两个值<br />后台：GridView1.DataKeys[e.Row.RowIndex].Values[0].ToString();<br />后台：GridView1.DataKeys[e.Row.RowIndex].Values[1].ToString();<br />或者<br />后台：GridView1.DataKeys[e.Row.RowIndex].Values["FID"].ToString();<br />后台：GridView1.DataKeys[e.Row.RowIndex].Values["FName"].ToString();</p>
<p>第二种方法：是用按钮的CommandArgument属性邦定需要的信息。</p>
<p>典型的例子：下载附件列(有附件的显示下载链接，无附件的显示为空)<br />&lt;asp:TemplateColumn HeaderText="附件"&gt;<br />&lt;HeaderStyle Width="7%"&gt;&lt;/HeaderStyle&gt;<br />&lt;ItemTemplate&gt;<br />&lt;asp:LinkButton id="LinkButton1" CommandName="download" CommandArgument='&lt;%# DataBinder.Ev<wbr>al(Container.DataItem, "attached_file")%&gt;' runat="server" Visible='&lt;%# ((DataBinder.Ev<wbr>al(Container.DataItem, "attached_file").ToString()) != "") %&gt;'&gt;下载&lt;/asp:LinkButton&gt;<br />&lt;/ItemTemplate&gt;<br />&lt;/asp:TemplateColumn&gt;</p>
<p>在dgHKStock_ItemCommand事件中：<br />if ("download" == e.CommandName)<br />{<br />&nbsp;&nbsp;&nbsp; mybc.SystemOverTime0();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 判断Session是否过期<br />&nbsp;&nbsp;&nbsp; mybc.RightManage("16010500");&nbsp;&nbsp;&nbsp; // 判断用户是否有打开此网页的权限<br />&nbsp;&nbsp;&nbsp; mybc.HTTP_DownloadFile(e.CommandArgument.ToString()); // 取得当前存货信息的附件存放路径<br />}</p></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/378062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-13 23:25 <a href="http://www.blogjava.net/liuyz2006/articles/378062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己实现DataKeyNames </title><link>http://www.blogjava.net/liuyz2006/articles/378060.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 13 May 2012 15:15:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/378060.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/378060.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/378060.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/378060.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/378060.html</trackback:ping><description><![CDATA[<div class="article_title" sizset="27" sizcache="1"><span class="ico ico_type_Original"></span>
<h3 sizset="27" sizcache="1"><span class="link_title" sizset="27" sizcache="1"><a href="http://blog.csdn.net/dotnet90/article/details/1931719">自己实现DataKeyNames </a></span></h3></div>
<div class="article_manage" sizset="28" sizcache="1"><span class="link_postdate">2007-12-12 17:13</span> <span class="link_view" title="阅读次数">676人阅读</span> <span class="link_comments" title="评论次数" sizset="28" sizcache="1"><a href="http://blog.csdn.net/dotnet90/article/details/1931719#comments">评论</a>(2)</span> <span class="link_collect" sizset="29" sizcache="1"><a title="收藏" href="javascript:void(0);">收藏</a></span> <span class="link_report" sizset="30" sizcache="1"><a title="举报" href="http://blog.csdn.net/dotnet90/article/details/1931719#report">举报</a></span> </div>
<div class="article_content" id="article_content" sizset="31" sizcache="1">
<p sizset="31" sizcache="1"><strong style="color: black; background-color: #a0ffff">DataKeyNames</strong>就是数据库表的字段，可以设置<a name="baidusnap2"></a><strong style="color: black; background-color: #99ff99">多个</strong>。<br />&lt;asp:<a name="baidusnap0"></a><strong style="color: black; background-color: #ffff66">GridView</strong> ID="gvGoods" runat="server" AutoGenerateColumns="False" Width="550px" AllowPaging="True" <strong style="color: black; background-color: #a0ffff">DataKeyNames</strong>="s_goodsID,s_goodsName" OnPageIndexChanging="gvGoods_PageIndexChanging" OnRowDataBound="gvGoods_RowDataBound" OnRowCommand="gvGoods_RowCommand"&gt;</p>
<p sizset="33" sizcache="1">使用 <strong style="color: black; background-color: #a0ffff">DataKeyNames</strong> 属性指定表示数据源<a name="baidusnap3"></a><strong style="color: black; background-color: #ff9999">主键</strong>的字段。<br /><br />注意 <br />若要以声明方式设置此属性，请使用以逗号分隔的字段名列表。<br /><br /><br />当设置了 <strong style="color: black; background-color: #a0ffff">DataKeyNames</strong> 属性时，<strong style="color: black; background-color: #ffff66">GridView</strong> 控件用来自指定字段的值填充它的 DataKeys 集合，这提供了一种访问每个行的<strong style="color: black; background-color: #ff9999">主键</strong>的便捷方法。<br /><br />注意 <br /><strong style="color: black; background-color: #ffff66">GridView</strong> 控件以控件状态存储这些键字段值。如果这些值包含敏感信息，则强烈建议您通过将 ViewStateEncryptionMode 属性设置为 ViewStateEncryptionMode.Always 来启用视图状态加密。<br /><br /><br />在使用自动生成的字段列时（通过将 AutoGenerateColumns 属性设置为 true），<strong style="color: black; background-color: #ffff66">GridView</strong> 控件自动确保与 <strong style="color: black; background-color: #a0ffff">DataKeyNames</strong> 属性中指定的字段相对应的自动生成字段列是只读的。<br /><br />注意 <br />为了使 <strong style="color: black; background-color: #ffff66">GridView</strong> 控件的自动更新和删除功能工作，必须设置 <strong style="color: black; background-color: #a0ffff">DataKeyNames</strong> 属性。为了匹配要更新或删除的行，这些键字段的值被传递到数据源控件。<br /><br /><br />如果将某个列字段的 Visible 属性设置为 false，则在 <strong style="color: black; background-color: #ffff66">GridView</strong> 控件中将不显示该列，该列中的数据也不会往返于客户端。如果希望某个不可见的列中的数据可以进行往返，则向 <strong style="color: black; background-color: #a0ffff">DataKeyNames</strong> 属性添加相应的字段名称。<br /></p>
<p>一个删除的例子：<br />注意：DataKeyField=的用法<br /><br /><br />=====页面=====<br /><br />&lt;asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False" DataKeyField="DoubleKey"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Columns&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:BoundColumn DataField="item" HeaderText="item"&gt;&lt;/asp:BoundColumn&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:ButtonColumn CommandName="del" Text="删除"&gt;&lt;/asp:ButtonColumn&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Columns&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/asp:DataGrid&gt; <br /><br />====绑定========<br /><br />private void SetBind() <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataAdapter da=new SqlDataAdapter("select * from doublekey",conn); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataSet ds=new DataSet(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; da.Fill(ds); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataTable dt=ds.Tables[0]; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataColumn dc=new DataColumn("DoubleKey",typeof(string),"key1+'#'+key2"); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dt.Columns.Add(dc); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.DataGrid1.DataSource=dt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.DataGrid1.DataBind(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br /><br /><br /><br />=====删除====<br /><br />private void DataGrid1_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(e.CommandName=="del") <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCommand comm=new SqlCommand("delete from doublekey where key1=@key1 and key2=@key2",conn);&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlParameter parm1=new SqlParameter("@key1",SqlDbType.Int); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlParameter parm2=new SqlParameter("@key2",SqlDbType.Int);&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string [] keys=this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString().Split('#'); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parm1.Value=keys[0]; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parm2.Value=keys[1]; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; comm.Parameters.Add(parm1); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; comm.Parameters.Add(parm2);&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Open();&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; comm.ExecuteNonQuery();&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Close();&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetBind();&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<br /><br />&nbsp;</p></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/378060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-13 23:15 <a href="http://www.blogjava.net/liuyz2006/articles/378060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DataKeyNames工作 </title><link>http://www.blogjava.net/liuyz2006/articles/378059.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 13 May 2012 15:03:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/378059.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/378059.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/378059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/378059.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/378059.html</trackback:ping><description><![CDATA[<div class="postTitle"><a id="cb_post_title_url" href="http://www.cnblogs.com/davyli/archive/2008/04/17/1158027.html">DataKeyNames工作</a> </div>
<div class="postText">
<div id="cnblogs_post_body">
<div class="w2204">datakeynames 其sdk中的描述如下：<br />datakeynames：获取或设置一个数组，该数组包含了显示在 gridview 控件中的项的主键字段的名称。 <br />datakeys：获取一个 datakey 对象集合，这些对象表示 gridview 控件中的每一行的数据键值。&nbsp;&nbsp;</div>
<div class="w2144">
<p>gridview的datakeynames属性指出要持久保存在视图状态中的数据字段的名称,以便在回发事件(储如rowcommand)的后期获取它们.作为字符串数组实现的datakeyname,是datagrid控件的datakeyfield属性在gridview中的对应属性。它包括一个datagrid中显示的行的主键和gridview的许多属性：</p>
<p>&lt;asp:gridview id="gridview1" runat="server" datasourceid="sqldatasource1" datakeynames="productid,productname,unitprice"..../&gt;<br /><br />谈谈对GridView控件DataKeyName属性的一点认识。 <br />　　 <br />　　页面前台有以下代码： <br />　　&lt;asp:GridView ID="View1" Width="100%" runat="server" AutoGenerateColumns="False" CellPadding="3" OnRowDataBound="View1_RowDataBound" CssClass="GbText" DataKeyNames="SubjectID,Mode" CellSpacing="1"&gt; <br />　　 <br />　　后台有以下代码： <br />　　protected void View1_RowDataBound(object sender,GridViewRowEventArgs e) <br />　　{ <br />　　 if(View1.DataKeys[e.Row.RowIndex].Values["Mode"].ToString().ToLower() == "false") <br />　　 { <br />　　 ...... <br />　　 } <br />　　} <br />　　 <br />　　说明： <br />　　由于为GridView控件的DataKeyNames属性设置了表的两个字段(SubjectID,Mode)，因此可以在为GridView绑定数据时对库表的每个记录的指定字段值作出判断。后台代码中的e.Row.RowIndex即表示GridView的当前行(对应于库表的当前记录)；而View1.DataKeys[e.Row.RowIndex].Values["Mode"].ToString()则获取当前行指定字段(Mode)的值。若前台代码只写：DataKeyNames="SubjectID'(即DataKeyNames属性只填入一个字段名)，则后台只需写成： View1.DataKeys[e.Row.RowIndex].Value.ToString()) 即可。 <br />　　同样的，要动态获取当前行另一个字段的值可以这样写： View.DataKeys[e.Row.RowIndex].Values["SubjectID"].ToString())。 <br />　　 <br />　　总之，为GridView的DataKeyNames属性设置库表字段名的主要目的还是为了在为GridView控件绑定数据时获取当前行指定字段的值，以便作相应处理。若无此需求的话则GridView的DataKeyNames属性就可以不设置。 </p></div></div></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/378059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-13 23:03 <a href="http://www.blogjava.net/liuyz2006/articles/378059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#数组操作详细剖析</title><link>http://www.blogjava.net/liuyz2006/articles/378058.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 13 May 2012 14:46:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/378058.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/378058.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/378058.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/378058.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/378058.html</trackback:ping><description><![CDATA[<h1><span style="font-size: 14pt">C#数组操作详细剖析</span></h1>
<div></div>
<div id="arctext">
<p>&nbsp;</p>
<p>本文向大家介绍C#数组操作，可能好多人还不了解C#数组操作，没有关系，看完本文你肯定有不少收获，希望本文能教会你更多东西。</p>
<p>数组是相同类型的对象的集合。由于数组几乎可以为任意长度，因此可以使用数组存储数千乃至数百万个对象，但必须在创建数组时就确定其大小。数组中的每项都按索引进行访问，索引是一个数字，指示对象在数组中的存储位置或槽。数组既可用于存储 引用类型，也可用于存储 值类型。</p>
<p>C#数组操作程序：</p><pre><ol class="dp-xml"><li class="alt"><span>using&nbsp;System; &nbsp;</span></li><li class=""><span>using&nbsp;System.Collections.Generic; &nbsp;</span></li><li class="alt"><span>using&nbsp;System.Text; &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>namespace&nbsp;ClassAboutArray &nbsp;</span></li><li class=""><span>{ &nbsp;</span></li><li class="alt"><span>public&nbsp;class&nbsp;CreateArray &nbsp;</span></li><li class=""><span>{ &nbsp;</span></li><li class="alt"><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class=""><span>///&nbsp;一维数组的定义 &nbsp;</span></li><li class="alt"><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class=""><span>public&nbsp;void&nbsp;testArr1() &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li class=""><span>int[]&nbsp;</span><span class="attribute"><font color="#ff0000">myIntArr</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span>&nbsp;int[100]; &nbsp;</span></li><li class="alt"><span>//定义一个长度为100的int数组 &nbsp;</span></li><li class=""><span>string[]&nbsp;</span><span class="attribute"><font color="#ff0000">mystringArr</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span>&nbsp;string[100]; &nbsp;</span></li><li class="alt"><span>//定义一个长度为100的string数组 &nbsp;</span></li><li class=""><span>object[]&nbsp;</span><span class="attribute"><font color="#ff0000">myObjectArr</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span>&nbsp;object[100]; &nbsp;</span></li><li class="alt"><span>//定义一个长度为100的int数组 &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>int[]&nbsp;</span><span class="attribute"><font color="#ff0000">myIntArr2</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span>&nbsp;int[]&nbsp;{&nbsp;1,&nbsp;2,&nbsp;3&nbsp;};&nbsp; &nbsp;</span></li><li class=""><span>//定义一个int数组，长度为3 &nbsp;</span></li><li class="alt"><span>string[]&nbsp;</span><span class="attribute"><font color="#ff0000">mystringArr2</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span>&nbsp;string[]&nbsp;{&nbsp;"油",&nbsp;"盐"&nbsp;}; &nbsp;</span></li><li class=""><span>//定义一个string数组，长度为2 &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class=""><span>///&nbsp;多维数组的定义 &nbsp;</span></li><li class="alt"><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class=""><span>public&nbsp;void&nbsp;testArr2() &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li class=""><span>int[,]&nbsp;</span><span class="attribute"><font color="#ff0000">myIntArr</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span>&nbsp;int[10,&nbsp;100];&nbsp; &nbsp;</span></li><li class="alt"><span>//定义一个10*100的二维int数组 &nbsp;</span></li><li class=""><span>string[,&nbsp;,]&nbsp;</span><span class="attribute"><font color="#ff0000">mystringArr</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span>&nbsp;string[2,&nbsp;2,&nbsp;3];&nbsp; &nbsp;</span></li><li class="alt"><span>//定义一个2*2*3的三维string数组&nbsp; &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>int[,]&nbsp;</span><span class="attribute"><font color="#ff0000">myIntArr2</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span>&nbsp;int[,]&nbsp;{&nbsp;{&nbsp;1,&nbsp;2,&nbsp;3&nbsp;},&nbsp;{&nbsp;-1,&nbsp;-2,&nbsp;-3&nbsp;}&nbsp;}; &nbsp;</span></li><li class=""><span>//定义一个2*3的二维int数组，并初始化 &nbsp;</span></li><li class="alt"><span>string[,]&nbsp;</span><span class="attribute"><font color="#ff0000">mystringArr2</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span>&nbsp;string[,]&nbsp;{&nbsp;{&nbsp;"油",&nbsp;"盐"&nbsp;},&nbsp;{&nbsp;"《围城》",&nbsp;"《晨露》"&nbsp;}&nbsp;}; &nbsp;</span></li><li class=""><span>//定义一个2*2的二维string数组，并初始化 &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class=""><span>///&nbsp;交错数组的定义 &nbsp;</span></li><li class="alt"><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class=""><span>public&nbsp;void&nbsp;testArr3() &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li class=""><span>int[][]&nbsp;</span><span class="attribute"><font color="#ff0000">myJaggedArray</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span>&nbsp;int[3][]; &nbsp;</span></li><li class="alt"><span>myJaggedArray[0]&nbsp;=&nbsp;new&nbsp;int[5]; &nbsp;</span></li><li class=""><span>myJaggedArray[1]&nbsp;=&nbsp;new&nbsp;int[4]; &nbsp;</span></li><li class="alt"><span>myJaggedArray[2]&nbsp;=&nbsp;new&nbsp;int[2]; &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>int[][]&nbsp;</span><span class="attribute"><font color="#ff0000">myJaggedArray2</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span>&nbsp;int[][] &nbsp;</span></li><li class=""><span>&nbsp;{ &nbsp;</span></li><li class="alt"><span>new&nbsp;int[]&nbsp;{1,3,5,7,9}, &nbsp;</span></li><li class=""><span>new&nbsp;int[]&nbsp;{0,2,4,6}, &nbsp;</span></li><li class="alt"><span>new&nbsp;int[]&nbsp;{11,22} &nbsp;</span></li><li class=""><span>&nbsp;}; &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li class=""><span>} &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li class=""><span>public&nbsp;class&nbsp;TraverseArray &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li class=""><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class="alt"><span>///&nbsp;使用GetLowerBound|GetUpperBound遍历数组 &nbsp;</span></li><li class=""><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class="alt"><span>public&nbsp;void&nbsp;test1() &nbsp;</span></li><li class=""><span>{ &nbsp;</span></li><li class="alt"><span>//定义二维数组 &nbsp;</span></li><li class=""><span>string[,]&nbsp;</span><span class="attribute"><font color="#ff0000">myStrArr2</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span>&nbsp;string[,]&nbsp;<br />{&nbsp;{&nbsp;"油",&nbsp;"盐"&nbsp;},&nbsp;{&nbsp;"《围城》",&nbsp;"《晨露》"&nbsp;},&nbsp;{&nbsp;"毛毛熊",&nbsp;"Snoopy"&nbsp;}&nbsp;}; &nbsp;</span></li><li class="alt"><span>//循环输出 &nbsp;</span></li><li class=""><span>for&nbsp;(int&nbsp;</span><span class="attribute"><font color="#ff0000">i</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">myStrArr2</font></span><span>.GetLowerBound(0);&nbsp;i&nbsp;</span><span class="tag"><strong><font color="#006699">&lt;</font></strong></span><span>=&nbsp;myStrArr2.GetUpperBound(0);&nbsp;i++) &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li class=""><span>Console.WriteLine("item{0}",&nbsp;i); &nbsp;</span></li><li class="alt"><span>for&nbsp;(int&nbsp;</span><span class="attribute"><font color="#ff0000">j</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">myStrArr2</font></span><span>.GetLowerBound(1);&nbsp;j&nbsp;</span><span class="tag"><strong><font color="#006699">&lt;</font></strong></span><span>=&nbsp;myStrArr2.GetUpperBound(1);&nbsp;j++) &nbsp;</span></li><li class=""><span>{ &nbsp;</span></li><li class="alt"><span>Console.WriteLine("&nbsp;item{0}{1}:{2}",&nbsp;i,&nbsp;j,&nbsp;myStrArr2.GetValue(i,&nbsp;j)); &nbsp;</span></li><li class=""><span>} &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li class=""><span>} &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li class=""><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class="alt"><span>///&nbsp;使用foreach遍历数组 &nbsp;</span></li><li class=""><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class="alt"><span>public&nbsp;void&nbsp;test2() &nbsp;</span></li><li class=""><span>{ &nbsp;</span></li><li class="alt"><span>//定义二维数组 &nbsp;</span></li><li class=""><span>string[,]&nbsp;</span><span class="attribute"><font color="#ff0000">myStrArr2</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span>&nbsp;string[,]&nbsp;<br />{&nbsp;{&nbsp;"油",&nbsp;"盐"&nbsp;},&nbsp;{&nbsp;"《围城》",&nbsp;"《晨露》"&nbsp;},&nbsp;{&nbsp;"毛毛熊",&nbsp;"Snoopy"&nbsp;}&nbsp;}; &nbsp;</span></li><li class="alt"><span>//循环输出 &nbsp;</span></li><li class=""><span>foreach&nbsp;(string&nbsp;item&nbsp;in&nbsp;myStrArr2) &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li class=""><span>{ &nbsp;</span></li><li class="alt"><span>Console.WriteLine("{0}",&nbsp;item); &nbsp;</span></li><li class=""><span>} &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li class=""><span>} &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>public&nbsp;class&nbsp;SortArray &nbsp;</span></li><li class=""><span>{ &nbsp;</span></li><li class="alt"><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class=""><span>///&nbsp;利用Sort方法进行数组排序 &nbsp;</span></li><li class="alt"><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class=""><span>public&nbsp;void&nbsp;test1() &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li class=""><span>//定义数组 &nbsp;</span></li><li class="alt"><span>int[]&nbsp;</span><span class="attribute"><font color="#ff0000">myArr</font></span><span>&nbsp;=&nbsp;{&nbsp;5,&nbsp;4,&nbsp;3,&nbsp;2,&nbsp;1&nbsp;}; &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>//输出原始数组：原始数组:5-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>4-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>3-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>2-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>1-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;</span></li><li class=""><span>Console.WriteLine("原始数组:"); &nbsp;</span></li><li class="alt"><span>for&nbsp;(int&nbsp;</span><span class="attribute"><font color="#ff0000">i</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">0</font></span><span>;&nbsp;i&nbsp;</span><span class="tag"><strong><font color="#006699">&lt;</font></strong></span><span>&nbsp;</span><span class="tag-name"><strong><font color="#006699">myArr.Length</font></strong></span><span>;&nbsp;i++) &nbsp;</span></li><li class=""><span>Console.Write("{0}-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>",&nbsp;myArr[i]); &nbsp;</span></li><li class="alt"><span>Console.WriteLine(); &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>//对数组排序 &nbsp;</span></li><li class=""><span>Array.Sort(myArr); &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li class=""><span>//并输出排序后的数组：1-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>2-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>3-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>4-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>5-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;</span></li><li class="alt"><span>Console.WriteLine("排序以后数组:"); &nbsp;</span></li><li class=""><span>for&nbsp;(int&nbsp;</span><span class="attribute"><font color="#ff0000">i</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">0</font></span><span>;&nbsp;i&nbsp;</span><span class="tag"><strong><font color="#006699">&lt;</font></strong></span><span>&nbsp;</span><span class="tag-name"><strong><font color="#006699">myArr.Length</font></strong></span><span>;&nbsp;i++) &nbsp;</span></li><li class="alt"><span>Console.Write("{0}-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>",&nbsp;myArr[i]); &nbsp;</span></li><li class=""><span>} &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li class=""><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class="alt"><span>///&nbsp;多个数组的关键字排序 &nbsp;</span></li><li class=""><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class="alt"><span>public&nbsp;void&nbsp;test2() &nbsp;</span></li><li class=""><span>{ &nbsp;</span></li><li class="alt"><span>//定义数组 &nbsp;</span></li><li class=""><span>int[]&nbsp;</span><span class="attribute"><font color="#ff0000">arrSid</font></span><span>&nbsp;=&nbsp;{&nbsp;5,&nbsp;4,&nbsp;3,&nbsp;2,&nbsp;1&nbsp;}; &nbsp;</span></li><li class="alt"><span>string[]&nbsp;</span><span class="attribute"><font color="#ff0000">arrSname</font></span><span>&nbsp;=&nbsp;{&nbsp;"张三",&nbsp;"李四",&nbsp;"王五",&nbsp;"麻子",&nbsp;"淘气"&nbsp;}; &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>//输出原始数组：原始数组:张三(5)-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>李四(4)-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>王五(3)-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>麻子(2)-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>淘气(1)-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;</span></li><li class=""><span>Console.WriteLine("原始数组:"); &nbsp;</span></li><li class="alt"><span>for&nbsp;(int&nbsp;</span><span class="attribute"><font color="#ff0000">i</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">0</font></span><span>;&nbsp;i&nbsp;</span><span class="tag"><strong><font color="#006699">&lt;</font></strong></span><span>&nbsp;</span><span class="tag-name"><strong><font color="#006699">arrSid.Length</font></strong></span><span>;&nbsp;i++) &nbsp;</span></li><li class=""><span>Console.Write("{0}({1})-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>",&nbsp;arrSname[i],&nbsp;arrSid[i]); &nbsp;</span></li><li class="alt"><span>Console.WriteLine(); &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>//根据学号关键字排序 &nbsp;</span></li><li class=""><span>Array.Sort(arrSid,&nbsp;arrSname); &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li class=""><span>//并输出排序后的数组：淘气(1)-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>麻子(2)-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>王五(3)-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>李四(4)-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>张三(5) &nbsp;</span></li><li class="alt"><span>Console.WriteLine("排序以后数组:"); &nbsp;</span></li><li class=""><span>for&nbsp;(int&nbsp;</span><span class="attribute"><font color="#ff0000">i</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">0</font></span><span>;&nbsp;i&nbsp;</span><span class="tag"><strong><font color="#006699">&lt;</font></strong></span><span>&nbsp;</span><span class="tag-name"><strong><font color="#006699">arrSid.Length</font></strong></span><span>;&nbsp;i++) &nbsp;</span></li><li class="alt"><span>Console.Write("{0}({1})-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>",&nbsp;arrSname[i],&nbsp;arrSid[i]); &nbsp;</span></li><li class=""><span>} &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>public&nbsp;class&nbsp;SearchArray &nbsp;</span></li><li class=""><span>{ &nbsp;</span></li><li class="alt"><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class=""><span>///&nbsp;利用BinarySearch方法搜索元素 &nbsp;</span></li><li class="alt"><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class=""><span>public&nbsp;void&nbsp;test1() &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li class=""><span>//定义数组 &nbsp;</span></li><li class="alt"><span>int[]&nbsp;</span><span class="attribute"><font color="#ff0000">myArr</font></span><span>&nbsp;=&nbsp;{&nbsp;5,&nbsp;4,&nbsp;3,&nbsp;2,&nbsp;1&nbsp;}; &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>//对数组排序 &nbsp;</span></li><li class=""><span>Array.Sort(myArr); &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li class=""><span>//搜索 &nbsp;</span></li><li class="alt"><span>int&nbsp;</span><span class="attribute"><font color="#ff0000">target</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">3</font></span><span>; &nbsp;</span></li><li class=""><span>int&nbsp;</span><span class="attribute"><font color="#ff0000">result</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">Array</font></span><span>.BinarySearch(myArr,&nbsp;target);&nbsp;//2 &nbsp;</span></li><li class="alt"><span>Console.WriteLine("{0}的下标为{1}",&nbsp;target,&nbsp;result);&nbsp;//2 &nbsp;</span></li><li class=""><span>} &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li class=""><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class="alt"><span>///&nbsp;判断是否包含某个值 &nbsp;</span></li><li class=""><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class="alt"><span>public&nbsp;void&nbsp;test2() &nbsp;</span></li><li class=""><span>{ &nbsp;</span></li><li class="alt"><span>//定义数组 &nbsp;</span></li><li class=""><span>string[]&nbsp;</span><span class="attribute"><font color="#ff0000">arrSname</font></span><span>&nbsp;=&nbsp;{&nbsp;"张三",&nbsp;"李四",&nbsp;"王五",&nbsp;"麻子",&nbsp;"淘气"&nbsp;}; &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li class=""><span>//判断是否含有某值 &nbsp;</span></li><li class="alt"><span>string&nbsp;</span><span class="attribute"><font color="#ff0000">target</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">"王五"</font></span><span>; &nbsp;</span></li><li class=""><span>bool&nbsp;</span><span class="attribute"><font color="#ff0000">result</font></span><span>&nbsp;=&nbsp;((System.Collections.IList)arrSname).Contains(target); &nbsp;</span></li><li class="alt"><span>Console.WriteLine("包含{0}?{1}",&nbsp;target,&nbsp;result);&nbsp;//true &nbsp;</span></li><li class=""><span>} &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>public&nbsp;class&nbsp;ReverseArray &nbsp;</span></li><li class=""><span>{ &nbsp;</span></li><li class="alt"><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class=""><span>///&nbsp;利用Reverse方法反转数组 &nbsp;</span></li><li class="alt"><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class=""><span>public&nbsp;void&nbsp;test1() &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li class=""><span>//定义数组 &nbsp;</span></li><li class="alt"><span>int[]&nbsp;</span><span class="attribute"><font color="#ff0000">myArr</font></span><span>&nbsp;=&nbsp;{&nbsp;5,&nbsp;4,&nbsp;3,&nbsp;2,&nbsp;1&nbsp;}; &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>//输出原始数组：原始数组:5-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>4-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>3-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>2-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>1-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;</span></li><li class=""><span>Console.WriteLine("原始数组:"); &nbsp;</span></li><li class="alt"><span>for&nbsp;(int&nbsp;</span><span class="attribute"><font color="#ff0000">i</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">0</font></span><span>;&nbsp;i&nbsp;</span><span class="tag"><strong><font color="#006699">&lt;</font></strong></span><span>&nbsp;</span><span class="tag-name"><strong><font color="#006699">myArr.Length</font></strong></span><span>;&nbsp;i++) &nbsp;</span></li><li class=""><span>Console.Write("{0}-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>",&nbsp;myArr[i]); &nbsp;</span></li><li class="alt"><span>Console.WriteLine(); &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>//对数组反转 &nbsp;</span></li><li class=""><span>Array.Reverse(myArr); &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li class=""><span>//并输出反转后的数组：1-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>2-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>3-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>4-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>5-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;</span></li><li class="alt"><span>Console.WriteLine("反转以后数组:"); &nbsp;</span></li><li class=""><span>for&nbsp;(int&nbsp;</span><span class="attribute"><font color="#ff0000">i</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">0</font></span><span>;&nbsp;i&nbsp;</span><span class="tag"><strong><font color="#006699">&lt;</font></strong></span><span>&nbsp;</span><span class="tag-name"><strong><font color="#006699">myArr.Length</font></strong></span><span>;&nbsp;i++) &nbsp;</span></li><li class="alt"><span>Console.Write("{0}-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>",&nbsp;myArr[i]); &nbsp;</span></li><li class=""><span>} &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>public&nbsp;class&nbsp;CopyArray &nbsp;</span></li><li class=""><span>{ &nbsp;</span></li><li class="alt"><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class=""><span>///&nbsp;利用Copy静态方法复制数组 &nbsp;</span></li><li class="alt"><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class=""><span>public&nbsp;void&nbsp;test1() &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li class=""><span>//定义数组 &nbsp;</span></li><li class="alt"><span>int[]&nbsp;</span><span class="attribute"><font color="#ff0000">myArr</font></span><span>&nbsp;=&nbsp;{&nbsp;5,&nbsp;4,&nbsp;3,&nbsp;2,&nbsp;1&nbsp;}; &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>//输出原始数组：原始数组:5-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>4-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>3-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>2-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>1-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;</span></li><li class=""><span>Console.WriteLine("原始数组:"); &nbsp;</span></li><li class="alt"><span>for&nbsp;(int&nbsp;</span><span class="attribute"><font color="#ff0000">i</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">0</font></span><span>;&nbsp;i&nbsp;</span><span class="tag"><strong><font color="#006699">&lt;</font></strong></span><span>&nbsp;</span><span class="tag-name"><strong><font color="#006699">myArr.Length</font></strong></span><span>;&nbsp;i++) &nbsp;</span></li><li class=""><span>Console.Write("{0}-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>",&nbsp;myArr[i]); &nbsp;</span></li><li class="alt"><span>Console.WriteLine(); &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>//复制数组 &nbsp;</span></li><li class=""><span>int[]&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span class="attribute"><font color="#ff0000">newArr</font></span><span>&nbsp;=&nbsp;new&nbsp;int[3]; &nbsp;</span></li><li class="alt"><span>Array.Copy(myArr,&nbsp;newArr,&nbsp;3); &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>//并输出反复制的数组：5-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>4-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>3-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;</span></li><li class=""><span>Console.WriteLine("复制数组:"); &nbsp;</span></li><li class="alt"><span>for&nbsp;(int&nbsp;</span><span class="attribute"><font color="#ff0000">i</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">0</font></span><span>;&nbsp;i&nbsp;</span><span class="tag"><strong><font color="#006699">&lt;</font></strong></span><span>&nbsp;</span><span class="tag-name"><strong><font color="#006699">newArr.Length</font></strong></span><span>;&nbsp;i++) &nbsp;</span></li><li class=""><span>Console.Write("{0}-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>",&nbsp;newArr[i]); &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class=""><span>///&nbsp;利用CopyTo实例方法复制数组 &nbsp;</span></li><li class="alt"><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class=""><span>public&nbsp;void&nbsp;test2() &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li class=""><span>//定义数组 &nbsp;</span></li><li class="alt"><span>int[]&nbsp;</span><span class="attribute"><font color="#ff0000">myArr</font></span><span>&nbsp;=&nbsp;{&nbsp;5,&nbsp;4,&nbsp;3,&nbsp;2,&nbsp;1&nbsp;}; &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>//输出原始数组：原始数组:5-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>4-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>3-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>2-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>1-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;</span></li><li class=""><span>Console.WriteLine("原始数组:"); &nbsp;</span></li><li class="alt"><span>for&nbsp;(int&nbsp;</span><span class="attribute"><font color="#ff0000">i</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">0</font></span><span>;&nbsp;i&nbsp;</span><span class="tag"><strong><font color="#006699">&lt;</font></strong></span><span>&nbsp;</span><span class="tag-name"><strong><font color="#006699">myArr.Length</font></strong></span><span>;&nbsp;i++) &nbsp;</span></li><li class=""><span>Console.Write("{0}-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>",&nbsp;myArr[i]); &nbsp;</span></li><li class="alt"><span>Console.WriteLine(); &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>//复制数组 &nbsp;</span></li><li class=""><span>int[]&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span class="attribute"><font color="#ff0000">newArr</font></span><span>&nbsp;=&nbsp;new&nbsp;int[7]; &nbsp;</span></li><li class="alt"><span>myArr.CopyTo(newArr,&nbsp;2); &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>//并输出反复制的数组：0-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>0-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>5-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>4-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>3-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>2-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>1-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;</span></li><li class=""><span>Console.WriteLine("复制数组:"); &nbsp;</span></li><li class="alt"><span>for&nbsp;(int&nbsp;</span><span class="attribute"><font color="#ff0000">i</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">0</font></span><span>;&nbsp;i&nbsp;</span><span class="tag"><strong><font color="#006699">&lt;</font></strong></span><span>&nbsp;</span><span class="tag-name"><strong><font color="#006699">newArr.Length</font></strong></span><span>;&nbsp;i++) &nbsp;</span></li><li class=""><span>Console.Write("{0}-</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>",&nbsp;newArr[i]); &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li class=""><span>} &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li class=""><span>public&nbsp;class&nbsp;DynamicCreateArray &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li class=""><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class="alt"><span>///&nbsp;利用CreateInstance动态创建数组 &nbsp;</span></li><li class=""><span>///&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">summary</span><span class="tag">&gt;</span></font></strong><span>&nbsp;</span></li><li class="alt"><span>public&nbsp;void&nbsp;test1() &nbsp;</span></li><li class=""><span>{ &nbsp;</span></li><li class="alt"><span>//定义长度数组 &nbsp;</span></li><li class=""><span>int[]&nbsp;</span><span class="attribute"><font color="#ff0000">lengthsArr</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span>&nbsp;int[]&nbsp;{&nbsp;3,&nbsp;4&nbsp;}; &nbsp;</span></li><li class="alt"><span>int[]&nbsp;</span><span class="attribute"><font color="#ff0000">lowerBoundsArr</font></span><span>&nbsp;=&nbsp;{&nbsp;1,&nbsp;11&nbsp;}; &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>Array&nbsp;</span><span class="attribute"><font color="#ff0000">arr</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">Array</font></span><span>.CreateInstance(Type.GetType("System.Int32"),&nbsp;lengthsArr,&nbsp;lowerBoundsArr); &nbsp;</span></li><li class=""><span>&nbsp;</span></li><li class="alt"><span>Random&nbsp;</span><span class="attribute"><font color="#ff0000">r</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span>&nbsp;Random();&nbsp;//声明一个随机数对象 &nbsp;</span></li><li class=""><span>//循环赋值、输出 &nbsp;</span></li><li class="alt"><span>for&nbsp;(int&nbsp;</span><span class="attribute"><font color="#ff0000">i</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">arr</font></span><span>.GetLowerBound(0)&nbsp;-&nbsp;1;&nbsp;i&nbsp;</span><span class="tag"><strong><font color="#006699">&lt;</font></strong></span><span>&nbsp;</span><span class="tag-name"><strong><font color="#006699">arr.GetUpperBound</font></strong></span><span>(0)&nbsp;-&nbsp;1;&nbsp;i++) &nbsp;</span></li><li class=""><span>{ &nbsp;</span></li><li class="alt"><span>for&nbsp;(int&nbsp;</span><span class="attribute"><font color="#ff0000">j</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">arr</font></span><span>.GetLowerBound(1)&nbsp;-&nbsp;1;&nbsp;j&nbsp;</span><span class="tag"><strong><font color="#006699">&lt;</font></strong></span><span>&nbsp;</span><span class="tag-name"><strong><font color="#006699">arr.GetUpperBound</font></strong></span><span>(1)&nbsp;-&nbsp;1;&nbsp;j++) &nbsp;</span></li><li class=""><span>{ &nbsp;</span></li><li class="alt"><span>arr.SetValue((int)r.Next()&nbsp;%&nbsp;100,&nbsp;i,&nbsp;j);//用1～100的随即数赋值 &nbsp;</span></li><li class=""><span>Console.WriteLine("arr[{0},{1}]={3}",&nbsp;i,&nbsp;j,&nbsp;arr.GetValue(i,&nbsp;j)); &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li class=""><span>} &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li class=""><span>} &nbsp;</span></li><li class="alt"><span>}&nbsp;</span></li></ol></pre></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/378058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-13 22:46 <a href="http://www.blogjava.net/liuyz2006/articles/378058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Convert.ToInt32、(int)和int.Parse三者的区别</title><link>http://www.blogjava.net/liuyz2006/articles/378056.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 13 May 2012 14:09:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/378056.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/378056.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/378056.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/378056.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/378056.html</trackback:ping><description><![CDATA[<h1 class="postTitle"><span style="font-size: 14pt">Convert.ToInt32、(int)和int.Parse三者的区别</span></h1>
<div class="postBody">
<div id="cnblogs_post_body">
<p><span style="font-size: 10pt">(1)这两个方法的最大不同是它们对null值的处理方法：<br />&nbsp;&nbsp;&nbsp; <span style="color: red">Convert.ToInt32(null)会返回0而不会产生任何异常，但int.Parse(null)则会产生异常。</span></span></p>
<p><span style="color: #000000"><span style="font-size: 10pt">没搞清楚Convert.ToInt32和int.Parse()的细细微区别时千万别乱用，否则可能会产生无法预料的结果，举例来说：假如从url中取一个参数page的值，我们知道这个值是一个int，所以即可以用Convert.ToInt32(Request.QueryString["page"])，也可以用,int.Parse(Request.QueryString["page"])，但是如果page这个参数在url中不存在，那么前者将返回0，0可能是一个有效的值，所以你不知道url中原来根本就没有这个参数而继续进行下一下的处理，这就可能产生意想不到的效果，而用后一种办法的话没有page这个参数会抛出异常，我们可以捕获异常然后再做相应的处理，比如提示用户缺少参数，而不是把参数值当做0来处理。</span></span></p>
<p><span style="color: red"><span style="font-size: 10pt; color: #000000">(2)还有一点区别就是<br /></span></span><span style="color: red"><span style="font-size: 10pt">&nbsp; a. Convert.ToInt32(double value)<br />如果 value 为两个整数中间的数字，则返回二者中的偶数；即 3.5转换为4，4.5 转换为 4，而 5.5 转换为 6。&nbsp;&nbsp;不过4.6可以转换为5，4.4转换为4</span></span><span style="color: red"><span style="font-size: 10pt"><br />&nbsp; b. int.Parse("4.5") <br /></span></span><span style="color: red"><span style="font-size: 10pt">直接报错:"<em>输入字符串的格式不正确</em>".</span></span></p>
<p><span style="color: red"><span style="font-size: 10pt">&nbsp; c. int(4.6) = 4<br /></span></span><span style="color: red"><span style="font-size: 10pt">Int转化其他数值类型为Int时没有四舍五入，强制转换 </span></span><br /><span style="color: #000000"><span style="font-size: 10pt"><br />int.Parse是转换String为int<br />Convert.ToInt32是转换继承自Object的对象为int的. <br />你得到一个object对象,你想把它转换为int,用int.Parse就不可以,要用Convert.ToInt32.<br /><br /></span><span style="color: red"><span style="font-size: 10pt"><strong>个人总结:<br /></strong><span>(1)Convert.ToInt32的参数比较多，Int.Parse只能转换string类型的.</span></span></span></span><span style="color: #000000"><span style="color: red"><span style="font-size: 10pt"><br />(2)Parse就是把String转换成int,char,double....等,也就是*.Parse(string) 括号中的一定要是string.<br />(3)Convert可以提供多种类型的转换,也就是Convert.*()括号中可以为很多种类型(包括string).<br />(4)至于效率上的区别可以看看这遍文章：《细说Convert和Parse到底那个效率高》&nbsp;<br /></span></span></span></p></div></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/378056.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-13 22:09 <a href="http://www.blogjava.net/liuyz2006/articles/378056.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GridView详述</title><link>http://www.blogjava.net/liuyz2006/articles/378052.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 13 May 2012 12:54:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/378052.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/378052.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/378052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/378052.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/378052.html</trackback:ping><description><![CDATA[<a href="http://www.builder.com.cn/2008/0203/728442.shtml">http://www.builder.com.cn/2008/0203/728442.shtml</a><img src ="http://www.blogjava.net/liuyz2006/aggbug/378052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-13 20:54 <a href="http://www.blogjava.net/liuyz2006/articles/378052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IsPostBack介绍</title><link>http://www.blogjava.net/liuyz2006/articles/378047.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 13 May 2012 08:28:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/378047.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/378047.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/378047.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/378047.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/378047.html</trackback:ping><description><![CDATA[<div class="multicntwrap">
<div class="multicnt">
<div>
<h3 class="title pre fs1"><span class="tcnt"><font face="微软雅黑" size="5"><span style="font-size: 14pt">IsPostBack介绍</span></font></span>&nbsp;&nbsp;<span class="bgc0 fc07 fw0 fs0"></span></h3>
<p class="tdep clearfix nbw-act fc06" style="line-height: 20px"><span class="pleft"><span class="blogsep">2010-01-27 10:36:19</span><span class="blogsep">|&nbsp;&nbsp;分类：</span> <a class="fc03 m2a" title="技术交流" href="http://blog.163.com/zhenxiaxu@126/blog/#m=0&amp;t=1&amp;c=fks_087069092094083074087081085095085085085068092082085071082">技术交流</a> <span class="blogsep phide" id="$_blogTagTitle">|&nbsp;&nbsp;标签：</span><span class="fc03 phide" id="$_blogTagInfo"></span> </span><span class="pright fc07 ztag"><span class="blogsep">|</span><span class="zihao fc03" id="$_fontswitch" __1336896439542__="ev_3607516973">字号<span class="zihaoshow  phide" id="$_fontsTypes"><span class="zihaoc bdc0"><span class="stag" __1336896439542__="ev_4258186421" __tabkey__="true" index="0"></span><span class="fc04 stag" __1336896439542__="ev_1934276112" __tabkey__="true" index="1">大</span><span class="fc04 stag selected js-fcurrent fc05" __1336896439542__="ev_1596455282" __tabkey__="true" index="2">中</span><span class="fc04 stag" __1336896439542__="ev_9252880484" __tabkey__="true" index="3">小</span></span></span></span></span><span class="pright pnt fc03" id="$_blog_subscribe" __1336896439542__="ev_2999014162"><span class="iblock icn0 icn0-919">&nbsp;</span><a class="m2a">订阅</a></span> </p></div></div></div>
<div></div>
<div class="nbw-blog-start"></div>
<div class="bct fc05 fc11 nbw-blog ztag js-fs2" __1336896439542__="ev_8390675990">
<p style="text-indent: 2em">1 IsPostBack介绍</p>
<p style="text-indent: 2em">IsPostBack是Page类有一个bool类型的属性，用来判断针对当前Form的请求是第一次还是非第一次请求。当IsPostBack＝true时表示非第一次请求，我们称为PostBack，当IsPostBack＝false时表示第一次请求。在asp.net框架内部有很多的场景需要判断IsPostBack，比如LoadAllState等操作就需要在PostBack的时候进行。对于我们自己使用WebForm进行开发时，经常会在Page_Load中对IsPostBack进行判断，因为第一次请求的时候会执行Page_Load，在非第一次请求的时候也会执行Page_Load。为什么对同一个Form有多次请求呢asp.net中引入了服务器端事件，支持服务器端事件的控件，会发出对当前Form的请求，这样在很多情形下我们就需要区别是否是对这个Form的第一次请求。</p>
<p style="text-indent: 2em">2 IsPostBack结论</p>
<p style="text-indent: 2em">本人对.Net的源代码中相关的处理进行的分析得到如下的结论：</p>
<p style="text-indent: 2em">结论&#9312; 对于使用Server.Transfer进行迁移时迁移到的页面其IsPostBack＝false。</p>
<p style="text-indent: 2em">结论&#9313; Post方式如果Request中没有请求值，即Request.Form =null则IsPostBack＝false；Get方式如果Request中没有请求值，即Request.QueryString =null则IsPostBack＝false。</p>
<p style="text-indent: 2em">结论&#9314; 如果QueryString或Form虽然有请求值，但是QueryString或Form中的Key没有&#8220;__VIEWSTATE&#8221;和&#8220;__EVENTTARGET&#8221;和&#8220;__VIEWSTATEFIELDCOUNT&#8221;，并且没有键为&#8220;null&#8221;，值以&#8220;__VIEWSTATE&#8221;开头并且也没有值为&#8220;__EVENTTARGET&#8221;的键值对，则IsPostBack＝false。</p>
<p style="text-indent: 2em">结论&#9315; 使用Response.Redirect方式向自画面迁移时，此时IsPostBack＝false。</p>
<p style="text-indent: 2em">结论&#9316; 发生跨页提交（CrossPagePostBack），当访问PreviousPage属性的时候，对于源Page，IsPostBack=true。</p>
<p style="text-indent: 2em">结论&#9317; 发生跨页提交（CrossPagePostBack）时目标页面是IsPostBack＝false</p>
<p style="text-indent: 2em">结论&#9318; 使用Server.Execute迁移到的页面其IsPostBack＝false。</p>
<p style="text-indent: 2em">结论&#9319; 在Page运行期间其对应的DLL被更新了并且Page的树结构发生过变化，这种情况下请求时IsPostBack＝false。</p>
<p style="text-indent: 2em">可以这样来理解这些结论：一般情况判断Request中如果没有请求值则IsPostBack＝false。如果有请求值但是不包括&#8220;__VIEWSTATE&#8221;等一些特殊的键或值，则IsPostBack＝false（每次请求后.Net框架会将一些特殊的隐藏域&#8220;__VIEWSTATE&#8221;等返回给客户端）。还有一些特殊的情形是上面的规则不能正确判断的需要特殊处理的，这些情形包括Server.Transfer，Response.Redirect，CrossPagePostBack，Server.Execute，发生了页面元素变化及重新编译。</p>
<p style="text-indent: 2em">一般来说记住上面的结论就可以，如果您有兴趣，或者怀疑请继续看下面的IsPostBack推论过程。</p>
<p style="text-indent: 2em">3 IsPostBack推论过程<br /><br />下面是根据.Net框架中的源代码，来分析IsPostBack是如何判断出来的。对于这些结论的推断本人做了相关的试验来证明推论的正确性，由于<br /><br />篇幅的原因没有将这些试验代码体现出来。另外不可能将全部的.Net框架的代码都体现出来，只是将相关的代码片段列出，说明推断的依据。<br /><br />另外由于本人水平有限对.Net框架的代码理解还存在的不足的地方，请发现后进行指正，谢谢。<br /><br />publicbool IsPostBack<br /><br />{<br /><br />get<br /><br />{<br /><br />if (this._requestValueCollection == null)<br /><br />{<br /><br />return false;<br /><br />}<br /><br />if (this._isCrossPagePostBack)<br /><br />{<br /><br />return true;<br /><br />}<br /><br />if (this_pageFlags[8])<br /><br />{<br /><br />return false;<br /><br />}<br /><br />return (<br /><br />(<br /><br />(this.Context.ServerExecuteDepth &lt;= 0) ||<br /><br />((this.Context.Handler != null) &amp;&amp;<br /><br />(base.GetType() == this.Context.Handler.GetType()))<br /><br />) &amp;&amp; !this._fPageLayoutChanged<br /><br />);<br /><br />}<br /><br />}<br /><br />我们将每一个if判断作为一个小节，作如下的分析。<br /><br />3.1 this._requestValueCollection == null<br /><br />if (this._requestValueCollection == null)<br /><br />{<br /><br />return false;<br /><br />}<br /><br />可以看出_requestValueCollection等于null时IsPostBack就等于false。<br /><br />在Page.ProcessRequestMain(bool, bool)中有如下的代码：<br /><br />if (this.PageAdapter != null)<br /><br />{<br /><br />this._requestValueCollection = this.PageAdapter.DeterminePostBackMode();<br /><br />}<br /><br />else<br /><br />{<br /><br />this._requestValueCollection = this.DeterminePostBackMode();<br /><br />}<br /><br />PageAdapter.DeterminePostBackMode最终还是调用了Page.DeterminePostBackMode，下面我们看Page.DeterminePostBackMode如何实现。<br /><br />protected internal virtual NameValueCollection DeterminePostBackMode()<br /><br />{<br /><br />if (this.Context.Request == null)<br /><br />{<br /><br />return null;<br /><br />}<br /><br />if (this.Context.PreventPostback)<br /><br />{<br /><br />return null;<br /><br />}<br /><br />NameValueCollection collectionBasedOnMethod = this.GetCollectionBasedOnMethod(false);<br /><br />if (collectionBasedOnMethod == null)<br /><br />{<br /><br />return null;<br /><br />}<br /><br />bool flag = false;<br /><br />string[] values = collectionBasedOnMethod.GetValues((string) null);<br /><br />if (values != null)<br /><br />{<br /><br />int length = values.Length;<br /><br />for (int i = 0; i &lt; length; i++)<br /><br />{<br /><br />if (values[i].StartsWith("__VIEWSTATE", StringComparison.Ordinal) ||<br /><br />(values[i] == "__EVENTTARGET"))<br /><br />{<br /><br />flag = true;<br /><br />break;<br /><br />}<br /><br />}<br /><br />}<br /><br />if (((collectionBasedOnMethod["__VIEWSTATE"] == null) &amp;&amp; (collectionBasedOnMethod["__VIEWSTATEFIELDCOUNT"] == null)) &amp;&amp;<br /><br />((collectionBasedOnMethod["__EVENTTARGET"] == null) &amp;&amp; !flag))<br /><br />{<br /><br />return null;<br /><br />}<br /><br />if (this.Request.QueryStringText.IndexOf(<br /><br />HttpResponse.RedirectQueryStringAssignment, StringComparison.Ordinal) != -1)<br /><br />{<br /><br />collectionBasedOnMethod = null;<br /><br />}<br /><br />return collectionBasedOnMethod;<br /><br />}<br /><br />这个函数中返回null就意味者IsPostBack＝false，将上面函数中每个返回为null的地方作如下的分析。<br /><br />3.1.1 this.Context.Request == null<br /><br />&nbsp;&nbsp;&nbsp; if (this.Context.Request == null)&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;&nbsp;&nbsp;&nbsp; }this.Context.Request == null应该只有在异常的情况下会发生，<br /><br />正常情况下会在HttpRuntime.ProcessRequestInternal中创建HttpContext及HttpRequest对象。<br /><br />3.1.2 this.Context.PreventPostback<br /><br />&nbsp;&nbsp;&nbsp; if (this.Context.PreventPostback)&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;&nbsp;&nbsp;&nbsp; }在HttpServerUtility.Transfer中会使用PreventPostback，其代<br /><br />码如下：<br /><br />public void Transfer(string path)<br /><br />{<br /><br />bool preventPostback = this._context.PreventPostback;<br /><br />this._context.PreventPostback = true;<br /><br />this.Transfer(path, true);<br /><br />this._context.PreventPostback = preventPostback;<br /><br />}<br /><br />在调用Server.Transfer进行画面迁移时设置Context.PreventPostback＝ture。此处得出结论&#9312;：对于使用Server.Transfer进行迁移时迁移到<br /><br />的页面其IsPostBack＝false。<br /><br />3.1.3 collectionBasedOnMethod == null<br /><br />NameValueCollection collectionBasedOnMethod = this.GetCollectionBasedOnMethod(false);<br /><br />if (collectionBasedOnMethod == null)<br /><br />{<br /><br />return null;<br /><br />}<br /><br />调用了Page.GetCollectionBasedOnMethod后其返回值进行判断。如果其返回值为null则IsPostBack为false。<br /><br />Page.GetCollectionBasedOnMethod的定义如下：<br /><br />internal NameValueCollection GetCollectionBasedOnMethod(bool dontReturnNull)<br /><br />{<br /><br />if (this._request.HttpVerb == HttpVerb.POST)<br /><br />{<br /><br />if (!dontReturnNull &amp;&amp; !this._request.HasForm)<br /><br />{<br /><br />return null;<br /><br />}<br /><br />return this._request.Form;<br /><br />}<br /><br />if (!dontReturnNull &amp;&amp; !this._request.HasQueryString)<br /><br />{<br /><br />return null;<br /><br />}<br /><br />return this._request.QueryString;<br /><br />}<br /><br />从上面的代码可以看出返回值为null的情形是_request.HasForm＝null或_request.HasQueryString＝null。此处得出结论&#9313;：Post方式如果<br /><br />Request中没有请求值，即Request.Form =null则IsPostBack＝false；Get方式如果Request中没有请求值，即Request.QueryString =null则<br /><br />IsPostBack＝false。<br /><br />3.1.4 ((collectionBasedOnMethod["__VIEWSTATE"] == null) &amp;&amp; (collectionBasedOnMethod["__VIEWSTATEFIELDCOUNT"] == null)) &amp;&amp;<br /><br />((collectionBasedOnMethod["__EVENTTARGET"] == null) &amp;&amp; !flag)<br /><br />bool flag = false;<br /><br />string[] values = collectionBasedOnMethod.GetValues((string) null);<br /><br />if (values != null)<br /><br />{<br /><br />int length = values.Length;<br /><br />for (int i = 0; i &lt; length; i++)<br /><br />{<br /><br />if (values[i].StartsWith("__VIEWSTATE", StringComparison.Ordinal) ||<br /><br />(values[i] == "__EVENTTARGET"))<br /><br />{<br /><br />flag = true;<br /><br />break;<br /><br />}<br /><br />}<br /><br />}<br /><br />上面这段代码的意思是判断请求的键值对中是否存在没有键，其值以&#8220;__VIEWSTATE&#8221;开头或者其值为&#8220;__EVENTTARGET&#8221;。例如如下的Get请求<br /><br />方式会使得flag＝true。<br /><br />&#8230;/defalt.aspx?__VIEWSTATE<br /><br />&#8230;/defalt.aspx?__EVENTTARGET<br /><br />对于Get方式&#8220;?__VIEWSTATE＝&#8221;会将__VIEWSTATE作为请求的键，其值为&#8220;&#8221;，但是&#8220;?__VIEWSTATE&#8221;会认为其键为&#8220;null&#8221;，其值为<br /><br />&#8220;__VIEWSTATE&#8221;<br /><br />if (<br /><br />((collectionBasedOnMethod["__VIEWSTATE"] == null) &amp;&amp; (collectionBasedOnMethod["__VIEWSTATEFIELDCOUNT"] == null)) &amp;&amp;<br /><br />((collectionBasedOnMethod["__EVENTTARGET"] == null) &amp;&amp; !flag))<br /><br />{<br /><br />return null;<br /><br />}<br /><br />如上的条件意味着请求的键中同时没有&#8220;__VIEWSTATE&#8221;，&#8220;__EVENTTARGET&#8221;，&#8220;__VIEWSTATEFIELDCOUNT&#8221;，并且flag为false则返回null。<br /><br />flag为false意味着没有键为&#8220;null&#8221;值以&#8220;__VIEWSTATE&#8221;开头并且也没有值为&#8220;__EVENTTARGET&#8221;的键值对。<br /><br />此处得出结论&#9314;如果QueryString或Form虽然有请求值，但是QueryString或Form中的Key没有&#8220;__VIEWSTATE&#8221;和&#8220;__EVENTTARGET&#8221;和<br /><br />&#8220;__VIEWSTATEFIELDCOUNT&#8221;，并且没有键为&#8220;null&#8221;值以&#8220;__VIEWSTATE&#8221;开头并且也没有值为&#8220;__EVENTTARGET&#8221;的键值对，则IsPostBack＝<br /><br />false。<br /><br />3.1.5 this.Request.QueryStringText.IndexOf(HttpResponse.RedirectQueryStringAssignment, StringComparison.Ordinal) != -1<br /><br />if (this.Request.QueryStringText.IndexOf(HttpResponse.RedirectQueryStringAssignment, StringComparison.Ordinal) != -1)<br /><br />{<br /><br />collectionBasedOnMethod = null;<br /><br />}<br /><br />HttpResponse.RedirectQueryStringAssignment的值为&#8220;__redir＝1&#8221;，上面的代码的意思是如果QueryStringText中包括包括&#8220;__redir＝1&#8221;<br /><br />则返回null。在HttpRequest.Redirect中会判断如果IsPostBack为true，并且URL中不包含有&#8220;__redir＝1&#8221;时，会给URL中增加&#8220;__redir＝1<br /><br />&#8221;。一般情况下我们使用request.Redirect迁移到的页面都应该是IsPostBack＝false，有一种特殊的情形是使用request.Redirect迁移到当前<br /><br />页，此时IsPostBack为true。此种情况发生时在request.Redirect中给URL中增加&#8220;__redir＝1&#8221;。执行到page. ProcessRequestMain时会重新<br /><br />将IsPostBack判断为fales。<br /><br />此处得出结论&#9315;使用Response.Redirect方式向自画面迁移时，此时IsPostBack＝false。<br /><br />此时大家可能会有疑问为什么使用Response.Redirect方式向自画面迁移时要特殊处理，使用Response.Redirect向其他画面迁移为什么不要。<br /><br />使用Response.Redirect向其他画面迁移时Response.Form=null，Response.QueryString=null，所以可以判断是IsPostBack＝false。但是使用<br /><br />Response.Redirect方式向自画面迁移时Response.QueryString&lt;&gt;null,所以要特殊判断。<br /><br />3.2 this._isCrossPagePostBack<br /><br />if (this._isCrossPagePostBack)<br /><br />{<br /><br />return true;<br /><br />}<br /><br />在Page的PreviousPage属性中会对_isCrossPagePostBack进行设置，具体代码如下：<br /><br />public Page PreviousPage<br /><br />{<br /><br />get<br /><br />{<br /><br />&#8230;<br /><br />ITypedWebObjectFactory vPathBuildResult = (ITypedWebObjectFactory) BuildManager.GetVPathBuildResult(this.Context,<br /><br />this._previousPagePath);<br /><br />if (typeof(Page).IsAssignableFrom(vPathBuildResult.InstantiatedType))<br /><br />{<br /><br />this._previousPage = (Page) vPathBuildResult.CreateInstance();<br /><br />this._previousPage._isCrossPagePostBack = true;<br /><br />this.Server.Execute(this._previousPage, TextWriter.Null, true, false);<br /><br />}<br /><br />}<br /><br />return this._previousPage;<br /><br />}<br /><br />}<br /><br />在发生跨页面提交的时候，当访问PreviousPage属性的时候源Page的IsCrossPagePostBack会被设置true。此处得出结论&#9316;发生跨页提交<br /><br />（CrossPagePostBack），当访问PreviousPage属性的时候，对于源Page，IsPostBack=true。<br /><br />3.3 this._pageFlags[8]<br /><br />if (this._pageFlags[8])<br /><br />{<br /><br />return false;<br /><br />}<br /><br />在Page. ProcessRequestMain中有如下的代码片断对_pageFlags[8]进行赋值。<br /><br />else if (!this.IsCrossPagePostBack)<br /><br />{<br /><br />VirtualPath path = null;<br /><br />if (this._requestValueCollection["__PREVIOUSPAGE"] != null)<br /><br />{<br /><br />try<br /><br />{<br /><br />path = VirtualPath.CreateNonRelativeAllowNull(<br /><br />DecryptString(this._requestValueCollection["__PREVIOUSPAGE"]));<br /><br />}<br /><br />catch (CryptographicException)<br /><br />{<br /><br />this._pageFlags[8] = true;<br /><br />}<br /><br />if ((path != null) &amp;&amp; (path != this.Request.CurrentExecutionFilePathObject))<br /><br />{<br /><br />this._pageFlags[8] = true;<br /><br />this._previousPagePath = path;<br /><br />}<br /><br />}<br /><br />}<br /><br />解密发生异常时_pageFlags[8]为true这种异常发生的可能性比较小我们忽略，重点看另外一种情形，将这种情形的所有条件结合起来就是<br /><br />IsCrossPagePostBack＝false &amp;&amp; _requestValueCollection["__PREVIOUSPAGE"] != null &amp;&amp; path != null &amp;&amp; (path !=<br /><br />this.Request.CurrentExecutionFilePathObject)。发生跨页提交时对于目标页面IsCrossPagePostBack＝false，此时源页面<br /><br />的"__PREVIOUSPAGE"等信息会提交给目标页面，所以_requestValueCollection["__PREVIOUSPAGE"] != null。此时当前请求的<br /><br />CurrentExecutionFilePathObject是根据目标页的路径生成的，与使用_requestValueCollection["__PREVIOUSPAGE"]生成的path对象不同。<br /><br />此处得出结论&#9317;发生跨页提交（CrossPagePostBack）时目标页面是IsPostBack＝false。为什么需要对CrossPagePostBack的目标页面做这样的<br /><br />处理呢？发生CrossPagePostBack时，会将源页面的信息提交给目标页面此时Request.Form！＝null，而且包括__VIEWSTATE等键按照其他的规<br /><br />则会判断为IsPostBack＝true，所以需要对CrossPagePostBack的目标页面做特殊的判断。<br /><br />3.4 (this.Context.ServerExecuteDepth &lt;= 0) || ((this.Context.Handler != null) &amp;&amp; (base.GetType() ==<br /><br />this.Context.Handler.GetType()))<br /><br />在HttpServerUtility中有如下的代码对Context. ServerExecuteDepth进行了操作。<br /><br />public void Execute(string path, TextWriter writer, bool preserveForm)<br /><br />{<br /><br />&#8230;<br /><br />try<br /><br />{<br /><br />this._context.ServerExecuteDepth++;<br /><br />handler = this._context.ApplicationInstance.MapHttpHandler(this._context, request.RequestType, path3, filename,<br /><br />useAppConfig);<br /><br />}<br /><br />finally<br /><br />{<br /><br />this._context.ServerExecuteDepth--;<br /><br />}<br /><br />&#8230;<br /><br />}<br /><br />在HttpServerUtility.ExecuteInternal中也有一处对Context.ServerExecuteDepth类似的操作。HttpServerUtility.Execute会调用<br /><br />HttpServerUtility.ExecuteInternal。从此可以看出Context.ServerExecuteDepth是表示Server.Execute中的执行深度。在调用<br /><br />Server.Execute时Context.ServerExecuteDepth&gt;0。另外调用Server.Execute后Context.Handle中存储的还是原来的页对象，也就是说<br /><br />base.GetType()!= this.Context.Handler.GetType()。这样对于Server.Execute来说this.Context.ServerExecuteDepth &lt;= 0) ||<br /><br />((this.Context.Handler != null)这个条件为false。此处得出结论&#9318;使用Server.Execute迁移到的页面其IsPostBack＝false。此处我们会有<br /><br />疑问，为什么需要对Server.Execute进行特殊的判断呢？理由是使用Server.Execute时会将源Page中的隐含域提交，此时Request.Form!=null<br /><br />，而且包括__VIEWSTATE等键按照其他的规则会判断为IsPostBack＝true。<br /><br />3.5 this._fPageLayoutChanged<br /><br />fPageLayoutChanged从这个变量的字面意思来看是Page的Layout发生了变化。<br /><br />在Page.LaodAllState中代码片断如下：<br /><br />private void LoadAllState()<br /><br />{<br /><br />&#8230;<br /><br />string s = (string) second.First;<br /><br />int num = int.Parse(s, NumberFormatInfo.InvariantInfo);<br /><br />this._fPageLayoutChanged = num != this.GetTypeHashCode();<br /><br />&#8230;<br /><br />}<br /><br />其意思是现在得到的HashCode和存储在ViewState中的HashCode不一致时fPageLayoutChanged＝true。GetTypeHashCode()会返回一个HashCode<br /><br />，而且这个方法是对aspx进行编译的时候产生的，只有在页面上的元素发生了变化的时候其返回的值会发生变化。此处得出结论&#9319;在Page运行<br /><br />期间其对应的DLL被更新了并且Page的树结构发生过变化，这种情况下请求时IsPostBack＝false。&nbsp; 就是判断当前页面是不是你提交过后再次由服务器回传过来的<br /><br />你直接在网址里输入一个页面地址访问页面的时候<br />这时在服务器端创建的页面对象的IsPostBack属性为false<br />在你对这个页面进行提交的时候<br />会把你页面控件里的一些值啊什么的东西回传给服务器<br />然后服务器就又创建了一个新的页面对象<br />并且从ViewState中读取回传到服务器的信息<br />这个新的页面对象的IsPostBack属性就为true<br /><br />对了<br />如果对一个页面对象的生命周期了解的话就很好理解<br />你可以去查下相关的资料<br />要知道各个页面事件都是在什么时候引发的<br />以及在不同的时期都完成了哪些工作<br />比如什么时候读取ViewState<br />什么时候执行控件事件<br />什么时候保存ViewState<br />什么时候呈现页面（也就是把网页发送给客户端）<br /><br />这个说起来还比较麻烦 &gt;_&lt;<br />自己试试吧~~<br />对这个理解清楚的话<br />那ASP.NET页面的回传机制也就有个大概了解了<br />这样对今后一些问题的解决也会很有帮助 </p></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/378047.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-13 16:28 <a href="http://www.blogjava.net/liuyz2006/articles/378047.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多个页面向同一目标页面PostBack的问题</title><link>http://www.blogjava.net/liuyz2006/articles/378046.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 13 May 2012 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/378046.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/378046.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/378046.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/378046.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/378046.html</trackback:ping><description><![CDATA[<h1><span style="font-size: 12pt">多个页面向同一目标页面PostBack的问题</span></h1>
<div id="content_art">1. 如果是单个<a title="页面" href="http://www.haogongju.net/tag/%E9%A1%B5%E9%9D%A2" target="_blank">页面</a> A.<a title="asp" href="http://www.haogongju.net/tag/asp" target="_blank">asp</a>x&nbsp;&nbsp;传递参数 到页面 B.aspx，<a title="可以" href="http://www.haogongju.net/tag/%E5%8F%AF%E4%BB%A5" target="_blank">可以</a>通过设置A中的postBackUrl="~/B.aspx"，或者使用 Server.Transfer("~/B.aspx")。在目标页面 B.aspx 中，通过 <a name="baidusnap0"></a><strong style="color: black; background-color: #ffff66">Previous<a title="Page" href="http://www.haogongju.net/tag/Page" target="_blank">Page</a>Type</strong> VirtualPath="~/A.aspx" 的强类指定源页面 A.aspx。这样，可以在B.aspx中通过 F<a title="in" href="http://www.haogongju.net/tag/in" target="_blank">in</a>dControl() 来获得A.aspx中的控件；或者，在A.aspx中把控件<a title="定义" href="http://www.haogongju.net/tag/%E5%AE%9A%E4%B9%89" target="_blank">定义</a>为公共属性，这样，在B.aspx中可以直接按 A.property 的方式<a title="访问" href="http://www.haogongju.net/tag/%E8%AE%BF%E9%97%AE" target="_blank">访问</a><br /><br />2. 当多个页面 A1.aspx, A2.aspx,..., An.aspx 同时要传递参数到页面 B.aspx 时，同样<a title="我们" href="http://www.haogongju.net/tag/%E6%88%91%E4%BB%AC" target="_blank">我们</a>可以使用 postBackUrl或者Server.Transfer()机制<a title="建立" href="http://www.haogongju.net/tag/%E5%BB%BA%E7%AB%8B" target="_blank">建立</a>联系。但是这个时候，由于A1,A2,...,An可能是不同类型的页面，故无法直接使用<strong style="color: black; background-color: #ffff66">PreviousPageType</strong> VirtualPath 的强类指定，而且，在.aspx 中<a title="关键字" href="http://www.haogongju.net/tag/%E5%85%B3%E9%94%AE%E5%AD%97" target="_blank">关键字</a> <strong style="color: black; background-color: #ffff66">PreviousPageType</strong> 也只能出现<a title="一次" href="http://www.haogongju.net/tag/%E4%B8%80%E6%AC%A1" target="_blank">一次</a>。这个时候的<a title="解决" href="http://www.haogongju.net/tag/%E8%A7%A3%E5%86%B3" target="_blank">解决</a>办法是，在B.aspx中不使用关键字 <strong style="color: black; background-color: #ffff66">PreviousPageType</strong>，而在B.aspx.cs中通过如下代码来判定是哪个源页面是PreviousPage：<br /><br />if (Page.PreviousPage.<a title="App" href="http://www.haogongju.net/tag/App" target="_blank">App</a>RelativeVirtualPath == "~/A1.aspx"）<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Label lblA1= (Label)Page.PreviousPage.FindControl("lblA1");<br />&nbsp;&nbsp;&nbsp; ...<br />}<br />else if(Page.PreviousPage.AppRelativeVirtualPath == "~/A2.aspx"）<br />{<br />&nbsp;&nbsp;&nbsp; ...<br />}<br />else if ...<br />{<br />&nbsp;&nbsp;&nbsp; ...<br />}<br /><br />这里同样使用 FindControl() 来获得源页面的控件引用。直接通过属性访问的方式应该也可以，我没有再测试<br /><br />3. 网上提到过一种<a title="方法" href="http://www.haogongju.net/tag/%E6%96%B9%E6%B3%95" target="_blank">方法</a>，就是使用Interface来解决，有<a title="兴趣" href="http://www.haogongju.net/tag/%E5%85%B4%E8%B6%A3" target="_blank">兴趣</a>的可以<a title="研究" href="http://www.haogongju.net/tag/%E7%A0%94%E7%A9%B6" target="_blank">研究</a>研究：<br /><br /><a href="http://pluralsight.com/blogs/fritz/archive/2005/10/14/15566.aspx" target="_blank" rel="nofollow">http://pluralsight.com/blogs/fritz/archive/2005/10/14/15566.aspx</a><br /><br />我是试了半天，没有<a title="成功" href="http://www.haogongju.net/tag/%E6%88%90%E5%8A%9F" target="_blank">成功</a>，就放弃了。<br /><br />4. 顺便说一下 FindControl()<br /><br />最常见也最让人头疼的就是 "<a class="l" href="http://forum.aspitalia.com/forum/post/260506/ObjectReferenceNotSetANInstanceOFANObject.aspx" target="_blank" rel="nofollow"><font color="#cc0033">Object reference</font><font color="#0000cc"> not set to an instance of an </font><font color="#cc0033">object</font></a>" 错误了。因为FindControl()需要从上往下逐级才能找到目标控件，<a title="特别" href="http://www.haogongju.net/tag/%E7%89%B9%E5%88%AB" target="_blank">特别</a>是使用了master page的时候就更加麻烦。这个时候，需要使用如下的访问形式：<br /><br />Label lblA1= (Label)Page.PreviousPage.FindControl("ctl00$ContentPlaceHolder1$lblA1"); 
<p>&nbsp;</p></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/378046.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-13 15:49 <a href="http://www.blogjava.net/liuyz2006/articles/378046.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SqlCommandBuilder</title><link>http://www.blogjava.net/liuyz2006/articles/377475.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 06 May 2012 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/377475.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/377475.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/377475.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/377475.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/377475.html</trackback:ping><description><![CDATA[<div class="clear"></div>
<div class="lemma-main-content" id="lemmaContent-0">　　作用：c#中用来批量更新数据库 
<div class="spctrl"></div>　　用法：一般和adapter结合使用。 
<div class="spctrl"></div>　　例： 
<div class="spctrl"></div>　　SqlConnection conn = new SqlConnection(strConnection));//连接数据库 
<div class="spctrl"></div>　　DataSet ds=new DataSet(); 
<div class="spctrl"></div>　　SqlDataAdapter myAdapter = new SqlDataAdapter();//new一个adapter对象 
<div class="spctrl"></div>　　adapter.SelectCommand = new SqlCommand("select * from "+strTblName),(SqlConnection) conn); //cmd 
<div class="spctrl"></div>　　SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter); //new 一个 SqlCommandBuilder 
<div class="spctrl"></div>　　myAdapter.Fill(ds); 
<div class="spctrl"></div>　　myAdapter.InsertCommand = myCommandBuilder .GetInsertCommand();//插入 
<div class="spctrl"></div>　　myAdapter.UpdateCommand = myCommandBuilder .GetUpdateCommand();//更新 
<div class="spctrl"></div>　　myAdapter.DeleteCommand = myCommandBuilder .GetDeleteCommand();//删除 
<div class="spctrl"></div>　　conn.Open();//打开数据库 
<div class="spctrl"></div>　　myAdapter.Update(ds); //更新ds到数据库 
<div class="spctrl"></div>　　conn.Close();//关闭数据库 
<div class="spctrl"></div>　　何时使用： 
<div class="spctrl"></div>　　a. 有时候需要缓存的时候，比如说在一个商品选择界面，选择好商品，并且进行编辑/删除/更新后， 
<div class="spctrl"></div>　　最后一并交给数据库，而不是每一步操作都访问数据库，因为客户选择商品可能进行n次编辑/删除 
<div class="spctrl"></div>　　更新操作，如果每次都提交，不但容易引起数据库冲突,引发错误，而且当数据量很大时在用户执行 
<div class="spctrl"></div>　　效率上也变得有些慢 
<div class="spctrl"></div>　　b.有的界面是这样的有的界面是这样的，需求要求一定用缓存实现，确认之前的操作不提交到库,点击 
<div class="spctrl"></div>　　页面专门提交的按钮时才提交商品选择信息和商品的其它信息. 我经常遇到这样的情况 
<div class="spctrl"></div>　　c.有些情况下只往数据库里更新，不读取. 也就是说没有从数据库里读，SqlDataAdapter也就不知道是 
<div class="spctrl"></div>　　更新哪张表了，调用Update就很可能出错了。这样的情况下可以用SqlCommandBuilder 了 
<div class="spctrl"></div>　　（此段参考了他人所作） 
<div class="spctrl"></div>　　d.在使用adapter的时候如果不是用设计器的时候，并且要用到adapter.Update（）函数的时候，这时候要注意 
<div class="spctrl"></div>　　SqlCommandBuilder必须要有 
<div class="spctrl"></div>　　常见错误： 
<div class="spctrl"></div>　　一些初学者经常会在使用adapter的时候忘了使用SqlCommandBuilder，即使用了也会忘了用 
<div class="spctrl"></div>　　myAdapter.UpdateCommand = myCommandBuilder .GetUpdateCommand();//更新， 
<div class="spctrl"></div>　　还自以为是很对，感觉烦躁不可救药。 
<div class="spctrl"></div>　　摘自msdn 
<div class="spctrl"></div>　　The following example uses the derived class, OleDbDataAdapter, to update the data source. 
<div class="spctrl"></div>　　C# 
<div class="spctrl"></div>　　public DataSet CreateCmdsAndUpdate(string connectionString, string queryString) 
<div class="spctrl"></div>　　{ 
<div class="spctrl"></div>　　using (OleDbConnection connection = new OleDbConnection(connectionString)) 
<div class="spctrl"></div>　　{ 
<div class="spctrl"></div>　　OleDbDataAdapter adapter = new OleDbDataAdapter(); 
<div class="spctrl"></div>　　adapter.SelectCommand = new OleDbCommand(queryString, connection); 
<div class="spctrl"></div>　　OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter); 
<div class="spctrl"></div>　　connection.Open(); 
<div class="spctrl"></div>　　DataSet customers = new DataSet(); 
<div class="spctrl"></div>　　adapter.Fill(customers); 
<div class="spctrl"></div>　　//code to modify data in dataset here 
<div class="spctrl"></div>　　adapter.Update(customers); 
<div class="spctrl"></div>　　return customers; 
<div class="spctrl"></div>　　} 
<div class="spctrl"></div>　　}</div><img src ="http://www.blogjava.net/liuyz2006/aggbug/377475.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-06 16:24 <a href="http://www.blogjava.net/liuyz2006/articles/377475.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用SqlCommandBuilder 实现批量更新</title><link>http://www.blogjava.net/liuyz2006/articles/377474.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Sun, 06 May 2012 08:10:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/377474.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/377474.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/377474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/377474.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/377474.html</trackback:ping><description><![CDATA[用SqlCommandBuilder&nbsp;实现批量更新<!-- 正文开始 -->

<div class="articalContent  " id="sina_keyword_ad_area2">
<p>一般是这样的，如果用设计器将SqlDataAdapter拖到页面中使用时，不会出现SqlDataAdapter.Update(ds)更新时出错情况，因为系统会自动生成SqlDataAdapter的属性命令，比如:&nbsp;<wbr> .UpdateCommane insertCommand selectCommand等。&nbsp;<wbr> 但是有些程序员不喜欢用设计器，或者是有些地方没必要拖动SqlDataAdapter这么个庞大物来实现,那么SqlDataAdapter就不会自动生成相关的查询或更新语句了.&nbsp;<wbr>&nbsp;<wbr> 所以当执行到SqlDataAdapter.Update(ds)语句时，SqlDataAdapter桥接器不知道更新哪个表.不报错了.&nbsp;<wbr></p>
<p>解决方法:</p>
<p>&nbsp;<wbr> 用SqlCommandBuilder 实现批量更新</p>
<p>&nbsp;<wbr> 1.功能：</p>
<p>&nbsp;<wbr>&nbsp;<wbr> 可以实现你对DataSet在UI层做任意操作后，直接丢给这个方法，这个方法就可以自动把你的修改更 新到数据库中,而没必要每次都更新到</p>
<p>&nbsp;<wbr>&nbsp;<wbr> 数据库</p>
<p>&nbsp;<wbr> 2.使用方法<br />&nbsp;<wbr> public int UpdateByDataSet(DataSet ds,string strTblName,string strConnection)<br />&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr> try<br />&nbsp;<wbr> {<br />&nbsp;<wbr>&nbsp;<wbr> SqlConnection&nbsp;<wbr> conn = new SqlConnection(strConnection));<br />&nbsp;<wbr>&nbsp;<wbr> SqlDataAdapter myAdapter = new SqlDataAdapter();<br />&nbsp;<wbr>&nbsp;<wbr> SqlCommand myCommand = new SqlCommand("select * from "+strTblName),(SqlConnection)this.conn);&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />&nbsp;<wbr>&nbsp;<wbr> myAdapter.SelectCommand = myCommand;<br />&nbsp;<wbr>&nbsp;<wbr> SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />&nbsp;<wbr>&nbsp;<wbr> myAdapter.Update(ds,strTblName);&nbsp;<wbr><br />&nbsp;<wbr>&nbsp;<wbr> return 0;<br />}<br />catch(BusinessException errBU)<br />{&nbsp;<wbr><br />&nbsp;<wbr>&nbsp;<wbr> throw errBU;<br />}&nbsp;<wbr>&nbsp;<wbr><br />catch(Exception err)<br />{&nbsp;<wbr><br />&nbsp;<wbr>&nbsp;<wbr> throw new BusinessException(err);<br />}<br />}</p>
<p>直接调用这个方法就可以啦,说明的一点是select * from "+strTblName是一定要的，<br />作用大家也应该想到了，主要是告诉 SqlDataAdapter更新哪个表</p>
<p>3.什么时候用?</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> a. 有时候需要缓存的时候，比如说在一个商品选择界面，选择好商品，并且进行编辑/删除/更新后，</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 最后一并交给数据库，而不是每一步操作都访问数据库，因为客户选择商品可能进行n次编辑/删除</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 更新操作，如果每次都提交，不但容易引起数据库冲突,引发错误，而且当数据量很大时在用户执行</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 效率上也变得有些慢</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> b.有的界面是这样的有的界面是这样的，需求要求一定用缓存实现，确认之前的操作不提交到库,点击</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 页面专门提交的按钮时才提交商品选择信息和商品的其它信息. 我经常遇到这样的情况</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> c.有些情况下只往数据库里更新，不读取. 也就是说没有从数据库里读，SqlDataAdapter也就不知道是<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 更新哪张表了，调用Update就很可能出错了。这样的情况下可以用SqlCommandBuilder 了.</p>
<p>4.<br />注意点:<br />&nbsp;<wbr> 1.只能更新一个表，不能更新两个或两个以上相关联的表<br />&nbsp;<wbr> 2.表中必须有主键<br />&nbsp;<wbr> 3.更新的表中字段不能有image类型的</p>
<p>5.优点:</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 节省代码量，节省时间，这个方法可以代替所有的:&nbsp;<wbr> 更新/删除/插入操作语句</p>
<p>6.缺点:<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 访问两次数据库(select * TableName,就是这句，要确认是哪个表，除非是很大的数据量，<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 一般是感觉不到的)，效率有些慢</p></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/377474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-06 16:10 <a href="http://www.blogjava.net/liuyz2006/articles/377474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>由IDisposable接口导致的using使用 以及using的其他用法</title><link>http://www.blogjava.net/liuyz2006/articles/377356.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Fri, 04 May 2012 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/377356.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/377356.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/377356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/377356.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/377356.html</trackback:ping><description><![CDATA[<div><h1><a id="cb_post_title_url" href="http://www.cnblogs.com/xhiyu/archive/2011/02/09/1950377.html">由IDisposable接口导致的using使用 以及using的其他用法</a></h1> 	 		 			<p>在ADO.NET中，通过SqlConnection类创建SQLServer的连接，SqlConnection类实现了IDisposable接口.想这样实现了这个接口的类如果被实例化了，并不会被系统回收，所以要手动回收。</p> <p>除了使用using(SqlConnection conn = new SqlConnection(strConn)){},</p> <p>我们还可以，try{}finally{conn.close();conn.dispose();}</p>  <p>using使用总结（以下为转载部分，来自:<a href="http://www.cnblogs.com/hefei_wangyan/archive/2011/01/05/1926557.html">http://www.cnblogs.com/hefei_wangyan/archive/2011/01/05/1926557.html</a>）</p> <p>using这个关键字在C#中共用三个用法：&nbsp;</p> <p> </p><div id="cnblogs_post_body"> <div> <div>1. using指令。using + 命名空间名字，这样可以在程序中直接用命令空间中的类型，而不必指定类型的详细命名空间，类似于Java的import，这个功能也是最常用的，几乎每个cs的程序都会用到。</div> <div>例如：using System; 一般都会出现在*.cs中。</div> <div>2.using别名。using + 别名 = 包括详细命名空间信息的具体的类型。</div> <div>这种做法有个好处就是当同一个cs引用了两个不同的命名空间，但两个命名空间都包括了一个相同名字的类型的时候。当需要用到这个类型的时候，就 每个地方都要用详细命名空间的办法来区分这些相同名字的类型。而用别名的方法会更简洁，用到哪个类就给哪个类做别名声明就可以了。注意：并不是说两个名字 重复，给其中一个用了别名，另外一个就不需要用别名了，如果两个都要使用，则两个都需要用using来定义别名的。</div> <div>3.using语句，定义一个范围，在范围结束时处理对象。</div> <div>场景：</div> <div>当在某个代码段中使用了类的实例，而希望无论因为什么原因，只要离开了这个代码段就自动调用这个类实例的Dispose。要达到这样的目的，用try...catch来捕捉异常也是可以的，但用using也很方便。</div> <div>这里触发cls1和cls2的Dispose条件是到达using语句末尾或者中途引发了异常并且控制离开了语句块。</div> </div> </div></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/377356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-04 11:11 <a href="http://www.blogjava.net/liuyz2006/articles/377356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SqlConnection</title><link>http://www.blogjava.net/liuyz2006/articles/377266.html</link><dc:creator>阿者</dc:creator><author>阿者</author><pubDate>Thu, 03 May 2012 04:46:00 GMT</pubDate><guid>http://www.blogjava.net/liuyz2006/articles/377266.html</guid><wfw:comment>http://www.blogjava.net/liuyz2006/comments/377266.html</wfw:comment><comments>http://www.blogjava.net/liuyz2006/articles/377266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyz2006/comments/commentRss/377266.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyz2006/services/trackbacks/377266.html</trackback:ping><description><![CDATA[<h1>SqlConnection</h1>
<div class="blog-article-date">
<div class="date">2008-07-13 14:52 </div></div>
<div class="blog-article-pic" id="blogarticlefont">
<p>using System;<br />using System.Data;<br />using System.Configuration;<br />using System.Collections;<br />using System.Web;<br />using System.Web.Security;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />using System.Web.UI.WebControls.WebParts;<br />using System.Web.UI.HtmlControls;<br />using System.Data.SqlClient;<br />using System.Data.Common;</p>
<p>namespace SqlConn<br />{<br />&nbsp;&nbsp;&nbsp; public partial class _Default : System.Web.UI.Page<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void Page_Load(object sender, EventArgs e)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //建立数据源链接<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlConnection nwind_conn = new SqlConnection();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nwind_conn.ConnectionString = "server=localhost;database=Bookstore;uid=sa;pwd=sa; Connection Timeout=15; Packet Size=8192;Persist Security Info=true;";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //建立数据读取<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCommand nwind_comm = new SqlCommand();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nwind_comm.Connection = nwind_conn;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nwind_comm.CommandText = "SELECT book_name from book_info";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nwind_comm.CommandTimeout = 25;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nwind_comm.CommandType = CommandType.Text;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打开数据源链接<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nwind_conn.Open();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //建立事务,要建立事务须先打开和数据库的链接<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlTransaction Tran;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tran = nwind_conn.BeginTransaction();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nwind_comm.Transaction = Tran;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //结束并提交事务,应在数据读取前(即没有执行ExecuteNonQuery,ExecuteReader,ExecuteScalar,ExecuteXmlReader)前结束事务<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tran.Commit();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //或:Tran.Rollback();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //执行数据读取<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataReader reader = nwind_comm.ExecuteReader();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //尝试取消命令的执行,如果尝试失败不会产生异常<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nwind_comm.Cancel();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //关闭数据源链接<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nwind_conn.Close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}</p></div><img src ="http://www.blogjava.net/liuyz2006/aggbug/377266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyz2006/" target="_blank">阿者</a> 2012-05-03 12:46 <a href="http://www.blogjava.net/liuyz2006/articles/377266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>