﻿<?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-灵魂-放水-随笔分类-.NET</title><link>http://www.blogjava.net/zqli/category/12937.html</link><description>为学日益，为道日损。</description><language>zh-cn</language><lastBuildDate>Thu, 17 Jan 2008 15:03:20 GMT</lastBuildDate><pubDate>Thu, 17 Jan 2008 15:03:20 GMT</pubDate><ttl>60</ttl><item><title>[转]C#泛型编程 </title><link>http://www.blogjava.net/zqli/archive/2008/01/17/175983.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Thu, 17 Jan 2008 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2008/01/17/175983.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/175983.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2008/01/17/175983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/175983.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/175983.html</trackback:ping><description><![CDATA[<span style="font-family: 宋体">泛型：通过参数化类型来实现在同一份代码上操作多种数据类型。利用&#8220;参数化类型&#8221;将类型抽象化，从而实现灵活的复用。</span>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><strong><span style="font-family: 宋体">例子代码：</span></strong></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><span style="color: blue; font-family: 新宋体">class</span><span style="font-family: 新宋体"> <span style="color: teal">Program</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">static</span> <span style="color: blue">void</span> Main(<span style="color: blue">string</span>[] args)</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span> obj = 2;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: teal">Test</span>&lt;<span style="color: blue">int</span>&gt; test = <span style="color: blue">new</span> <span style="color: teal">Test</span>&lt;<span style="color: blue">int</span>&gt;(obj);</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: teal">Console</span>.WriteLine(<span style="color: maroon">"int:"</span> + test.obj);</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">string</span> obj2 = <span style="color: maroon">"hello world"</span>;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: teal">Test</span>&lt;<span style="color: blue">string</span>&gt; test1 = <span style="color: blue">new</span> <span style="color: teal">Test</span>&lt;<span style="color: blue">string</span>&gt;(obj2);</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: teal">Console</span>.WriteLine(<span style="color: maroon">"String:"</span> + test1.obj);</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: teal">Console</span>.Read();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">class</span> <span style="color: teal">Test</span>&lt;T&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> T obj;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> Test(T obj)</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">this</span>.obj = obj;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span style="font-family: 新宋体">}</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; </span></strong><strong><span style="font-family: 新宋体">输出结果是：</span></strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; int:2</span></p>
<p style="margin: 0cm 0cm 0pt 21pt"><span style="font-family: 新宋体">String:hello world</span></p>
<p style="margin: 0cm 0cm 0pt 21pt"><strong><span style="font-family: 新宋体">程序分析：</span></strong></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt; tab-stops: list 39.0pt"><span style="font-family: 新宋体">1、&nbsp;</span><strong><span style="color: red; font-family: 新宋体">Test</span></strong><strong><span style="color: red; font-family: 新宋体">是一个泛型类。T是要实例化的范型类型。</span></strong><span style="font-family: 新宋体">如果T被实例化为int型，那么成员变量obj就是int型的，如果T被实例化为string型，那么obj就是string类型的。</span></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt; tab-stops: list 39.0pt"><span style="font-family: 新宋体">2、&nbsp;</span><span style="font-family: 新宋体">根据不同的类型，上面的程序显示出不同的值。</span></p>
<p style="margin: 0cm 0cm 0pt 21pt"><strong><span style="font-family: 新宋体">C#</span></strong><strong><span style="font-family: 新宋体">泛型机制：</span></strong></p>
<p style="margin: 0cm 0cm 0pt 21pt"><span style="font-family: 新宋体">C#</span><span style="font-family: 新宋体">泛型能力有CLR在运行时支持：C#泛型代码在编译为IL代码和元数据时，采用特殊的占位符来表示范型类型，并用专有的IL指令支持泛型操作。而真正的泛型实例化工作以&#8220;on-demand&#8221;的方式，发生在JIT编译时。</span></p>
<p style="margin: 0cm 0cm 0pt 21pt"><span style="font-family: 新宋体">看看刚才的代码中Main函数的元数据</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">.method private hidebysig static void&nbsp;Main(string[] args) cil managed</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">{</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;.entrypoint</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;// Code size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 79 (0x4f)</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;.maxstack&nbsp;2</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;.locals init ([0] int32 obj,</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [1] class CSharpStudy1.Test`1&lt;int32&gt; test,</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;[2] string obj2,</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [3] class CSharpStudy1.Test`1&lt;string&gt; test1)</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0000:&nbsp;nop</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0001:&nbsp;ldc.i4.2</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0002:&nbsp;stloc.0</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0003:&nbsp;ldloc.0</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="color: red; font-family: Fixedsys">&nbsp;IL_0004:&nbsp;newobj&nbsp;&nbsp;&nbsp;&nbsp; instance void class CSharpStudy1.Test`1&lt;int32&gt;::.ctor(!0)</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0009:&nbsp;stloc.1</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_000a:&nbsp;ldstr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "int:"</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_000f:&nbsp;ldloc.1</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0010:&nbsp;ldfld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; !0 class CSharpStudy1.Test`1&lt;int32&gt;::obj</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0015:&nbsp;box&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [mscorlib]System.Int32</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_001a:&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string [mscorlib]System.String::Concat(object,</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;object)</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_001f:&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void [mscorlib]System.Console::WriteLine(string)</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0024:&nbsp;nop</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0025:&nbsp;ldstr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "hello world"</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_002a:&nbsp;stloc.2</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_002b:&nbsp;ldloc.2</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="color: red; font-family: Fixedsys">&nbsp;IL_002c:&nbsp;newobj&nbsp;&nbsp;&nbsp;&nbsp; instance void class CSharpStudy1.Test`1&lt;string&gt;::.ctor(!0)</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0031:&nbsp;stloc.3</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0032:&nbsp;ldstr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "String:"</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0037:&nbsp;ldloc.3</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0038:&nbsp;ldfld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; !0 class CSharpStudy1.Test`1&lt;string&gt;::obj</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_003d:&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string [mscorlib]System.String::Concat(string,</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string)</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0042:&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void [mscorlib]System.Console::WriteLine(string)</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0047:&nbsp;nop</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0048:&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int32 [mscorlib]System.Console::Read()</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_004d:&nbsp;pop</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_004e:&nbsp;ret</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">} // end of method Program::Main</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Fixedsys">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 新宋体">再来看看Test类中构造函数的元数据</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">.method public hidebysig specialname rtspecialname </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; instance void&nbsp;.ctor(!T obj) cil managed</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">{</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;// Code size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17 (0x11)</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;.maxstack&nbsp;8</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0000:&nbsp;ldarg.0</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0001:&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; instance void [mscorlib]System.Object::.ctor()</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0006:&nbsp;nop</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0007:&nbsp;nop</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0008:&nbsp;ldarg.0</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0009:&nbsp;ldarg.1</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="color: red; font-family: Fixedsys">&nbsp;IL_000a:&nbsp;stfld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; !0 class ConsoleCSharpTest1.Test`1&lt;!T&gt;::obj</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_000f:&nbsp;nop</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">&nbsp;IL_0010:&nbsp;ret</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: Fixedsys">} // end of method Test`1::.ctor</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">1</span><span style="font-family: 新宋体">、第一轮编译时，编译器只为Test&lt;T&gt;类型产生&#8220;泛型版&#8221;的IL代码与元数据——并不进行泛型的实例化，T在中间只充当占位符。例如：Test类型元数据中显示的&lt;!T&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">2</span><span style="font-family: 新宋体">、JIT编译时，当JIT编译器第一次遇到Test&lt;int&gt;时，将用int替换&#8220;范型版&#8221;IL代码与元数据中的T——进行泛型类型的实例化。例如：Main函数中显示的&lt;int&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">3</span><span style="font-family: 新宋体">、CLR为所有类型参数为&#8220;引用类型&#8221;的泛型类型产生同一份代码；但是如果类型参数为&#8220;值类型&#8221;，对每一个不同的&#8220;值类型&#8221;，CLR将为其产生一份独立的代码。因为实例化一个引用类型的泛型，它在内存中分配的大小是一样的，但是当实例化一个值类型的时候，在内存中分配的大小是不一样的。</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="font-family: 新宋体">C#</span></strong><strong><span style="font-family: 新宋体">泛型特点：</span></strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 新宋体">1</span><span style="font-family: 新宋体">、如果实例化泛型类型的参数相同，那么JIT编辑器会重复使用该类型，因此C#的动态泛型能力避免了C++静态模板可能导致的代码膨胀的问题。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 新宋体">2</span><span style="font-family: 新宋体">、C#泛型类型携带有丰富的元数据，因此C#的泛型类型可以应用于强大的反射技术。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 新宋体">3</span><span style="font-family: 新宋体">、C#的泛型采用&#8220;基类、接口、构造器，值类型/引用类型&#8221;的约束方式来实现对类型参数的&#8220;显示约束&#8221;，提高了类型安全的同时，也丧失了C++模板基于&#8220;签名&#8221;的隐式约束所具有的高灵活性</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="font-family: 新宋体">C#</span></strong><strong><span style="font-family: 新宋体">泛型继承：</span></strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 新宋体">C#</span><span style="font-family: 新宋体">除了可以单独声明泛型类型（包括类与结构）外，也可以在基类中包含泛型类型的声明。但基类如果是泛型类，它的类型要么以实例化，要么来源于子类（同样是泛型类型）声明的类型参数，看如下类型</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 新宋体">class C&lt;U,V&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 新宋体">class D:C&lt;string,int&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 新宋体">class E&lt;U,V&gt;:C&lt;U,V&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 新宋体">class F&lt;U,V&gt;:C&lt;string,int&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: red; font-family: 新宋体">class G:C&lt;U,V&gt;&nbsp;//</span><span style="color: red; font-family: 新宋体">非法</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">E</span><span style="color: black; font-family: 新宋体">类型为C类型提供了U、V，也就是上面说的来源于子类</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">F</span><span style="color: black; font-family: 新宋体">类型继承于C&lt;string,int&gt;，个人认为可以看成F继承一个非泛型的类</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">G</span><span style="color: black; font-family: 新宋体">类型为非法的，因为G类型不是泛型，C是泛型，G无法给C提供泛型的实例化</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">泛型类型的成员：</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">泛型类型的成员可以使用泛型类型声明中的类型参数。但类型参数如果没有任何约束，则只能在该类型上使用从System.Object继承的公有成员。如下图：</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">
<div align="center"><img height="190" alt="" src="http://www.cnblogs.com/images/cnblogs_com/kid-li/C1.JPG" width="203" border="0" /></div>
&nbsp;</span>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: black; font-family: 新宋体">泛型接口：</span></strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">泛型接口的类型参数要么已实例化，要么来源于实现类声明的类型参数</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: black; font-family: 新宋体">泛型委托：</span></strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">泛型委托支持在委托返回值和参数上应用参数类型，这些参数类型同样可以附带合法的约束</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">delegate bool MyDelegate&lt;T&gt;(T value);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">class MyClass</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">{</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">&nbsp;&nbsp;&nbsp; static bool F(int i){...}</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">&nbsp;&nbsp;&nbsp; static bool G(string s){...}</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">&nbsp;&nbsp;&nbsp; static void Main()</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyDelegate&lt;string&gt; p2 = G;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyDelegate&lt;int&gt; p1 = new MyDelegate&lt;int&gt;(F);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">}</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: black; font-family: 新宋体">泛型方法：</span></strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">1</span><span style="color: black; font-family: 新宋体">、C#泛型机制只支持&#8220;在方法声明上包含类型参数&#8221;——即泛型方法。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">2</span><span style="color: black; font-family: 新宋体">、C#泛型机制不支持在除方法外的其他成员（包括属性、事件、索引器、构造器、析构器）的声明上包含类型参数，但这些成员本身可以包含在泛型类型中，并使用泛型类型的类型参数。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">3</span><span style="color: black; font-family: 新宋体">、泛型方法既可以包含在泛型类型中，也可以包含在非泛型类型中。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">泛型方法声明：如下</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">public static int FunctionName&lt;T&gt;(T value){...}</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">泛型方法的重载：</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">public void Function1&lt;T&gt;(T a);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">public void Function1&lt;U&gt;(U a);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">这样是不能构成泛型方法的重载。因为编译器无法确定泛型类型T和U是否不同，也就无法确定这两个方法是否不同</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">public void Function1&lt;T&gt;(int x);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">public void Function1(int x);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">这样可以构成重载</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">public void Function1&lt;T&gt;(T t) where T:A;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">public void Function1&lt;T&gt;(T t) where T:B;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">这样不能构成泛型方法的重载。因为编译器无法确定约束条件中的A和B是否不同，也就无法确定这两个方法是否不同</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">泛型方法重写：</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">在重写的过程中，抽象类中的抽象方法的约束是被默认继承的。如下：</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">abstract class Base</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">{</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">&nbsp;&nbsp;&nbsp; public abstract T F&lt;T,U&gt;(T t,U u) where U:T;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">&nbsp;&nbsp;&nbsp; public abstract T G&lt;T&gt;(T t) where T:IComparable;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">}</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">class MyClass:Base</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">{</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">&nbsp;&nbsp;&nbsp; public override X F&lt;X,Y&gt;(X x,Y y){...}</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">&nbsp;&nbsp;&nbsp; public override T G&lt;T&gt;(T t) where T:IComparable{}</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">}</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">对于MyClass中两个重写的方法来说</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">F</span><span style="color: black; font-family: 新宋体">方法是合法的，约束被默认继承</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">G</span><span style="color: black; font-family: 新宋体">方法是非法的，指定任何约束都是多余的</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: black; font-family: 新宋体">泛型约束：</span></strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">1</span><span style="color: black; font-family: 新宋体">、C#泛型要求对&#8220;所有泛型类型或泛型方法的类型参数&#8221;的任何假定，都要基于&#8220;显式的约束&#8221;，以维护C#所要求的类型安全。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">2</span><span style="color: black; font-family: 新宋体">、&#8220;显式约束&#8221;由where子句表达，可以指定&#8220;基类约束&#8221;，&#8220;接口约束&#8221;，&#8220;构造器约束&#8221;，&#8220;值类型/引用类型约束&#8221;共四种约束。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">3</span><span style="color: black; font-family: 新宋体">、&#8220;显式约束&#8221;并非必须，如果没有指定&#8220;显式约束&#8221;，范型类型参数将只能访问System.Object类型中的公有方法。例如：在开始的例子中，定义的那个obj成员变量。比如我们在开始的那个例子中加入一个Test1类，在它当中定义两个公共方法Func1、Func2，如下图：</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">
<div align="center"><img height="319" alt="" src="http://www.cnblogs.com/images/cnblogs_com/kid-li/C2.JPG" width="217" border="0" /></div>
<br />
<br />
下面就开始分析这些约束：</span>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">基类约束：</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><span style="color: blue; font-family: 新宋体">class</span><span style="font-family: 新宋体"> <span style="color: teal">A</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">void</span> Func1()</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">class</span> <span style="color: teal">B</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">void</span> Func2()</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">class</span> <span style="color: teal">C</span>&lt;S, T&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">where</span> S : <span style="color: teal">A</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">where</span> T : <span style="color: teal">B</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> C(S s,T t)</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//S</span></span><span style="color: green; font-family: 新宋体">的变量可以调用Func1方法</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.Func1();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//T</span></span><span style="color: green; font-family: 新宋体">的变量可以调用Func2方法</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.Func2();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">接口约束：</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><span style="color: blue; font-family: 新宋体">interface</span><span style="font-family: 新宋体"> <span style="color: teal">IA</span>&lt;T&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T Func1();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">interface</span> <span style="color: teal">IB</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">void</span> Func2();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">interface</span> <span style="color: teal">IC</span>&lt;T&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T Func3();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">class</span> <span style="color: teal">MyClass</span>&lt;T, V&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">where</span> T : <span style="color: teal">IA</span>&lt;T&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">where</span> V : <span style="color: teal">IB</span>, <span style="color: teal">IC</span>&lt;V&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> MyClass(T t,V v)</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//T</span></span><span style="color: green; font-family: 新宋体">的对象可以调用Func1</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.Func1();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//V</span></span><span style="color: green; font-family: 新宋体">的对象可以调用Func2和Func3</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.Func2();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.Func3();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">构造器约束：</span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt; text-align: left" align="left"><span style="color: blue; font-family: 新宋体">class</span><span style="font-family: 新宋体"> <span style="color: teal">A</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> A()</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">class</span> <span style="color: teal">B</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> B(<span style="color: blue">int</span> i)</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">class</span> <span style="color: teal">C</span>&lt;T&gt; <span style="color: blue">where</span> T : <span style="color: blue">new</span>()</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T t;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> C()</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t = <span style="color: blue">new</span> T();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">class</span> <span style="color: teal">D</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">void</span> Func()</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: teal">C</span>&lt;<span style="color: teal">A</span>&gt; c = <span style="color: blue">new</span> <span style="color: teal">C</span>&lt;<span style="color: teal">A</span>&gt;();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="color: red; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C&lt;B&gt; d = new C&lt;B&gt;();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;}</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp; d</span><span style="font-family: 新宋体">对象在编译时报错：The type B must have a public parameterless constructor in order to use it as parameter 'T' in the generic type or method C&lt;T&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: red; font-family: 新宋体">&nbsp;&nbsp;&nbsp; </span></strong><strong><span style="color: red; font-family: 新宋体">注意：C#现在只支持无参的构造器约束</span></strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: black; font-family: 新宋体">此时由于我们为B类型写入了一个有参构造器，使得系统不会再为B自动创建一个无参的构造器，但是如果我们将B类型中加一个无参构造器，那么对象d的实例化就不会报错了。B类型定义如下：</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="color: black; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue; font-family: 新宋体">class</span><span style="font-family: 新宋体"> <span style="color: teal">B</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> B()</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> B(<span style="color: blue">int</span> i)</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { }</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">值类型/引用类型：</span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt; text-align: left" align="left"><span style="color: blue; font-family: 新宋体">public</span><span style="font-family: 新宋体"> <span style="color: blue">struct</span> <span style="color: teal">A</span> { }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">class</span> <span style="color: teal">B</span> { }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">class</span> <span style="color: teal">C</span>&lt;T&gt; <span style="color: blue">where</span> T : <span style="color: blue">struct</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: teal">C</span>&lt;<span style="color: teal">A</span>&gt; c1 = <span style="color: blue">new</span> <span style="color: teal">C</span>&lt;<span style="color: teal">A</span>&gt;();</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red">C&lt;B&gt; c2 = new C&lt;B&gt;();</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">&nbsp;&nbsp;&nbsp; c2</span><span style="color: black; font-family: 新宋体">对象在编译时报错：The type 'B' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or methor 'C&lt;T&gt;'</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: black; font-family: 新宋体">总结：</span></strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">1</span><span style="color: black; font-family: 新宋体">、C#的泛型能力由CLR在运行时支持，它既不同于C++在编译时所支持的静态模板，也不同于Java在编译器层面使用&#8220;擦拭法&#8221;支持的简单的泛型。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">2</span><span style="color: black; font-family: 新宋体">、C#的泛型支持包括类、结构、接口、委托四种泛型类型，以及方法成员。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: 新宋体">3</span><span style="color: black; font-family: 新宋体">、C#的泛型采用&#8220;基类，接口，构造器，值类型/引用类型&#8221;的约束方式来实现对类型参数的&#8220;显式约束&#8221;，它不支持C++模板那样的基于签名的隐式约束。</span></p>
<img src ="http://www.blogjava.net/zqli/aggbug/175983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2008-01-17 16:17 <a href="http://www.blogjava.net/zqli/archive/2008/01/17/175983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]ASP.net中"名称以无效字符开头"问题解决? </title><link>http://www.blogjava.net/zqli/archive/2008/01/07/173459.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Mon, 07 Jan 2008 14:11:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2008/01/07/173459.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/173459.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2008/01/07/173459.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/173459.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/173459.html</trackback:ping><description><![CDATA[在ASP.NET方面,我算是个刚刚入门.今天上网下了一个ASPX程序,准备深入学习,设置好虚拟路径后,在IE中打开,出现了如下的错误提示:<br />
<br />
<table width="400">
    <p style="font: 13pt/15pt 宋体, MS Song">无法显示 XML 页。
    <p style="font: 9pt/14pt 宋体, MS Song">使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 <a href="javascript:location.reload()" target="_self">刷新</a>按钮，或以后重试。
    <hr />
    <p style="font: bold 9pt/14pt 宋体, MS Song">名称以无效字符开头。处理资源 'http://localhost/likong/' 时出错。第 1 行，位置: 2 </p>
    <pre style="font-weight: normal; font-size: 10pt; line-height: 12pt; font-style: normal; font-variant: normal"><font color="blue">&lt;%@ Page language="c#"  ValidateRequest="false"  Codebehind="default.aspx.cs" AutoEventWireup="false" Inherits="Socut.Cla...</font></pre>
    <p>&nbsp;</p>
    <tbody>
    </tbody>
    </p>
</table>
<br />
这是怎么回事啊,以前怎么没遇到过的.经查阅资料后才知道,这是因为NET没用注册到IIS引起的.原来早两天我重装VS.NET把IIS还原了.<br />
在命令窗口中运行"C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis.exe -i"问题得以解决.<br />
<input id="Image1" type="image" src="http://zhfen.cnblogs.com/images/cnblogs_com/zhfen/iis.gif" value="Image1" border="0" name="Image1" /><br />
<br />
.NetFramework2.0，需要运行的是C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i。末尾的"i"不能少。
<img src ="http://www.blogjava.net/zqli/aggbug/173459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2008-01-07 22:11 <a href="http://www.blogjava.net/zqli/archive/2008/01/07/173459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于水晶报表设置横向或纵向打印的问题？</title><link>http://www.blogjava.net/zqli/archive/2007/10/26/156155.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Fri, 26 Oct 2007 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/10/26/156155.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/156155.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/10/26/156155.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/156155.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/156155.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 水晶报表10：在设计完rpt报表文件以后（设置了打印方向），直接调用PrintToPrinter(*,*,*,*)方法，要求<br />
<br />
先保存为.pdf文件，并不能很好的实现直接打印。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其次，如果将rpt文件赋给一个CrystalReportView后，当直接点击打印按钮时，弹出的打印对话框默认打印<br />
<br />
rpt设计时的纸张打印方向。而如果通过调用CrystalReportView.PrintReport()方法，弹出的打印对话框默认打印<br />
<br />
却是本机默认打印机的默认纸张打印方向。据称，PrintReport()方法首先就是读取打印机默认的设置先。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因此，想不浏览报表数据，直接调用打印，又要按自己的横向或纵向打印这个问题，似乎很难利用报表<br />
<br />
本身的库来解决。难道，只能通过先用代码，修改打印机的纸张打印方向，然后再调用PrintReport()方法?真<br />
<br />
的没有更好的解决办法？<br />
<img src ="http://www.blogjava.net/zqli/aggbug/156155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-10-26 15:10 <a href="http://www.blogjava.net/zqli/archive/2007/10/26/156155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DataView取RowFilter过滤之后的记录</title><link>http://www.blogjava.net/zqli/archive/2007/10/26/156153.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Fri, 26 Oct 2007 07:00:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/10/26/156153.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/156153.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/10/26/156153.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/156153.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/156153.html</trackback:ping><description><![CDATA[<br />
<p>删除用RowFilter筛选之后的记录集，用While循环是可以做到的，而用For循环却不行。<br />
<br />
While(dataView.count&gt;0)<br />
{<br />
&nbsp; dataView.Delete(this.dataView.Count-1)<br />
//....<br />
}<br />
因此，除了通过数据绑定到DataGridView,DataGrid外，可以通过循环来取经过RowFilter筛选后的记录集：<br />
方法有很多，如：</p>
<p>&nbsp;foreach (DataRowView row in dataView)<br />
{<br />
&nbsp;&nbsp; MessageBox.Showrow.Row[4].ToString());<br />
}</p>
<img src ="http://www.blogjava.net/zqli/aggbug/156153.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-10-26 15:00 <a href="http://www.blogjava.net/zqli/archive/2007/10/26/156153.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用TextObject动态更改水晶报表打印标题</title><link>http://www.blogjava.net/zqli/archive/2007/10/25/155800.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Thu, 25 Oct 2007 02:56:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/10/25/155800.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/155800.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/10/25/155800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/155800.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/155800.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分步：<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、在rpt报表文件中，从工具箱里拖入一个TextObject控件到目标位置，可以设置相关属性。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比如：定义了一个TextObject控件，名为 title。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、在要为该TextObject赋值的class里加入如下代码：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using CrystalDecisions.CrystalReports.Engine;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using CrystalDecisions.Shared;<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Report.StyleAreport aReport=new Special.Report.StyleAreport();//实例化报表文件rpt<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextObject title = (TextObject)aReport.ReportDefinition.ReportObjects["title"];//找到刚定义的TextObject控件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title.Text ="动态标题"; 
<img src ="http://www.blogjava.net/zqli/aggbug/155800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-10-25 10:56 <a href="http://www.blogjava.net/zqli/archive/2007/10/25/155800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DataTable.Compute(expression ,filter)解决Count(),Sum()......</title><link>http://www.blogjava.net/zqli/archive/2007/10/20/154463.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Sat, 20 Oct 2007 03:19:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/10/20/154463.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/154463.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/10/20/154463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/154463.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/154463.html</trackback:ping><description><![CDATA[<div class="tit">最近为.NET项目编码，为了少写代码，直接用DataSet,DataTable等现成微软封装好的组件，对于Sum()、Count()等计算，DataTable提供了配套的方法Founction Compute():<br />
<br />
<br />
<br />
<br />
DataTable.Compute 方法</div>
<div class="date">2007-03-22 17:53</div>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt">
            <div class="majorTitle">.</div>
            <div class="title">DataTable.Compute 方法&nbsp;&nbsp;</div>
            <div>
            <div>
            <p>计算用来传递筛选条件的当前行上的给定表达式。 </p>
            <p><strong>命名空间:</strong>System.Data<br />
            <strong>程序集:</strong>System.Data（在 system.data.dll 中） </p>
            <div class="MTPS_CollapsibleRegion"><br />
            <div class="section" style="display: block">
            <div>
            <div class="code">
            <div class="CodeSnippetTitleBar">
            <div class="CodeDisplay">Visual Basic（声明）</div>
            </div>
            <pre class="code" space="preserve"><span style="color: blue">Public</span> <span style="color: blue">Function</span> Compute ( _
            &nbsp;&nbsp;&nbsp;&nbsp; expression <span style="color: blue">As</span> <span style="color: blue">String</span>, _
            &nbsp;&nbsp;&nbsp;&nbsp; filter <span style="color: blue">As</span> <span style="color: blue">String</span> _
            ) <span style="color: blue">As</span> <span style="color: blue">Object</span>
            </pre>
            </div>
            <div class="code">
            <div class="CodeSnippetTitleBar">
            <div class="CodeDisplay">Visual Basic（用法）</div>
            </div>
            <pre class="code" space="preserve"><span style="color: blue">Dim</span> instance <span style="color: blue">As</span> DataTable
            <span style="color: blue">Dim</span> expression <span style="color: blue">As</span> <span style="color: blue">String</span>
            <span style="color: blue">Dim</span> filter <span style="color: blue">As</span> <span style="color: blue">String</span>
            <span style="color: blue">Dim</span> returnValue <span style="color: blue">As</span> <span style="color: blue">Object</span>
            returnValue = instance.Compute(expression, filter)
            </pre>
            </div>
            <div class="code">
            <div class="CodeSnippetTitleBar">
            <div class="CodeDisplay">C#</div>
            </div>
            <pre class="code" space="preserve"><span style="color: blue">public</span> Object Compute (
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">string</span> expression,
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">string</span> filter
            )
            </pre>
            </div>
            <div class="code">
            <div class="CodeSnippetTitleBar">
            <div class="CodeDisplay">C++</div>
            </div>
            <pre class="code" space="preserve"><span style="color: blue">public</span>:
            Object^ Compute (
            &nbsp;&nbsp;&nbsp;&nbsp; String^ expression,
            &nbsp;&nbsp;&nbsp;&nbsp; String^ filter
            )
            </pre>
            </div>
            <div class="code">
            <div class="CodeSnippetTitleBar">
            <div class="CodeDisplay">J#</div>
            </div>
            <pre class="code" space="preserve"><span style="color: blue">public</span> Object Compute (
            &nbsp;&nbsp;&nbsp;&nbsp; String expression,
            &nbsp;&nbsp;&nbsp;&nbsp; String filter
            )
            </pre>
            </div>
            <div class="code">
            <div class="CodeSnippetTitleBar">
            <div class="CodeDisplay">JScript</div>
            </div>
            <pre class="code" space="preserve"><span style="color: blue">public</span> <span style="color: blue">function</span> Compute (
            &nbsp;&nbsp;&nbsp;&nbsp; expression : String,
            &nbsp;&nbsp;&nbsp;&nbsp; filter : String
            ) : Object
            </pre>
            </div>
            <p>&nbsp;</p>
            <h4 class="subHeading">参数</h4>
            <dl paramname="expression">
            <dt><span class="parameter">expression</span>
            <dd>
            <p>要计算的表达式。 </p>
            </dd></dl>
            <dl paramname="filter">
            <dt><span class="parameter">filter</span>
            <dd>
            <p>要限制在表达式中进行计算的行的筛选器。 </p>
            </dd></dl>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            <h4 class="subHeading">返回值</h4>
            <a href="http://msdn2.microsoft.com/zh-cn/library/system.object(VS.80).aspx">Object</a>，设置为计算结果。 </div>
            </div>
            </div>
            <div class="MTPS_CollapsibleRegion"><a class="CollapseRegionLink" href="http://msdn2.microsoft.com/zh-cn/library/system.data.datatable.compute(VS.80).aspx#">备注</a><br />
            <div class="section" style="display: block">
            <div>
            <p><span class="parameter">expression</span> 参数需要聚合函数。例如，以下是合法表达式：</p>
            <p><tt><font face="NSimsun">Count(Quantity)</font></tt> </p>
            <p>但是以下表达式不合法：</p>
            <p><tt><font face="NSimsun">Sum (Quantity * UnitPrice)</font></tt> </p>
            <p>如果必须针对两列或多列执行操作，则应该创建 <a href="http://msdn2.microsoft.com/zh-cn/library/system.data.datacolumn(VS.80).aspx">DataColumn</a>，并将它的 <a href="http://msdn2.microsoft.com/zh-cn/library/system.data.datacolumn.%20(VS.80).aspx">Expression</a> 属性设置为适当的表达式，然后针对结果列使用聚合表达式。在这种情况下，假定有一个名为&#8220;total&#8221;的 <strong>DataColumn</strong>，并且 <strong>Expression</strong> 属性设置为： </p>
            <p><tt><font face="NSimsun">"Quantity * UnitPrice"</font></tt> </p>
            <p><strong>Compute</strong> 方法的表达式参数将为： </p>
            <p><tt><font face="NSimsun">Sum(total)</font></tt> </p>
            <p>第二个参数 <span class="parameter">filter</span> 确定在表达式中使用哪些行。例如，如果该表包含名为&#8220;colDate&#8221;的日期列，则可用以下表达式限制这些行：</p>
            <p><tt><font face="NSimsun">colDate &gt; 1/1/99 AND colDate &lt; 17/1/99</font></tt> </p>
            <p>有关为这两个参数创建表达式的规则，请参见 <strong>DataColumn.Expression</strong> 属性。</p>
            </div>
            </div>
            </div>
            <div class="MTPS_CollapsibleRegion">
            <div class="section" style="display: block">
            <div>
            <p>下面的示例针对识别号码为五的销售人员，对名为&#8220;Total&#8221;（合计）的列的值求和。</p>
            <div class="code">
            <div class="CodeSnippetTitleBar">
            <div class="CodeDisplay">Visual Basic</div>
            <div class="CopyCodeButton"><a class="copyCode" href="file::CopyCode(%20ctl00_LibFrame_ctl15VisualBasic%20);"></a></div>
            </div>
            <pre class="code" space="preserve"><span style="color: blue">Private</span> <span style="color: blue">Sub</span> ComputeBySalesSalesID(<span style="color: blue">ByVal</span> dataSet <span style="color: blue">As</span> DataSet)
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">' Presumes a DataTable named "Orders" that has a column named "Total."</span>
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">Dim</span> table <span style="color: blue">As</span> DataTable
            &nbsp;&nbsp;&nbsp;&nbsp; table = dataSet.Tables(<span style="color: maroon">"Orders"</span>)
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">' Declare an object variable.</span>
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">Dim</span> sumObject <span style="color: blue">As</span> <span style="color: blue">Object</span>
            &nbsp;&nbsp;&nbsp;&nbsp; sumObject = table.Compute(<span style="color: maroon">"Sum(Total)"</span>, <span style="color: maroon">"EmpID = 5"</span>)
            <span style="color: blue">End</span> <span style="color: blue">Sub</span>
            </pre>
            </div>
            <div class="code">
            <div class="CodeSnippetTitleBar">
            <div class="CodeDisplay">C#</div>
            <div class="CopyCodeButton"><span style="color: blue">private</span> <span style="color: blue">void</span> ComputeBySalesSalesID(DataSet dataSet)<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">// Presumes a DataTable named "Orders" that has a column named "Total."</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp; DataTable table;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; table = dataSet.Tables["Orders"];<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">// Declare an object variable.</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp; object sumObject;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; sumObject = table.Compute("Sum(Total)", "EmpID = 5");<br />
            </div>
            </div>
            </div>
            </div>
            </div>
            </div>
            </div>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/zqli/aggbug/154463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-10-20 11:19 <a href="http://www.blogjava.net/zqli/archive/2007/10/20/154463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个初学C#时的错误</title><link>http://www.blogjava.net/zqli/archive/2007/10/12/152312.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Fri, 12 Oct 2007 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/10/12/152312.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/152312.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/10/12/152312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/152312.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/152312.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在制作ToolStrip菜单栏的时候，选择的是label控件型，后来，调试才发现鼠标移上去，一点变化都没有，甚至点了都不知道点中没有，又弄了<br />
