﻿<?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>博客园-谷哥</title><link>http://www.cnblogs.com/ktgu/</link><description>努力读书不如论坛看贴</description><language>zh-cn</language><lastBuildDate>Sat, 05 Jul 2008 03:45:47 GMT</lastBuildDate><pubDate>Sat, 05 Jul 2008 03:45:47 GMT</pubDate><ttl>60</ttl><item><title>正则表达式笔记</title><link>http://www.cnblogs.com/ktgu/archive/2007/06/19/789215.html</link><dc:creator>ktgu</dc:creator><author>ktgu</author><pubDate>Tue, 19 Jun 2007 07:15:00 GMT</pubDate><guid>http://www.cnblogs.com/ktgu/archive/2007/06/19/789215.html</guid><wfw:comment>http://www.cnblogs.com/ktgu/comments/789215.html</wfw:comment><comments>http://www.cnblogs.com/ktgu/archive/2007/06/19/789215.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ktgu/comments/commentRss/789215.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ktgu/services/trackbacks/789215.html</trackback:ping><description><![CDATA[<p>限定符的概念：</p>
<p>&nbsp;非显式限定符(3 个):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*：出现0或多次<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+：出现1或多次<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;？：出现0或1次</p>
<p>&nbsp;显式限定符:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用显式限定符则可准确指定数字、范围或数字集,&nbsp;&nbsp;显式限定符使用花括号 {} 及其中的数字值表示模式出现次数的上下限</p>
<p>&nbsp;&nbsp;&nbsp;a{5}&nbsp;:&nbsp;准确匹配5个字符"a"<br>&nbsp;&nbsp;&nbsp;a{,5}:&nbsp;0到5个字符"a"<br>&nbsp;&nbsp;&nbsp;a{5,}&nbsp;5到任意个字符"a"<br>&nbsp;&nbsp;&nbsp;a{2,3}&nbsp;2到3个字符"a"</p>
<p>元字符的概念：</p>
<p>&nbsp;在正则表达式中，有一种意义特殊的构造，即元字符 。如：* ? +&nbsp; { } $ ^ . [ ( | ) ] \</p>
<p>&nbsp;.：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可指定字符串（或行）的开始<br>&nbsp;$ :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可指定字符串（或行）的结束<br>&nbsp;\ (反斜杠):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果要匹配元字符，必须使用反斜杠进行&#8220;转义&#8221;。<br>&nbsp;| (管道):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a|b 将匹配包含&#8220;a&#8221;或&#8220;b&#8221;的任何输入内容<br>&nbsp;括号():&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用于给模式分组,它允许使用限定符让一个完整模式出现多次,如：(ab){2,3}模式匹配abab,ababab</p>
<p>字符类的概念：<br>&nbsp;在方括号 [ ] 中定义, 格式如：[字符表],它仅匹配字符表中的一个字符<br>&nbsp;<br>&nbsp;指定任何数值数字: [0123456789]<br>&nbsp;使用连字符(-) 来定义字符的范围<br>&nbsp;[0-9],[a-z],[A-Z]<br>&nbsp;仅在连字符不是第一个字符时，连字符才在字符类中有特殊含义,如果需要在范围中包括连字符，将它指定为第一个字符</p>
<p>注意，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.正则表达式元字符在字符类中不做特殊处理，所以这些元字符不需要转义</p>
<p>字符类是与其他正则表达式语言分开的一种语言,字符类有自己的规则和语法:<br>字符 ^ :&nbsp;&nbsp;&nbsp;表示否定此类, 如：[^123456]匹配除123456以外的字符.<br>注：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;^ 在字符类中的作用与它在正则表达式模式中的作用完全不同。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;如果要否定连字符(-)，应将连字符作为字符类的第二个字符，如 ^[^-][0-9]$&nbsp;&nbsp; 匹配 0、1、2、... （不匹配 -0、-1、 -2 等）<br><br></p>
<h2>资源</h2>
<p>正则表达式库 <a href="http://www.regexlib.com/" target=_blank>http://www.regexlib.com/</a></p>
<p>正则表达式讨论列表 <a href="http://aspadvice.com/login.aspx?ReturnUrl=%2fSignUp%2flist.aspx%3fl%3d68%26c%3d16&amp;l=68&amp;c=16" target=_blank>http://aspadvice.com/login.aspx?ReturnUrl=%2fSignUp%2flist.aspx%3fl%3d68%26c%3d16&amp;l=68&amp;c=16</a></p>
<p>正则表达式论坛 <a href="http://forums.regexadvice.com/" target=_blank>http://forums.regexadvice.com/</a></p>
<p>正则表达式 Web 日志 <a href="http://blogs.regexadvice.com/" target=_blank>http://blogs.regexadvice.com/</a></p>
<p>Mastering Regular Expressions (O'Reilly)，作者 Jeffrey Friedl <a href="http://www.regex.info/" target=_blank>http://www.regex.info/</a></p>
<p>.NET 正则表达式参考 <a href="http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemTextRegularExpressions.asp" target=_blank>http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemTextRegularExpressions.asp</a></p>
<p>Jscript 正则表达式语法 <a href="http://www.msdn.microsoft.com/library/en-us/script56/html/js56jsgrpRegExpSyntax.asp" target=_blank>http://www.msdn.microsoft.com/library/en-us/script56/html/js56jsgrpRegExpSyntax.asp</a></p>
<p>正则表达式信息 <a href="http://www.regular-expressions.info/" target=_blank>http://www.regular-expressions.info/</a></p><img src ="http://www.cnblogs.com/ktgu/aggbug/789215.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37540/" target="_blank">[新闻]微软在台北发布新色鼠标产品</a>]]></description></item><item><title>一个超级NB的面试问答(转)</title><link>http://www.cnblogs.com/ktgu/archive/2007/03/31/695120.html</link><dc:creator>ktgu</dc:creator><author>ktgu</author><pubDate>Sat, 31 Mar 2007 08:06:00 GMT</pubDate><guid>http://www.cnblogs.com/ktgu/archive/2007/03/31/695120.html</guid><wfw:comment>http://www.cnblogs.com/ktgu/comments/695120.html</wfw:comment><comments>http://www.cnblogs.com/ktgu/archive/2007/03/31/695120.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/ktgu/comments/commentRss/695120.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ktgu/services/trackbacks/695120.html</trackback:ping><description><![CDATA[A：请写一个文件拷贝函数。
<div style="FONT-SIZE: 8pt">Q：你说的&#8220;拷贝&#8221;是什么意思？</div>
<div style="FONT-SIZE: 8pt">A：嗯。。。。就是把一个文件的内容拷贝到新的文件</div>
<div style="FONT-SIZE: 8pt">Q：考不考虑日期/时间？</div>
<div style="FONT-SIZE: 8pt">A：不用，那些不用被拷贝。</div>
<div style="FONT-SIZE: 8pt">Q：目标文件可以和源文件同名么？</div>
<div style="FONT-SIZE: 8pt">A：嗯。。。不行</div>
<div style="FONT-SIZE: 8pt">Q：那我不用担心假名攻击（name spoofing）？比如说土耳其语的I。（注意哈，土耳其语的I有四种写法，和英语的I相似而不同）。</div>
<div style="FONT-SIZE: 8pt">A：不用担心。</div>
<div style="FONT-SIZE: 8pt">Q：文件属性呢？</div>
<div style="FONT-SIZE: 8pt">A：新文件和老文件的属性一样</div>
<div style="FONT-SIZE: 8pt">Q：那我应该修改老文件的属性么？如果这个拷贝操作时备份或者存档操作的一部分，那可能不应该保留&#8217;Archive&#8217;这个属性。</div>
<div style="FONT-SIZE: 8pt">A：不用，保持原样就行了。</div>
<div style="FONT-SIZE: 8pt">Q：那万一源文件的&#8217;Archive&#8217;属性被关掉了呢？如果新文件的这个属性也被我关掉，可能会搞坏用户的备份软件。</div>
<div style="FONT-SIZE: 8pt">A：就让它们一样。我不在乎用户的备份软件。</div>
<div style="FONT-SIZE: 8pt">Q：这样为用户设计软件好像不好吧？</div>
<div style="FONT-SIZE: 8pt">A：。。。</div>
<div style="FONT-SIZE: 8pt">Q：文件压缩怎么办？这是个文件属性，但拷贝目的地不一定支持压缩。</div>
<div style="FONT-SIZE: 8pt">A：不用管文件压缩。</div>
<div style="FONT-SIZE: 8pt">Q：哪怕源文件被压缩了，而拷贝目的地不支持压缩？</div>
<div style="FONT-SIZE: 8pt">A：对头！</div>
<div style="FONT-SIZE: 8pt">Q：那加密呢？如果源文件被加了密，而拷贝目的地不支持加密？</div>
<div style="FONT-SIZE: 8pt">A：如果目的地不支持加密就不要加密。</div>
<div style="FONT-SIZE: 8pt">Q：哎呀不好意思，我不是想岔开话题。不过。。。这样不是很大的安全隐患么？特别当这个文件拷贝函数支持任意多个参数的时候（直接或者间接）。</div>
<div style="FONT-SIZE: 8pt">A：靠！他妈的把文件拷贝过去就行了！</div>
<div style="FONT-SIZE: 8pt">Q：创建文件的用户呢？</div>
<div style="FONT-SIZE: 8pt">A：不用管。</div>
<div style="FONT-SIZE: 8pt">Q：那文件的所有人呢？</div>
<div style="FONT-SIZE: 8pt">A：不用管。</div>
<div style="FONT-SIZE: 8pt">Q：那文件权限呢？有没有啥么方法来处理继承的权限和赋予的权限？</div>
<div style="FONT-SIZE: 8pt">A：不要管权限了。</div>
<div style="FONT-SIZE: 8pt">Q：那这个函数会在什么系统上运行？</div>
<div style="FONT-SIZE: 8pt">A：Windows XP</div>
<div style="FONT-SIZE: 8pt">Q：Home, Pro, Media Center，或者多于一个版本？</div>
<div style="FONT-SIZE: 8pt">A：Pro</div>
<div style="FONT-SIZE: 8pt">Q：哪一个Service Pack？</div>
<div style="FONT-SIZE: 8pt">A：SP2</div>
<div style="FONT-SIZE: 8pt">Q：也就是说我们不用支持其它的Service Pack？</div>
<div style="FONT-SIZE: 8pt">A：对阿</div>
<div style="FONT-SIZE: 8pt">Q：咋个提供源文件名？</div>
<div style="FONT-SIZE: 8pt">A：用参数传进去。</div>
<div style="FONT-SIZE: 8pt">Q：那则个参数十一个以null结尾的字符串，一个计数的字符串（学Pascal的都知道哈），还是一个对象？</div>
<div style="FONT-SIZE: 8pt">A：以Null计数的字符串。</div>
<div style="FONT-SIZE: 8pt">Q：Null指针可能被传进去么？</div>
<div style="FONT-SIZE: 8pt">A：不可能。</div>
<div style="FONT-SIZE: 8pt">Q：那文件名的编码呢？</div>
<div style="FONT-SIZE: 8pt">A：Unicode。</div>
<div style="FONT-SIZE: 8pt">Q：不好意思，这个这个。。。Unicode不能算编码。如果我们用Unicode数据，我们必须知道具体的编码，比如UTF-8, UCS-2, UTF-16，等等。</div>
<div style="FONT-SIZE: 8pt">A：你够狠！UTF－8。</div>
<div style="FONT-SIZE: 8pt">Q：好嘛。我只是想说把UTF-8转换成UTF-16，好让Windows API调用工作，还是有点痛苦的。</div>
<div style="FONT-SIZE: 8pt">A：射！UTF-8!</div>
<div style="FONT-SIZE: 8pt">Q：Big-endian还是small-endian?</div>
<div style="FONT-SIZE: 8pt">A：啊―――随便你丫的！</div>
<div style="FONT-SIZE: 8pt">Q：那我们接受相对路径还是绝对路径？</div>
<div style="FONT-SIZE: 8pt">A：就绝对路径。</div>
<div style="FONT-SIZE: 8pt">Q：那些路径有没有什么需要过滤的特征？</div>
<div style="FONT-SIZE: 8pt">A：没有。用户自己搞定。</div>
<div style="FONT-SIZE: 8pt">Q：怎么生成目标文件名？或者用户提供？</div>
<div style="FONT-SIZE: 8pt">A：。。。</div>
<div style="FONT-SIZE: 8pt">Q：要不要(或者允不允许)我提供异步拷贝操作？</div>
<div style="FONT-SIZE: 8pt">A：不。</div>
<div style="FONT-SIZE: 8pt">Q：我该怎么报错？Exception？Error code？</div>
<div style="FONT-SIZE: 8pt">A：随便。</div>
<div style="FONT-SIZE: 8pt">Q：我是该在被调用的函数内部处理错误呢，还是把错误传给调用者？</div>
<div style="FONT-SIZE: 8pt">A：嗯。。。传出去。</div>
<div style="FONT-SIZE: 8pt">Q：如果目标文件已经存在怎么办？</div>
<div style="FONT-SIZE: 8pt">A：不会的。</div>
<div style="FONT-SIZE: 8pt">Q：也就是调用人确保这点？</div>
<div style="FONT-SIZE: 8pt">A：对。</div>
<div style="FONT-SIZE: 8pt">Q：也就是说如果目标文件的确存在，我可以立刻终结程序运行？但这个明显违背了前置条件，而且鬼才知道会出什么问题。</div>
<div style="FONT-SIZE: 8pt">A：射。随你丫的。</div>
<div style="FONT-SIZE: 8pt">Q：那轮换数据流呢？</div>
<div style="FONT-SIZE: 8pt">A：随便你！！</div>
<div style="FONT-SIZE: 8pt">Q：老大，我真地不好意思，如果你觉得被我挑衅了。不要生气哈。我只是想在动手前得到一个清晰完整的规格。很明显如果我要写一个文件拷贝函数，而不是用各种库里现成的文件函数，这个新的函数需要满足某套特殊需求，所以我需要知道那些问题的确切答案。如果你无所谓，我可以在一分钟内整出一个函数来，但肯定有很多问题都没有解决。</div>
<div style="FONT-SIZE: 8pt">A：啊！！！！！！！！！！！！！！！！！！！！！！！！</div><img src ="http://www.cnblogs.com/ktgu/aggbug/695120.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37539/" target="_blank">[新闻]Hitwise:雅虎流量来自Google搜索比来自雅虎搜索的还多</a>]]></description></item><item><title>智能客户端(Smart Client)应用程序开发</title><link>http://www.cnblogs.com/ktgu/archive/2006/12/01/579504.html</link><dc:creator>ktgu</dc:creator><author>ktgu</author><pubDate>Fri, 01 Dec 2006 15:50:00 GMT</pubDate><guid>http://www.cnblogs.com/ktgu/archive/2006/12/01/579504.html</guid><wfw:comment>http://www.cnblogs.com/ktgu/comments/579504.html</wfw:comment><comments>http://www.cnblogs.com/ktgu/archive/2006/12/01/579504.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/ktgu/comments/commentRss/579504.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ktgu/services/trackbacks/579504.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好久前就听说过微软提出的智能客户端的概念,当时总以为微软又推出什么新的替代现有技术的新技术,是不是又会引起什么新的技术革命,心想作一个忠实的微软Fans也不太容易啊,也真够累的.本也想关注一下,但一直工作也忙,也由于别的方面学的还不够扎实,所以也没有太多的时间来研究这个东东.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;直到最近这几个月的时间内总算很清闲,倒也没什么事,于是花了点时间研究研究.才算对智能客户端有了一些认识.&nbsp;&nbsp;我们从.NET Framework和利用Visual Studio.NET，微软在Smart Client的设计、开发、测试和部署等各个阶段都提供了全面的支持可以看出微软还是力推Smart Clien的,未来几年很有发展前途.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;智能客户端定义:</span><a style="PAGE-BREAK-BEFORE: auto; PAGE-BREAK-AFTER: auto" href="https://thesource.ofallevil.com/china/msdn/developercenter/smartclient/SmartClientDefinition.aspx"><span style="FONT-SIZE: 8pt">https://thesource.ofallevil.com/china/msdn/developercenter/smartclient/SmartClientDefinition.aspx</span></a><br><br><span style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要想了解Smart Client到底是何方神圣,微软有专门的专题介绍以及系列教程,写这篇文章目的只是希望和朋友们有机会能共同探讨的机会!<br><br>微软网站有关于Smart Client的详细介绍<br><br>MSDN 智能客户端开发人员中心<br></span><a href="https://thesource.ofallevil.com/china/msdn/developercenter/SmartClient/default.mspx"><span style="FONT-SIZE: 8pt">https://thesource.ofallevil.com/china/msdn/developercenter/SmartClient/default.mspx</span></a><br><br><span style="FONT-SIZE: 8pt">微软Smart Client系列教程<br></span><a href="http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/consyscourse/smartclient.aspx"><span style="FONT-SIZE: 8pt">http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/consyscourse/smartclient.aspx</span></a><span style="FONT-SIZE: 8pt"> </span><img src ="http://www.cnblogs.com/ktgu/aggbug/579504.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37537/" target="_blank">[新闻]YouTube需提交用户信息 网民隐私或遭威胁</a>]]></description></item><item><title>C#2.0新的语法扩充(泛型,迭代器,匿名方法)</title><link>http://www.cnblogs.com/ktgu/archive/2006/11/29/576368.html</link><dc:creator>ktgu</dc:creator><author>ktgu</author><pubDate>Wed, 29 Nov 2006 07:14:00 GMT</pubDate><guid>http://www.cnblogs.com/ktgu/archive/2006/11/29/576368.html</guid><wfw:comment>http://www.cnblogs.com/ktgu/comments/576368.html</wfw:comment><comments>http://www.cnblogs.com/ktgu/archive/2006/11/29/576368.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/ktgu/comments/commentRss/576368.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ktgu/services/trackbacks/576368.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 8pt">1.匿名方法</p>
<p style="FONT-SIZE: 8pt">在C#1.0中典型的给一个委托添加一个方法调用代码如下:<br>private void ctrl_Click (object sender,EventArgs e)<br>txt.Click += new MyDelegate(ctrl_Click);<br>private ctrl_Click(object sender,EventArgs e)<br>{<br>&nbsp;Message.Show(...);<br>}<br>哪怕只有这么一条语句也必须得按上面的形式给事件的调用列表添加方法,还得创建一个委托的实例</p>
<p style="FONT-SIZE: 8pt">在C#2.0中引入了匿名方法,大大简化了上述操作<br>可以改写为<br>txt.Click += delegate {Message.Show();}<br>或是这样:<br>txt.Click += ctrl_Click也是允许的.</p>
<p style="FONT-SIZE: 8pt">C#编译器对上述的定义自动隐式转化,只要匿名方法和委托的定义兼容.<br>符合下列条件可以兼容<br>1.参数兼容<br>如果匿名方法没有参数,委托中没有out参数<br>如果匿名方法和委托的参数在数量,类型,顺序上都一致<br>2.返回值兼容<br>如果委托没有返回值,匿名方法中也没有返回值或匿名方法中只有return不带返回值<br>如果两者都有返回值,并且匿名方法的返回值可以隐式转化为委托定义的类型</p>
<p style="FONT-SIZE: 8pt">符合参数和返回值兼容的就可以使用匿名方法</p>
<p style="FONT-SIZE: 8pt"><br>匿名方法的捕获变量(capture variable)</p>
<p style="FONT-SIZE: 8pt">如果局部变量或参数的作用范围内包含匿名方法声明，则该局部变量或参数称为该匿名方法的外部变量或捕获变量</p>
<p style="FONT-SIZE: 8pt">public void method1(bool enabled)<br>{<br>&nbsp;string b;<br>&nbsp;this.txt.Click += delegate <br>&nbsp;{ <br>&nbsp; this.txt.enabled = enabled;<br>&nbsp; this.txt.Text = b;<br>&nbsp;}<br>}</p>
<p style="FONT-SIZE: 8pt">对于这个匿名方法来说:参数enabled和变量a是它的捕获变量或叫外部变量.<br>捕获变量的生命周期直到此匿名方法的资源被回收而结束</p>
<p style="FONT-SIZE: 8pt"><br>2.泛型<br>关于泛型的定义及如何使用网上资料已经很多,请参见MSDN</p>
<p style="FONT-SIZE: 8pt"><br>3.迭代器(iterators)</p>
<p style="FONT-SIZE: 8pt">在C#1.0中若想要使得类型成为可枚举的类型(即象使用数组一样用foreach一样枚举数组中的成员),那么这个类中必须实现IEnumerable接口的GetEnumerator()方法返回IEnumerator<br>public IEnumerator GetEnumerator()<br>{..}<br>一般来说实现GetEnumerator是不容易的.</p>
<p style="FONT-SIZE: 8pt">在C#2.0中引入了的新的语法扩充:迭代器,它能够很好的简单方便的让我们实现GetEnumerator()方法<br>如:<br>public IEnumerator GetEnumerator()<br>{<br>&nbsp;for ( int i = 0; i &lt; 10; i ++)<br>&nbsp;{<br>&nbsp; yield return i;<br>&nbsp;}<br>}</p>
<p style="FONT-SIZE: 8pt">假设类Class1中实现了上述的GetEnumertor方法<br>那我们就可以用foreach对类Class1进行枚举<br>Class1 c = new Class1;<br>foreach ( int i in c)<br>{<br>&nbsp;Console.WriteLine(i);<br>}</p>
<p style="FONT-SIZE: 8pt">yield return产生迭代的下一个值,yield break说明迭代完成,用迭代器实现就是这么简单.</p>
<p style="FONT-SIZE: 8pt">定义和使用命名迭代器</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp; class Class1<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public IEnumerator GetEnumerator()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 10; i++)<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; yield return i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 定义一个命名的迭代器,并可以提供参数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public IEnumerable MaxToMin(int min, int max)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = max; i &gt;= min; i--)<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; yield return i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 定义一个迭代器类型的属性,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public IEnumerable MinToMax<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // this表示该类实例,因为该类实现了GetEnumerator(),它是可枚举的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { yield return this; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public IEnumerable GetDescriptions()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yield return "this is my test";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yield return "class name is class1";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yield return "ktgu";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)<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; Class1 c = new Class1();</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (int i in c)<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; Console.WriteLine(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (int i in c.MaxToMin(1, 10))<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; Console.WriteLine(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (int i in c.MinToMax)<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; Console.WriteLine(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (string s in c.GetDescriptions())<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; Console.WriteLine(s);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 8pt">4.不完整代码<br>C#2.0中引入了一个"不全代码"的概念,即你可以将一个类的定义放在别的文件中.这样给大项目,大文件的维护带来方便.<br>声明:<br>[modifiers] partial type<br>modifier: [public/private/protected/internal] abstract new override static virtual extern <br>type:类/结构/接口</p>
<p style="FONT-SIZE: 8pt"><br>以上主要是偏向于介绍如何快速的应用这些新的语法点,详细概念及要领请参见MSDN<br></p><img src ="http://www.cnblogs.com/ktgu/aggbug/576368.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37535/" target="_blank">[新闻]纽约用户提前7天排队购iPhone</a>]]></description></item><item><title>对C#委托及事件委托的理解</title><link>http://www.cnblogs.com/ktgu/archive/2006/11/28/575279.html</link><dc:creator>ktgu</dc:creator><author>ktgu</author><pubDate>Tue, 28 Nov 2006 08:15:00 GMT</pubDate><guid>http://www.cnblogs.com/ktgu/archive/2006/11/28/575279.html</guid><wfw:comment>http://www.cnblogs.com/ktgu/comments/575279.html</wfw:comment><comments>http://www.cnblogs.com/ktgu/archive/2006/11/28/575279.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/ktgu/comments/commentRss/575279.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ktgu/services/trackbacks/575279.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 8pt">委托的声明</p>
<p style="FONT-SIZE: 8pt">public delegate void MyDelegate(string str);<br>注<br>1.委托的定义和方法的定义类似，只是在前面加了一个delegate,但委托不是方法，它是一种类型。是一种特殊的类型,看成是一种新的对象类型比较好理解。用于对与该委托有相</p>
<p style="FONT-SIZE: 8pt">同签名的方法调用。<br>2.委托相当于C++中的函数指针，但它是类型安全的。<br>3.委托是从System.Delegate派生，但不能象定义常规类型一样直接从System.Delegate派生，对委托的声明只能通过上面的声明格式进行定义。关键字delegate通知编译器这是一</p>
<p style="FONT-SIZE: 8pt">个委托类型，从而在编译的时候对该类进行封装,对这一过程C#定义了专门的语法来处理这一过程。<br>4.不能从一个委托类型进行派生，因为它也是默认sealed的<br>5.委托即可以对静态方法进行调用也可以对实例方法进行调用。<br>6.每个委托类型包含一个自己的调用列表，当组合一个委托或从一个委托中删除一个委托时都将产生个新的调用列表。<br>7.两个不同类型的委托即使它们有相同的签名和返回值，但还是两个不同类型的委托。但其实在使用中可看作是相同的。</p>
<p style="FONT-SIZE: 8pt"><br>委托的比较</p>
<p style="FONT-SIZE: 8pt">C#中对委托定义了两个操作符 == 和 !=<br>在以下情况下两个委托是相等的：<br>1.当两个委托都同时为null的时候<br>2.当两个委托都不为null时,下列情况下是相等的。<br>a.当两个委托的各自的调用列表只含有一个入口点的时候<br>&nbsp;&nbsp; 在下列情况下是相等的<br>&nbsp;&nbsp; (1) 调用同一对象的同一静态方法<br>&nbsp;&nbsp; (2) 调用同一对象的同一实例方法<br>b.当两个委托具有多个入口点时<br>&nbsp;&nbsp; 在下列情况下是相等的<br>&nbsp;&nbsp; (1)只有当它们调用列表中的调用的方法按顺序都一一对应相同的对象及对象的同一方法的时候</p>
<p style="FONT-SIZE: 8pt">如上所述的两个不同类型的委托但是它们具有相同的签名和返回值时，只要满足上述条件的，即使它们类型不同，但比较的结果也是相同的。</p>
<p style="FONT-SIZE: 8pt">委托的异常处理</p>
<p style="FONT-SIZE: 8pt">当调用该委托的方法中发生了异常时，首先在调用该委托的方法中搜寻catch语句块。如果没有，则去该委托调用的方法中去寻找有没有catch语句块，这和调用方法发生异常的处</p>
<p style="FONT-SIZE: 8pt">理是一样的。</p>
<p style="FONT-SIZE: 8pt">当调用一个为null的委托即委托中列表中不存在调用方法时，将发生NullRefrenceException</p>
<p style="FONT-SIZE: 8pt">委托的注意点:<br>当一个委托有多个入口点的时候,调用委托将依该委托的调用列表中的方法的顺序依次调用.这些方法共享一个参数集合,所以当委托有返回值的时候调用完这个委托后的返回值是最</p>
<p style="FONT-SIZE: 8pt">后一个方法的返回值或是有out参数.如果该委托的参数为ref(引用类型),那么在招待第一个方法的时候如果对这个参数的值有所改变,那么这个改变将会影响到后面的方法调用.</p>
<p style="FONT-SIZE: 8pt">委托的一个例子</p>
<p style="FONT-SIZE: 8pt">using System;<br>using System.Collections.Generic;<br>using System.Text;</p>
<p style="FONT-SIZE: 8pt">namespace ConsoleApplication1<br>{<br>&nbsp;&nbsp;&nbsp; class Program<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 创建一个委托实例，封装C类的静态方法M1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyDelegate d1 = new MyDelegate(C.M1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d1("D1"); // M1</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 创建一个委托实例，封装C类的静态方法M2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyDelegate d2 = new MyDelegate(C.M2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d2("D2"); // M2</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 创建一个委托实例，封装C类的实例方法M3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyDelegate d3 = new MyDelegate(new C().M3);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d3("D3"); // M3</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 从一个委托d3创建一个委托实例<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyDelegate d4 = new MyDelegate(d3);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d4("D4"); // M3</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 组合两个委托<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyDelegate d5 = d1 + d2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d5 += d3;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d5("D5"); // M1,M2,M3</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 从组合委托中删除d3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyDelegate d6 = d5 - d3;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d6("D6"); // M1,M2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d6 -= d3; // 虽然d6调用列表中已经没有d3了，但这样只是不可能的移除没有错误发生<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d6("D6"); // M1,M2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d6 -= d6;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //d6("D6"); 此时d6的调用列表为空，d6为null,所以引发System.NullReferenceException</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyDelegate d7 = new MyDelegate(C1.P1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d7("D7"); // C1.P1</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyDelegate d8 = new MyDelegate(new C2().P1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d8("D8"); // C2.P1</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp; // 声明一个委托MyDelegate<br>&nbsp;&nbsp;&nbsp; public delegate void MyDelegate(string str);</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp; public class C<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void M1(string str)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("From:C.M1:&nbsp;&nbsp; {0}", str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void M2(string str)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("From:C.M2:&nbsp;&nbsp; {0}", str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void M3(string str)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("From:C.M3:&nbsp;&nbsp; {0}", str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp; public class C1<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void P1(string str)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("From:C1.P1:&nbsp;&nbsp; {0}", str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp; public class C2<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void P1(string str)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("From:C2.P1:&nbsp;&nbsp; {0}", str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>}</p>
<p style="FONT-SIZE: 8pt">事件委托</p>
<p style="FONT-SIZE: 8pt">事件概述</p>
<p style="FONT-SIZE: 8pt">事件就是当对象或类状态发生改变时，对象或类发出的信息或通知。发出信息的对象或类称为"事件源",对事件进行处理的方法称为"接收者",通常事件源在发出状态改变信息时,它</p>
<p style="FONT-SIZE: 8pt">并不知道由哪个事件接收者来处理.这就需要一种管理机制来协调事件源和接收者,C++中通过函数指针来完成的.在C#中事件使用委托来为触发时将调用的方法提供类型安全的封装</p>
<p style="FONT-SIZE: 8pt"><br>事件的声明</p>
<p style="FONT-SIZE: 8pt">1.声明一个委托<br>public delegate void EventHandler(object sender, System.EventArgs e);</p>
<p style="FONT-SIZE: 8pt">2.声明一个事件<br>public event EventHandler Changed;</p>
<p style="FONT-SIZE: 8pt">3.引发一个事件<br>public OnChanged(EnventArgs e)<br>{<br>&nbsp;if ( Changed != null)<br>&nbsp;{<br>&nbsp;&nbsp;Changed(this,e);<br>&nbsp;}<br>}</p>
<p style="FONT-SIZE: 8pt">4.定义事件处理程序<br>public MyText_OnChanged(Object sender,EventArgs e)<br>{<br>&nbsp;...<br>}</p>
<p style="FONT-SIZE: 8pt">5.订阅事件(将事件处理程序添加到事件的调用列表中)</p>
<p style="FONT-SIZE: 8pt">myText.Changed += EventHandler(MyText_OnChanged);</p>
<p style="FONT-SIZE: 8pt">下面的一个小例子说明了怎样定义一个完整的事件机制:</p>
<p style="FONT-SIZE: 8pt">using System;<br>using System.Collections.Generic;<br>using System.Text;</p>
<p style="FONT-SIZE: 8pt">namespace ConsoleApplication1<br>{<br>&nbsp;&nbsp;&nbsp; class Program<br>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyText myText = new MyText();</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 将事件处理程序添加到事件的调用列表中(即事件布线)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myText.Changed += new MyText.ChangedEventHandler(myText_Changed);&nbsp;&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; string str = "";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (str != "quit")<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; Console.WriteLine("please enter a string:");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = Console.ReadLine();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myText.Text = str;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 对Change事件处理的程序<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private static void myText_Changed(object sender, EventArgs e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("text has been changed&nbsp; :{0}\n" ,((MyText)sender).Text);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }&nbsp; </p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp; public class MyText<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string _text = "";</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 定义事件的委托<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public delegate void ChangedEventHandler(object sender, EventArgs e);</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 定义一个事件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public event ChangedEventHandler Changed;</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 用以触发Change事件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected virtual void OnChanged(EventArgs e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.Changed != null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Changed(this, e);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Text属性<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string Text<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return this._text; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set<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; this._text = value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 文本改变时触发Change事件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.OnChanged(new EventArgs());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}&nbsp;&nbsp; </p>
<p style="FONT-SIZE: 8pt">不足之处,还请大家多多指正!<br></p><img src ="http://www.cnblogs.com/ktgu/aggbug/575279.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37534/" target="_blank">[新闻]财富：微软必然得到雅虎 是对抗Google唯一出路</a>]]></description></item><item><title>程序员喝酒喝出的计算机文化[转]</title><link>http://www.cnblogs.com/ktgu/archive/2006/11/20/566664.html</link><dc:creator>ktgu</dc:creator><author>ktgu</author><pubDate>Mon, 20 Nov 2006 14:48:00 GMT</pubDate><guid>http://www.cnblogs.com/ktgu/archive/2006/11/20/566664.html</guid><wfw:comment>http://www.cnblogs.com/ktgu/comments/566664.html</wfw:comment><comments>http://www.cnblogs.com/ktgu/archive/2006/11/20/566664.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ktgu/comments/commentRss/566664.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ktgu/services/trackbacks/566664.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 8pt">大家喝的是啤酒。这时你入座了。</p>
<p style="FONT-SIZE: 8pt">你给自己倒了杯可乐，这叫低配置。 <br>你给自已倒了杯啤酒，这叫标准配置。</p>
<p style="FONT-SIZE: 8pt">你给自己倒了杯茶水，这茶的颜色还跟啤酒一样，这叫木马。 <br>你给自己倒了杯可乐，还滴了几滴醋，不仅颜色跟啤酒一样，而且不冒热气还有泡泡，这叫超级木马。</p>
<p style="FONT-SIZE: 8pt">你的同事给你倒了杯白酒，这叫推荐配置。 </p>
<p style="FONT-SIZE: 8pt">人到齐了，酒席开始了。 </p>
<p style="FONT-SIZE: 8pt">你先一个人喝了一小口，这叫单元测试。 <br>你跟旁边的人说哥们咱们随意，这叫交叉测试。<br>但是他说不行，这杯要干了，这叫压力测试。 <br>于是你说那就大家一起来吧，这叫内部测试。 <br>这个时候boss向全场举杯了，这叫集成测试。 </p>
<p style="FONT-SIZE: 8pt">菜过三巡，你就不跟他们客气了。 <br>你向对面的人敬酒，这叫p2p. <br>你向对面的人敬酒，他回敬你，你又再敬他&#8230;&#8230;，这叫tcp. <br>你向一桌人挨个敬酒，这叫令牌环。 <br>你说只要是兄弟就干了这杯，这叫广播。 </p>
<p style="FONT-SIZE: 8pt">可是你的女上司听了不高兴了：只有兄弟么，罚酒三杯。这叫BoB!!!。 <br>可是你的女下属听了不高兴了：我喝一口，你喝一杯，这叫恶意攻击。 </p>
<p style="FONT-SIZE: 8pt">有一个人过来向这桌敬酒，你说不行你先过了我这关，这叫防火墙。 <br>你的小弟们过来敬你酒，这叫一对多。 <br>你是boss，所有人过来敬你酒，这叫服务器。 </p>
<p style="FONT-SIZE: 8pt">酒是一样的，可是喝法是不同的。 <br>你喝了一杯，boss喝了一口，这叫c#。 <br>你喝了一杯，mm喝了一口，这叫vb。 <br>你喝了一杯，你大哥喝了半杯，这叫c++。 <br>你喝了半杯，你小弟喝了一杯，这叫汇编。 <br>你喝了一杯，你的搭档也喝了一杯，这叫c。 </p>
<p style="FONT-SIZE: 8pt">酒是一样的，可是喝酒的人是不同的。 <br>你越喝脸越红，这叫资源释放。 <br>你越喝脸越白，这叫资源独占。 <br>你已经醉了，却说我还能喝，叫做虚拟内存。 <br>你明明能喝，却说我已经醉了，叫做资源保留。 <br>你喝一段时间就上厕所，这叫cache。 </p>
<p style="FONT-SIZE: 8pt">酒过三巡，你也该活动活动了。 <br>你一桌一桌的走，这叫轮巡。 <br>你突然看到某一桌的漂亮mm，走了过去，这叫激活事件。 <br>你去了坐下来就不打算走了，这叫死循环。 <br>你的老大举杯邀你过去，你只好过去，这叫优先级。 <br>你向一桌敬酒，他们说不行不行我们都喝白的，于是你也喝白的，这叫本地化。 </p>
<p style="FONT-SIZE: 8pt">你向boss敬酒，可是boss被围了起来，你只能站在外圈，这叫队列。 <br>你终于到了内圈，小心翼翼的向前一步，这叫访问临界区。 <br>你拍着boss的肩膀说哥们咱们喝一杯，这叫越界。 </p>
<p style="FONT-SIZE: 8pt">你不知喝了几圈了，只会说两个字，干了，这叫udp。 <br>可是还有人拿着酒瓶跑过来说，刚才都没跟你喝，这叫丢包。 </p>
<p style="FONT-SIZE: 8pt">喝酒喝到最后的结果都一样 <br>你突然跑向厕所，这叫捕获异常错误。 <br>你在厕所吐了，反而觉得状态不错，这叫释放内存。 <br>你在台面上吐了，觉得很惭愧，这叫实时错误。 <br>你在boss面前吐了，觉得很害怕，这叫灾难性错误。 <br>你吐到了boss身上，只能索性晕倒了，这叫ShutDown。</p>
<p style="FONT-SIZE: 8pt">你找boss喝酒，boss说我喝不下了，这叫超过最大连接数。<br>你继续劝boss喝酒，这叫刷新。<br>boss说喝不了了，不喝了，这叫访问拒绝。<br>然后boss说：小伙子，我们换个话题，这叫页面重定向。<br>boss问你：小伙子，你叫什么？这叫登录验证。<br>boss说：你等等，我去下wc。结果左等右等就是等不回来，这叫连接超时。<br>你到处找boss，结果就是找不到，这叫该页无法显示。</p>
<p style="FONT-SIZE: 8pt">一个人拿着啤酒到你们部门那桌，对你们经理说：我敬你们部门一杯。然后你们部门一个喝啤酒的人和他干了这杯。<br>另一个人拿着白酒也到你们那，对你们经理说：我也敬你们部门一杯。然后你们部门一个喝白酒的人和他干了这杯。<br>这叫多态。</p>
<p style="FONT-SIZE: 8pt">一个人拿着两杯酒到你们部门那桌，把其中一杯酒放到经理面前，说：我敬你们部门一杯你们谁喝我不管，只要把这杯喝了就行了。<br>这叫封装。</p>
<p style="FONT-SIZE: 8pt">一个人拿着酒到你们部门那桌，对你们经理说：我敬你一杯。然后经理点名：xxx，帮我喝这杯，你喝就等于我喝了。<br>这叫继承。</p>
<p style="FONT-SIZE: 8pt">你拿个空杯子喝酒，这叫虚函数。</p>
<p style="FONT-SIZE: 8pt">别人向你敬酒，你拿个小杯准备喝，他说：&#8220;不行，我们要大杯&#8221;，这叫需求变更。</p>
<p style="FONT-SIZE: 8pt">你拿个大杯敬酒，他说：&#8220;我们换小杯的&#8221;，这叫简化版本。</p><img src ="http://www.cnblogs.com/ktgu/aggbug/566664.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37533/" target="_blank">[新闻]分众无线剥离短信业务 裁员2/3</a>]]></description></item><item><title>AJAX学习</title><link>http://www.cnblogs.com/ktgu/archive/2006/11/20/566659.html</link><dc:creator>ktgu</dc:creator><author>ktgu</author><pubDate>Mon, 20 Nov 2006 14:46:00 GMT</pubDate><guid>http://www.cnblogs.com/ktgu/archive/2006/11/20/566659.html</guid><wfw:comment>http://www.cnblogs.com/ktgu/comments/566659.html</wfw:comment><comments>http://www.cnblogs.com/ktgu/archive/2006/11/20/566659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ktgu/comments/commentRss/566659.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ktgu/services/trackbacks/566659.html</trackback:ping><description><![CDATA[没事的时候总喜欢泡技术社区,记得在2005年的时候社区里突然冒出个AJAX的新名词,开始还以为又出来什么新语言了.是不是又要掀起技术革命，感叹程序员的命真的是苦啊，一项技术还没有学好，新的技术又随之出现，于是时常会想起老了以后学不动了怎么办？开始见到AJAX并没有引起我对它的注意，后来经过时间不是很长好像这东西发展还真的挺快的。各论坛讨论的呼声越来越大，很多人把它说的神乎其神，在众多人高呼WEB2.0时代到来之时，AJAX也似乎有取代传统WEB开发的趋势，于是不得不在闲下来的时候对AJAX进行必要得了解。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 很早就知道AJAX其实就是html + javascript + xml + dom + Dhtml 说白了就是对老技术得灵活运用，偏偏老技术还没有学精谈何灵活运用呢，为了使技术能够得到提高也为了能够灵活运用AJAX跟随技术潮流，计划在闲着的时候学习一下ajax。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有空的时候将学习的笔记发布并整理成BLOG文章,希望得到大家的帮助!共同提高!<br><br>
<p style="FONT-SIZE: 8pt"><strong>Ajax 应用程序所用到的基本技术</strong><br>1.html<br>&nbsp;&nbsp;&nbsp; 组成web页面所用到的基本元素<br>2.javascript<br>&nbsp;&nbsp;&nbsp; javascript代码是AJAX应用程序核心的代码，帮助ajax程序改进与服务器通讯以实现不一样的用户体验<br>3.Dynamic HTML<br>&nbsp;&nbsp;&nbsp; 用于动态更新web页面<br>4.DOM（文档对象模型）<br>&nbsp;&nbsp;&nbsp; 用于通过javascrip代码处理HTML或服务器返回的XML<o:p></o:p></p>
<p style="FONT-SIZE: 8pt"><strong>javascript与服务器端通信的最核心的对象</strong><br>xmlHttp对象:传送XML格式数据的超文本传输协议<br>实际上XMLHTTP传输的数据可以是XML格式数据，也可以是字符串，流，或者一个无符号整数数组。还可以是URL的参数,它下达的结果可以是XML格式数据，也可以是字符串，流，或者一个无符号整数数组。<o:p></o:p></p>
<p style="FONT-SIZE: 8pt"><strong><em>调用步骤</em></strong><br>1、创建XMLHTTP对象<br>2、打开与服务端的连接，同时定义指令发送方式，服务网页(URL)和请求权限等。&nbsp;&nbsp;<br>3、发送指令。&nbsp;<br>4、等待并接收服务端返回的处理结果。&nbsp;<br>5、释放XMLHTTP对象<br><br><strong><em>方法</em></strong><br>open(数据传送方式(GET/POST/HEAD),服务器URL,是否异步执行,[用户名],[口令])<br>如：<br>open("GET","http://www.sohu.com",true)<br><br>send(content)<br>可以是XML格式数据，也可以是字符串，流，或者一个无符号整数数组。也可以省略，让指令通过Open方法的URL参数代入。<br>如：send(null);</p>
<p style="FONT-SIZE: 8pt">setRequestHeader(HTTP 头,HTTP 头值)<br>如：xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")</p>
<p style="FONT-SIZE: 8pt">abort()取消当前 HTTP 请求</p>
<p style="FONT-SIZE: 8pt">getAllResponseHeaders ()<br>从响应信息中检索所有的HTTP 头字段</p>
<p style="FONT-SIZE: 8pt">getResponseHeader(HTTP 头)<br>从响应信息正文中获得一个 HTTP 标头值</p>
<p style="FONT-SIZE: 8pt"><em><strong>属性<br></strong></em>onreadystatechange：用以状态改变后所要作的处理的事件句柄。 <br>readyState 异步操作的状态：未初始化(0)，正在加载(1)，已加载(2)，交互(3)，已完成(4) <br>responseBody：返回为无符号整数数组。 <br>responseStream：返回为IStream流。 <br>responseText ：返回字符串。 <br>responseXML：返回为XML格式数据。 <br>status：服务器返回的HTTP状态码 <br>statusText ：服务器HTTP响应行状态</p>
<p style="FONT-SIZE: 8pt"><em><strong>说明<br></strong></em>1.同步和异步<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同步状态下发送http请求后，只有当客户端接收到来自服务端的全部应答数据或协议栈超时返回！反之异步状态下，直接返回。在异步方式下数据包一旦发送完毕就结束send进程客户端执行其他的操作,而在同步方式下客户端要等到服务器返回确认消息后才结束send进程。实际运用中我们根据实际情况使用同步或异步，注意了如果设为同步状态可能因为服务器返回数据量大或响应慢而导致不必要的长时间等待！</p>
<p style="FONT-SIZE: 8pt">2.POST和GET<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用"POST"方式发送数据.可以大到4MB "GET"只能256KB<br><br><br></p>
<div style="FONT-SIZE: 8pt">创建一个XMLHTTP对象<br>Microsoft Internet Explorer浏览器使用MSXML解析器处理XML，MSXML实际上有两种不同的版本xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");<br>xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");<br>对于非 Microsoft 浏览器(Mozilla、Firefox、Safari、Opera):<br>xmlHttp = new XMLHttpRequest();<br><br>function getXmlHttp()<br>{<br>&nbsp;var xmlHttp = null;&nbsp;<br>&nbsp;<br>&nbsp;if ( window.XMLHttpRequest)<br>&nbsp;{<br>&nbsp;&nbsp;xmlHttp = new XMLHttpRequest();<br>&nbsp;&nbsp;if (xmlHttp.overrideMimeType)<br>&nbsp;&nbsp;&nbsp;xmlHttp.overrideMimeType("text/xml");<br>&nbsp;}<br>&nbsp;else if ( window.ActiveXObject)<br>&nbsp;{<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;catch(e)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");<br>&nbsp;&nbsp;}<br>&nbsp;}</div>
<div style="FONT-SIZE: 8pt">&nbsp;<br>&nbsp;if ( !xmlHttp)<br>&nbsp;{<br>&nbsp;&nbsp;window.alert("XmlHttp not be Supported!");&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;<br>&nbsp;return xmlHttp;&nbsp;<br>}<br><br>下面的代码说明了如何从创建到初始化XMLHTTP到发送数据的过程，并指定处理返回数据的事件句柄<br></div>
<div style="FONT-SIZE: 8pt">var xmlHttp = null;<br>&nbsp;&nbsp;<br>function callServer(url)<br>{<br>&nbsp;xmlHttp = getXmlHttp();<br>&nbsp;xmlHttp.onReadyStateChange = setPage;<br>&nbsp;xmlHttp.open("GET",url,true);<br>&nbsp;xmlHttp.send();&nbsp;&nbsp;&nbsp;<br>&nbsp;document.getElementById("loading").innerHTML = "正在加载...";<br>}</div>
<div style="FONT-SIZE: 8pt"><br>得到返回数据并更新页面<br>function setPage()<br>{&nbsp;&nbsp;&nbsp;<br>&nbsp;switch(xmlHttp.readyState)<br>&nbsp;{<br>&nbsp;&nbsp;case 0:<br>&nbsp;&nbsp;&nbsp;document.getElementById("loading").innerHTML = "正在初始化...";<br>&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;case 1:<br>&nbsp;&nbsp;&nbsp;document.getElementById("loading").innerHTML = "正在加载...";<br>&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;case 2:<br>&nbsp;&nbsp;&nbsp;document.getElementById("loading").innerHTML = "已加载完成...";<br>&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;case 3:<br>&nbsp;&nbsp;&nbsp;document.getElementById("loading").innerHTML = "正在接收数据...";<br>&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;case 4:<br>&nbsp;&nbsp;&nbsp;document.getElementById("loading").innerHTML = "已完成!";<br>&nbsp;&nbsp;&nbsp;break;<br>&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;<br>&nbsp;if ( xmlHttp.readyState == 4)<br>&nbsp;{<br>&nbsp;&nbsp;if ( xmlHttp.status == 200)<br>&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;document.getElementById("content").innerText = xmlHttp.responseText;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;xmlHttp.abort();&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;}&nbsp;<br>}<br><br></div>
<div style="FONT-SIZE: 8pt">HTML&nbsp;：<br></div>
<div style="FONT-SIZE: 8pt"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&lt;input&nbsp;name="url"&nbsp;id="url"&nbsp;type="text"&nbsp;value="http://www.sohu.com"&gt;&lt;input&nbsp;type="button"&nbsp;onclick="callServer(document.getElementById('url').value)"&nbsp;value="get&nbsp;data"&gt;&amp;nbsp;&lt;BR&gt;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&lt;div&nbsp;id="loading"&nbsp;style="color:red;&nbsp;font-size:12px;"&gt;&lt;/div&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&lt;span&nbsp;id="content"&gt;&lt;/span&gt;<br><br></div><img src ="http://www.cnblogs.com/ktgu/aggbug/566659.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37533/" target="_blank">[新闻]分众无线剥离短信业务 裁员2/3</a>]]></description></item><item><title>黄健翔激情解说之中国移动版、石化版、房地产版</title><link>http://www.cnblogs.com/ktgu/archive/2006/06/30/439285.html</link><dc:creator>ktgu</dc:creator><author>ktgu</author><pubDate>Fri, 30 Jun 2006 01:52:00 GMT</pubDate><guid>http://www.cnblogs.com/ktgu/archive/2006/06/30/439285.html</guid><wfw:comment>http://www.cnblogs.com/ktgu/comments/439285.html</wfw:comment><comments>http://www.cnblogs.com/ktgu/archive/2006/06/30/439285.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ktgu/comments/commentRss/439285.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ktgu/services/trackbacks/439285.html</trackback:ping><description><![CDATA[<span class=msgtxt>中国移动版：<br>　　　　　　收费，收费，收费，双向收费立功了，垄断政策立功了，不要给用户任何的机会。伟大的中国移动，他继承了托拉斯的光荣的传统，桑弘羊、洛克菲勒、比尔盖茨在这一刻灵魂附体、中国移动，他代表了最不要脸的行业悠久的垄断历史，在这一刻，我们不是人！我们不是人！ <br>　　<br>　　　　　　用户，用户面对这个政策，他面对的是全中国用户的目光和期待。他们曾经多次以为我们要实现单向收费，他期待这一点，他能够微笑着面对我们的新政策吗？了解了新政策的实质以后，他会是怎样的表情？<br>　　<br>　　　　　　收费又上涨了，游戏结束了，中国移动获得了胜利，彻底玩残了用户。我们永远也不会屈服于用户的压力，伟大的中国移动，伟大的移动总裁，M揍人今天生日快乐，中国移动万岁！ <br>　　<br>　　　　　　我们没有辜负中国移动人的期望，这个新政策是一个绝对理论上的玩你，绝对的玩你。中国移动进入了世界五百强！胜利属于中国移动！属于M揍人，属于中国移动总裁，属于中国移动董事长，属于全体中国移动人！<br>　　<br>　　　　　　让用户滚蛋吧！<br>　　<br>　　中国石化版<br>　　　　　　涨价，涨价，涨价，油价立功了，垄断立功了，不要给私车用户任何的机会。伟大的中国石化！我们继承了只涨不跌的光荣传统，扎卡维、内贾德在这一刻灵魂附体！石油价格的上涨，乃是我们发挥与国际接轨历史传统的胜利，在这一刻，我们全都不要脸，我们全都不要脸！ <br>　　<br>　　　　　　购油者，购油者面对涨价，他面对的是中国石化的屠刀。他的汽车，即将成为废铁，购油者深知这一点，但他必须面对&#8220;与国际原油市场价格接轨&#8221;的解释！我们的目标是让他看着加油站价目表时，脸上露出更痛苦的表情！<br>　　<br>　　　　　　价涨了，与国际接轨了，中国石化获得了胜利，额外多掏了600亿。我们不会在国际原油市场降价时也与国际接轨，伟大的扎卡维，伟大的内贾德，愿扎卡维永垂不朽，愿内贾德继续玩核爆竹！ <br>　　　　　　中国石化没有辜负中国石化人的期望，我们的&#8220;与国际接轨&#8221;是对质疑声的一记绝杀，绝对的封口胶！虽然我们实际上进口的是俄罗斯劣质原油而非北海轻质石油！胜利属于中国石化，属于扎卡维的炸弹，属于内贾德的核爆竹，属于所有中国石化人！！！<br>　　<br>　　　　　　让购油者哭起来吧！他们也许心知肚明，但是面对着垄断政策，他们失去了自己的勇气，面对老婆和情人开车兜风的要求，他们没有拿出誓不低头的作风，他们终于自食其果。他们要重新骑上自行车了，他们不用再关系汽油价格了，因为他们即将要关心的是被自行车座磨出的痔疮，再见！<br>　　<br>　　<br>　　中国房地产商版<br>　　　　　涨价，涨价，涨价，楼市立功了，楼市立功了，不要给购房人任何的机会。伟大的中国房地产商！我们继承了无奸不商的光荣传统，潘石屹、任志强在这一刻灵魂附体！我们这群人，代表了奸商悠久的历史传统，在这一刻，我们不是一个人在耍流氓，我们不是一个人在耍流氓！ <br>　　<br>　　　　　　房奴，房奴面对涨价，他面对的是全中国房地产商的目光和期待。他的钱包，他日后四十年的血汗钱都在我们的视野内，房奴深知这一点，但他必须苦笑着面对房地产市场！要不然十周以后，他会有更痛苦的表情！<br>　　　　　　<br>　　　　　　价涨了，游戏结束了，房地产商获得了胜利，培养了一大批房奴。我们不会倒在不买房运动面前，伟大的房地产商，伟大的房地产商，潘石屹今天生日快乐，任志强万岁！ <br>　　<br>　　　　　　任志强没有辜负房地产人的期望，他的&#8220;当房奴是活该&#8221;对房奴们是一记绝杀，绝对的死角！中国房地产从此进入了世界最暴利行业领域！胜利属于中国房地产商，属于潘石屹，属于任志强，属于所有房地产奸商们！！　<br>　　<br>　　　　　　让房奴越来越多吧！房奴也许会后悔的，他们再坚持6个月不买房的话，房地产商就撑不住了，但是他们失去了自己的勇气，面对房地产商强大的实力和地方政府的袒护，他们没有拿出猛冲猛打的作风，他们终于自食其果。他们终于开始终生为银行打工了，他们不用回自己新买的小窝了，他们大多数即将累死，再见！</span><img src ="http://www.cnblogs.com/ktgu/aggbug/439285.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37532/" target="_blank">[新闻]传统新闻产业受新媒体冲击 面临动荡性调整</a>]]></description></item><item><title>八荣八耻 </title><link>http://www.cnblogs.com/ktgu/archive/2006/06/30/439280.html</link><dc:creator>ktgu</dc:creator><author>ktgu</author><pubDate>Fri, 30 Jun 2006 01:48:00 GMT</pubDate><guid>http://www.cnblogs.com/ktgu/archive/2006/06/30/439280.html</guid><wfw:comment>http://www.cnblogs.com/ktgu/comments/439280.html</wfw:comment><comments>http://www.cnblogs.com/ktgu/archive/2006/06/30/439280.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ktgu/comments/commentRss/439280.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ktgu/services/trackbacks/439280.html</trackback:ping><description><![CDATA[<p>男人的八荣八耻 <br>以深爱老婆为荣，以风流花心为耻。 <br>以处处服务为荣，以敷衍了事为耻。 <br>以机智幽默为荣，以愚昧木讷为耻。 <br>以勤快家务为荣，以好吃懒做为耻。 <br>以细心体贴为荣，以只顾自己为耻。 <br>以事事交待为荣，以隐瞒欺骗为耻。 <br>以老实听话为荣，以违背妻命为耻。 <br>以努力挣钱为荣，以不求上进为耻。 </p>
<p>女人的八荣八耻 <br>以饭后洗碗为荣，以不做家务为耻。 <br>以按时回家为荣，以彻夜不归为耻。 <br>以和睦婆媳为荣，以刁难他人为耻。 <br>以照顾小孩为荣，以整天去玩为耻。 <br>以听老公话为荣，以指挥老公为耻。 <br>以温柔体贴为荣，以泼辣刁蛮为耻。<br>以精打细算为荣，以铺张浪费为耻。</p>
<p>创业的八荣八耻<br>以脚踏实地为荣，以三心二意为耻<br>以创造价值为荣，以哗众取众为耻<br>以坚持到底为荣，以半途而废为耻<br>以追求成功为荣，以不思进取为耻<br>以诚信服务为荣，以欺骗用户为耻<br>以市场营销为荣，以悄无声息为耻<br>以广交朋友为荣，以固步自封为耻<br>以遵纪守法为荣，以违法乱纪为耻</p>
<p>程序员的八荣八耻<br>以塌实编码为荣 以心浮气躁为耻<br>以详细注释为荣 以注释残缺为耻<br>以勤于测试为荣 以懒于测试为耻<br>以简明文档为荣 以冗余文档为耻<br>以注重团队为荣 以孤傲自大为耻<br>以刻苦钻研为荣 以敷衍了事为耻<br>以善于总结为荣 以不思进取为耻<br>以质效并进为荣 以单取其一为耻</p>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/ktgu/aggbug/439280.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37532/" target="_blank">[新闻]传统新闻产业受新媒体冲击 面临动荡性调整</a>]]></description></item><item><title>存储过程中调用C#封装的DLL</title><link>http://www.cnblogs.com/ktgu/archive/2006/05/30/413352.html</link><dc:creator>ktgu</dc:creator><author>ktgu</author><pubDate>Tue, 30 May 2006 11:00:00 GMT</pubDate><guid>http://www.cnblogs.com/ktgu/archive/2006/05/30/413352.html</guid><wfw:comment>http://www.cnblogs.com/ktgu/comments/413352.html</wfw:comment><comments>http://www.cnblogs.com/ktgu/archive/2006/05/30/413352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ktgu/comments/commentRss/413352.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ktgu/services/trackbacks/413352.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 8pt">最近一个项目中遇到一个转换FileTime的问题.时间是在C#中用DateTime.ToFileTime写入数据库中,这在存储过程中判断年和季度成了问题,怎么样才能把时间转换为正常的时间格式呢?Sql server中又没有FromFileTime对应的方法?其实很简单用C#写一个转换时间的Dll然后在存储过程中调用就可以了.<br>转换时间的类如下:<br>[Guid("729ba6af-3eff-4b75-b43b-d951a190dbe6")]<br>&nbsp;public class FileTimeConvert <br>&nbsp;{<br>&nbsp;&nbsp;public FileTimeConvert()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;}<br>&nbsp;<br>&nbsp;&nbsp;public string ConvertTime(long fileTime)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;string retVal = string.Empty;<br>&nbsp;&nbsp;&nbsp;if (fileTime &gt; 0)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;DateTime dt = DateTime.FromFileTime(fileTime);<br>&nbsp;&nbsp;&nbsp;&nbsp;retVal = dt.ToString();&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;return retVal;<br>&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;}<br>注意这个Guid我们在存储过程中引用要用到这个Guid.<br><br>为方便可能在多处需要调用,我们专门写一个存储过程<br>如下:<br><br>CREATE&nbsp; PROCEDURE&nbsp; spu_ConvertFileTimeToNormal<br>&nbsp;@ticks BIGINT,<br>&nbsp;@returnval&nbsp; varchar(40) output<br>&nbsp;AS&nbsp;</p>
<p style="FONT-SIZE: 8pt">DECLARE @src varchar(255)<br>DECLARE @desc varchar(255) </p>
<p style="FONT-SIZE: 8pt"><br>DECLARE @object int<br>DECLARE @hr int<br>EXEC @hr = sp_OACreate '{729ba6af-3eff-4b75-b43b-d951a190dbe6}',@object OUT</p>
<p style="FONT-SIZE: 8pt">IF @hr = 0&nbsp;--如果创建对象成功<br>&nbsp; BEGIN&nbsp;<br>&nbsp;&nbsp;EXEC @hr = sp_OAMethod @object,'ConvertTime',@returnval OUT,@ticks<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;print @returnval<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;print @hr<br>&nbsp;&nbsp;if(@hr &lt;&gt; 0)<br>&nbsp;&nbsp;&nbsp;BEGIN<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT <br>&nbsp;&nbsp;&nbsp;&nbsp;SELECT hr=convert(varbinary(4),@hr), <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#83;&#111;&#117;&#114;&#99;&#101;&#61;&#64;&#115;&#114;&#99;">Source=@src</a>, <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#68;&#101;&#115;&#99;&#114;&#105;&#112;&#116;&#105;&#111;&#110;&#61;&#64;&#100;&#101;&#115;&#99;">Description=@desc</a>&nbsp;<br>&nbsp;&nbsp;&nbsp;END<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;END</p>
<p style="FONT-SIZE: 8pt">&nbsp;ELSE<br>&nbsp; BEGIN<br>&nbsp;&nbsp; --print&nbsp; @hr<br>&nbsp;&nbsp; print 'Create Object ConvertTime failed'<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT <br>&nbsp;&nbsp;&nbsp;&nbsp; SELECT hr=convert(varbinary(4),@hr), <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#83;&#111;&#117;&#114;&#99;&#101;&#61;&#64;&#115;&#114;&#99;">Source=@src</a>, <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#68;&#101;&#115;&#99;&#114;&#105;&#112;&#116;&#105;&#111;&#110;&#61;&#64;&#100;&#101;&#115;&#99;">Description=@desc</a><br>&nbsp;&nbsp;&nbsp;&nbsp; RETURN<br>&nbsp; END</p>
<p style="FONT-SIZE: 8pt">&nbsp;EXEC @hr = sp_OADestroy @object</p>
<p style="FONT-SIZE: 8pt">&nbsp;IF @hr &lt;&gt; 0<br>&nbsp;BEGIN<br>&nbsp;&nbsp;&nbsp; EXEC sp_OAGetErrorInfo @object<br>&nbsp;&nbsp;&nbsp; RETURN<br>&nbsp;END<br><br>GO<br><br>这个时候我们还差最后一步注册DLL了<br>在.net 命令行下输入 regasm -codebase path<br><br>好了,现在我们就可以在其他存储过程中调用这个存储过程返回正常的时间了.<br>给个小例子:<br>EXEC spu_ConvertFileTimeToNormal @CreateTime,@NormalTime OUT&nbsp;&nbsp;&nbsp;&nbsp;<br>@CreateTime:FileTime格式<br>@NormalTime :正常的时间格式字符串(spu_ConvertFileTimeToNormal 存储过程返回值)<br><br>这个简单的小例子说明了我们怎么样在存储过程中调用DLL<br>是不是你解决问题又多了一个选择了呢?<br></p><img src ="http://www.cnblogs.com/ktgu/aggbug/413352.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37531/" target="_blank">[新闻]微软Silverlight被指侵犯Gotuit三项专利</a>]]></description></item><item><title>大腕版web2.0[转]</title><link>http://www.cnblogs.com/ktgu/archive/2006/04/18/378511.html</link><dc:creator>ktgu</dc:creator><author>ktgu</author><pubDate>Tue, 18 Apr 2006 10:50:00 GMT</pubDate><guid>http://www.cnblogs.com/ktgu/archive/2006/04/18/378511.html</guid><wfw:comment>http://www.cnblogs.com/ktgu/comments/378511.html</wfw:comment><comments>http://www.cnblogs.com/ktgu/archive/2006/04/18/378511.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/ktgu/comments/commentRss/378511.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ktgu/services/trackbacks/378511.html</trackback:ping><description><![CDATA[一定得选最好的托管中心<br>全套Cisco的网络设备加SUN的服务器<br>建就建最酷的用户体验<br>免费注册帐户<br>每个帐户存储空间最少也得两个G<br>什么AJAX呀、Tag呀、Rss呀<br>能给他整地全部给他整上<br>社区附带一个VIP区，有牛人7x24小时蹲点帮你解惑<br>Blog上常驻一个叫Keso的家伙<br>留小辫儿，特大牛的那种<br>只要一打开页面，甭管有事没事都得用Skype跟人家说<br>&#8220;你丫赶紧给我注册！&#8221;<br>一口地道的京片子<br>倍儿有面子<br>网站里还要建一个wiki系统<br>全部翻译自维基百科<br>每天翻译量起码百兆计算吧<br>再建一个站内搜索<br>支持所有内容全文检索<br>文本呀、RSS呀、Blog呀，你要搜什么我给你找出什么<br>就是一个字——快<br>全站搜一次才用0.00001秒<br>在这里注册用户的不是CEO就是网络精英<br>你要是分不清Blog和WebLog<br>你都不好意思去TrackBack人家<br>你说这样的网站，VC会投多少？<br>我觉得怎么着也得两千万美金吧？<br>两千万美金？那是成本<br>四千万美金起<br>你别嫌贵，我还挑东家呢<br>你得研究VC的投资心理<br>能掏起两千万的主儿<br>根本不在乎再掏两千万<br>什么叫Blogger，你知道吗？<br>Blogger挑服务商都用最2.0的，不用最好的<br>所以，我们做web2.0的口号就是：<br>不求最好，但求最2.0！<img src ="http://www.cnblogs.com/ktgu/aggbug/378511.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37530/" target="_blank">[新闻]Symbian开源:救赎,反击与未来</a>]]></description></item><item><title>开发中碰到过的一些问题总结,给自己也给大家一个参考!</title><link>http://www.cnblogs.com/ktgu/archive/2006/04/14/375298.html</link><dc:creator>ktgu</dc:creator><author>ktgu</author><pubDate>Fri, 14 Apr 2006 07:50:00 GMT</pubDate><guid>http://www.cnblogs.com/ktgu/archive/2006/04/14/375298.html</guid><wfw:comment>http://www.cnblogs.com/ktgu/comments/375298.html</wfw:comment><comments>http://www.cnblogs.com/ktgu/archive/2006/04/14/375298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ktgu/comments/commentRss/375298.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ktgu/services/trackbacks/375298.html</trackback:ping><description><![CDATA[<p>灵活的运用数据绑定操作<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 绑定到简单属性:&lt;%#UserName%&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 绑定到集合:&lt;asp:ListBox id="ListBox1" datasource='&lt;%# myArray%&gt;' runat="server"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 绑定到表达式:&lt;%#(class1.property1.ToString() + "," + class1.property2.ToString())%&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 绑定到方法返回值:&lt;%# GetSafestring(str) %&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 绑定到Hashtable:&lt;%# ((DictionaryEntry)Container.DataItem).Key%&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 绑定到ArrayList:&lt;%#Container.DataItem %&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 若数组里里放的是对象则可能要进行必要的转换后再绑定如:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%#((对象类型)Container.DataItem).属性%&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 绑定到DataView,DataTable,DataSet:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%#((DataRowView)Container.DataItem)["字段名"]%&gt;或<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%#((DataRowView)Container.DataItem).Rows[0]["字段名"]%&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要格式化则:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%#string.Format("格式",((DataRowView)Container.DataItem)["字段名"])%&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%#DataBinder.Eval(Container.DataItem,"字段名","格式")%&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 绑定到DataReader:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%#((IDataReader)Container.DataItem).字段名%&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然为了方便一般使用最多的就是DataBinder类的Eval方法了.不过这样对于同时要绑定大量的数据效率要低一些</p>
<p>Sql Server中DateTime值的范围<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1753-01-01 至 9999-12-31<br>&nbsp;在做Access程序导入数据到Sql Server 时要注意ACCESS中的日期可能不在此范围内而出现错误.(如日期为207-01-01)</p>
<p>检测到有潜在危险的 Request.Form 值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; solution1:&lt;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#64;&#80;&#97;&#103;&#101;">%@Page</a> ValidateRequest="false" %&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; solution2:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;system.web&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;pages validateRequest="false" /&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/system.web&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<br>&nbsp;其实这样做的确有点不安全,我们还应该自己定义一个专门处理这类危险字符的方法来对其进行预处理</p>
<p>ViewState,Session,Cookie作用域<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ViewState值保存在浏览器的html代码中，当浏览器关闭或跳到别的页面，则值消失&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session采用键值对的形式，键存放客户端而值放在服务器端，是通过用户的ID去找服务器上对应的值，这种方式值放置在服务器端，有个时间限制，时间到则服务器自动释放&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cookies则有两种方法，一种方法是把值保存在浏览器的变量中，当浏览器关闭时结束，另一种方法是保存在硬盘中，只要时间不过期，下次还可使用 </p>
<p>Access中的通配符注意了<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DAO: *, ADO: % (是不是有时候在SQL SERVER里能查而用VB在操作ACCESS时有查不出数据来啊?)<br><br>(添加中...)<br></p><img src ="http://www.cnblogs.com/ktgu/aggbug/375298.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37528/" target="_blank">[新闻]《福布斯》:暴雪的新一波完美风暴已经到来</a>]]></description></item><item><title>DataGrid操作的一些总结</title><link>http://www.cnblogs.com/ktgu/archive/2006/03/28/361177.html</link><dc:creator>ktgu</dc:creator><author>ktgu</author><pubDate>Tue, 28 Mar 2006 11:00:00 GMT</pubDate><guid>http://www.cnblogs.com/ktgu/archive/2006/03/28/361177.html</guid><wfw:comment>http://www.cnblogs.com/ktgu/comments/361177.html</wfw:comment><comments>http://www.cnblogs.com/ktgu/archive/2006/03/28/361177.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/ktgu/comments/commentRss/361177.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ktgu/services/trackbacks/361177.html</trackback:ping><description><![CDATA[<p><strong>1.DataGrid动态绑定字段</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有时候我们会遇到在DataGrid中动态绑定某个字段的情况,比如:当显示中文时我们绑定cname,显示英文时我们要绑定ename,此时我们可以这样:<br>ButtonColumn:<br>if (language == "cn")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((ButtonColumn)this.DataGrid1.Columns[3]).DataTextField = "cname";<br>else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((ButtonColumn)this.DataGrid1.Columns[3]).DataTextField = "ename";<br><br>BoundColumn:<br>((BoundColumn)this.DataGrid1.Columns[3]).DataField = "cname";<br><br>HyperLinkColumn同ButtonColumn的写法,不同的是当我们要动态改变TemplateColumn的显示应该怎么办呢?<br>这样就行了 先新建一个模板:<br>public class Template1 :ITemplate<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp; public void InstantiateIn(Control container)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextBox txt = new TextBox();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txt.Text = "this is a added template column";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; container.Controls.Add(txt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;}<br>再这样写:<br>((TemplateColumn)this.DataGrid1.Columns[1]).ItemTemplate = new Template1();<br><br><strong>2.动态转换DataGrid中某个Cell中的值</strong><br><br>BoundColumn:<br>if (e.Item.Cells[3].Text == "Ann")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.Item.Cells[3].Text = "&lt;b&gt;这一行本来应该显示Ann,现在被转换成这样了!&lt;/b&gt;";<br><br>ButtonColumn :<br>LinkButton link = (LinkButton)e.Item.Cells[3].Controls[0];<br>if (link.Text == "Ann")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link.Text = "&lt;b&gt;这一行本来应该显示Ann,现在被转换成这样了!&lt;/b&gt;";<br>这段代码写在:OnItemDataBound事件的方法体中就可以了.<br><br>HyperLinkColumn:<br>强类型转换成HyperLink,<br><br>Template Column:<br>通过FindControl方法<br><br><strong>3.动态创建DataGrid及添加列<br></strong><br>DataGrid dg = new DataGrid();<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;// BoundColumn<br>&nbsp;&nbsp;&nbsp;&nbsp;BoundColumn col1 = new BoundColumn();<br>&nbsp;&nbsp;&nbsp;&nbsp;col1.DataField = "au_id";<br>&nbsp;&nbsp;&nbsp;&nbsp;col1.HeaderText = "au_id";<br>&nbsp;&nbsp;&nbsp;&nbsp;dg.Columns.Add(col1);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;// ButtonColumn<br>&nbsp;&nbsp;&nbsp;&nbsp;ButtonColumn col2 = new ButtonColumn();<br>&nbsp;&nbsp;&nbsp;&nbsp;col2.DataTextField = "au_fname";<br>&nbsp;&nbsp;&nbsp;&nbsp;col2.HeaderText = "au_fname";<br>&nbsp;&nbsp;&nbsp;&nbsp;dg.Columns.Add(col2);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;// TemplateColumn<br>&nbsp;&nbsp;&nbsp;&nbsp;TemplateColumn col3 = new TemplateColumn();<br>&nbsp;&nbsp;&nbsp;&nbsp;col3.ItemTemplate = new Templates.Template1();<br>&nbsp;&nbsp;&nbsp;&nbsp;col3.HeaderText = "My Template Column";<br>&nbsp;&nbsp;&nbsp;&nbsp;dg.Columns.Add(col3);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;// LinkButtonColumn<br>&nbsp;&nbsp;&nbsp;&nbsp;HyperLinkColumn col4 = new HyperLinkColumn();<br>&nbsp;&nbsp;&nbsp;&nbsp;col4.HeaderText = "au_lname";<br>&nbsp;&nbsp;&nbsp;&nbsp;col4.DataTextField = "au_lname";<br>&nbsp;&nbsp;&nbsp;&nbsp;col4.DataNavigateUrlField = "au_lname";&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;dg.Columns.AddAt(0,col4);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;SqlConnection conn = new SqlConnection("server=localhost;uid=sa;pwd=;database=pubs");&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;SqlDataAdapter da = new SqlDataAdapter("select * from authors",conn);<br>&nbsp;&nbsp;&nbsp;&nbsp;DataSet ds = new DataSet();<br>&nbsp;&nbsp;&nbsp;&nbsp;da.Fill(ds);<br>&nbsp;&nbsp;&nbsp;&nbsp;dg.DataSource = ds;<br>&nbsp;&nbsp;&nbsp;&nbsp;dg.DataBind();<br>&nbsp;&nbsp;&nbsp;&nbsp;Page.Controls[1].Controls.Add(dg);<br><br><strong>4.关于.Net中将DataGrid内容导出到Excel乱码的问题</strong><br>一般常用的方法为:<br>DataGrid1.DataSource = this.GetDataSource();&nbsp;&nbsp;&nbsp;<br>DataGrid1.DataBind();<br>Response.Clear();<br>Response.Buffer = true;<br>Response.ContentType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = "application/vnd.ms-excel";<br>Response.Charset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = "gb2312";<br>EnableViewState&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = false;<br>System.IO.StringWriter tw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = new System.IO.StringWriter();<br>System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);<br>DataGrid1.RenderControl(hw&nbsp;);<br>Response.Write(tw.ToString());<br>Response.End();<br><br>但是有时导出会出现乱码,有时则不会出现乱码.真是百思不得其解.<br><br>我们可以这样解决将<br>Response.ContentType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = "application/vnd.ms-excel";<br>Response.Charset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = "gb2312";<br>换成:<br>Response.Write("&lt;meta http-equiv=Content-Type content=text/html;charset=gb2312&gt;");<br>Response.AppendHeader("content-disposition","attachment;filename=\"" + HttpUtility.UrlEncode("全部销售记录["+DateTime.Now.ToString("yyyy-MM-dd")+"]",System.Text.Encoding.UTF8) + ".xls\"");<br><br>为什么直接输出到Excel会出现乱码,而用Excel打开这段Html不会出现乱码呢?暂时能解决问题但还是不明白,希望高手能给予释疑!<br><br></p><img src ="http://www.cnblogs.com/ktgu/aggbug/361177.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37527/" target="_blank">[新闻]中国互联网公司在哪儿</a>]]></description></item><item><title>Enterprise Library使用过程中的出现的"未处理的“System.Configuration.ConfigurationException”类型的异常出现在 microsoft.practices.enterpriselibrary.configuration.dll 中"问题</title><link>http://www.cnblogs.com/ktgu/archive/2006/01/19/320405.html</link><dc:creator>ktgu</dc:creator><author>ktgu</author><pubDate>Thu, 19 Jan 2006 08:35:00 GMT</pubDate><guid>http://www.cnblogs.com/ktgu/archive/2006/01/19/320405.html</guid><wfw:comment>http://www.cnblogs.com/ktgu/comments/320405.html</wfw:comment><comments>http://www.cnblogs.com/ktgu/archive/2006/01/19/320405.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ktgu/comments/commentRss/320405.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ktgu/services/trackbacks/320405.html</trackback:ping><description><![CDATA[有时候我们经常在编译的时候出现这样的一个错误:未处理的&#8220;System.Configuration.ConfigurationException&#8221;类型的异常出现在 microsoft.practices.enterpriselibrary.configuration.dll 中。"这是因为在你的输出目录下没有找到这个配置文件的原因。<br><br class="">刚刚明明把配置文件（应用程序名.exe.config &amp; dataconfiguration.config）保存到bin/debug下面了。怎么没找到呢？再调试还是说没有。结果发现每次运行的时候这个文件总是会被自动删除掉了。<br class=""><br class="">原来我们要这样做就可以了。将配置文件存放到项目文件夹下面。然后在在项目中选择 属性|生成事件|生成后事件命令行 输入：copy&nbsp;"$(ProjectDir)\*.config"&nbsp;"$(TargetDir)"这样在每次生成以后都会把这个配置文件拷到目标文件夹下面就不会产生如上的错误了。
<p class=""></p>
<p class=""></p><img src ="http://www.cnblogs.com/ktgu/aggbug/320405.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37526/" target="_blank">[新闻]微软:Silverlight内容也可被搜索引擎检索</a>]]></description></item><item><title>使用OPENROWSET函数连接并访问远程数据库数据</title><link>http://www.cnblogs.com/ktgu/archive/2005/11/14/276220.html</link><dc:creator>ktgu</dc:creator><author>ktgu</author><pubDate>Mon, 14 Nov 2005 11:07:00 GMT</pubDate><guid>http://www.cnblogs.com/ktgu/archive/2005/11/14/276220.html</guid><wfw:comment>http://www.cnblogs.com/ktgu/comments/276220.html</wfw:comment><comments>http://www.cnblogs.com/ktgu/archive/2005/11/14/276220.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/ktgu/comments/commentRss/276220.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ktgu/services/trackbacks/276220.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们有时候会遇到要访问的数据不只是在本地服务器上，往往另一部分在远程数据库服务器上，比如我们在两个服务器上存放着表结构一样的数据我们要把两数据合并起来一起显示怎么办呢，那么这个时候我们用SQL SERVER提供的OPENROWSET函数了，使用起来很方便，记住像引用表名那样引用OPENROWSET 函数就可以了。<br><br>我们可以这样写：<br>1.SELECT a.* FROM table1 a LEFT JOIN OPENROWSET('MSDASQL','DRIVER={SQL Server};SERVER=192.168.0.1,2412;UID=sa;PWD=bb',DbName.dbo.table2) AS b ON a.id = b.id ORDER BY a.ID DESC<br>将地址为192.168.0.1端口为2412的SQL SERVER上的table2表和本地服务器上的table1表联接。<br><br>2.SELECT * FROM （SELECT a.* FROM table1 a&nbsp;UNION SELECT&nbsp;b.*&nbsp;FROM&nbsp;OPENROWSET('MSDASQL','DRIVER={SQL Server};SERVER=192.168.0.1,2412;UID=aa;PWD=bb',DbName.dbo.table2) AS b) TempTable ORDER BY ID DESC<br>将地址为192.168.0.1端口为2412的SQL SERVER上的table2表中内容加到table1表中。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上例中我们用的是ODBC 的OLE DB 提供程序,当然了你还可能用SQL Server 的 Microsoft OLE DB,Jet 的 Microsoft OLE DB等Provider连接。<br><br>使用SQL Server 的 Microsoft OLE DB:<br>OPENROWSET（'SQLOLEDB','服务器地址,端口';'用户名';'密码',&nbsp;'SQL语句')<br><br>使用Jet 的 Microsoft OLE DB:<br>OPENROWSET('Microsoft.Jet.OLEDB.4.0',&nbsp;'c:\test.mdb';'admin';'pwd', Orders)<br><br>注意：以上两种用户名和密码前都是用分号分隔。<br><br>今天刚好用到，所以小总结一下，记忆力不好没办法只能写下来。<br></p><img src ="http://www.cnblogs.com/ktgu/aggbug/276220.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37525/" target="_blank">[新闻]内置AI技术 三星聪明微波炉还能上网</a>]]></description></item></channel></rss>