<br />
半天，把label转换为Button控件类型，问题解决。
<img src ="http://www.blogjava.net/zqli/aggbug/152312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-10-12 13:14 <a href="http://www.blogjava.net/zqli/archive/2007/10/12/152312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用VS2005制作WinForm安装包</title><link>http://www.blogjava.net/zqli/archive/2007/06/26/126431.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Tue, 26 Jun 2007 14:36:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/06/26/126431.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/126431.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/06/26/126431.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/126431.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/126431.html</trackback:ping><description><![CDATA[<p>一.<br><br>1.&nbsp;在现有项目的解决方案中添加新的项目:&nbsp;右击"解决方案",选择"添加"--"新建项目",&nbsp;在"添加新项目"的选择窗口中,&nbsp;"项目类型"选"其他项目类型"--"安装和部署","模板"选"安装项目",给新项目指定名称,位置;<br>2.&nbsp;在新添加的安装项目上右击,&nbsp;选择"视图"--"文件系统",&nbsp;右击"目标计算机上的文件系统"作侧的"应用程序文件夹",&nbsp;选择"添加文件"或者"添加项目输出",将你要安装的文件添加到该位置;<br>3.&nbsp;初始的安装位置:&nbsp;在上面的"文件系统"界面,&nbsp;左击"应用程序文件夹",&nbsp;在"属性"栏中找到"DefaultLocation",&nbsp;默认的属性值是:&nbsp;[ProgramFilesFolder][Manufacturer]\[ProductName],&nbsp;这就是用户安装的默认位置,&nbsp;如果不是这样,&nbsp;修改成这样.&nbsp;<br>4.&nbsp;另外,&nbsp;在"解决方案管理器"中,&nbsp;点击你添加的安装项目,&nbsp;在"属性"编辑栏中,&nbsp;在[Manufacturer]中填入你公司的名字或者你自己希望的文字,&nbsp;在[ProductName]填入你为要被安装的项目命名的名字.<br>5.&nbsp;先在"解决方案管理器"中"生成"你的项目,&nbsp;然后"生成"你的安装项目<br>6.&nbsp;在"解决方案管理器"中,右击你的安装项目,&nbsp;选择"安装",&nbsp;便可在你的开发机上进行安装了,&nbsp;在你的安装项目的路径下的bin下有两个文件夹:&nbsp;debug&nbsp;和&nbsp;Release,&nbsp;<br>7.&nbsp;在解决方案管理器中,右击你的安装项目,&nbsp;选择"属性",&nbsp;如果你的项目属性里选择的是&nbsp;"配置"&nbsp;是&nbsp;"debug",&nbsp;则你生成的安装文件在&nbsp;debug&nbsp;里面,&nbsp;如果选择的"配置"是&nbsp;"Release",&nbsp;则生成的安装文件在&nbsp;Release&nbsp;里面.&nbsp;当然你也可以修改你的位置可文件名,&nbsp;还可以对你的安装文件进行其它的设置.<br><br>二.<br>在解决方案管理器中,&nbsp;右击添加的"安装项目",&nbsp;选择"视图"--"注册表"; </p>
<p>&#160;</p>
<p>在"目标计算机上的注册表"下,默认有注册表的五个主键栏;<br>默认情况下,&nbsp;在&nbsp;[HKEY_CURRENT_USER]&nbsp;和&nbsp;[HKEY_CURRENT_MACHINE]&nbsp;下会有&nbsp;[Software]\[Manufacturer]&nbsp;分支,&nbsp;如果你的安装项目的属性中设置了&nbsp;[Manufacturer]值,&nbsp;安装后会用值去替代[Manufacturer],&nbsp;例如&nbsp;[Manufacturer]&nbsp;的值&nbsp;设置为&nbsp;"Power&nbsp;Word",&nbsp;则安装后会在&nbsp;[Software]下创建一个[Power&nbsp;Word]分支;<br>默认情况下&nbsp;[Manufacturer]&nbsp;的&nbsp;AlwaysCreate&nbsp;属性是&nbsp;false,&nbsp;即:如果你的&nbsp;[Manufacturer]&nbsp;下没有项目,则不创建&nbsp;[Manufacturer]&nbsp;,如果无论如何都要创建这个键,&nbsp;则可将&nbsp;它的&nbsp;AlwaysCreate&nbsp;设置为&nbsp;true;<br>依照上面的方法,&nbsp;在你想建注册表项的主键中逐级新建分支项和项目,&nbsp;在新建的注册表项目上右击后选属性,&nbsp;设置注册项的&nbsp;value&nbsp;值;<br>无论是建主键分支还是项目,&nbsp;都可以用&nbsp;[]&nbsp;的方法使用系统变量来动态指定需要添加的注册表内容.&nbsp;例如:<br>[Manufacturer]&nbsp;存放的是安装项目的公司值,<br>[ProductName]&nbsp;存放的是安装项目属性中的&nbsp;产品名称,<br>[TARGETDIR]&nbsp;存放的是安装时用户选定的安装路径,<br>[COMPANYNAME]&nbsp;存放的是安装时用户填入的公司名(如果没设用户信息安装界面则取操作系统中的公司名),<br>[USERNAME]&nbsp;存放的是安装时用户填入的用户名(如果没设用户信息安装界面则取操作系统中的用户名,<br>如此等等<br><br>如果想要在安装时出现注册码,&nbsp;要么自己做一个DLL或者EXE项目,&nbsp;加入到&nbsp;自定义操作中在安装时打开界面输入注册码,&nbsp;要么使用VS安装项目自带的界面(在视图--用户界面中添加"用户信息"安装界面,设置showserialnumber&nbsp;为&nbsp;true),&nbsp;不过那个注册码是用&nbsp;模7&nbsp;来验证的,&nbsp;只要是验证位数值之和能被7整除都能通过,&nbsp;就像以前安装盗板&nbsp;office&nbsp;97&nbsp;时输入&nbsp;"1111111"一样.<br></p>
<img src ="http://www.blogjava.net/zqli/aggbug/126431.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-06-26 22:36 <a href="http://www.blogjava.net/zqli/archive/2007/06/26/126431.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]轻而易举拥有xp风格的界面 </title><link>http://www.blogjava.net/zqli/archive/2007/06/26/126273.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Tue, 26 Jun 2007 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/06/26/126273.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/126273.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/06/26/126273.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/126273.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/126273.html</trackback:ping><description><![CDATA[Windows XP发布时，我们中许多人都为她华丽漂亮的界面折服和兴奋。然而，.NET1.0发布时，我们中又有许多人，包括我自己，对它不支持XP风格感到大失所望。可事实是，在Windows XP（只限于WindowsXP）里.NET支持XP风格，只是还要您做一点小工作。<br>这篇文章主要参考了<a href='http://www.codeproject.com/csharp/dotnetvisualstyles.asp跟随下面的步骤，使您的程序拥有XP风格的界面,GO!1.%20新建一个Windows应用程序，然后打开AssemblyInfo.cs，修改一下内容，下面的是示例代码：using%20System.Reflection;using%20System.Runtime.CompilerServices;[assembly:%20AssemblyTitle("abc")][assembly:%20AssemblyDescription("abc")][assembly:%20AssemblyConfiguration("")][assembly:%20AssemblyCompany("")][assembly:%20AssemblyProduct("")][assembly:%20AssemblyCopyright("")][assembly:%20AssemblyTrademark("")][assembly:%20AssemblyCulture("")]%20[assembly:%20AssemblyVersion("1.0.0.0")][assembly:%20AssemblyDelaySign(false)][assembly:%20AssemblyKeyFile("")][assembly:%20AssemblyKeyName("")]2.%20往项目添加新项。新添加一个XML文件，将文件命名为%20[您的程序名].exe.manifest，[您的程序名]指的是在%20../bin/debug%20文件夹里生成的可执行程序名%20。文件的内容示例如下：您只要根据您在AssemblyInfo.cs里所作的设置修改%20version="1.0.0.0",%20name="abc",%20abc%20这几个值就可以了。xmlns="urn:schemas-microsoft-com:asm.v1"%20manifestVersion="1.0">version="1.0.0.0"%20processorArchitecture="X86"%20name="abc"type="win32"%20/>abctype="win32"%20name="Microsoft.Windows.Common-Controls"%20version="6.0.0.0"%20processorArchitecture="X86"%20publicKeyToken="6595b64144ccf1df"%20language="*"%20/>%20重新编译程序。%20注意，从ButtonBase,GroupBox和Label继承下来的组件必须将FlatStyle属性设为System。3.%20将%20[您的程序名].exe.manifest%20文件添加到程序的可执行文件（1）菜单文件打开，打开../bin/debug/[您的程序名].exe，现在您可以看到一个资源浏览树；（2）右击根目录[您的程序名]，单击"添加资源..."；（3）在跳出的对话框中单击&#8220;自定义...&#8221;；（4）将资源类型命名为RT_MANIFEST，确定；（5）双击资源树的RT_MANIFEST下的项（一般情况下是101），Copy%20文件%20[您的程序名].exe.manifest%20的内容，粘贴在打开的文件中，粘贴的结果是二进制形式（结果有点奇怪，不用理会）。'><font color=#0000ff>http://www.codeproject.com/csharp/dotnetvisualstyles.asp<br>跟随下面的步骤，使您的程序拥有XP风格的界面,GO!<br>1. 新建一个Windows应用程序，然后打开AssemblyInfo.cs，修改一下内容，下面的是示例代码：<br>using System.Reflection;<br>using System.Runtime.CompilerServices;<br>[assembly: AssemblyTitle("abc")]<br>[assembly: AssemblyDescription("abc")]<br>[assembly: AssemblyConfiguration("")]<br>[assembly: AssemblyCompany("")]<br>[assembly: AssemblyProduct("")]<br>[assembly: AssemblyCopyright("")]<br>[assembly: AssemblyTrademark("")]<br>[assembly: AssemblyCulture("")] <br>[assembly: AssemblyVersion("1.0.0.0")]<br>[assembly: AssemblyDelaySign(false)]<br>[assembly: AssemblyKeyFile("")]<br>[assembly: AssemblyKeyName("")]<br>2. 往项目添加新项。新添加一个XML文件，将文件命名为 [您的程序名].exe.manifest，[您的程序名]指的是在 ..\bin\debug 文件夹里生成的可执行程序名 。文件的内容示例如下：您只要根据您在AssemblyInfo.cs里所作的设置修改 version="1.0.0.0", name="abc", <description>abc</description> 这几个值就可以了。</td>
</tr>
</table>
<br><?xml version="1.0" encoding="UTF-8" standalone="yes"?><br><assembly <br>xmlns="urn:schemas-microsoft-com:asm.v1" <br>manifestVersion="1.0"&gt;<br><assemblyidentity <br>version="1.0.0.0" <br>processorArchitecture="X86" <br>name="abc"<br>type="win32" /&gt;<br><description>abc</description><br><dependency><br><dependentassembly><br><assemblyidentity <br>type="win32" <br>name="Microsoft.Windows.Common-Controls" <br>version="6.0.0.0" <br>processorArchitecture="X86" <br>publicKeyToken="6595b64144ccf1df" <br>language="*" /&gt; <br></dependentassembly><br></dependency><br></assembly><br>重新编译程序。 注意，从ButtonBase,GroupBox和Label继承下来的组件必须将FlatStyle属性设为System。<br>3. 将 [您的程序名].exe.manifest 文件添加到程序的可执行文件<br>（1）菜单文件打开，打开..\bin\debug\[您的程序名].exe，现在您可以看到一个资源浏览树；<br>（2）右击根目录[您的程序名]，单击"添加资源..."；<br>（3）在跳出的对话框中单击&#8220;自定义...&#8221;；<br>（4）将资源类型命名为RT_MANIFEST，确定；<br>（5）双击资源树的RT_MANIFEST下的项（一般情况下是101），Copy 文件 [您的程序名].exe.manifest 的内容，粘贴在打开的文件中，粘贴的结果是二进制形式（结果有点奇怪，不用理会）。</font><br></a>
<img src ="http://www.blogjava.net/zqli/aggbug/126273.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-06-26 10:16 <a href="http://www.blogjava.net/zqli/archive/2007/06/26/126273.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Skin++ For C#.Net2005使用帮助</title><link>http://www.blogjava.net/zqli/archive/2007/06/26/126253.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Tue, 26 Jun 2007 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/06/26/126253.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/126253.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/06/26/126253.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/126253.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/126253.html</trackback:ping><description><![CDATA[<p><strong><span>一、概述</span></strong></p>
<p><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><span>Skin++</span><span>是一款通用的软件换肤套件，目前支持各种版本操作系统，</span><span>Windows9x</span><span>、</span><span>Windows2000</span><span>、</span><span>WindowsXP</span><span>、</span><span>Windows2003</span><span>。支持各种开发语言，</span><span>Visual C++</span><span>、<span>Visual C++.Net</span>、</span><span>Visual Basic 6 </span><span>、</span><span>Visual Basic.Net</span><span>、</span><span>C#</span><span>、</span><span>PowerBuilder</span><span>、</span><span>Delphi</span><span>、</span><span>C++Builder</span><span>、易语言等。</span><span>Skin++ </span><span>目前已经拥有数量众多的用户，并且有很多的国内外大公司客户。无论其换肤的效果还是程序本身的稳定性，都堪称一流。要做出漂亮风格的界面，使用</span><span>Skin++</span><span>变得非常简单，只要一行代码，就能让你的程序彻底换肤，并拥有动态换肤的功能。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Skin++ For DotNet</span><span>目前全面支持</span><span>Visual C#.net 2002</span><span>、</span><span>Visual C#.net 2003</span><span>、</span><span>Visual C#.net 2005</span><span>、</span><span>Visual VB.net 2002</span><span>、</span><span>Visual VB.net 2003</span><span>、</span><span>Visual VB.net 2005</span><span>、</span><span>Visual VC.net 2002</span><span>、</span><span>Visual VC.net 2003</span><span>、</span><span>Visual VC.net 2005</span><span>。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span>使用</span></strong><strong><span>Skin++</span></strong><strong><span>之前需要做一个准备工作，注册</span></strong><strong><span>Skin++</span></strong><strong><span>控件。</span></strong></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>由于</span><span>Skin++ For DotNet</span><span>是以</span><span>COM</span><span>的形式存在的，所以在你的机器第一次使用之前应该先注册该</span><span>DLL</span><span>文件。注册命令：</span><span>RegSvr32.exe&nbsp; Skin++</span><span>存在的路径</span><span>\SkinPPDotNet.dll </span><span>注册后会出现下图所示：</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height=112 src="http://www.uipower.com/document/uploadfile/2006112002.files/image001.jpg" width=553></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong><span>二、</span></strong><strong><span>Skin++</span></strong><strong><span>如何在</span></strong><strong><span>C#.net 2005 </span></strong><strong><span>中使用</span></strong></p>
<p><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong><span>1.</span></strong><strong><span>创建</span></strong><strong><span>C# Windows</span></strong><strong><span>应用程序</span></strong></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height=374 src="http://www.uipower.com/document/uploadfile/2006112002.files/image002.jpg" width=554></span></p>
<p><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.</span></strong><strong><span>拷贝</span></strong><strong><span>Skin++</span></strong><strong><span>相关文件</span></strong></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>在</span><span>Skin++</span><span>的安装目录下拷贝一个</span><span>Skin++</span><span>皮肤文件（</span><span>*.ssk</span><span>或</span><span>*.spp</span><span>）到当前工程目录</span><span>.</span><span>下。</span></p>
<p><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.</span></strong><strong><span>添加引用</span></strong></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>右键单击工程目录的引用节点</span> <span>，弹出下面的菜单</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height=287 src="http://www.uipower.com/document/uploadfile/2006112002.files/image003.jpg" width=224></span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>请单击&#8220;添加引用</span><span>(&amp;R)</span><span>&#8221;菜单项，此时会弹出&#8220;添加引用&#8221;窗体</span><span>,</span><span>如下图：</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height=352 src="http://www.uipower.com/document/uploadfile/2006112002.files/image004.jpg" width=482></span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><span>切换到</span><span>COM</span><span>页面，请选择</span><span>SkinPPDotNet 3.0 Type Library</span><span>组件项，并双击该项，或点击下边的&#8220;确定&#8221;按钮。此时在引用树列表中会多出</span><span>SKINPPDOTNETLib</span><span>一项：</span></p>
<p><span><img height=211 src="http://www.uipower.com/document/uploadfile/2006112002.files/image005.jpg" width=267></span></p>
<p>&nbsp;</p>
<p><strong><span>4.</span></strong><strong><span>添加名字空间</span></strong></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>请在</span><span>Program .cs</span><span>窗体的代码开头处添加</span> <span>using</span><span> SKINPPDOTNETLib;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp; <img height=202 src="http://www.uipower.com/document/uploadfile/2006112002.files/image006.jpg" width=282></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong><span>&nbsp;&nbsp;&nbsp; 5.</span></strong><strong><span>声明<span>Skin++</span>组件变量</span></strong></p>
<p><span>&nbsp;&nbsp;&nbsp; </span><span>请在<span> Program</span>中写上：</span><span>public</span><span> <span>static</span> SKINPPDOTNETLib.<span>SkinPPDotNetClass</span> SkinPPObj;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height=168 src="http://www.uipower.com/document/uploadfile/2006112002.files/image007.jpg" width=460></span></p>
<p>&nbsp;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>6.</strong></span><strong><span>创建</span></strong><strong><span>Skin++</span></strong><strong><span>组件实例</span></strong></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>在</span><span>Main</span><span>（）中创建</span><span>Skin++</span><span>组件对象：</span></p>
<p align=left><span>SkinPPObj = <span>new</span> <span>SkinPPDotNetClass</span>();</span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp; SkinPPObj.LoadSkin(<span>"PixOS.spp"</span>, <span>false</span>);</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height=158 src="http://www.uipower.com/document/uploadfile/2006112002.files/image008.jpg" width=478>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>至此，</span><span>Skin++</span><span>就添加完成了！请按</span><span>F5</span><span>运行，效果如下图：</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height=317 src="http://www.uipower.com/document/uploadfile/2006112002.files/image009.jpg" width=308></span></p>
<p>&nbsp;</p>
<p><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7.</span></strong><strong><span>注意事项</span></strong></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.</span><span>请注意你拷贝的</span><span>Skin++</span><span>皮肤的路径，</span><span>sppLoadSkin</span><span>可以指定带路径的皮肤名称，支持绝对路径和相对路径。在</span><span>2003</span><span>中，工程的调试目录默认在</span><span>\bin\Debug</span><span>或</span><span>\bin\Release</span><span>中，所以在本文的例子中，请把皮肤拷贝到</span><span>\bin\Debug</span><span>目录中。当然你可以在</span><span>sppLoadSkin</span><span>中指定皮肤的路径。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.sppLoadSkin</span><span>的第二个参数是，是否让</span><span>Skin++</span><span>不自动截获所有的窗口进行换肤。默认情况下请填写</span><span>false.</span><span>就是让</span><span>Skin++</span><span>对你所有的窗口进行换肤。这样以后凡是从你程序中弹出的窗口均能自动换肤，而不需要你填写任何的代码。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.</span><span>细心的朋友也许会注意到，我们把</span><span>Application.EnableVisualStyles()</span><span>;</span><span>这句话注释掉了。原因是<span>Skin++</span>已经对<span>C#</span>所有的控件进行了彻底的换肤，所以在这个地方应该把<span>C#</span>默认的美化工作停止掉，这样可以提升显示效率。</span></p>
<img src ="http://www.blogjava.net/zqli/aggbug/126253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-06-26 09:41 <a href="http://www.blogjava.net/zqli/archive/2007/06/26/126253.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.NetFrameWork和.Compact NetFrameWork中Combox控件的区别</title><link>http://www.blogjava.net/zqli/archive/2007/04/26/113850.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Thu, 26 Apr 2007 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/04/26/113850.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/113850.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/04/26/113850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/113850.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/113850.html</trackback:ping><description><![CDATA[<p>从数据库中查询数据出来时，在赋值到Combox控件时，当Combox的Collections里没有对应的条目，.NetFrameWork可以把数据库取出来的值加到里面去，而.Compact NetFrameWork的Collections里如无相对应的item，将显示null。</p>
<img src ="http://www.blogjava.net/zqli/aggbug/113850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-04-26 17:08 <a href="http://www.blogjava.net/zqli/archive/2007/04/26/113850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>去掉水晶报表的数据库验证界面。</title><link>http://www.blogjava.net/zqli/archive/2007/04/26/113847.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Thu, 26 Apr 2007 09:01:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/04/26/113847.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/113847.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/04/26/113847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/113847.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/113847.html</trackback:ping><description><![CDATA[<p><strong>&nbsp;WinForm：</strong>&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;this.crystalReportViewer1.ReportSource = this.customerByLivingPlace1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 数据库Login<br>&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; foreach (CrystalDecisions.Shared.IConnectionInfo connection in this.customerByLivingPlace1.DataSourceConnections)<br>&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; connection.SetConnection("localhost", "Real_EstatePC", "**", "**");<br>&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; this.crystalReportViewer1.Refresh();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 子报表的Login<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (CrystalDecisions.CrystalReports.Engine.ReportDocument sr in document.Subreports)<br>&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; foreach (CrystalDecisions.Shared.IConnectionInfo connection in this.customerByLivingPlace1.DataSourceConnections)<br>&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;&nbsp; connection.SetConnection("localhost", "Real_EstatePC", "**", "**");<br>&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; }<br><br><br>注：customerByLivingPlace1指向rpt。<br><br><br><strong>WebForm：</strong><br>&nbsp;首先,为了登录方便,将数据库的用户名和密码先写到Web.config中: <br>&lt;appSettings&gt; <br>&nbsp;&nbsp;&nbsp; &lt;add key="DBServerName" value="你的数据库服务器" /&gt; <br>&nbsp;&nbsp;&nbsp; &lt;add key="DBUserID" value="sa" /&gt; <br>&nbsp;&nbsp;&nbsp; &lt;add key="DBPassWord" value="UU1Tc3lzdGVt" /&gt; <br>&lt;/appSettings&gt; </p>
<p>然后写个类来统一验证登录 <br>using System; <br>using System.Collections.Generic; <br>using System.Text; <br>using System.Configuration; </p>
<p>namespace BLL <br>{ <br>&nbsp;&nbsp;&nbsp; public class LoginCrystalReport <br>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void Login( CrystalDecisions.CrystalReports.Engine.ReportDocument report) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string serverName=ConfigurationManager.AppSettings["DBServerName"]; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string userId = ConfigurationManager.AppSettings["DBUserID"]; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string passWord=ConfigurationManager.AppSettings["DBPassWord"]; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Set Database Logon to main report <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (CrystalDecisions.Shared.IConnectionInfo connection in report.DataSourceConnections) <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; if (connection.ServerName == serverName) <br>&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; connection.SetLogon(userId, passWord); <br>&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; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Set Database Logon to subreport <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (CrystalDecisions.CrystalReports.Engine.ReportDocument subreport in report.Subreports) <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; foreach (CrystalDecisions.Shared.IConnectionInfo connection in subreport.DataSourceConnections) <br>&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; if (connection.ServerName == serverName) <br>&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;&nbsp;&nbsp;&nbsp; connection.SetLogon(userId, passWord); <br>&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; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; } <br>} <br><br></p>
<img src ="http://www.blogjava.net/zqli/aggbug/113847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-04-26 17:01 <a href="http://www.blogjava.net/zqli/archive/2007/04/26/113847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DataGrid.DataSource为DataView的DataGrid列宽重新自定义绘制。</title><link>http://www.blogjava.net/zqli/archive/2007/03/27/106685.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Tue, 27 Mar 2007 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/03/27/106685.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/106685.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/03/27/106685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/106685.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/106685.html</trackback:ping><description><![CDATA[
		<p>自定义DataGrid的列宽，数据源并非直接从DataSet直接拖过来，而是动态添加，不多说，部分代码如下：<br /><br />//重绘DataGrid的每个列</p>
		<p>            DataGridTableStyle ts = new DataGridTableStyle();<br />            ts.MappingName = RealEstatePDA.Util.DataBase.DataViews.getInstance().BuildingLocationDataView.Table.TableName; //如果绑定的是Datatable,这里要变一下   <br />            int numCols = RealEstatePDA.Util.DataBase.DataViews.getInstance().BuildingLocationDataView.Table.Columns.Count;<br />            int i = 0;<br />            DataGridTextBoxColumn aColumnTextColumn;<br />            while (i &lt; numCols)   //重绘所有的列   <br />            {<br />                aColumnTextColumn = new DataGridTextBoxColumn();<br />                aColumnTextColumn.MappingName = RealEstatePDA.Util.DataBase.DataViews.getInstance().BuildingLocationDataView.Table.Columns[i].ColumnName;<br />                ts.GridColumnStyles.Add(aColumnTextColumn);     //增加一种自定义的column风格   <br />                i++;<br />            }</p>
		<p>            this.HousedataGrid.TableStyles.Add(ts);</p>
		<p>            this.HousedataGrid.TableStyles[0].GridColumnStyles[0].Width = 70;   //第一列的宽度   <br />            this.HousedataGrid.TableStyles[0].GridColumnStyles[0].HeaderText = "房屋编号"; //第一列的标题   <br />            this.HousedataGrid.TableStyles[0].GridColumnStyles[1].Width = 200;   //第二列的宽度   <br />            this.HousedataGrid.TableStyles[0].GridColumnStyles[1].HeaderText = "YYYYY"; //第二列的标题   </p>
		<p>            this.HousedataGrid.Refresh();     </p>
		<p>
				<br />           //<br /><br /><br /><br /><br />相类似的另一种样式：<br />private DataView dv1,dv2;<br />private DataGridTableStyle dgts;<br /><br />private void frmChhd_Resize(object sender, System.EventArgs e)<br />{<br />//调整dataGrid1的列宽<br />if(dv1!=null)<br />{<br />//添加模板列<br />if(dataGrid1.TableStyles.Count==0)<br />{<br />dgts.MappingName=dv1.Table.TableName;<br />dataGrid1.TableStyles.Add(dgts); <br />}<br />int i=dataGrid1.Width/6-10;<br /><br />dataGrid1.TableStyles[0].GridColumnStyles[0].Width=i*2;<br /><br />dataGrid1.TableStyles[0].GridColumnStyles[1].Width<br />=dataGrid1.TableStyles[0].GridColumnStyles[2].Width<br />=dataGrid1.TableStyles[0].GridColumnStyles[3].Width<br />=dataGrid1.TableStyles[0].GridColumnStyles[4].Width=i;<br />}<br /><br />}<br /></p>
<img src ="http://www.blogjava.net/zqli/aggbug/106685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-03-27 16:08 <a href="http://www.blogjava.net/zqli/archive/2007/03/27/106685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]C#的四个基本技巧 </title><link>http://www.blogjava.net/zqli/archive/2007/03/13/103526.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Tue, 13 Mar 2007 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/03/13/103526.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/103526.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/03/13/103526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/103526.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/103526.html</trackback:ping><description><![CDATA[
		<p>1．如果可能尽量使用接口来编程 </p>
		<p>　　.NET框架包括类和接口，在编写程序的时候，你可能知道正在用.NET的哪个类。然而，在这种情况下如果你用.NET支持的接口而不是它的类来编程时，代码会变得更加稳定、可用性会更高。请分析下面的代码： </p>
		<p>private void LoadList (object [] items, ListBox l) <br />{ <br />　for (int i = 0; i &lt; items.Length;i++) <br />　　l.Items.Add (items[i].ToString ()); <br />} </p>
		<p>　　这个函数从一个可为任何对象的数组中加载ListBox，这段代码被限定为只能使用数组。假想过些时候你发现那些对象存在数据库中，或别的集合中。那么你需要修改程序来使用不同的集合类型。如果你用ICollection接口来写那段程序，你就不用修改那段程序了，对于任何实现ICollection接口的类型它都能很好的工作: </p>
		<p>private void LoadList (ICollection items,ListBox l) <br />{ <br />　　foreach (object o in items) <br />　　l.Items.Add (o.ToString ()); <br />} </p>
		<p>　　ICollection被数组和所有System.Collection中的集合实现。此外，多维数组也支持ICollection接口。如果那还不够的话，数据库.NET类同样支持ICollection接口。用接口写的这个函数不用需改就可以才许多中情况下使用。 </p>
		<p>　　2. 使用属性代替原始数据 </p>
		<p>　　因为属性已经成为语言本身的元素，所以声明数据元素时它的作用域等级没有必要大于private。因为代码本身会把属性看成数据元素，你并没有失去使用简单数据类型的便利性 。相反它会使你的代码更加灵活功能更加强大。属性使你的数据元素封装性更好。属性可以让你使用lazy evaluation来返回数据。lazy evaluation的意思是当用户请求时才计算它的值，而不是一直保留着它。 </p>
		<p>　　最后，属性可以是virtual也可以是abstract。你也可以在接口中定义属性。 </p>
		<p>　　这里还有维护方面的因素应当注意：尽管操作两者的方法是一样的，但是你把一个数据元素变成属性，那么原先客户端的程序便不能访问服务端的新版本程序了。实际上对于在Web service中你想实现序列化的值你可以把它们变成属性来使用： </p>
		<p>private int TheMonth = 0; </p>
		<p>[XmlAttribute ("Month")] <br />public int Month <br />{ <br />　get { <br />　　return TheMonth; <br />　} <br />　set { <br />　　TheMonth = value; <br />　} <br />} </p>
		<p>　　简单通过属性就可以使你的所有数据元素私有化。 </p>
		<p>　　3. 在Producer/Consumer 的Idiom中使用Delegate </p>
		<p>　　当你生成一个实现producer idiom类的时候，使用deletate来通知consumer。这种方法相对于用接口更加灵活。Delegate是多点传送的，所以不用加额外的代码你就何以支持多用户。相对于用接口这样做可使类之间的耦合性降低。 </p>
		<p>　　下面的类处理键盘输入并把它传给所有的registered listeners： </p>
		<p>public class KeyboardProcessor <br />{ <br />private OnGetLine theFunc = null; </p>
		<p>public OnGetLine OnGetLineCallback { <br />　get { <br />　　return theFunc; <br />　} <br />　set { <br />　　theFunc = value; <br />　} <br />} </p>
		<p>public void Run (){ <br />// Read input. <br />// If there is any listeners, publish: <br />string s; <br />do { <br />　s = Console.ReadLine (); <br />　if (s.Length == 0) <br />　　break; <br />　if (theFunc != null){ <br />　　System.Delegate [] funcs =theFunc.GetInvocationList(); <br />　　foreach (OnGetLine f in funcs) { <br />　　　try { <br />　　　　f (s); <br />　　　} catch (Exception e) { <br />　　　　Console.WriteLine <br />　　　　("Caught Exception: {0}", e.Message); <br />　　　} <br />　　} <br />　} <br />} while (true); <br />} </p>
		<p>　　任何数目的listeners都可注册到producer，它们所要做的只是提供一个特定的函数：deletate。 </p>
		<p>　　4. 注意初始化顺序 </p>
		<p>　　C＃中对于一些变量声明加入了initializer的概念。它们在构造函数之前被执行，实际上变量在基类的构造函数执行前之前被初始化。 </p>
		<p>　　所以，在初始化变量的时候不要用基类中的数据，因为它们还没有被构造。<br /></p>
<img src ="http://www.blogjava.net/zqli/aggbug/103526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-03-13 14:20 <a href="http://www.blogjava.net/zqli/archive/2007/03/13/103526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#验证数字</title><link>http://www.blogjava.net/zqli/archive/2007/03/13/103482.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Tue, 13 Mar 2007 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/03/13/103482.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/103482.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/03/13/103482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/103482.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/103482.html</trackback:ping><description><![CDATA[private bool IsNumeric(string str)  <br />{   <br />   System.Text.RegularExpressions.Regex reg<br />       = new System.Text.RegularExpressions.Regex(@"^[-]?\d+[.]?\d*$");   <br />   return reg.IsMatch(str);  <br />}<img src ="http://www.blogjava.net/zqli/aggbug/103482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-03-13 11:32 <a href="http://www.blogjava.net/zqli/archive/2007/03/13/103482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>调用.NET库，制作鼠标右键弹出菜单。</title><link>http://www.blogjava.net/zqli/archive/2007/03/09/102809.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Fri, 09 Mar 2007 06:03:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/03/09/102809.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/102809.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/03/09/102809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/102809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/102809.html</trackback:ping><description><![CDATA[        可以从工具栏上拖个ContextMenu控件下来，并编辑好，然后把你所需要添加ContextMenu的控件的ContextMenu属性设为这个右键菜单；除了上贴所述的方法，您也可以通过手工添写代码来实现弹出式菜单。关键的类是ContextMenu类。该类有两个构造函数，其中ContextMenu()生成一个不含任何菜单项的弹出式菜单；ContextMenu(MenuItem[]   menus)生成一个包括参数中所指定的菜单项的弹出式菜单。如要给一个按钮控件button1添加弹出式菜单，可以参考以下的代码：   <br />    <br />  ContextMenu   Menu1=new   ContextMenu();     <br />  Menu1.MenuItems.Add(new   MenuItem(“弹出菜单一"));     <br />  Menu1.MenuItems.Add(new   MenuItem(“弹出菜单二"));     <br />  button1.ContextMenu=Menu1;   <br />    <br />  ContextMenu有几个关键的属性、方法和事件，可以帮助您定制弹出式菜单，属性RightToLeft可以使菜单项从右到左对齐，属性SourceControl返回一个Control值表示当前所显示弹出菜单对应的控件。Show()方法可以使程序主动显示弹出菜单。当弹出菜单弹出时将引发一个Popup事件，你可以在该事件的响应方法中进行一些处理使弹出菜单显示前做一些操作。   <br />    <br />  您还可以参考MSDN中给出的一个示例来定制弹出式菜单：   <br />  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWindowsFormsContextMenuClassTopic.asp <br /><br />msdn示例代码（C#）<br /><br /><pre>private void MyPopupEventHandler(System.Object sender, System.EventArgs e)
 {
    // Define the MenuItem objects to display for the TextBox.
    MenuItem menuItem1 = new MenuItem("&amp;Copy");
    MenuItem menuItem2 = new MenuItem("&amp;Find and Replace");
    // Define the MenuItem object to display for the PictureBox.
    MenuItem menuItem3 = new MenuItem("C&amp;hange Picture");

    // Clear all previously added MenuItems.
    contextMenu1.MenuItems.Clear();
 
    if(contextMenu1.SourceControl == textBox1)
    {
       // Add MenuItems to display for the TextBox.
       contextMenu1.MenuItems.Add(menuItem1);
       contextMenu1.MenuItems.Add(menuItem2);
    }
    else if(contextMenu1.SourceControl == pictureBox1)
    {
       // Add the MenuItem to display for the PictureBox.
       contextMenu1.MenuItems.Add(menuItem3);
    }
 }
</pre>  <img src ="http://www.blogjava.net/zqli/aggbug/102809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-03-09 14:03 <a href="http://www.blogjava.net/zqli/archive/2007/03/09/102809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]新手入门-WinForm如何打开一个新窗体得同步关闭当前窗体。另求C/S结构程序设计方式。</title><link>http://www.blogjava.net/zqli/archive/2007/02/02/97404.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Fri, 02 Feb 2007 00:53:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/02/02/97404.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/97404.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/02/02/97404.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/97404.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/97404.html</trackback:ping><description><![CDATA[
		<p>提问：</p>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>问者:7712190(25458848@163.com) 信誉:96 级别:user5 日期:2006-9-10 23:49:27</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: visible; HEIGHT: 50px; WORD-WRAP: break-word">小弟一直都是做 B/S开发 
这几天心血来潮 想写一写 C/S程序 
一入门就遇到这个问题 我在 登陆窗体体 NEW了 一个新窗体吧新窗体Show了 之后 原来得窗体cLOSE。新NEW得窗体也关闭了  不知道为什么 请指点

另求 C/S程序得 设计方法。
比如如何处理 公共得变量 等应该注意得事情  希望大家不吝赐教
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>回复： </p>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:wzq6511() 信誉:100 级别:user1 日期:2006-9-11 0:36:28 id:36659940</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">不要用close，用hide，原先的窗体只能隐藏起来不能关闭。
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:bejon(阿牛[如果我懂，必坦诚相告；如果您懂，请不怜赐教。]) 信誉:93 级别:star1 日期:2006-9-11 2:00:21 id:36660132</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">在new form后使用this.close;来完成

在new form之前把窗体id写在注册表，然后在new form之后检查那里，如果有值就使用api关闭那个窗体，然后把注册表清空。


</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:zhgroup(王员外) 信誉:99 级别:star1 日期:2006-9-11 8:06:33 id:36660371</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">1、要看原窗体是那个窗体了，如果是入口的窗体，则应hide,想要显示时可用Show.
如果是登陆窗体,在主窗体的Main入口处
FormLogin frm = new FormLogin();
frm.ShowDialog();
if 登陆失败
 关闭窗体
 return
2、和B/S基本类似，只不过对于状态信息比较容易控制。


</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:qzh1119(大浪淘沙) 信誉:59 级别:user2 日期:2006-9-11 8:12:07 id:36660412</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">up
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:qzh1119(大浪淘沙) 信誉:59 级别:user2 日期:2006-9-11 8:12:33 id:36660419</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">关注，学习中
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:bestshl(快乐的Coder) 信誉:100 级别:user2 日期:2006-9-11 8:24:52 id:36660529</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">zhgroup(王员外) 正解
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:interboy(冯东) 信誉:100 级别:user2 日期:2006-9-11 8:27:37 id:36660559</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">zhgroup(王员外) 说的对,如果你把main函数放在loginform里的话,那么它就是主窗体,如果你在它里面调用了this.close();你想啊,主窗体都关了,别的呢,皮之不存,毛将焉附!
建议把loginform作为子窗体,通过主窗体了掉子窗体进行判断
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:7712190(25458848@163.com) 信誉:96 级别:user5 日期:2006-9-11 12:40:41 id:36667940</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">问题是我不想HIde  真的没有其他的办法了么?
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:lovefootball(蟑螂（生活就是扯淡--做人要放低姿态）) 信誉:98 级别:star2 日期:2006-9-11 12:49:07 id:36668125</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">上面已经说清楚了
如果你不想hide
那你就在main里面先new这个登陆窗体
如果登陆成功在run主窗体
否则关闭
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:zahuifan(杂烩饭) 信誉:93 级别:star1 日期:2006-9-11 12:56:33 id:36668305</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">up
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:guyes123(以为喜欢这里,所以来接分) 信誉:100 级别:user1 日期:2006-9-11 13:00:06 id:36668391</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">一般还是用HIDE吧
其他的我就不会了
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:naturalth(自我批判，是思想、品德、素质、技能创新的优良工具) 信誉:99 级别:user4 日期:2006-9-11 13:07:31 id:36668586</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">#region "Main"
public ModMain()
{
}

[STAThreadAttribute]
static void Main() 
{
//异常处理
Application.ThreadException += new ThreadExceptionEventHandler(MainUIThreadExceptionHandler);

            Common.Database.ConnectionString = Get_Info();
frmLogon frm = new frmLogon();
            frm.txtUser.Text = loginUser;
if (frm.ShowDialog()==System.Windows.Forms.DialogResult.Cancel)
{
return;
}
            
System.Windows.Forms.Application.Run(new myMenu());
}
#endregion
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:xvting(xvting) 信誉:103 级别:user4 日期:2006-9-11 15:10:44 id:36672298</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">VS默认的WinForm程序模板只有一个程序消息循环，并且入口Form关闭的同时退出程序消息循环，结束程序。

开始
 |
 |
消息循环（入口Form）
 |
 |
结束



</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:xvting(xvting) 信誉:103 级别:user4 日期:2006-9-11 15:14:42 id:36672390</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">可以设计下面的流程

开始
 |
 |                    False
消息循环（登陆Form）---------
 |                          |
 | True                     |
 |                          |
消息循环（主Form）           |
 |                          |
 |--------------------------
退出
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:xvting(xvting) 信誉:103 级别:user4 日期:2006-9-11 15:16:34 id:36672453</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">Demo

StartApp.cs文件
/////////////////////////////////////////////////////////////////
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Text;

namespace WinFromDemo
{
public class StartApp
{
private static bool LoginResult = false;

[STAThread]
static void Main()
{
//First Message Loop
LoginContext loginContext = new StartApp.LoginContext();
Application.Run(loginContext);

if (LoginResult)
{
//Second Message Loop
StartApp.MainContext mainContext = new StartApp.MainContext();
Application.Run(mainContext);
}
}

public class LoginContext : ApplicationContext 
{
private LoginDialog loginDialog;

public LoginContext() 
{
loginDialog = new LoginDialog();
loginDialog.StartPosition = FormStartPosition.CenterScreen;
loginDialog.Closed += new EventHandler(OnFormClosed);            
loginDialog.Show();
}

private void OnFormClosed(object sender, EventArgs e) 
{
LoginResult = !(this.loginDialog.DialogResult == DialogResult.Cancel);

ExitThread();
}
}

public class MainContext : ApplicationContext 
{
private Form mainForm;

public MainContext() 
{
mainForm = new Form();
mainForm.StartPosition =  FormStartPosition.CenterScreen;
mainForm.Closed += new EventHandler(OnFormClosed);            
mainForm.Show();
}

private void OnFormClosed(object sender, EventArgs e) 
{
ExitThread();
}
}
}
}

</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:csLius() 信誉:100 级别:user2 日期:2006-9-11 15:17:56 id:36672496</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">http://blog.csdn.net/Knight94/archive/2006/08/22/1104957.aspx

</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:pegtop(再回首) 信誉:100 级别:user2 日期:2006-9-11 15:23:51 id:36672677</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">新窗体是在原窗体基础上建立起来的,不能关闭原窗体只能隐藏.

要想处理全局变量,建议采用Static变量
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:pretty_soft() 信誉:100 级别:user1 日期:2006-9-11 15:36:50 id:36673096</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">我觉得还是
 开启---登陆画面/显示主窗体默认界面---用showdialog显示登陆---判断返回值初始权限
这样比较好
把应用程序加载放到启动画面去
这种更适合比较大的系统，不同的模块不同的用户权限
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:Santos(快乐的GG) 信誉:100 级别:user4 日期:2006-9-11 16:15:46 id:36674473</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">ShowDialog();方法才是正解.

Button1_Click()
{

xxxForm frm = new xxxForm();
frm.ShowDialog();

}
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:kissknife(侧身向南边) 信誉:100 级别:user5 日期:2006-9-11 16:20:54 id:36674652</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">http://www.cnblogs.com/KissKnife/archive/2006/09/10/500158.html
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:ttgzs(一路狂奔) 信誉:100 级别:user1 日期:2006-9-11 17:01:58 id:36676000</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">#region "Main"
public ModMain()
{
}

[STAThreadAttribute]
static void Main() 
{
//异常处理
Application.ThreadException += new ThreadExceptionEventHandler(MainUIThreadExceptionHandler);

            Common.Database.ConnectionString = Get_Info();
frmLogon frm = new frmLogon();
            frm.txtUser.Text = loginUser;
if (frm.ShowDialog()==System.Windows.Forms.DialogResult.Cancel)
{
return;
}
            
System.Windows.Forms.Application.Run(new myMenu());
}
#endregion

</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:kubbye(小蛤蟆就是我) 信誉:100 级别:user1 日期:2006-9-11 23:15:00 id:36681363</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">准确的说,做为启动窗体的那个窗体是不能关的,它关了,程序就停了,其他的窗体可以关,启动窗体只能隐藏
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:kubbye(小蛤蟆就是我) 信誉:100 级别:user1 日期:2006-9-11 23:17:29 id:36681383</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">接上面,你可以把主界面作为启动窗体,然后在主界面未显示出来前,先显示登录窗体,登录成功再显示主窗体,登录不成功,直接退出,直接在form的load事件中写就好了
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:qiujb(楚留香) 信誉:100 级别:user2 日期:2006-9-12 8:12:25 id:36682515</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">zhgroup(王员外) 正解
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:Samen168(让代码为你写代码) 信誉:95 级别:star1 日期:2006-9-12 8:56:52 id:36683381</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">逻辑问题
main()
{
   loginform lf = new loginform();
   if(lf.Showdialog() == DialogResult.OK)
   {
     mainform mf = new mainform();
     mf.show();
   }
}
这样根据不存在谁打开谁
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:Samen168(让代码为你写代码) 信誉:95 级别:star1 日期:2006-9-12 8:57:00 id:36683386</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">根本
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:sunxianyu(找工作) 信誉:100 级别:user2 日期:2006-9-12 9:05:26 id:36683679</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">zhgroup(王员外) ( ) 信誉：99    Blog 
正解
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:fds2003(Hunter) 信誉:99 级别:user5 日期:2006-9-12 9:17:54 id:36684103</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">上面能说的都讲了！
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:yangao(偶新手 请问门在哪里？) 信誉:100 级别:user4 日期:2006-9-12 9:41:16 id:36684775</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">学习
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:henrydee1(小d) 信誉:101 级别:user2 日期:2006-9-12 10:29:21 id:36686255</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">if (this.ActiveMdiChild!=null)
{
this.ActiveMdiChild.Close(); //关闭已经打开的子窗体
}

InSchool child_InSchool=new InSchool();
child_InSchool.MdiParent=this;//this表示本窗体为其父窗体
child_InSchool.Show();
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:xiaoliangwh(小亮wh) 信誉:100 级别:user2 日期:2006-9-12 23:55:03 id:36705585</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">xuexi
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:sdl2005lyx() 信誉:100 级别:user4 日期:2006-9-13 8:26:41 id:36706505</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">lz：一个很简单的办法（刚好前几天解决的）：
     你在原来的窗体设置一个public bool bNew=false;的变量，在你要new新窗体的地方改成如下代码：
     bNew=true;
     this.Close();
     //原来窗体消失了，但它的类作用域并没有消失
   
然后在你原来定义、使用原窗体变量的地方，即frmOld.ShowDialog();之后：
    if(frmOld.bNew)
    {
        NewForm frmNew=new NewForm ();
        frmNew.ShowDialog();
    } 
问题就搞定了。。。  


</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:GXY2005(晓晨美眉好^_^) 信誉:94 级别:user5 日期:2006-9-13 8:52:21 id:36707030</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">jf
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:wuhuiITren(CSDN男主角) 信誉:100 级别:user2 日期:2006-9-14 13:26:23 id:36740819</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">楼上的都说了，楼主自己一个个试就可以了啊，想怎么办就怎么办啊
</pre>
		<hr style="COLOR: #c1cdd8; HEIGHT: 1px" />
		<p>答者:slex(蘂橤（蛋不能扯远，笑不能搞大)) 信誉:100 级别:user4 日期:2006-9-14 14:35:50 id:36743030</p>
		<pre style="OVERFLOW-Y: visible; OVERFLOW-X: auto; HEIGHT: 50px; WORD-WRAP: break-word">上面的那两个方法已经能解决lz问题了，该结了 呵呵
</pre>
<img src ="http://www.blogjava.net/zqli/aggbug/97404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-02-02 08:53 <a href="http://www.blogjava.net/zqli/archive/2007/02/02/97404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>低级错误-DataView.Count属性。</title><link>http://www.blogjava.net/zqli/archive/2007/02/01/97342.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Thu, 01 Feb 2007 12:12:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/02/01/97342.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/97342.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/02/01/97342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/97342.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/97342.html</trackback:ping><description><![CDATA[记录个自己的低级错误!!!!!!!!!!!!!!!!!<br /><br />今天在对一个表进行删除，发现以下问题：<br /><br />先附一段代码：（方便调试，加了些MessageBox.）<br />            string deleteID = this.costomerDataGrid[this.costomerDataGrid.CurrentRowIndex, 6].ToString();<br />            this.costomer_RecordTableAdapter.Fill(this.realEstatePDADataSet.Costomer_Record);<br />            MessageBox.Show("过滤前的dataView集合数："+this.dataView2.Count.ToString());<br />            this.dataView2.RowFilter = "客户编号 = '" +deleteID+ "'";<br />            //this.dataView1.Sort = "来访时间";<br />            MessageBox.Show("过滤条件：" + deleteID);<br />            MessageBox.Show("过滤后的dataView集合数："+this.dataView2.Count.ToString());<br />            this.costomer_RecordBindingSource.EndEdit();<br />            for (int i = 0; i &lt; this.dataView2.Count; i++)<br />            {<br />                MessageBox.Show("删除第"+i+"条记录");<br />                this.costomer_RecordBindingSource.RemoveAt(i);<br />            }<br />            this.costomer_RecordTableAdapter.Update(this.realEstatePDADataSet.Costomer_Record);<br />            MessageBox.Show("删除成功!");<br /><br />出现问题：表中的记录没被清除完全。仔细检查，发现Data.Count属性随着循环删除，每次比较 i &lt; this.dataView2.Count，Count属性也是动态变化的。解决办法:<br />            string deleteID = this.costomerDataGrid[this.costomerDataGrid.CurrentRowIndex, 6].ToString();<br />            this.costomer_RecordTableAdapter.Fill(this.realEstatePDADataSet.Costomer_Record);<br />            MessageBox.Show("过滤前的dataView集合数："+this.dataView2.Count.ToString());<br />            this.dataView2.RowFilter = "客户编号 = '" +deleteID+ "'";<br />            //this.dataView1.Sort = "来访时间";<br />            MessageBox.Show("过滤条件：" + deleteID);<br />            MessageBox.Show("过滤后的dataView集合数："+this.dataView2.Count.ToString());<br />            this.costomer_RecordBindingSource.EndEdit();<br />            while(this.dataView2.Count!=0)<br />            {<br />                MessageBox.Show("删除第" + Convert.ToSingle(this.dataView2.Count)+ "条记录");<br />                this.costomer_RecordBindingSource.RemoveAt(this.dataView2.Count-1);<br />            }<br />            this.costomer_RecordTableAdapter.Update(this.realEstatePDADataSet.Costomer_Record);<br />                MessageBox.Show("删除成功!");<br /><br /><img src ="http://www.blogjava.net/zqli/aggbug/97342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-02-01 20:12 <a href="http://www.blogjava.net/zqli/archive/2007/02/01/97342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]C# Inner Class vs. java 的inner class比较</title><link>http://www.blogjava.net/zqli/archive/2007/02/01/97235.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Thu, 01 Feb 2007 05:48:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/02/01/97235.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/97235.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/02/01/97235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/97235.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/97235.html</trackback:ping><description><![CDATA[为什么在C#中inner class不能够访问外部类的非静态成员，如下面的一段代码就存在这样的问题： <br /><br />public class TestOuter <br /><br />{ <br /><br />public static void outer(){} <br /><br />public void outer2(){} <br /><br /><br /><br />internal class A <br /><br />{ <br /><br />public voidtest() <br /><br />{ <br /><br />outer(); // 可以调用外部静态方法，无法调用实例方法 <br /><br />outer2(); // 本句无法通过编译 <br /><br />} <br /><br />} <br /><br />} <br /><br />在Java中，下面的代码是可以很正常的使用的： <br /><br />public class testinner <br /><br />{ <br /><br />static public void Main(String[] args) <br /><br />{ <br /><br />testinner tester = new testinner(); <br /><br />testinner.Inner inner = tester.new Inner(); <br /><br />inner.testinner(); <br /><br />} <br /><br />public void test(){ } <br /><br /><br /><br />class Inner <br /><br />{ <br /><br />public void testinner() <br /><br />{ <br /><br />test(); <br /><br />} <br /><br />} <br /><br />} <br /><br /><br /><br />对比之下，C#中的内部类能够使用外部类定义的类型和静态方法，但是不能直接使用外部类的实例方法，直接看来，外部类对于内部类的作用更像是一个命名空间，在C#中，始终可以用（只要访问控制允许） <br /><br />TestOuter.A instance = new TestOuter.A(); <br /><br />来创建一个内部类的实例，这个实例与外部类的任何实例没有任何直接的关系。类似于Java中的静态内部类。 <br /><br />Java中，非静态内部类可以访问所有外部类的方法和变量。所以Java中的内部类的构造也依赖于外部类，必须使用如： <br /><br />Outer.Inner inner = outer.new Inner(); <br /><br />这样的语法来定义内部类的实例以确保他与某一确定的外部类的对象相对应。 <br /><br />而在C#中，类区分为Nested Class和Not-Nested Class，前者是声明在其他数据类型内部的类。后者是直接定义在某一个命名空间的类。 <br /><br />非内嵌类只允许使用public和internal的访问控制，而内置类则允许使用所有的五种访问控制符，private, protected , internal protected。内部类也可以访问外部类的所有方法,包括instance方法和private方法，但是需要显式的传递一个外部类的实例。 <br /><br />如： <br /><br />public class TestOuter <br /><br />{ <br /><br />public void outer2(){} <br /><br /><br /><br />internal class A <br /><br />{ <br /><br />public A(TestOuter obj) <br /><br />{ <br /><br />Outer_this = obj <br /><br />} <br /><br />public void test() <br /><br />{ <br /><br />obj.outer2(); <br /><br />} <br /><br />TestOuter Outer_this； <br /><br />} <br /><br />} <br /><br />C#这样做的原因，主要是为了避免outer.new 这样的语法，保持一致的对象创建方式。虽然相比于Java需要创建一个新的方法和变量，但是对象的创建过程更加直接，而且避免了隐含的内部类与外部类的实例之间的关系。 <br /><br />如果分析到CLR的实现层面，我们也可以知道，C#的内部类应该并没有包含外部类的虚函数表，而仅仅包含了静态方法表，所有对外部类的方法的调用时通过外部类指针作的。具体的机制可能更复杂。但是除此以外，内部类并没有被作为一种特殊的类型处理，而是必须与其他普通的对象采取一样的机制进行创建。 <br /><br />C#的内部类提供了覆盖的功能，在一个包含了内部类的类的子类中可以用关键字new 来覆盖同名内部类的实现。 <br /><br />如: <br /><br />class A1 <br /><br />{ <br /><br />class B1 { } <br /><br />} <br /><br />class A2 : A1 <br /><br />{ <br /><br />new class B1 { } <br /><br />} <br /><br />C#中的内部类会覆盖同名的外部类的方法。如果上面的A1中定义任何名为B1()的方法，该方法将被覆盖。 <br /><br /><br /><br />内部类使用的一些General Information: <br /><br />创建内部类的一个目的是为了抽象外部类的某一状态下的行为，或者内部类仅在外部类的某一特定上下文存在。或是隐藏实现，通过将内部类设为private，可以设置仅有外部类可以访问该类。内部类的另外一个重要的用途是当外部类需要作为某个特定的类工作，而外部类已经继承与另外一个类的时候，因为Java不支持多继承，所以创建一个对应的内部类作为外部类的一个fa&amp;ccedil;ade来使用。 <br /><br />通常，创建内部类的动机都是上面中的其中之一或者几项。而其中最常见的目的莫过于前两项。 <br /><br />我们看一下Java中处理事件的代码： <br /><br />public class Demo1 extends JPanel <br /><br />{ <br /><br />class IconDemo implements Icon {} <br /><br />} <br /><br />这个例子对应了上面的第一种动机，即封装特定状态或特定实现的动机。IconDemo仅在的Demo1中使用，对应特定的图标绘制行为。 <br /><br />常见的另外一个场合是需要自定义Action的行为，我们可能有如下的类： <br /><br />public class Demo1 extends JPanel implements ActionListener <br /><br />{ <br /><br />private JMenuItem item1; <br /><br />void foo() <br /><br />{ <br /><br />Item1 = new JMenuItem（“test” , new TestAction(“some action”)）; <br /><br />} <br /><br />Private TestAction extends AbstractAction <br /><br />{ <br /><br />//code goes here <br /><br />} <br /><br />} <br /><br />这种情况下，TestAction可以看成是一种特化的要求。 <br /><br /><br /><br />隐藏实现的需求往往对应于内部抽象，或者二次抽象(Secondary Abstraction)，它对应着对于类内部的部分行为进一步抽象，聚簇。常见的一种情况是在内部类中创建私有的结构，用于抽象尽在类的内部使用的数据结构。 <br /><br /><br /><br />而作为Fa&amp;ccedil;ade使用的情况相当于外部类作为内部类的创建工厂，当外部请求需要外部类提供一个它不能够继承的基类或接口的时候，外部类产生一个内部类的实例对象，返回给相应的请求。 <br /><br /><br /><br />创建内部类的一些原则： <br /><br />如果一下一些情况出现，避免使用内部类： <br /><br />内部类的功能过分膨胀影响了对外部类的阅读 <br /><br />内部类内部包含内部类，对代码的可读性影响很大 <br /><br />内部类可以不依赖于外部类被使用，在这种情况下，说明内部类与外部类的抽象没有包含关系，则应该将内部类作为一种独立的抽象设计为另外一个外部类。(可以参考内部类设计的第二目的，内部抽象) <br /><br /><br /><br />注：在VC中可以使用内部类作为模版的局部特化处理，掠过不提。其实我也不太懂，:) <br /><img src ="http://www.blogjava.net/zqli/aggbug/97235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-02-01 13:48 <a href="http://www.blogjava.net/zqli/archive/2007/02/01/97235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DataGridView显示行号</title><link>http://www.blogjava.net/zqli/archive/2007/01/27/96253.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Sat, 27 Jan 2007 03:23:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/01/27/96253.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/96253.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/01/27/96253.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/96253.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/96253.html</trackback:ping><description><![CDATA[DataGridView控件的属性中，无法设置显示行号，为了达到如图所示的效果：<br /><p align="center"><img src="C:\Documents and Settings\Administrator\My Documents\My Pictures\1.jpg" temp_src="C:\Documents and Settings\Administrator\My Documents\My Pictures\1.jpg" /></p><p align="left"><br /><br />可以在DataGirdView的RowPostPaint事件中进行绘制。<br />如：添加以下方法代码 <br /><br />private void DrawRowIndex(object sender, DataGridViewRowPostPaintEventArgs e)<br />        {<br />            Rectangle rectangle = new Rectangle(e.RowBounds.Location.X,<br />               e.RowBounds.Location.Y,<br />               this.costomerDataGridView.RowHeadersWidth - 4,<br />               e.RowBounds.Height);</p><p align="left">            TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(),<br />                this.costomerDataGridView.RowHeadersDefaultCellStyle.Font,<br />                rectangle,<br />                this.costomerDataGridView.RowHeadersDefaultCellStyle.ForeColor,<br />                TextFormatFlags.VerticalCenter | TextFormatFlags.Right);</p><p align="left">        }<br />即可完成显示行号的功能。<br /><br /></p><img src ="http://www.blogjava.net/zqli/aggbug/96253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-01-27 11:23 <a href="http://www.blogjava.net/zqli/archive/2007/01/27/96253.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]揭开正则表达式的神秘面纱</title><link>http://www.blogjava.net/zqli/archive/2007/01/21/95180.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Sun, 21 Jan 2007 14:12:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/01/21/95180.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/95180.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/01/21/95180.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/95180.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/95180.html</trackback:ping><description><![CDATA[
		<h4>
				<strong>引言</strong>
		</h4>
		<p>    正则表达式（regular expression）描述了一种字符串匹配的模式，可以用来：（1）检查一个串中是否含有符合某个规则的子串，并且可以得到这个子串；（2）根据匹配规则对字符串进行灵活的替换操作。<br /><br />    正则表达式学习起来其实是很简单的，不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂，一方面是因为大多数的文档没有做到由浅入深地讲解，概念上没有注意先后顺序，给读者的理解带来困难；另一方面，各种引擎自带的文档一般都要介绍它特有的功能，然而这部分特有的功能并不是我们首先要理解的。<br /><br />    文章中的每一个举例，都可以点击进入到测试页面进行测试。闲话少说，开始。</p>
		<hr color="#fea089" size="1" />
		<h4>1. 正则表达式规则</h4>
		<h5>
				<a name="common">
				</a>1.1 普通字符</h5>
		<p>    字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号，都是"普通字符"。表达式中的普通字符，在匹配一个字符串的时候，匹配与之相同的一个字符。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=c&amp;txt=abcde">举例1：表达式 "c"，在匹配字符串 "abcde" 时</a>，匹配结果是：成功；匹配到的内容是："c"；匹配到的位置是：开始于2，结束于3。（注：下标从0开始还是从1开始，因当前编程语言的不同而可能不同）<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=bcd&amp;txt=abcde">举例2：表达式 "bcd"，在匹配字符串 "abcde" 时</a>，匹配结果是：成功；匹配到的内容是："bcd"；匹配到的位置是：开始于1，结束于4。</p>
		<hr color="#fea089" size="1" />
		<h5>
				<a name="escaped">
				</a>1.2 简单的转义字符</h5>
		<p>    一些不便书写的字符，采用在前面加 "\" 的方法。这些字符其实我们都已经熟知了。</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="70">
										<p>表达式</p>
								</td>
								<td>
										<p>可匹配</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\r, \n</p>
								</td>
								<td>
										<p>代表回车和换行符</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\t</p>
								</td>
								<td>
										<p>制表符</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\\</p>
								</td>
								<td>
										<p>代表 "\" 本身</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>    还有其他一些在后边章节中有特殊用处的标点符号，在前面加 "\" 后，就代表该符号本身。比如：^, $ 都有特殊意义，如果要想匹配字符串中 "^" 和 "$" 字符，则表达式就需要写成 "\^" 和 "\$"。</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="66">
										<p>表达式</p>
								</td>
								<td>
										<p>可匹配</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\^</p>
								</td>
								<td>
										<p>匹配 ^ 符号本身</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\$</p>
								</td>
								<td>
										<p>匹配 $ 符号本身</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\.</p>
								</td>
								<td>
										<p>匹配小数点（.）本身</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>    这些转义字符的匹配方法与 "普通字符" 是类似的。也是匹配与之相同的一个字符。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%5C$d&amp;txt=abc$de">举例1：表达式 "\$d"，在匹配字符串 "abc$de" 时</a>，匹配结果是：成功；匹配到的内容是："$d"；匹配到的位置是：开始于3，结束于5。</p>
		<hr color="#fea089" size="1" />
		<h5>
				<a name="multi">
				</a>1.3 能够与 '多种字符' 匹配的表达式</h5>
		<p>    正则表达式中的一些表示方法，可以匹配 '多种字符' 其中的任意一个字符。比如，表达式 "\d" 可以匹配任意一个数字。虽然可以匹配其中任意字符，但是只能是一个，不是多个。这就好比玩扑克牌时候，大小王可以代替任意一张牌，但是只能代替一张牌。</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="66">
										<p>表达式</p>
								</td>
								<td>
										<p>可匹配</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<span id="pattern" name="pattern">
														<font color="#000000">
																<font color="#900050">\d</font>
														</font>
												</span>
										</p>
								</td>
								<td>
										<p>任意一个数字，0~9 中的任意一个</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<span id="pattern" name="pattern">
														<font color="#000000">
																<font color="#900050">\w</font>
														</font>
												</span>
										</p>
								</td>
								<td>
										<p>任意一个字母或数字或下划线，也就是 A~Z,a~z,0~9,_ 中任意一个</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<span id="pattern" name="pattern">
														<font color="#000000">
																<font color="#900050">\s</font>
														</font>
												</span>
										</p>
								</td>
								<td>
										<p>包括空格、制表符、换页符等空白字符的其中任意一个</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<span id="pattern" name="pattern">
														<font color="#000000">
																<font color="#900050">.</font>
														</font>
												</span>
										</p>
								</td>
								<td>
										<p>小数点可以匹配除了换行符（\n）以外的任意一个字符</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cd%5Cd&amp;txt=abc123">举例1：表达式 "<span id="pattern" name="pattern"><font color="#000000"><font color="#900050">\d</font><font color="#900050">\d</font></font></span>"，在匹配 "abc123" 时</a>，匹配的结果是：成功；匹配到的内容是："12"；匹配到的位置是：开始于3，结束于5。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=a.%5Cd&amp;txt=aaa100">举例2：表达式 "<span id="pattern" name="pattern"><font color="#000000">a<font color="#900050">.</font><font color="#900050">\d</font></font></span>"，在匹配 "aaa100" 时</a>，匹配的结果是：成功；匹配到的内容是："aa1"；匹配到的位置是：开始于1，结束于4。</p>
		<hr color="#fea089" size="1" />
		<h5>
				<a name="custom">
				</a>1.4 自定义能够匹配 '多种字符' 的表达式</h5>
		<p>    使用方括号 [ ] 包含一系列字符，能够匹配其中任意一个字符。用 [^ ] 包含一系列字符，则能够匹配其中字符之外的任意一个字符。同样的道理，虽然可以匹配其中任意一个，但是只能是一个，不是多个。</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="80">
										<p>表达式</p>
								</td>
								<td>
										<p>可匹配</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<span id="pattern" name="pattern">
														<font color="#000000">
																<font color="#900050">[ab5@]</font>
														</font>
												</span>
										</p>
								</td>
								<td>
										<p>匹配 "a" 或 "b" 或 "5" 或 "@"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<span id="pattern" name="pattern">
														<font color="#000000">
																<font color="#900050">[^abc]</font>
														</font>
												</span>
										</p>
								</td>
								<td>
										<p>匹配 "a","b","c" 之外的任意一个字符</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<span id="pattern" name="pattern">
														<font color="#000000">
																<font color="#900050">[f-k]</font>
														</font>
												</span>
										</p>
								</td>
								<td>
										<p>匹配 "f"~"k" 之间的任意一个字母</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<span id="pattern" name="pattern">
														<font color="#000000">
																<font color="#900050">[^A-F0-3]</font>
														</font>
												</span>
										</p>
								</td>
								<td>
										<p>匹配 "A"~"F","0"~"3" 之外的任意一个字符</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>    <a href="http://www.regexlab.com/zh/workshop.asp?pat=[bcd][bcd]&amp;txt=abc123">举例1：表达式 "<span id="pattern" name="pattern"><font color="#000000"><font color="#900050">[bcd]</font><font color="#900050">[bcd]</font></font></span>" 匹配 "abc123" 时</a>，匹配的结果是：成功；匹配到的内容是："bc"；匹配到的位置是：开始于1，结束于3。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%5B%5Eabc%5D&amp;txt=abc123">举例2：表达式 "<span id="pattern" name="pattern"><font color="#000000"><font color="#900050">[^abc]</font></font></span>" 匹配 "abc123" 时</a>，匹配的结果是：成功；匹配到的内容是："1"；匹配到的位置是：开始于3，结束于4。</p>
		<hr color="#fea089" size="1" />
		<h5>
				<a name="times">
				</a>1.5 修饰匹配次数的特殊符号</h5>
		<p>    前面章节中讲到的表达式，无论是只能匹配一种字符的表达式，还是可以匹配多种字符其中任意一个的表达式，都只能匹配一次。如果使用表达式再加上修饰匹配次数的特殊符号，那么不用重复书写表达式就可以重复匹配。<br /><br />    使用方法是："次数修饰"放在"被修饰的表达式"后边。比如："[bcd][bcd]" 可以写成 "[bcd]{2}"。</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="67">
										<p>表达式</p>
								</td>
								<td>
										<p>作用</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<span id="pattern" name="pattern">
														<font color="#000000">
																<font color="#e07000">{n}</font>
														</font>
												</span>
										</p>
								</td>
								<td>
										<p>表达式重复n次，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=\w{2}&amp;txt=ab+c6">"\w{2}" 相当于 "\w\w"</a>；<a href="http://www.regexlab.com/zh/workshop.asp?pat=a{5}&amp;txt=bbaaaaaddee">"a{5}" 相当于 "aaaaa"</a></p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<span id="pattern" name="pattern">
														<font color="#000000">
																<font color="#e07000">{m,n}</font>
														</font>
												</span>
										</p>
								</td>
								<td>
										<p>表达式至少重复m次，最多重复n次，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=ba{1,3}&amp;txt=a,baaa,baa,b,ba">"ba{1,3}"可以匹配 "ba"或"baa"或"baaa"</a></p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<span id="pattern" name="pattern">
														<font color="#000000">
																<font color="#e07000">{m,}</font>
														</font>
												</span>
										</p>
								</td>
								<td>
										<p>表达式至少重复m次，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=\w\d{2,}&amp;txt=b1,a12,_456,_4AA,M12344,12346546547446534543543">"\w\d{2,}"可以匹配 "a12","_456","M12344"...</a></p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<span id="pattern" name="pattern">
														<font color="#000000">
																<font color="#e07000">?</font>
														</font>
												</span>
										</p>
								</td>
								<td>
										<p>匹配表达式0次或者1次，相当于 {0,1}，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=a[cd]%3F&amp;txt=a,c,d,ac,ad">"a[cd]?"可以匹配 "a","ac","ad"</a></p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<span id="pattern" name="pattern">
														<font color="#000000">
																<font color="#e07000">+</font>
														</font>
												</span>
										</p>
								</td>
								<td>
										<p>表达式至少出现1次，相当于 {1,}，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=a%2Bb&amp;txt=a%2Cb%2Cab%2Caab%2Caaab">"a+b"可以匹配 "ab","aab","aaab"...</a></p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<span id="pattern" name="pattern">
														<font color="#000000">
																<font color="#e07000">*</font>
														</font>
												</span>
										</p>
								</td>
								<td>
										<p>表达式不出现或出现任意次，相当于 {0,}，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5C%5E*b&amp;txt=%5E%2Cb%2C%5E%5E%5Eb%2C%5E%5E%5E%5E%5E%5E%5Eb">"\^*b"可以匹配 "b","^^^b"...</a></p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cd%2B%5C.%3F%5Cd*&amp;txt=It%20costs%20%2412.5">举例1：表达式 "<span id="pattern" name="pattern"><font color="#000000"><font color="#900050">\d</font><font color="#e07000">+</font>\.<font color="#e07000">?</font><font color="#900050">\d</font><font color="#e07000">*</font></font></span>" 在匹配 "It costs $12.5" 时</a>，匹配的结果是：成功；匹配到的内容是："12.5"；匹配到的位置是：开始于10，结束于14。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=go{2,8}gle&amp;txt=Ads%20by%20goooooogle%2C%20or%20gooogle">举例2：表达式 "<span id="pattern" name="pattern"><font color="#000000">go<font color="#e07000">{2,8}</font>gle</font></span>" 在匹配 "Ads by goooooogle" 时</a>，匹配的结果是：成功；匹配到的内容是："goooooogle"；匹配到的位置是：开始于7，结束于17。</p>
		<hr color="#fea089" size="1" />
		<h5>
				<a name="special">
				</a>1.6 其他一些代表抽象意义的特殊符号</h5>
		<p>    一些符号在表达式中代表抽象的特殊意义：</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="67">
										<p>表达式</p>
								</td>
								<td>
										<p>作用</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<span id="pattern" name="pattern">
														<font color="#000000">
																<font color="#ff00ff">^</font>
														</font>
												</span>
										</p>
								</td>
								<td>
										<p>与字符串开始的地方匹配，不匹配任何字符</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<span id="pattern" name="pattern">
														<font color="#000000">
																<font color="#ff00ff">$</font>
														</font>
												</span>
										</p>
								</td>
								<td>
										<p>与字符串结束的地方匹配，不匹配任何字符</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<span id="pattern" name="pattern">
														<font color="#000000">
																<font color="#ff00ff">\b</font>
														</font>
												</span>
										</p>
								</td>
								<td>
										<p>匹配一个单词边界，也就是单词和空格之间的位置，不匹配任何字符</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>    进一步的文字说明仍然比较抽象，因此，举例帮助大家理解。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=^aaa&amp;txt=xxx+aaa+xxx">举例1：表达式 "<span id="pattern" name="pattern"><font color="#000000"><font color="#ff00ff">^</font>aaa</font></span>" 在匹配 "xxx aaa xxx" 时</a>，匹配结果是：失败。因为 "^" 要求与字符串开始的地方匹配，因此，只有当 "aaa" 位于字符串的开头的时候，"^aaa" 才能匹配，<a href="http://www.regexlab.com/zh/workshop.asp?pat=^aaa&amp;txt=aaa+xxx+xxx">比如："aaa xxx xxx"</a>。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=aaa$&amp;txt=xxx+aaa+xxx">举例2：表达式 "<span id="pattern" name="pattern"><font color="#000000">aaa<font color="#ff00ff">$</font></font></span>" 在匹配 "xxx aaa xxx" 时</a>，匹配结果是：失败。因为 "$" 要求与字符串结束的地方匹配，因此，只有当 "aaa" 位于字符串的结尾的时候，"aaa$" 才能匹配，<a href="http://www.regexlab.com/zh/workshop.asp?pat=aaa$&amp;txt=xxx+xxx+aaa">比如："xxx xxx aaa"</a>。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=.%5Cb.&amp;txt=@@@abc">举例3：表达式 "<span id="pattern" name="pattern"><font color="#000000"><font color="#900050">.</font><font color="#ff00ff">\b</font><font color="#900050">.</font></font></span>" 在匹配 "@@@abc" 时</a>，匹配结果是：成功；匹配到的内容是："@a"；匹配到的位置是：开始于2，结束于4。<br />    进一步说明："\b" 与 "^" 和 "$" 类似，本身不匹配任何字符，但是它要求它在匹配结果中所处位置的左右两边，其中一边是 "\w" 范围，另一边是 非"\w" 的范围。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cbend%5Cb&amp;txt=weekend,endfor,end">举例4：表达式 "<span id="pattern" name="pattern"><font color="#000000"><font color="#ff00ff">\b</font>end<font color="#ff00ff">\b</font></font></span>" 在匹配 "weekend,endfor,end" 时</a>，匹配结果是：成功；匹配到的内容是："end"；匹配到的位置是：开始于15，结束于18。</p>
		<p>    一些符号可以影响表达式内部的子表达式之间的关系：</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="65">
										<p>表达式</p>
								</td>
								<td>
										<p>作用</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>|</p>
								</td>
								<td>
										<p>左右两边表达式之间 "或" 关系，匹配左边或者右边</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>( )</p>
								</td>
								<td>
										<p>(1). 在被修饰匹配次数的时候，括号中的表达式可以作为整体被修饰<br />(2). 取匹配结果的时候，括号中的表达式匹配到的内容可以被单独得到</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>    <a href="http://www.regexlab.com/zh/workshop.asp?pat=Tom%7CJack&amp;txt=I%27m+Tom%2C+he+is+Jack">举例5：表达式 "<span id="pattern" name="pattern"><font color="#000000">Tom<font color="#5050ff">|</font>Jack</font></span>" 在匹配字符串 "I'm Tom, he is Jack" 时</a>，匹配结果是：成功；匹配到的内容是："Tom"；匹配到的位置是：开始于4，结束于7。匹配下一个时，匹配结果是：成功；匹配到的内容是："Jack"；匹配到的位置时：开始于15，结束于19。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%28go%5Cs*%29%2B&amp;txt=Let%27s%20go%20go%20go%21">举例6：表达式 "<span id="pattern" name="pattern"><font color="#000000"><font color="#5050ff">(</font>go<font color="#900050">\s</font><font color="#e07000">*</font><font color="#5050ff">)</font><font color="#e07000">+</font></font></span>" 在匹配 "Let's go go go!" 时</a>，匹配结果是：成功；匹配到内容是："go go go"；匹配到的位置是：开始于6，结束于14。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%uFFE5%28%5Cd%2B%5C.%3F%5Cd*%29&amp;txt=%uFF0410.9%2C%uFFE520.5">举例7：表达式 "<span id="pattern" name="pattern"><font color="#000000">￥<font color="#5050ff">(</font><font color="#900050">\d</font><font color="#e07000">+</font>\.<font color="#e07000">?</font><font color="#900050">\d</font><font color="#e07000">*</font><font color="#5050ff">)</font></font></span>" 在匹配 "＄10.9,￥20.5" 时</a>，匹配的结果是：成功；匹配到的内容是："￥20.5"；匹配到的位置是：开始于6，结束于10。单独获取括号范围匹配到的内容是："20.5"。</p>
		<hr color="#fea089" size="1" />
		<h4>2. 正则表达式中的一些高级规则</h4>
		<h5>
				<a name="reluctant">
				</a>2.1 匹配次数中的贪婪与非贪婪</h5>
		<p>    在使用修饰匹配次数的特殊符号时，有几种表示方法可以使同一个表达式能够匹配不同的次数，比如："{m,n}", "{m,}", "?", "*", "+"，具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中，总是尽可能多的匹配。比如，针对文本 "dxxxdxxxd"，举例如下：</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="93">
										<p>表达式</p>
								</td>
								<td>
										<p>匹配结果</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<a href="http://www.regexlab.com/zh/workshop.asp?pat=(d)(%5Cw%2B)&amp;txt=dxxxdxxxd">
														<span id="pattern" name="pattern">
																<font color="#000000">
																		<font color="#5050ff">(</font>d<font color="#5050ff">)</font><font color="#5050ff">(</font><font color="#900050">\w</font><font color="#e07000">+</font><font color="#5050ff">)</font></font>
														</span>
												</a>
										</p>
								</td>
								<td>
										<p>"\w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<a href="http://www.regexlab.com/zh/workshop.asp?pat=(d)(%5Cw%2B)(d)&amp;txt=dxxxdxxxd">
														<span id="pattern" name="pattern">
																<font color="#000000">
																		<font color="#5050ff">(</font>d<font color="#5050ff">)</font><font color="#5050ff">(</font><font color="#900050">\w</font><font color="#e07000">+</font><font color="#5050ff">)</font><font color="#5050ff">(</font>d<font color="#5050ff">)</font></font>
														</span>
												</a>
										</p>
								</td>
								<td>
										<p>"\w+" 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。虽然 "\w+" 也能够匹配上最后一个 "d"，但是为了使整个表达式匹配成功，"\w+" 可以 "让出" 它本来能够匹配的最后一个 "d"</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>    由此可见，"\w+" 在匹配的时候，总是尽可能多的匹配符合它规则的字符。虽然第二个举例中，它没有匹配最后一个 "d"，但那也是为了让整个表达式能够匹配成功。同理，带 "*" 和 "{m,n}" 的表达式都是尽可能地多匹配，带 "?" 的表达式在可匹配可不匹配的时候，也是尽可能的 "要匹配"。这 种匹配原则就叫作 "贪婪" 模式 。</p>
		<p>    非贪婪模式：<br /><br />    在修饰匹配次数的特殊符号后再加上一个 "?" 号，则可以使匹配次数不定的表达式尽可能少的匹配，使可匹配可不匹配的表达式，尽可能的 "不匹配"。这种匹配原则叫作 "非贪婪" 模式，也叫作 "勉强" 模式。如果少匹配就会导致整个表达式匹配失败的时候，与贪婪模式类似，非贪婪模式会最小限度的再匹配一些，以使整个表达式匹配成功。举例如下，针对文本 "dxxxdxxxd" 举例：</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="93">
										<p>表达式</p>
								</td>
								<td>
										<p>匹配结果</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<a href="http://www.regexlab.com/zh/workshop.asp?pat=(d)(%5Cw%2B%3F)&amp;txt=dxxxdxxxd">
														<span id="pattern" name="pattern">
																<font color="#000000">
																		<font color="#5050ff">(</font>d<font color="#5050ff">)</font><font color="#5050ff">(</font><font color="#900050">\w</font><font color="#e07000">+</font><font color="#e07000">?</font><font color="#5050ff">)</font></font>
														</span>
												</a>
										</p>
								</td>
								<td>
										<p>"\w+?" 将尽可能少的匹配第一个 "d" 之后的字符，结果是："\w+?" 只匹配了一个 "x"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<a href="http://www.regexlab.com/zh/workshop.asp?pat=(d)(%5Cw%2B%3F)(d)&amp;txt=dxxxdxxxd">
														<span id="pattern" name="pattern">
																<font color="#000000">
																		<font color="#5050ff">(</font>d<font color="#5050ff">)</font><font color="#5050ff">(</font><font color="#900050">\w</font><font color="#e07000">+</font><font color="#e07000">?</font><font color="#5050ff">)</font><font color="#5050ff">(</font>d<font color="#5050ff">)</font></font>
														</span>
												</a>
										</p>
								</td>
								<td>
										<p>为了让整个表达式匹配成功，"\w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配，从而使整个表达式匹配成功。因此，结果是："\w+?" 匹配 "xxx"</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>    更多的情况，举例如下：<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%3Ctd%3E%28%2E%2A%29%3C%2Ftd%3E&amp;txt=%3Ctd%3E%3Cp%3Eaa%3C%2Fp%3E%3C%2Ftd%3E%3Ctd%3E%3Cp%3Ebb%3C%2Fp%3E%3C%2Ftd%3E">举例1：表达式 "<span id="pattern" name="pattern"><font color="#000000">&lt;td&gt;<font color="#5050ff">(</font><font color="#900050">.</font><font color="#e07000">*</font><font color="#5050ff">)</font>&lt;/td&gt;</font></span>" 与字符串 "&lt;td&gt;&lt;p&gt;aa&lt;/p&gt;&lt;/td&gt; &lt;td&gt;&lt;p&gt;bb&lt;/p&gt;&lt;/td&gt;" 匹配时</a>，匹配的结果是：成功；匹配到的内容是 "&lt;td&gt;&lt;p&gt;aa&lt;/p&gt;&lt;/td&gt; &lt;td&gt;&lt;p&gt;bb&lt;/p&gt;&lt;/td&gt;" 整个字符串， 表达式中的 "&lt;/td&gt;" 将与字符串中最后一个 "&lt;/td&gt;" 匹配。 <br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%3Ctd%3E%28%2E%2A%3F%29%3C%2Ftd%3E&amp;txt=%3Ctd%3E%3Cp%3Eaa%3C%2Fp%3E%3C%2Ftd%3E%3Ctd%3E%3Cp%3Ebb%3C%2Fp%3E%3C%2Ftd%3E">举例2：相比之下，表达式 "<span id="pattern" name="pattern"><font color="#000000">&lt;td&gt;<font color="#5050ff">(</font><font color="#900050">.</font><font color="#e07000">*</font><font color="#e07000">?</font><font color="#5050ff">)</font>&lt;/td&gt;</font></span>" 匹配举例1中同样的字符串时</a>，将只得到 "&lt;td&gt;&lt;p&gt;aa&lt;/p&gt;&lt;/td&gt;"， 再次匹配下一个时，可以得到第二个 "&lt;td&gt;&lt;p&gt;bb&lt;/p&gt;&lt;/td&gt;"。</p>
		<hr color="#fea089" size="1" />
		<h5>
				<a name="backref">
				</a>2.2 反向引用 \1, \2...</h5>
		<p>    表达式在匹配时，表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候，小括号包含的表达式所匹配到的字符串可以单独获取。这一点，在前面的举例中，已经多次展示了。在实际应用场合中，当用某种边界来查找，而所要获取的内容又不包含边界时，必须使用小括号来指定所要的范围。比如前面的 "<span id="pattern" name="pattern"><font color="#000000">&lt;td&gt;<font color="#5050ff">(</font><font color="#900050">.</font><font color="#e07000">*</font><font color="#e07000">?</font><font color="#5050ff">)</font>&lt;/td&gt;</font></span>"。<br /><br />    其实，"小括号包含的表达式所匹配到的字符串" 不仅是在匹配结束后才可以使用，在匹配过程中也可以使用。表达式后边的部分，可以引用前面 "括号内的子匹配已经匹配到的字符串"。引用方法是 "\" 加上一个数字。"\1" 引用第1对括号内匹配到的字符串，"\2" 引用第2对括号内匹配到的字符串……以此类推，如果一对括号内包含另一对括号，则外层的括号先排序号。换句话说，哪一对的左括号 "(" 在前，那这一对就先排序号。</p>
		<p>    举例如下：<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%28%27%7C%22%29%28%2E%2A%3F%29%28%5C1%29&amp;txt=%27Hello%27%2C+%22World%22">举例1：表达式 "<span id="pattern" name="pattern"><font color="#000000"><font color="#5050ff">(</font>'<font color="#5050ff">|</font>"<font color="#5050ff">)</font><font color="#5050ff">(</font><font color="#900050">.</font><font color="#e07000">*</font><font color="#e07000">?</font><font color="#5050ff">)</font><font color="#5050ff">(</font><font color="#ff00ff">\1</font><font color="#5050ff">)</font></font></span>" 在匹配 " 'Hello', "World" " 时</a>，匹配结果是：成功；匹配到的内容是：" 'Hello' "。再次匹配下一个时，可以匹配到 " "World" "。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%28%5Cw%29%5C1%7B4%2C%7D&amp;txt=aa%20bbbb%20abcdefg%20ccccc%20111121111%20999999999">举例2：表达式 "<span id="pattern" name="pattern"><font color="#000000"><font color="#5050ff">(</font><font color="#900050">\w</font><font color="#5050ff">)</font><font color="#ff00ff">\1</font><font color="#e07000">{4,}</font></font></span>" 在匹配 "aa bbbb abcdefg ccccc 111121111 999999999" 时</a>，匹配结果是：成功；匹配到的内容是 "ccccc"。再次匹配下一个时，将得到 999999999。这个表达式要求 "\w" 范围的字符至少重复5次，<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cw%7B5%2C%7D&amp;txt=aa%20bbbb%20abcdefg%20ccccc%20111121111%20999999999">注意与 "\w{5,}" 之间的区别</a>。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%3C%28%5Cw%2B%29%5Cs%2A%28%5Cw%2B%28%3D%28%27%7C%22%29%2E%2A%3F%5C4%29%3F%5Cs%2A%29%2A%3E%2E%2A%3F%3C%2F%5C1%3E&amp;txt=%3Ctd+id%3D%27td1%27+style%3D%22bgcolor%3Awhite%22%3E%3C%2Ftd%3E%0D%0A%3Cbody+onload%3D%22doit%28%29%22%3E%3C%2Fbody%3E">举例3：表达式 "<span id="pattern" name="pattern"><font color="#000000">&lt;<font color="#5050ff">(</font><font color="#900050">\w</font><font color="#e07000">+</font><font color="#5050ff">)</font><font color="#900050">\s</font><font color="#e07000">*</font><font color="#5050ff">(</font><font color="#900050">\w</font><font color="#e07000">+</font><font color="#5050ff">(</font>=<font color="#5050ff">(</font>'<font color="#5050ff">|</font>"<font color="#5050ff">)</font><font color="#900050">.</font><font color="#e07000">*</font><font color="#e07000">?</font><font color="#ff00ff">\4</font><font color="#5050ff">)</font><font color="#e07000">?</font><font color="#900050">\s</font><font color="#e07000">*</font><font color="#5050ff">)</font><font color="#e07000">*</font>&gt;<font color="#900050">.</font><font color="#e07000">*</font><font color="#e07000">?</font>&lt;/<font color="#ff00ff">\1</font>&gt;</font></span>" 在匹配 "&lt;td id='td1' style="bgcolor:white"&gt;&lt;/td&gt;" 时</a>，匹配结果是成功。如果 "&lt;td&gt;" 与 "&lt;/td&gt;" 不配对，则会匹配失败；如果改成其他配对，也可以匹配成功。</p>
		<hr color="#fea089" size="1" />
		<h5>
				<a name="forward">
				</a>2.3 预搜索，不匹配；反向预搜索，不匹配</h5>
		<p>    前面的章节中，我讲到了几个代表抽象意义的特殊符号："^"，"$"，"\b"。它们都有一个共同点，那就是：它们本身不匹配任何字符，只是对 "字符串的两头" 或者 "字符之间的缝隙" 附加了一个条件。理解到这个概念以后，本节将继续介绍另外一种对 "两头" 或者 "缝隙" 附加条件的，更加灵活的表示方法。</p>
		<p>    正向预搜索："(?=xxxxx)"，"(?!xxxxx)"<br /><br />    格式："(?=xxxxx)"，在被匹配的字符串中，它对所处的 "缝隙" 或者 "两头" 附加的条件是：所在缝隙的右侧，必须能够匹配上 xxxxx 这部分的表达式。因为它只是在此作为这个缝隙上附加的条件，所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。这就类似 "\b"，本身不匹配任何字符。"\b" 只是将所在缝隙之前、之后的字符取来进行了一下判断，不会影响后边的表达式来真正的匹配。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=Windows+%28%3F%3DNT%7CXP%29&amp;txt=Windows+98%2C+Windows+NT%2C+Windows+2000">举例1：表达式 "<span id="pattern" name="pattern"><font color="#000000">Windows <font color="#999999">(?=</font>NT<font color="#5050ff">|</font>XP<font color="#999999">)</font></font></span>" 在匹配 "Windows 98, Windows NT, Windows 2000" 时</a>，将只匹配 "Windows NT" 中的 "Windows "，其他的 "Windows " 字样则不被匹配。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%28%5Cw%29%28%28%3F%3D%5C1%5C1%5C1%29%28%5C1%29%29%2B&amp;txt=aaa+ffffff+999999999">举例2：表达式 "<span id="pattern" name="pattern"><font color="#000000"><font color="#5050ff">(</font><font color="#900050">\w</font><font color="#5050ff">)</font><font color="#5050ff">(</font><font color="#999999">(?=</font><font color="#ff00ff">\1</font><font color="#ff00ff">\1</font><font color="#ff00ff">\1</font><font color="#999999">)</font><font color="#5050ff">(</font><font color="#ff00ff">\1</font><font color="#5050ff">)</font><font color="#5050ff">)</font><font color="#e07000">+</font></font></span>" 在匹配字符串 "aaa ffffff 999999999" 时</a>，将可以匹配6个"f"的前4个，可以匹配9个"9"的前7个。这个表达式可以读解成：重复4次以上的字母数字，则匹配其剩下最后2位之前的部分。当然，这个表达式可以不这样写，在此的目的是作为演示之用。</p>
		<p>    格式："(?!xxxxx)"，所在缝隙的右侧，必须不能匹配 xxxxx 这部分表达式。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%28%28%3F%21%5Cbstop%5Cb%29%2E%29%2B&amp;txt=fdjka+ljfdl+stop+fjdsla+fdj">举例3：表达式 "<span id="pattern" name="pattern"><font color="#000000"><font color="#5050ff">(</font><font color="#999999">(?!</font><font color="#ff00ff">\b</font>stop<font color="#ff00ff">\b</font><font color="#999999">)</font><font color="#900050">.</font><font color="#5050ff">)</font><font color="#e07000">+</font></font></span>" 在匹配 "fdjka ljfdl stop fjdsla fdj" 时</a>，将从头一直匹配到 "stop" 之前的位置，如果字符串中没有 "stop"，则匹配整个字符串。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=do%28%3F%21%5Cw%29&amp;txt=done%2C+do%2C+dog">举例4：表达式 "<span id="pattern" name="pattern"><font color="#000000">do<font color="#999999">(?!</font><font color="#900050">\w</font><font color="#999999">)</font></font></span>" 在匹配字符串 "done, do, dog" 时</a>，只能匹配 "do"。在本条举例中，"do" 后边使用 "(?!\w)" 和使用 "\b" 效果是一样的。</p>
		<p>    反向预搜索："(?&lt;=xxxxx)"，"(?&lt;!xxxxx)"<br /><br />    这两种格式的概念和正向预搜索是类似的，反向预搜索要求的条件是：所在缝隙的 "左侧"，两种格式分别要求必须能够匹配和必须不能够匹配指定表达式，而不是去判断右侧。与 "正向预搜索" 一样的是：它们都是对所在缝隙的一种附加条件，本身都不匹配任何字符。<br /><br />    举例5：表达式 "<span id="pattern" name="pattern"><font color="#000000"><font color="#999999">(?&lt;=</font><font color="#900050">\d</font><font color="#e07000">{4}</font><font color="#999999">)</font><font color="#900050">\d</font><font color="#e07000">+</font><font color="#999999">(?=</font><font color="#900050">\d</font><font color="#e07000">{4}</font><font color="#999999">)</font></font></span>" 在匹配 "1234567890123456" 时，将匹配除了前4个数字和后4个数字之外的中间8个数字。由于 JScript.RegExp 不支持反向预搜索，因此，本条举例不能够进行演示。很多其他的引擎可以支持反向预搜索，比如：Java 1.4 以上的 java.util.regex 包，.NET 中System.Text.RegularExpressions 命名空间，以及本站推荐的<a href="http://www.regexlab.com/zh/deelx/">最简单易用的 DEELX 正则引擎</a>。</p>
		<hr color="#fea089" size="1" />
		<h4>
				<a name="othercommon">
				</a>3. 其他通用规则</h4>
		<p>    还有一些在各个正则表达式引擎之间比较通用的规则，在前面的讲解过程中没有提到。</p>
		<p>3.1 表达式中，可以使用 "\xXX" 和 "\uXXXX" 表示一个字符（"X" 表示一个十六进制数）</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="63">
										<p>形式</p>
								</td>
								<td>
										<p>字符范围</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\xXX</p>
								</td>
								<td>
										<p>编号在 0 ~ 255 范围的字符，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cx20&amp;txt=It+is%2E">空格可以使用 "\x20" 表示</a></p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\uXXXX</p>
								</td>
								<td>
										<p>任何字符可以使用 "\u" 再加上其编号的4位十六进制数表示，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cu4E2D&amp;txt=%D6%D0%B9%FA">"\u4E2D"</a></p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>3.2 在表达式 "\s"，"\d"，"\w"，"\b" 表示特殊意义的同时，对应的大写字母表示相反的意义</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="55">
										<p>表达式</p>
								</td>
								<td>
										<p>可匹配</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\S</p>
								</td>
								<td>
										<p>
												<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5CS%2B&amp;txt=abc+123+%40%23%24%25">匹配所有非空白字符（"\s" 可匹配各个空白字符）</a>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\D</p>
								</td>
								<td>
										<p>
												<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5CD%2B&amp;txt=abc+123+%40%23%24%25">匹配所有的非数字字符</a>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\W</p>
								</td>
								<td>
										<p>
												<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5CW%2B&amp;txt=abc+123+%40%23%24%25">匹配所有的字母、数字、下划线以外的字符</a>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\B</p>
								</td>
								<td>
										<p>
												<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5CB%2E%5CB&amp;txt=abc+123+%40%23%24%25">匹配非单词边界，即左右两边都是 "\w" 范围或者左右两边都不是 "\w" 范围时的字符缝隙</a>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>3.3 在表达式中有特殊意义，需要添加 "\" 才能匹配该字符本身的字符汇总</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="55">
										<p>字符</p>
								</td>
								<td>
										<p>说明</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>^</p>
								</td>
								<td>
										<p>匹配输入字符串的开始位置。要匹配 "^" 字符本身，请使用 "\^"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>$</p>
								</td>
								<td>
										<p>匹配输入字符串的结尾位置。要匹配 "$" 字符本身，请使用 "\$"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>( )</p>
								</td>
								<td>
										<p>标记一个子表达式的开始和结束位置。要匹配小括号，请使用 "\(" 和 "\)"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>[ ]</p>
								</td>
								<td>
										<p>用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号，请使用 "\[" 和 "\]"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>{ }</p>
								</td>
								<td>
										<p>修饰匹配次数的符号。要匹配大括号，请使用 "\{" 和 "\}"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>.</p>
								</td>
								<td>
										<p>匹配除了换行符（\n）以外的任意一个字符。要匹配小数点本身，请使用 "\."</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>?</p>
								</td>
								<td>
										<p>修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身，请使用 "\?"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>+</p>
								</td>
								<td>
										<p>修饰匹配次数为至少 1 次。要匹配 "+" 字符本身，请使用 "\+"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>*</p>
								</td>
								<td>
										<p>修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身，请使用 "\*"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>|</p>
								</td>
								<td>
										<p>左右两边表达式之间 "或" 关系。匹配 "|" 本身，请使用 "\|"</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>3.4 括号 "( )" 内的子表达式，如果希望匹配结果不进行记录供以后使用，可以使用 "(?:xxxxx)" 格式</p>
		<p>    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%28%3F%3A%28%5Cw%29%5C1%29%2B&amp;txt=a bbccdd efg">举例1：表达式 "<span id="pattern" name="pattern"><font color="#000000"><font color="#999999">(?:</font><font color="#5050ff">(</font><font color="#900050">\w</font><font color="#5050ff">)</font><font color="#ff00ff">\1</font><font color="#999999">)</font><font color="#e07000">+</font></font></span>" 匹配 "a bbccdd efg" 时</a>，结果是 "bbccdd"。括号 "(?:)" 范围的匹配结果不进行记录，因此 "(\w)" 使用 "\1" 来引用。</p>
		<p>3.5 常用的表达式属性设置简介：Ignorecase，Singleline，Multiline，Global</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="80">
										<p>表达式属性</p>
								</td>
								<td>
										<p>说明</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>Ignorecase</p>
								</td>
								<td>
										<p>默认情况下，表达式中的字母是要区分大小写的。配置为 Ignorecase 可使匹配时不区分大小写。有的表达式引擎，把 "大小写" 概念延伸至 UNICODE 范围的大小写。</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>Singleline</p>
								</td>
								<td>
										<p>默认情况下，小数点 "." 匹配除了换行符（\n）以外的字符。配置为 Singleline 可使小数点可匹配包括换行符在内的所有字符。</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>Multiline</p>
								</td>
								<td>
										<p>默认情况下，表达式 "^" 和 "$" 只匹配字符串的开始 ① 和结尾 ④ 位置。如：<br /><br />①xxxxxxxxx②\n<br />③xxxxxxxxx④<br /><br />配置为 Multiline 可以使 "^" 匹配 ① 外，还可以匹配换行符之后，下一行开始前 ③ 的位置，使 "$" 匹配 ④ 外，还可以匹配换行符之前，一行结束 ② 的位置。</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>Global</p>
								</td>
								<td>
										<p>主要在将表达式用来替换时起作用，配置为 Global 表示替换所有的匹配。</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p> </p>
		<hr color="#fea089" size="1" />
		<p> </p>
		<h4>
				<a name="prompt">
				</a>4. 其他提示</h4>
		<p>4.1 如果想要了解高级的正则引擎还支持那些复杂的正则语法，可参见<a href="http://www.regexlab.com/zh/deelx/syntax.htm">本站 DEELX 正则引擎的说明文档</a>。</p>
		<p>4.2 如果要要求表达式所匹配的内容是整个字符串，而不是从字符串中找一部分，那么可以在表达式的首尾使用 "^" 和 "$"，比如："<span id="pattern" name="pattern"><font color="#000000"><font color="#ff00ff">^</font><font color="#900050">\d</font><font color="#e07000">+</font><font color="#ff00ff">$</font></font></span>" 要求整个字符串只有数字。</p>
		<p>4.3 如果要求匹配的内容是一个完整的单词，而不会是单词的一部分，那么在表达式首尾使用 "\b"，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cb%28if%7Cwhile%7Celse%7Cvoid%7Cint%29%5Cb&amp;txt=if%28ifdo%29%0D%0A++++dosome%28%29%3B%0D%0Aelse%0D%0A++++doelse%28%29%3B">使用 "<span id="pattern" name="pattern"><font color="#000000"><font color="#ff00ff">\b</font><font color="#5050ff">(</font>if<font color="#5050ff">|</font>while<font color="#5050ff">|</font>else<font color="#5050ff">|</font>void<font color="#5050ff">|</font>int……<font color="#5050ff">)</font><font color="#ff00ff">\b</font></font></span>" 来匹配程序中的关键字</a>。</p>
		<p>4.4 表达式不要匹配空字符串。否则会一直得到匹配成功，而结果什么都没有匹配到。比如：准备写一个匹配 "123"、"123."、"123.5"、".5" 这几种形式的表达式时，整数、小数点、小数数字都可以省略，但是不要将表达式写成："<span id="pattern" name="pattern"><font color="#000000"><font color="#900050">\d</font><font color="#e07000">*</font>\.<font color="#e07000">?</font><font color="#900050">\d</font><font color="#e07000">*</font></font></span>"，因为如果什么都没有，这个表达式也可以匹配成功。<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cd%2B%5C%2E%3F%5Cd%2A%7C%5C%2E%5Cd%2B&amp;txt=123%2C+123%2E%2C+123%2E5%2C+%2E5%2C+%2E">更好的写法是："<span id="pattern" name="pattern"><font color="#000000"><font color="#900050">\d</font><font color="#e07000">+</font>\.<font color="#e07000">?</font><font color="#900050">\d</font><font color="#e07000">*</font><font color="#5050ff">|</font>\.<font color="#900050">\d</font><font color="#e07000">+</font></font></span>"</a>。</p>
		<p>4.5 能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配 0 次，而这个括号整体又可以匹配无限次，那么情况可能比上一条所说的更严重，匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了，比如 .NET 的正则表达式，但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环，也可以从这一点入手，查找一下是否是本条所说的原因。</p>
		<p>4.6 合理选择贪婪模式与非贪婪模式，参见<a href="http://www.regexlab.com/zh/regtopic.htm#reluctant">话题讨论</a>。</p>
		<p>4.7 或 "|" 的左右两边，对某个字符最好只有一边可以匹配，这样，不会因为 "|" 两边的表达式因为交换位置而有所不同。</p>
<img src ="http://www.blogjava.net/zqli/aggbug/95180.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-01-21 22:12 <a href="http://www.blogjava.net/zqli/archive/2007/01/21/95180.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]C#3.0新特性</title><link>http://www.blogjava.net/zqli/archive/2007/01/20/95071.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Sat, 20 Jan 2007 11:13:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/01/20/95071.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/95071.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/01/20/95071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/95071.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/95071.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#993300">
						<strong>（1）用var声明变量</strong>
				</font>
				<br />js里是用var声明变量，但两者不同的是，js里的变量没有类型，数据才有类型，可以将一个变量指向任意的数据类型而运行自如。<br />而C#3.0里在用var声明变量时必须对其进行初始化，这样编译器能够根据初始化的值知道该变量的类型，将部分程序员要写的代码交给编译器去完成。就是说每个变量的类型还是固定的。<br />例如在C#3.0里可以这样直接声明并初始化变量：<br /></p>
		<div class="codeArea cpp">
				<div style="COLOR: #000000">
						<font color="#000000">var</font> <font color="#000000">tbTitle</font><font color="#000000">=</font><font color="#0000ff">new</font> <font color="#000000">System</font><font color="#000000">.</font><font color="#000000">Web</font><font color="#000000">.</font><font color="#000000">UI</font><font color="#000000">.</font><font color="#000000">WebControls</font><font color="#000000">.</font><font color="#000000">TextBox</font><font color="#000000">();</font></div>
		</div>
		<p>的确省写了很多代码，呵呵。但是，如果你想把变量声明和初始化分开，那var关键字就无能为力了。</p>
		<p>
				<font color="#800000">
						<strong>（2）直接构建对象<br /></strong>
				</font>js里创建对象的快捷途径一直令我很happy，例如：</p>
		<div class="codeArea js">
				<div style="COLOR: #000000">
						<font color="#0000ff">var</font> <font color="#000000">book</font><font color="#000000">={</font><font color="#000000">title</font><font color="#000000">:</font><font color="#ff00ff">'bookTitle'</font><font color="#000000">,</font> <font color="#000000">author</font><font color="#000000">:</font><font color="#ff00ff">'nate'</font><font color="#000000">,</font> <font color="#000000">id</font><font color="#000000">:</font><font color="#000000">222</font><font color="#000000">};</font></div>
		</div>
		<p>现在C#3.0竟也有类似的语法了：</p>
		<div class="codeArea js">
				<div style="COLOR: #000000">
						<font color="#0000ff">var</font> <font color="#000000">book</font><font color="#000000">=</font><font color="#0000ff">new</font> <font color="#000000">{</font><font color="#000000">title</font><font color="#000000">=</font><font color="#ff00ff">"bookTitle"</font><font color="#000000">,</font> <font color="#000000">author</font><font color="#000000">=</font><font color="#ff00ff">"nate"</font><font color="#000000">,</font> <font color="#000000">id</font><font color="#000000">=</font><font color="#000000">222</font><font color="#000000">};</font></div>
		</div>
		<p>其实也是由编译器做了更多的工作，在背后自己定义了一个类，更多的原理解释大家自己google吧。</p>
		<p>
				<strong>
						<font color="#800000">（3）扩展方法</font>
				</strong>
				<br />js里给一个类扩展方法也就是给prototype原型对象添加一个方法，非常方便。<br />现在C#3.0也提供了类似的功能，虽然偶觉得这个新特性可能太灵活了以至影响C#的严谨性甚至软件架构方面的问题，但是无疑这还是很吸引人的：</p>
		<div class="codeArea cpp">
				<div style="COLOR: #000000">
						<font color="#0000ff">public</font> <font color="#0000ff">static</font> <font color="#000000">ToInt32</font><font color="#000000">(</font><font color="#0000ff">this</font> <font color="#000000">String</font> <font color="#000000">s</font><font color="#000000">){</font><br /> <font color="#0000ff">return</font> <font color="#000000">Convert</font><font color="#000000">.</font><font color="#000000">ToInt32</font><font color="#000000">();</font><br /><font color="#000000">}</font></div>
		</div>
		<p>在任意一个类中定义上述静态方法，那么你的string对象就有直接的ToInt32方法了，是不是很方便？</p>
		<p>
				<strong>
						<font color="#800000">（4）创建对象时同时进行初始化</font>
				</strong>
				<br />同样是提供了一种简洁的语法来初始化一个对象，例如：</p>
		<div class="codeArea cpp">
				<div style="COLOR: #000000">
						<font color="#0000ff">public</font> <font color="#0000ff">class</font> <font color="#000000">Point</font><font color="#000000">{</font><br /> <font color="#0000ff">public</font> <font color="#0000ff">int</font> <font color="#000000">x</font><font color="#000000">;</font><br /> <font color="#0000ff">public</font> <font color="#0000ff">int</font> <font color="#000000">y</font><font color="#000000">;</font><br /><font color="#000000">}</font></div>
		</div>
		<p>可以这样实例化：</p>
		<div class="codeArea cpp">
				<div style="COLOR: #000000">
						<font color="#000000">var</font> <font color="#000000">point</font><font color="#000000">=</font><font color="#0000ff">new</font> <font color="#000000">Point</font><font color="#000000">{</font><font color="#000000">x</font><font color="#000000">=</font><font color="#000000">100</font><font color="#000000">,</font><font color="#000000">y</font><font color="#000000">=</font><font color="#000000">200</font><font color="#000000">};</font></div>
		</div>
		<p>这样可以少些多少构造函数啊，呵呵</p>
		<p>
				<strong>
						<font color="#800000">（5）方便声明集合对象</font>
				</strong>
				<br />以前对于数组可以直接声明时初始化：</p>
		<div class="codeArea cpp">
				<div style="COLOR: #000000">
						<font color="#000000">string</font>
						<font color="#000000">[]</font> <font color="#000000">s</font><font color="#000000">=</font><font color="#0000ff">new</font> <font color="#000000">string</font><font color="#000000">[]{</font><font color="#ff00ff">"red"</font><font color="#000000">,</font><font color="#ff00ff">"blue"</font><font color="#000000">,</font><font color="#ff00ff">"black"</font><font color="#000000">,</font><font color="#ff00ff">"white"</font><font color="#000000">};</font></div>
		</div>
		<p>而对于ArrayList这样的集合类型却没有简洁的语法，只能通过Add之类的方法逐一添加，<br />而在C#3.0中，所有实现ICollection接口的类都有了简洁的初始化语法：</p>
		<div class="codeArea js">
				<div style="COLOR: #000000">
						<font color="#0000ff">var</font> <font color="#000000">alColors</font><font color="#000000">=</font><font color="#0000ff">new</font> <font color="#000000">ArrayList</font><font color="#000000">{</font><font color="#ff00ff">"red"</font><font color="#000000">,</font><font color="#ff00ff">"blue"</font><font color="#000000">,</font><font color="#ff00ff">"black"</font><font color="#000000">,</font><font color="#ff00ff">"white"</font><font color="#000000">};</font></div>
		</div>
		<p>
				<strong>
						<font color="#800000">（6）Lambda表达式</font>
				</strong>
				<br />尽管委托作为C#最新引入的一个概念非常优秀，它也是事件机制的基础。但用起来却很麻烦，相信每个写过的人都有体会，现在C#3.0通过Lambda表达式简化了这个过程。<br />Lambda表达式的关键特征是将表达式或者语句块作为参数，通过=&gt;来直接定义一个委托，这个委托的类型会根据一系列的转换规则，由编译器决定，例如：</p>
		<div class="codeArea cpp">
				<div style="COLOR: #000000">
						<font color="#000000">DemoDelegate</font> <font color="#000000">myDelegate</font> <font color="#000000">=</font> <font color="#000000">(</font> <font color="#000000">)</font> <font color="#000000">=&gt;</font> <font color="#000000">Console</font><font color="#000000">.</font><font color="#000000">WriteLine</font><font color="#000000">(</font> <font color="#ff00ff">"Hiya!!"</font> <font color="#000000">)</font> <font color="#000000">;</font></div>
		</div>
		<p>这里的()表示一个空参数的函数，后面的Console.WriteLine("Hiya!!");是函数体。这样就很方便的实现了委托的定义，大家不妨回忆一下在C#1.1和C#2.0中是如何的麻烦，呵呵。<br />Lambda表达式不是那么容易理解，更多信息可以参见C#3.0的语言规范：<br /><a href="http://news.csdn.net/news/newstopic/26/26742.shtml">http://news.csdn.net/news/newstopic/26/26742.shtml</a></p>
		<p>
				<strong>
						<font color="#800000">（7）查询表达式</font>
				</strong>
				<br />虽然我对Ruby了解不多，但总感觉针对集合的查询，直接在语言中体现，这种灵感来源于Ruby。<br />于是C#3.0又多了一项诱人的特性，可以通过类似Sql语句的方式来获得需要的数据，结果可能存储于一个集合对象中或其他。<br />同样，没有能力三言两语将其说清楚，参见规范：<br /><a href="http://news.csdn.net/news/newstopic/26/26747.shtml">http://news.csdn.net/news/newstopic/26/26747.shtml</a></p>
<img src ="http://www.blogjava.net/zqli/aggbug/95071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-01-20 19:13 <a href="http://www.blogjava.net/zqli/archive/2007/01/20/95071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]C#实现web信息自动抓取 </title><link>http://www.blogjava.net/zqli/archive/2007/01/11/93251.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Thu, 11 Jan 2007 12:34:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/01/11/93251.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/93251.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/01/11/93251.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/93251.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/93251.html</trackback:ping><description><![CDATA[
		<p>出处：<a href="http://zkxp.cnblogs.com/archive/2006/04/24/383924.html"><font color="#000080">http://zkxp.cnblogs.com/archive/2006/04/24/383924.html</font></a></p>
		<p>背景 </p>
		<p>随着Internet的普及，网络信息正以极高的速度增长，在这么多数据中找到自己需要的信息是一件很繁琐的事情，找到需要的信息后如何获取也是件麻烦的事。这就需要Internet信息抓取程序来代替人工的操作。</p>
		<p>所谓Internet信息抓取程序，就是程序会按照用户的关键词或关键网站来收集相应的信息，并提供给用户想要的信息格式。</p>
		<p> </p>
		<p>信息量的增加会带来信息网站发布人员工作量的剧增，为实现信息发布系统实现信息自</p>
		<p>动发布、减少工作人员工作量、即时跟踪最新信息，就需要自动信息提供程序，因此Internet信息抓取程序应运而生。</p>
		<p> </p>
		<p>目标</p>
		<p> </p>
		<p>实现自定义网站信息分类抓取，存入本地数据库、生成静态页面或其它用户定义的信息结构，并下载与信息相关的多媒体文件。</p>
		<p> </p>
		<p>开发</p>
		<p> </p>
		<p>l         目标站点结构分析</p>
		<p>本步骤是准确抓取信息个关键。</p>
		<p>首先要选择更新频率高的页面做为抓取地址，然后分析要抓取内容页面url特点。</p>
		<p>然后分析要抓取信息页面的元素特性，比如标题位置，内容位置 等，得到定位标记点。</p>
		<p>将以上信息写成自己的配置文件或存到数据库中。</p>
		<p>每个网站都需要分析，写出单独的配置文件，供抓取程序使用。</p>
		<p> </p>
		<p>l         信息提取</p>
		<p>根据配置文件取得要抓取页面url，使用HttpWebRequest类获取内容：</p>
		<p>//获取http页面函数</p>
		<p>        public string Get_Http(string a_strUrl,int timeout)</p>
		<p>        {</p>
		<p>            string strResult ;         </p>
		<p> </p>
		<p>            try</p>
		<p>            {</p>
		<p>HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(a_strUrl) ;</p>
		<p>                myReq.Timeout = timeout;</p>
		<p>                HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse();</p>
		<p>            </p>
		<p>                Stream myStream = HttpWResp.GetResponseStream () ;</p>
		<p> </p>
		<p>                StreamReader sr = new StreamReader(myStream , Encoding.Default);</p>
		<p>                StringBuilder strBuilder = new StringBuilder();</p>
		<p>                while (-1 != sr.Peek())</p>
		<p>                {</p>
		<p>                    strBuilder.Append(sr.ReadLine()+"\r\n");</p>
		<p>                }</p>
		<p> </p>
		<p>                strResult = strBuilder.ToString();</p>
		<p>            }</p>
		<p>            catch(Exception exp)</p>
		<p>            {</p>
		<p>                strResult = "错误：" + exp.Message ;</p>
		<p>            }</p>
		<p> </p>
		<p>            return strResult ;</p>
		<p> </p>
		<p>        }</p>
		<p>获取页面内容后，分析页面中连接地址取到要抓取的url：</p>
		<p>//处理页面标题和链接</p>
		<p>        public string SniffWebUrl( string urlStr,string blockB,string blockE )</p>
		<p>        {       </p>
		<p>            string urlch1 = "";</p>
		<p>            string urlch2 = "";                    </p>
		<p>            int end_n1 = 0;</p>
		<p>            int end_nums = 0;</p>
		<p>            int end_nums1 = 0;</p>
		<p>            int end_nums2 = 0;</p>
		<p>            int end_nums3     = 0;            </p>
		<p>            string reUTStr = "";</p>
		<p>            string reTitle = "";</p>
		<p>            string ret = "";           </p>
		<p>            try</p>
		<p>            {</p>
		<p>                int pos01 = urlStr.IndexOf( "." );</p>
		<p>                int pos02 = urlStr.LastIndexOf( "/" );</p>
		<p>                if( pos01 &lt; 0 ) </p>
		<p>                {</p>
		<p>                    return "";</p>
		<p>                }</p>
		<p>                if( pos02 &lt; 0 ) </p>
		<p>                {</p>
		<p>                    return "";</p>
		<p>                }</p>
		<p>                int pos03 = urlStr.IndexOf( "/",pos01 );</p>
		<p>                if ( pos03 &lt; 0 )</p>
		<p>                {</p>
		<p>                    urlch1 = urlStr;</p>
		<p>                    urlch2 = urlStr;</p>
		<p>                }</p>
		<p>                else</p>
		<p>                {</p>
		<p>                    urlch1 = urlStr.Substring( 0,pos03 );</p>
		<p>                    urlch2 = urlStr.Substring( 0,pos02 );</p>
		<p>                }</p>
		<p> </p>
		<p>                string tmpAllStr = new PublicFun().Get_Http( urlStr ,time1);</p>
		<p> </p>
		<p>                int pos1 = tmpAllStr.IndexOf( blockB );</p>
		<p>                int pos2 = tmpAllStr.IndexOf( blockE,pos1 + blockB.Length );</p>
		<p>                if ( pos1&gt;0 &amp;&amp; pos2&gt;0 &amp;&amp; pos2&gt;pos1 )</p>
		<p>                {</p>
		<p>                    ret = tmpAllStr.Substring( pos1 + blockB.Length,pos2 - pos1 - blockB.Length );</p>
		<p>                    ret = ret.Substring( ret.IndexOf( "&lt;" ));</p>
		<p>                    while( ret.IndexOf( "&lt;A" ) &gt;= 0 )</p>
		<p>                    {</p>
		<p>                        ret = ret.Substring( 0,ret.IndexOf( "&lt;A" ) ) + "&lt;a" + ret.Substring( ret.IndexOf( "&lt;A" ) + 2 );</p>
		<p>                    }</p>
		<p>                    while( ret.IndexOf( "&lt;/A" ) &gt;=0 )</p>
		<p>                    {</p>
		<p>                        ret = ret.Substring( 0,ret.IndexOf( "&lt;/A" ) ) + "&lt;/a" + ret.Substring( ret.IndexOf( "&lt;/A" ) + 3 );</p>
		<p>                    }</p>
		<p>                    while( ret.IndexOf( "Href=" ) &gt;=0 )</p>
		<p>                    {</p>
		<p>                        ret = ret.Substring( 0,ret.IndexOf( "Href=" )) + "href=" + ret.Substring( ret.IndexOf( "Href=" ) + 5 );</p>
		<p>                    }</p>
		<p>                    while( ret.IndexOf( "HREF=" ) &gt;=0 )</p>
		<p>                    {</p>
		<p>                        ret = ret.Substring( 0,ret.IndexOf( "HREF=" )) + "href=" + ret.Substring( ret.IndexOf( "HREF=" ) + 5 );</p>
		<p>                    }</p>
		<p>                    while( ret.IndexOf( "href='" ) &gt;=0 )</p>
		<p>                    {</p>
		<p>                        ret = ret.Substring( 0,ret.IndexOf( "href='" )) + "href=\"" + ret.Substring( ret.IndexOf( "href='" ) + 6 ); </p>
<img src ="http://www.blogjava.net/zqli/aggbug/93251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-01-11 20:34 <a href="http://www.blogjava.net/zqli/archive/2007/01/11/93251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]设计模式之单态模式- -</title><link>http://www.blogjava.net/zqli/archive/2007/01/11/93166.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Thu, 11 Jan 2007 06:48:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/01/11/93166.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/93166.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/01/11/93166.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/93166.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/93166.html</trackback:ping><description><![CDATA[
		<p>设计模式之单态模式<br />author: 李艳庆<br />date: 2005年11月4日</p>
		<p>单态模式Singleton, 目的是保在调用期间, 一个类只有一个实例存在.<br />最典型的例子为数据库连接, 数据库连接只需要一个, 所以可以使用单态模式.<br />使用单态模式时, 创建数据库连接的方法, 只能为静态, 并且要保证方法的同步, 否则在多线程操作中, 有可能会创建多个实例.<br />示例代码如下: </p>
		<p>using System;<br />using System.Data.OleDb;<br />using System.Runtime.Remoting.Contexts;</p>
		<p>[Synchronization()]<br />public class ConnectionClass<br />{<br /> private static OleDbConnection instance = null;<br /> private static string constring = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=singleton.mdb;Mode=Share Deny None;Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False";</p>
		<p> public static OleDbConnection GetInstance()<br /> {<br />  if (instance == null)<br />  {<br />   Console.WriteLine("Create new connection");<br />   instance = new OleDbConnection(constring);<br />  }<br />  return instance;<br /> }<br />}<br />public class Client<br />{<br /> public static void Main()<br /> {<br />  OleDbConnection cn = ConnectionClass.GetInstance();<br />  cn.Open();<br />  cn = ConnectionClass.GetInstance();<br />  cn.Close();<br /> }<br />}</p>
<img src ="http://www.blogjava.net/zqli/aggbug/93166.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-01-11 14:48 <a href="http://www.blogjava.net/zqli/archive/2007/01/11/93166.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>跨多窗体传值C# Session</title><link>http://www.blogjava.net/zqli/archive/2007/01/11/93073.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Thu, 11 Jan 2007 01:58:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/01/11/93073.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/93073.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/01/11/93073.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/93073.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/93073.html</trackback:ping><description><![CDATA[初初接触C#，今天看到个帖子，窗体编程中，也存在类似Web应用中的Session：<br /><br />赋值：Session["UserName"]   =   UserName_Txt.Text;   <br />或         Session.Add("UserName",UserName_Txt.Text);   <br /><br />if   (Session["UserName"]!=null)  <br />  {   <br />        do   something   <br />    <br />  }<br /><br />取值：string   UserName   =   （string）Session["UserName"]；   <br />用完后消除Session的值，以免浪费系统资源   <br />              Session.Remove("UserName")；   <br /><br /><br /><img src ="http://www.blogjava.net/zqli/aggbug/93073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-01-11 09:58 <a href="http://www.blogjava.net/zqli/archive/2007/01/11/93073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DataTable,DataView和DataGrid中一些容易混淆的概念</title><link>http://www.blogjava.net/zqli/archive/2007/01/08/92404.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Mon, 08 Jan 2007 08:18:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/01/08/92404.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/92404.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/01/08/92404.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/92404.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/92404.html</trackback:ping><description><![CDATA[        DataGrid通过DataSource 和 DataMember 属性来绑定其要显示的数据源。数据源一般是DataTable、DataView、DataSet等，不过将这些数据源绑定到DataGrid时实际上是绑定的DataView。若数据源是DataTable时，实际上是绑定了此DataTable的DefaultView，若数据源是DataSet时，则可以向 DataMember 属性设置一个字符串，该字符串指定要绑定到的表，然后再将DataMember指定的那个DataTable的DefaultView绑定到DataGrid。 <br />   <img src ="http://www.blogjava.net/zqli/aggbug/92404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-01-08 16:18 <a href="http://www.blogjava.net/zqli/archive/2007/01/08/92404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>窗体导航：Form1-&gt;Form2及窗体间传值</title><link>http://www.blogjava.net/zqli/archive/2007/01/06/92171.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Sat, 06 Jan 2007 05:34:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/01/06/92171.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/92171.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/01/06/92171.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/92171.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/92171.html</trackback:ping><description><![CDATA[用Form1表示原窗体，使用Form2表示新显示的窗体，它们之间存在“Form1-&gt;Form2”的导航关系。<br /><br />显示Form2有两种方式-调用Form2的Show方法或调用ShowDialog方法。Show方法将Form2作为普通的窗体显示出来，而ShowDialog方法则将其作为模式对话框进行显示。这两种方法的区别在于，对Show方法的调用立即返回，Form1继续执行Show方法调用后面的代码，而对ShowDialog的调用将被阻塞，直到Form2被关闭为止。<br /><br />另外，ShowDialog方法显示对话框后还能接收到一个返回值，表示用户在对话框中进行操作的结果。只需在Form2中的恰当位置将其自身的DialogResult属性设置为DialogResoult枚举的某个值之一，就可以关闭Form2并向Form1返回这个DialogResult值。<br /><br /><br /><br />常用的窗体间属性、构造器之外的一种传递值的方法：<br /><br />可以在第一个窗体中定义一个static   public   变量,用它来传递数据   <br />  如:   <br />  Form1.cs文件中:   <br />    <br />  static   public   string   str;   <br />  private   Form2   frm   =   new   Form2();   <br />  private   void   button1_Click(object   sender,   System.EventArgs   e)   <br />  {   <br />  str   =   textBox1.Text;   <br />  frm.Show();   <br />  this.Hide();   <br />  }   <br />    <br />  Form2.cs文件中:   <br />    <br />  private   void   Form2_Load(object   sender,   System.EventArgs   e)   <br />  {   <br />  textBox1.Text   =   Form1.str;   <br />  }   <br />    <br />  如果str被声明为   public   而不是   static   public   则必须声明一个Form1的实例才能使用.<img src ="http://www.blogjava.net/zqli/aggbug/92171.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-01-06 13:34 <a href="http://www.blogjava.net/zqli/archive/2007/01/06/92171.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]DataGrid资料</title><link>http://www.blogjava.net/zqli/archive/2007/01/04/91826.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Thu, 04 Jan 2007 11:31:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2007/01/04/91826.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/91826.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2007/01/04/91826.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/91826.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/91826.html</trackback:ping><description><![CDATA[
		<div class="posthead">
				<h2>
						<a class="singleposttitle" id="viewpost1_TitleUrl" href="http://www.cnblogs.com/iCeSnaker/archive/2004/07/31/29017.html">
								<font color="#223355">DataGrid资料</font>
						</a>
				</h2>Posted on 2004-07-31 22:40 <a href="http://icesnaker.cnblogs.com/"><font color="#223355">iCeSnaker</font></a> 阅读(27359) <a href="http://www.cnblogs.com/iCeSnaker/archive/2004/07/31/29017.aspx#Post"><font color="#223355">评论(23)</font></a>  <a href="http://www.cnblogs.com/iCeSnaker/admin/EditPosts.aspx?postid=29017"><font color="#223355">编辑</font></a> <a href="http://www.cnblogs.com/iCeSnaker/AddToFavorite.aspx?id=29017"><font color="#223355">收藏</font></a><a href="http://www.cnblogs.com/iCeSnaker/services/trackbacks/29017.aspx"><font color="#223355">引用</font></a><a href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'saveit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();"><font color="#223355">网摘</font></a> 所属分类: <a href="http://www.cnblogs.com/iCeSnaker/category/7214.html"><font color="#223355">C#</font></a><img height="1" src="http://www.cnblogs.com/iCeSnaker/aggbug/29017.html?webview=1" width="1" /><!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="http://www.cnblogs.com/iCeSnaker/archive/2004/07/31/29017.html"
dc:identifier="http://www.cnblogs.com/iCeSnaker/archive/2004/07/31/29017.html"
dc:title="DataGrid资料"
trackback:ping="http://www.cnblogs.com/iCeSnaker/services/trackbacks/29017.aspx" />
</rdf:RDF>
--></div>
		<div class="postbody">
				<p>
						<font face="Courier New">
								<font size="2">
										<span id="ArticleTitle1_ArticleTitle1_lblTitle">关于datagrid的打印<br /><a href="http://www.chinaaspx.com/article/csharp/295.htm"><font color="#1d58d1">http://www.chinaaspx.com/article/csharp/295.htm</font></a><br /><br />C#中为DataGrid添加下拉列表框<br /><a href="http://www.cnblogs.com/icesnaker/archive/2004/09/21/45015.aspx"><font color="#1d58d1">http://www.cnblogs.com/icesnaker/archive/2004/09/21/45015.aspx</font></a><br /><br />DataGrid也玩分页<br /></span>
										<a href="http://dev.csdn.net/article/32/32339.shtm">
												<font color="#1d58d1">http://dev.csdn.net/article/32/32339.shtm</font>
										</a>
										<br />
										<br />DataGrid的正反双向排序<br /></font>
								<a href="http://dev.csdn.net/develop/article/26/26817.shtm">
										<font color="#1d58d1" size="2">http://dev.csdn.net/develop/article/26/26817.shtm</font>
								</a>
								<br />
								<br />
								<span id="ArticleTitle1_ArticleTitle1_lblTitle">
										<font size="2">DataGrid删除确认及Item颜色交替<br /></font>
										<a href="http://dev.csdn.net/develop/article/26/26768.shtm">
												<font color="#1d58d1" size="2">http://dev.csdn.net/develop/article/26/26768.shtm</font>
										</a>
										<br />
										<br />
										<span id="ArticleTitle1_ArticleTitle1_lblTitle">
												<font size="2">DataGrid常见解决方案(三)--在DataGrid中选择,确认,删除多行复选框列表<br /><a href="http://dev.csdn.net/develop/article/26/26613.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/26/26613.shtm</font></a><br /><br />使用DataGrid动态绑定DropDownList<br /><a href="http://dev.csdn.net/develop/article/26/26590.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/26/26590.shtm</font></a><br /><br />DataGrid在分页状态下删除纪录的问题<br /><a href="http://dev.csdn.net/develop/article/26/26589.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/26/26589.shtm</font></a><br /><br />怎样使用DataGrid控件<br /><a href="http://dev.csdn.net/develop/article/26/26459.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/26/26459.shtm</font></a><br /><br />DataGrid Web控件深度历险(3) part1<br /><a href="http://dev.csdn.net/develop/article/26/26249.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/26/26249.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataGrid Web控件深度历险(3) part2<br /><a href="http://dev.csdn.net/develop/article/26/26250.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/26/26250.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataGrid Web控件深度历险(3) part3<br /><a href="http://dev.csdn.net/develop/article/26/26403.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/26/26403.shtm</font></a><br /><br />datagrid分页《非控件版》<br /><a href="http://dev.csdn.net/develop/article/26/26002.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/26/26002.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">datagrid分页问题（前后跳页）《控件版》<br /><a href="http://dev.csdn.net/develop/article/26/26001.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/26/26001.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataGrid Web控件深度历险(2) Part1<br /><a href="http://dev.csdn.net/develop/article/25/25948.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/25/25948.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">
														<span>
																<span>
																		<font size="2">DataGrid Web控件深度历险(1)<br /><a href="http://dev.csdn.net/develop/article/25/25816.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/25/25816.shtm</font></a><br /></font>
																</span>
														</span>
														<br />DataGrid Web控件深度历险(2) Part2<br /><a href="http://dev.csdn.net/develop/article/25/25949.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/25/25949.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">如何在DataGrid里面产生滚动条而不滚动题头<br /><a href="http://dev.csdn.net/develop/article/25/25538.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/25/25538.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">使用在.net 框架上的DataGrid數據分頁控件<br /><a href="http://dev.csdn.net/develop/article/25/25474.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/25/25474.shtm</font></a><br /><br />将某一目录下的所有相同格式的 XML文件绑定到不同的DataGrid<br /><a href="http://dev.csdn.net/develop/article/25/25469.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/25/25469.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataGrid连接Access的快速分页法（5）——实现快速分页<br /><a href="http://dev.csdn.net/develop/article/25/25294.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/25/25294.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataGrid连接Access的快速分页法（4）——动态生成SQL语句<br /><a href="http://dev.csdn.net/develop/article/25/25293.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/25/25293.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataGrid连接Access的快速分页法（3）——SQL语句的选用（降序）<br /><a href="http://dev.csdn.net/develop/article/25/25291.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/25/25291.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataGrid连接Access的快速分页法（2）——SQL语句的选用（升序）<br /><a href="http://dev.csdn.net/develop/article/25/25290.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/25/25290.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataGrid连接Access的快速分页法（1）——需求与现状<br /><a href="http://dev.csdn.net/develop/article/25/25288.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/25/25288.shtm</font></a><br /><br />显示DataGrid序号的一个适用的方法<br /><a href="http://dev.csdn.net/develop/article/25/25113.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/25/25113.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">常见 Datagrid 错误(other)<br /><a href="http://dev.csdn.net/develop/article/24/24460.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/24/24460.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">XP 风格的可拖动列、可排序、可改变宽度的DataGrid的例子<br /><a href="http://dev.csdn.net/develop/article/24/24441.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/24/24441.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">利用radio实现Datagrid的单选<br /><a href="http://dev.csdn.net/develop/article/24/24295.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/24/24295.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">重画系列:DataGridColumnStyle之测试代码<br /><a href="http://dev.csdn.net/develop/article/24/24191.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/24/24191.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">将OleDbDataAdapter绑定到Winform下的DataGrid<br /><a href="http://dev.csdn.net/develop/article/24/24148.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/24/24148.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">去除Asp:DataGrid中无用ViewState的方法（2）<br /><a href="http://dev.csdn.net/develop/article/23/23671.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/23/23671.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">去除Asp:DataGrid中无用ViewState的方法（1）<br /><a href="http://dev.csdn.net/develop/article/23/23670.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/23/23670.shtm</font></a><br /><br />datagrid保存时无法提交更新的问题<br /><a href="http://dev.csdn.net/develop/article/23/23376.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/23/23376.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">将DBF,XLS,XML,MDB文件导入C#DataGrid的方法<br /><a href="http://dev.csdn.net/develop/article/23/23036.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/23/23036.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">动态创建DataGrid的模版列<br /><a href="http://dev.csdn.net/develop/article/22/22942.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/22/22942.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataTable中数据记录的统计<br /><a href="http://dev.csdn.net/develop/article/22/22710.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/22/22710.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">（ASP.NET）用动态属性和DataView实现DataGrid的双向排序<br /><a href="http://dev.csdn.net/develop/article/22/22513.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/22/22513.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">如何同步滚动两个相同的DataGrid<br /><a href="http://dev.csdn.net/develop/article/22/22438.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/22/22438.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">asp.net中DataGrid性能测试<br /><a href="http://dev.csdn.net/develop/article/22/22405.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/22/22405.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">让Asp.NET的DataGrid可排序、可选择、可分页<br /><a href="http://dev.csdn.net/develop/article/22/22297.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/22/22297.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataGrid传统分页方式<br /><a href="http://dev.csdn.net/develop/article/21/21997.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/21/21997.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">在后代码里创建DataGrid控件<br /><a href="http://dev.csdn.net/develop/article/21/21934.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/21/21934.shtm</font></a><br /><br />实现类似Windows资源管理器的DataGrid<br /><a href="http://dev.csdn.net/develop/article/21/21933.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/21/21933.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">ASP.net中的Datagrid自定义分页功能<br /><a href="http://dev.csdn.net/develop/article/21/21875.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/21/21875.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">在Pocket PC应用程序中使用DataGrid控件<br /><a href="http://dev.csdn.net/develop/article/21/21844.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/21/21844.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">创建可拖动列的DataGrid（2）<br /><a href="http://dev.csdn.net/develop/article/21/21594.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/21/21594.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">创建可拖动列的DataGrid<br /><a href="http://dev.csdn.net/develop/article/21/21593.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/21/21593.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataGrid和CheckBox的混合使用<br /><a href="http://dev.csdn.net/develop/article/21/21585.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/21/21585.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">利用Session纪录datagrid模板列中CheckBox的状态<br /><a href="http://dev.csdn.net/develop/article/21/21294.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/21/21294.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataGrid模板列中TextBox的焦点相应键盘事件<br /><a href="http://dev.csdn.net/develop/article/21/21290.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/21/21290.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">给DataGrid添加确定删除的功能<br /><a href="http://dev.csdn.net/develop/article/20/20892.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/20/20892.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">如何给DataGrid添加自动增长列<br /><a href="http://dev.csdn.net/develop/article/20/20887.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/20/20887.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">如何利用RadioButtonList实现datagrid列的单选<br /><a href="http://dev.csdn.net/develop/article/20/20789.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/20/20789.shtm</font></a><br /><br />锦上添花DataGrid！<br /><a href="http://dev.csdn.net/develop/article/20/20770.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/20/20770.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">ASP.Net WebMatrix中Datagrid使用模板列对数据显示进行排版<br /><a href="http://dev.csdn.net/develop/article/20/20576.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/20/20576.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">格式化 DataGrid 输出<br /><a href="http://dev.csdn.net/develop/article/20/20307.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/20/20307.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">如何实现单击在DATALIST(DATAGRID)的HEADER加入的CHECKBOX,进行DATALIST(DATAGRID)中的CHECKBOX列全选或全不选<br /><a href="http://dev.csdn.net/develop/article/20/20290.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/20/20290.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">向datagrid中加横向 纵向的合计 （在datatable中实现，datatable间倒数据）<br /><a href="http://dev.csdn.net/develop/article/20/20221.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/20/20221.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">基于ADO+Adodc控件+DataGrid控件制作的一个数据库编辑程序（完整原程序）<br /><a href="http://dev.csdn.net/develop/article/19/19600.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/19/19600.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">如何实现自定义及自动逐页打印DataGrid显示的内容<br /><a href="http://dev.csdn.net/develop/article/19/19353.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/19/19353.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">合并datagrid中内容相同的单元格<br /><a href="http://dev.csdn.net/develop/article/19/19122.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/19/19122.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">创建固定表头、表格体滚动的DataGrid<br /><a href="http://dev.csdn.net/develop/article/18/18972.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/18/18972.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">创建跨多列、多行表头的DataGrid<br /><a href="http://dev.csdn.net/develop/article/18/18971.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/18/18971.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">在DataGrid中添加一个合计字段<br /><a href="http://dev.csdn.net/develop/article/18/18856.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/18/18856.shtm</font></a><br /><br />在DataGrid里添加确认删除的对话框<br /><a href="http://dev.csdn.net/develop/article/18/18838.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/18/18838.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">为DataGrid添加自动编号功能<br /><a href="http://dev.csdn.net/develop/article/18/18783.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/18/18783.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">格式化DataGrid的例子【将数据源中的0,1值转换成实际的文字】<br /><a href="http://dev.csdn.net/develop/article/18/18782.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/18/18782.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">Henry手记—Web Form中的Datagrid的自定义分页<br /><a href="http://dev.csdn.net/develop/article/18/18760.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/18/18760.shtm</font></a><br /><br />创建完全可编辑的 DataGrid<br /><a href="http://dev.csdn.net/develop/article/18/18744.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/18/18744.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataGrid控件通用打印类<br /><a href="http://dev.csdn.net/develop/article/18/18711.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/18/18711.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">为DataGrid添加CheckBox控件<br /><a href="http://dev.csdn.net/develop/article/18/18615.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/18/18615.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">VB.NET中关于DataGrid颜色的自定义<br /><a href="http://dev.csdn.net/develop/article/18/18512.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/18/18512.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">在DataGrid快速添加新行<br /><a href="http://dev.csdn.net/develop/article/18/18487.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/18/18487.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">Henry手记－Datagrid事件响应(二)<br /><a href="http://dev.csdn.net/develop/article/18/18315.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/18/18315.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">datagrid技巧之一：代码控制选中行的颜色<br /><a href="http://dev.csdn.net/develop/article/17/17852.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/17/17852.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">在C#里实现DATAGRID的打印预览和打印<br /><a href="http://dev.csdn.net/develop/article/17/17851.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/17/17851.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">Binding a DataGrid to an ADO Recordset<br /><a href="http://dev.csdn.net/develop/article/17/17850.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/17/17850.shtm</font></a><br /><br />Creating DataGrid Templated Columns Dynamically - Part II<br /><a href="http://dev.csdn.net/develop/article/17/17846.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/17/17846.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">Creating DataGrid Templated Columns Dynamically - Part I<br /><a href="http://dev.csdn.net/develop/article/17/17845.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/17/17845.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataTable,DataView和DataGrid中一些容易混淆的概念<br /><a href="http://dev.csdn.net/develop/article/17/17840.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/17/17840.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">动态的管理ASP.NET DataGrid数据列<br /><a href="http://dev.csdn.net/develop/article/17/17599.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/17/17599.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">Henry手记－Datagrid键盘事件响应（二）<br /><a href="http://dev.csdn.net/develop/article/17/17424.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/17/17424.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">Henry手记—从Datagrid的标题居中说起<br /><a href="http://dev.csdn.net/develop/article/17/17053.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/17/17053.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">用嵌套的DataGrid实现主从式表的显示<br /><a href="http://dev.csdn.net/develop/article/16/16960.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/16/16960.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataGrid中嵌套使用Repeater<br /><a href="http://dev.csdn.net/develop/article/16/16834.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/16/16834.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">Henry手记 － Datagrid键盘事件响应（一）<br /><a href="http://dev.csdn.net/develop/article/16/16572.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/16/16572.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">给datagrid控件建立稳固的双向排序(asp.net)<br /><a href="http://dev.csdn.net/develop/article/16/16563.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/16/16563.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">asp.net笔记(dataset，datagrid)<br /><a href="http://dev.csdn.net/develop/article/16/16528.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/16/16528.shtm</font></a><br /><br />添加一个下拉框到DataGrid<br /><a href="http://dev.csdn.net/develop/article/16/16434.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/16/16434.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataSet导出CSV格式(ASP.NET,C#)<br /><a href="http://dev.csdn.net/develop/article/16/16311.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/16/16311.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">Henry手记：Datagrid事件响应<br /><a href="http://dev.csdn.net/develop/article/16/16273.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/16/16273.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">Henry手记：WinForm Datagrid结构剖析（三）使用代码<br /><a href="http://dev.csdn.net/develop/article/16/16088.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/16/16088.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">Henry手记：WinForm Datagrid结构剖析（三）类代码<br /><a href="http://dev.csdn.net/develop/article/16/16087.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/16/16087.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">Henry手记：WinForm Datagrid结构剖析（三）<br /><a href="http://dev.csdn.net/develop/article/16/16086.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/16/16086.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">ADO在vb.net中的使用（与datagrid结合）<br /><a href="http://dev.csdn.net/develop/article/15/15975.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/15/15975.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">Henry手记：WinForm Datagrid结构剖析（二）程序<br /><a href="http://dev.csdn.net/develop/article/15/15929.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/15/15929.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">Henry手记：WinForm Datagrid结构剖析（二）<br /><a href="http://dev.csdn.net/develop/article/15/15928.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/15/15928.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">ASP.NET中的DataGrid的属性<br /><a href="http://dev.csdn.net/develop/article/15/15920.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/15/15920.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">EnableViewState="false"的DataGrid分页<br /><a href="http://dev.csdn.net/develop/article/15/15913.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/15/15913.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">Datagrid 链接数据库Access<br /><a href="http://dev.csdn.net/develop/article/15/15861.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/15/15861.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataGrid 链接Access数据库<br /><a href="http://dev.csdn.net/develop/article/15/15860.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/15/15860.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">Henry手记:WinForm Datagrid结构剖析（一）<br /><a href="http://dev.csdn.net/develop/article/15/15686.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/15/15686.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">把Excel文件中的数据读入到DataGrid中<br /><a href="http://dev.csdn.net/develop/article/15/15544.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/15/15544.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">如何创建一个用弹出窗口来查看详细信息的超链接列<br /><a href="http://dev.csdn.net/develop/article/15/15456.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/15/15456.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataGrid使用技巧（四）<br /><a href="http://dev.csdn.net/develop/article/15/15282.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/15/15282.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataGrid使用技巧（三）<br /><a href="http://dev.csdn.net/develop/article/15/15220.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/15/15220.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataGrid使用技巧（二）<br /><a href="http://dev.csdn.net/develop/article/15/15139.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/15/15139.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">DataGrid使用技巧(一)<br /><a href="http://dev.csdn.net/develop/article/15/15109.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/15/15109.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">神奇的 DataGrid<br /><a href="http://dev.csdn.net/develop/article/14/14114.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/14/14114.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">使用c#+(datagrid控件)编辑xml文件<br /><a href="http://dev.csdn.net/develop/article/13/13333.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/13/13333.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">在DataGrid中创建一个弹出式Details窗口<br /><a href="http://dev.csdn.net/develop/article/12/12170.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/12/12170.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">在DataGrid中创建一个弹出式Details窗口<br /><a href="http://dev.csdn.net/develop/article/12/12099.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/12/12099.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">vs.net beta 2中利用DataGrid分页详解<br /><a href="http://dev.csdn.net/develop/article/11/11009.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/11/11009.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">使用 ASP+ DataGrid 控件来创建主视图/详细资料视图 （2）<br /><a href="http://dev.csdn.net/develop/article/1/1865.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/1/1865.shtm</font></a></font>
										</span>
								</span>
						</font>
				</p>
				<p>
						<font face="Courier New">
								<span>
										<span>
												<font size="2">使用 ASP+ DataGrid 控件来创建主视图/详细资料视图<br /><a href="http://dev.csdn.net/develop/article/1/1864.shtm"><font color="#1d58d1">http://dev.csdn.net/develop/article/1/1864.shtm</font></a><br /></font>
										</span>
								</span>
						</font>
				</p>
		</div>
<img src ="http://www.blogjava.net/zqli/aggbug/91826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2007-01-04 19:31 <a href="http://www.blogjava.net/zqli/archive/2007/01/04/91826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] 简单宜用的网站静态化思路及代码分析 </title><link>http://www.blogjava.net/zqli/archive/2006/12/18/88631.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Mon, 18 Dec 2006 12:41:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2006/12/18/88631.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/88631.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2006/12/18/88631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/88631.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/88631.html</trackback:ping><description><![CDATA[
		<p>出处:http://www.net2china.net/blog/user1/sunychen/archives/2006/226.html<br /></p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<div class="post-body">
												<div>
														<font color="#ffffff" size="3">
																<a href="http://www.ewaimao.cn/blog/">finddream的外贸网络营销</a>
														</font>
												</div>
												<div>
														<font size="3">静态化是有很大好处的。最值得称道的应该是加快下载速度,更利于搜索引擎的抓取,这两点对一个企业网站来说应该比较重要吧。</font>
												</div>
												<div> </div>
												<div>
														<font size="3">一般的静态化是通过fso组件读取网站模板的内容，然后替换其中的特定字符，生成静态页面，这是个不错的想法，如果你要自己写一个网站，建议你用这种办法，因为比较稳定。而且如果想以后更换网站界面也相当容易，只需修改模板而无需更改程序。这个办法很多高手已经说得很明白了，推荐一个：</font>
												</div>
												<div>
														<font size="3">http://www.jingzhengli.cn/Blog/zjh/265.html</font>
												</div>
												<div> </div>
												<div>
														<font size="3">然而很不幸，很多公司的网站已经做好，而且每一页都是html中夹杂大量asp代码的形式，没有模板，功能也没有模块化，如果想仍用以上方法进行静态化处理，其复杂程度相当于重做一个网站。</font>
												</div>
												<div> </div>
												<div>
														<font size="3">提出一个简单宜用的解决办法。不用模板、不用修改程序，非常便捷。利用XMLHTTP对象及其方法。他的原理是将已有的asp网页内容一次性读取出来，然后写到静态页中，实现网站的静态化重构。</font>
												</div>
												<div> </div>
												<div>
														<font size="3">现在以生成 <a href="http://www.rocky-glass.com/"><font color="#3f729e">www.rocky-glass.com</font></a>的首页为例，介绍一下这种方法，代码如下：</font>
												</div>
												<div> </div>
												<div>
														<font size="3">Url="http://www.rocky-glass.com/default.asp" ‘<span style="COLOR: red">定义动态首页</span></font>
												</div>
												<div>
														<font size="3">wstr = GetPage(Url) ‘<span style="COLOR: red">把动态首页的内容全部读取出来</span></font>
												</div>
												<div> </div>
												<div>
														<font size="3">Set fs=Server.CreateObject("Scripting.FileSystemObject")</font>
												</div>
												<div> </div>
												<div>
														<font size="3">Set CrFi=fs.CreateTextFile(server.MapPath("../")&amp;"\index.htm") ‘<span style="COLOR: red">创建静态首页</span><span style="COLOR: red">index.htm</span></font>
												</div>
												<div>
														<font size="3">CrFi.Writeline(wstr) ‘<span style="COLOR: red">将读取出的内容写入静态页面</span></font>
												</div>
												<div>
														<font size="3">set CrFi=nothing ‘<span style="COLOR: red">关闭两个对象</span></font>
												</div>
												<div>
														<font size="3">set fs=nothing</font>
												</div>
												<div> </div>
												<div>
														<font size="3">以下两个函数涉及到xmlhttp对象和方法的使用，如果能看懂就看，看不懂直接调用就行。</font>
												</div>
												<div>
														<font size="3">
																<span style="COLOR: red">Function GetPage(url) </span>
																<span style="COLOR: red">‘此过程的功能是实现把</span>
																<span style="COLOR: red">asp</span>
																<span style="COLOR: red">网页的内容一次性读取出来。</span>
														</font>
												</div>
												<div>
														<font size="3">dim Retrieval</font>
												</div>
												<div>
														<font size="3">Set Retrieval = CreateObject("Microsoft.XMLHTTP") </font>
												</div>
												<div>
														<font size="3">With Retrieval </font>
												</div>
												<div>
														<font size="3">.Open "Get", url, False ', "", "" </font>
												</div>
												<div>
														<font size="3">.Send </font>
												</div>
												<div>
														<font size="3">GetPage = BytesToBstr(.ResponseBody)</font>
												</div>
												<div>
														<font size="3">End With </font>
												</div>
												<div>
														<font size="3">Set Retrieval = Nothing </font>
												</div>
												<div>
														<span style="COLOR: red">
																<font size="3">End Function</font>
														</span>
												</div>
												<div> </div>
												<div>
														<font size="3">
																<span style="COLOR: red">Function BytesToBstr(body)</span>
																<span style="COLOR: red">‘字符转换</span>
														</font>
												</div>
												<div>
														<font size="3">dim objstream</font>
												</div>
												<div>
														<font size="3">set objstream = Server.CreateObject("adodb.stream")</font>
												</div>
												<div>
														<font size="3">objstream.Type = 1</font>
												</div>
												<div>
														<font size="3">objstream.Mode =3</font>
												</div>
												<div>
														<font size="3">objstream.Open</font>
												</div>
												<div>
														<font size="3">objstream.Write body</font>
												</div>
												<div>
														<font size="3">objstream.Position = 0</font>
												</div>
												<div>
														<font size="3">objstream.Type = 2</font>
												</div>
												<div>
														<font size="3">objstream.Charset = "utf-8" ‘<span style="COLOR: red">如果是中文页面请用</span><span style="COLOR: red">gb2312.</span><span style="COLOR: red">，英文页面用</span><span style="COLOR: red">utf-8</span></font>
												</div>
												<div>
														<font size="3">BytesToBstr = objstream.ReadText </font>
												</div>
												<div>
														<font size="3">objstream.Close</font>
												</div>
												<div>
														<font size="3">set objstream = nothing</font>
												</div>
												<div>
														<span style="COLOR: red">
																<font size="3">End Function</font>
														</span>
												</div>
												<div> </div>
												<div>
														<font size="3">首页的静态化就完成了，生成为 index.htm 这个静态页，其他的页面也可以按照这个思路进行，利用不同的后缀id值，就可以批量生成所有网页。</font>
												</div>
												<div> </div>
												<div>
														<font size="3">两点注意：1、如果是批量生成页面要保证网速，否则程序的运行很容易超出服务器的允许时间。</font>
												</div>
												<div>
														<font size="3">
																<span>          2</span>、生成英文页面的时候，要保证原页面上没有汉字或其他语言，否则生成出错。</font>
												</div>
												<div> </div>
												<div>
														<font size="3">这种静态化相对比较容易，尤其是那些对那些写的很差劲的网站进行静态化处理。我一直用这种方法给企业静态化处理。</font>
												</div>
												<div>
														<font size="3">有机会我会把这种方法进一步写成类，方便各位网友调用。</font>
												</div>
												<div> </div>
												<div>
														<font size="3">下边说说两种骗人的静态化方案，引起各位注意。</font>
												</div>
												<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
														<font size="3">
																<span>1、 </span>框架伪静态,这种是非常简单而且也是非常便于识别的,它的原理比较简单,就是做一个静态的主框架页面,然后把动态的内容链入副框架内,这个单从它的URL就可以看出眉目,如果整个网站的URL都是一样的,那么就一定是框架伪静态的。这种所谓的静态化不仅达不到优化的目的，而且还不如不优化。</font>
												</div>
												<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
														<font size="3">
																<span>2、 </span>利用组件把asp的辍显示为htm,它主要是利用一个组件强制性的把asp文件的后辍显示为htm,比较有名的组件是MOD REWRITE，这种东西只是在形式上让你感觉已经静态化了，其实仍然是执行动态网页。识别这个也比较容易，那就是看看有没有生成静态页就是了。如果没有生成静态页，显然是骗人的，因为只有动态页才是虚拟的，从数据库中调用数据进行显示，而静态页面一定是独立的。当然，利用这种方案可以起到seo优化作用，但是对访问速度来说，是一点提高都没有的，而且还有可能降低访问速度。</font>
												</div>
										</div>
								</td>
						</tr>
				</tbody>
		</table> <br /><br /><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1444169</p><img src ="http://www.blogjava.net/zqli/aggbug/88631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2006-12-18 20:41 <a href="http://www.blogjava.net/zqli/archive/2006/12/18/88631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] 用C#生成随机中文汉字验证码的基本原理 </title><link>http://www.blogjava.net/zqli/archive/2006/10/28/77853.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Sat, 28 Oct 2006 14:19:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2006/10/28/77853.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/77853.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2006/10/28/77853.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/77853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/77853.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 验证码              出处:http://peyree.bokee.com/前几天去申请免费QQ号码，突然发现申请表单中的验证码内容换成了中文，这叫真叫我大跌眼镜感到好笑，Moper上的猫儿们都大骂腾讯采用中文验证码。^_^ 我不得不佩服腾讯为了防止目前网络上横行的QQ号码自动注册机而采取中文验证码的手段。仔细想了想感觉用程序生成随机的中文验证码并不是很难，下面就来介绍一下使用C#生成...&nbsp;&nbsp;<a href='http://www.blogjava.net/zqli/archive/2006/10/28/77853.html'>阅读全文</a><img src ="http://www.blogjava.net/zqli/aggbug/77853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2006-10-28 22:19 <a href="http://www.blogjava.net/zqli/archive/2006/10/28/77853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>