<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>DEGULA</title>
	
	<link>http://degula.com</link>
	<description>Hell, its about time.</description>
	<lastBuildDate>Thu, 24 Sep 2009 10:37:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.3</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Degula" /><feedburner:info uri="degula" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>Degula</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>HttpHandler和HttpModule</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/7NoYmRrHK8A/httphandler%e5%92%8chttpmodule.html</link>
		<comments>http://degula.com/dotnet/200909506/httphandler%e5%92%8chttpmodule.html#comments</comments>
		<pubDate>Thu, 24 Sep 2009 10:37:25 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[dotnet]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>

		<guid isPermaLink="false">http://degula.com/?p=506</guid>
		<description><![CDATA[
ASP.Net 处理Http Request时，使用Pipeline（管道）方式，由各个HttpModule对请求进行处理，然后到达 HttpHandler，HttpHandler处理完之后，仍经过Pipeline中各个HttpModule的处理，最后将HTML发送到客户端浏览 器中。


生 命周期中涉及到几个非常重要的对象：HttpHandler,HttpModule,IHttpHandlerFactory，他们的执行(顺序)大致的 执行过程是这样的：client端发送页面请求，被IIS的某个进程截获，它根据申请的页 面后缀(.aspx)不同，调用不同的页面处理程序(.asp-&#62;asp.dll; .aspx-&#62;ISAPI.dll).而页面处理程序在处理过程中，则要经历HttpModule,HttpHandler的处理：前者HttpModule用于页面处理前和处理后的一些事件的处理，后者HttpHandler进行真正的页面的处理。
如前所说，HttpModule会在页面处理前和后对页面进行处理，所以它不会 影响真正的页面请求。通常用在给每个页面的头部或者尾部添加一些信息（如版 权声明）等.曾经见过一些免费的空间，我们的页面上传上去后，浏览的时候发现，在每个页面的头部和尾部多了很多小广告&#8230;.,如果理解了 HttpModule的原理，要做这个就不是很难了~

IHttpModule与IHttpHandler的区别整理
1.先后次序.先IHttpModule,后IHttpHandler. 注:Module要看你响应了哪个事件，一些事件是在Handler之前运行的，一些是在Handler之后运行的
2.对请求的处理上:
 IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.
 IHttpHandler则属于挑食类型,只有ASP.net注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.
3.IHttpHandler按照你的请求 生成响应的内容，IHttpModule对请求进行预处理，如验证、修改、过滤等等，同时也可以对响应进行处理

ASP.Net 系统本身配置有很多HttpHandler和HttpModule，以处理aspx等.Net标准的页面文件，以及这些页面文件中标 准的事件处理等。查看%System%/Microsoft.NET\Framework\v2.0.50727\CONFIG目录下的 web.config文件中的httpHandlers和httpModules节点，可以看到这些配置。如果有兴趣，可以使用Reflector查 看.Net系统中相关的类和方法，了解.Net如何处理以及做了什么处理。
.Net 也提供了一套机制来开发自定义的HttpHandler和 HttpModule，均可以用于对HttpRequest的截取，完成自定义的处理。 HttpModule 继承System.Web.IHttpModule接口，实现自己的HttpModule类。必须要实现接口的两个方法：Init和Dispose。在 Init中，可以添加需要截取的事件；Dispose用于资源的释放，如果在Init中创建了自己的资源对象，请在Dispose中进行释放。

]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ffffff; font-family: Verdana; font-size: 13px; line-height: 19px;"></p>
<p style="margin: 0px auto 10px; text-indent: 0px;"><span style="color: #000000;">ASP.Net 处理Http Request时，使用Pipeline（管道）方式，由各个HttpModule对请求进行处理，然后到达 HttpHandler，HttpHandler处理完之后，仍经过Pipeline中各个HttpModule的处理，最后将HTML发送到客户端浏览 器中。</span></p>
<p style="margin: 0px auto 10px; text-indent: 0px;"><span style="color: #000000;"><span id="more-506"></span><br />
</span></p>
<p style="margin: 0px auto 10px; text-indent: 0px;"><span style="color: #000000;">生 命周期中涉及到几个非常重要的对象：HttpHandler,HttpModule,IHttpHandlerFactory，他们的执行(顺序)大致的 执行过程是这样的：client端发送页面请求，被IIS的某个进程截获，它根据申请的页 面后缀(.aspx)不同，调用不同的页面处理程序(.asp-&gt;asp.dll; .aspx-&gt;ISAPI.dll).而页面处理程序在处理过程中，则要经历HttpModule,HttpHandler的处理：前者</span><span style="color: #ff0000;"><span style="color: #000000;">HttpModule用于页面处理前和处理后的一些事件的处理</span></span><span style="color: #000000;">，</span><span style="color: #ff0000;"><span style="color: #000000;">后者HttpHandler进行真正的页面的处理</span></span><span style="color: #000000;">。</span><br />
<span style="color: #000000;">如前所说，HttpModule会在页面处理前和后对页面进行处理，所以它不会 影响真正的页面请求。通常用在给每个页面的头部或者尾部添加一些信息（如版 权声明）等.曾经见过一些免费的空间，我们的页面上传上去后，浏览的时候发现，在每个页面的头部和尾部多了很多小广告&#8230;.,如果理解了 HttpModule的原理，要做这个就不是很难了~</span></p>
<p style="margin: 0px auto 10px; text-indent: 0px;">
<span style="color: #000000;">IHttpModule与IHttpHandler的区别整理</span><br />
<span style="color: #000000;">1.先后次序.先IHttpModule,后IHttpHandler.</span> <span style="color: #ff0000;"><span style="color: #000000;">注:</span></span><span style="color: #000000;">Module要看你响应了哪个事件，一些事件是在Handler之前运行的，一些是在Handler之后运行的</span><br />
<span style="color: #000000;">2.对请求的处理上:</span><br />
<span style="color: #000000;"> IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.</span><br />
<span style="color: #000000;"> IHttpHandler则属于挑食类型,只有ASP.net注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.</span><br />
<span style="color: #000000;">3.IHttpHandler按照你的请求 生成响应的内容，IHttpModule对请求进行预处理，如验证、修改、过滤等等，同时也可以对响应进行处理</span></p>
<p style="margin: 0px auto 10px; text-indent: 0px;">
<p style="margin: 0px auto 10px; text-indent: 0px;"><span style="color: #000000;">ASP.Net 系统本身配置有很多HttpHandler和HttpModule，以处理aspx等.Net标准的页面文件，以及这些页面文件中标 准的事件处理等。查看%System%/Microsoft.NET\Framework\v2.0.50727\CONFIG目录下的 web.config文件中的httpHandlers和httpModules节点，可以看到这些配置。如果有兴趣，可以使用Reflector查 看.Net系统中相关的类和方法，了解.Net如何处理以及做了什么处理。</span></p>
<p style="margin: 0px auto 10px; text-indent: 0px;"><span style="color: #000000;">.Net 也提供了一套机制来开发自定义的HttpHandler和 HttpModule，均可以用于对HttpRequest的截取，完成自定义的处理。 HttpModule 继承System.Web.IHttpModule接口，实现自己的HttpModule类。必须要实现接口的两个方法：Init和Dispose。在 Init中，可以添加需要截取的事件；Dispose用于资源的释放，如果在Init中创建了自己的资源对象，请在Dispose中进行释放。</span></p>
<p></span></p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/dotnet/200909506/httphandler%e5%92%8chttpmodule.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://degula.com/dotnet/200909506/httphandler%e5%92%8chttpmodule.html</feedburner:origLink></item>
		<item>
		<title>Log4Net使用指南(zz)</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/sWSBrrl15ww/log4net%e4%bd%bf%e7%94%a8%e6%8c%87%e5%8d%97zz.html</link>
		<comments>http://degula.com/dotnet/200909505/log4net%e4%bd%bf%e7%94%a8%e6%8c%87%e5%8d%97zz.html#comments</comments>
		<pubDate>Wed, 16 Sep 2009 14:42:37 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[dotnet]]></category>
		<category><![CDATA[.net]]></category>

		<guid isPermaLink="false">http://degula.com/?p=505</guid>
		<description><![CDATA[声明：本文内容主要译自Nauman Leghari的Using log4net，亦加入了个人的一点心得(节3.1.4)。
请在这里下载示例代码

1 简介
1.1 Log4net的优点：
几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后，就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。
经验表明，日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点：它可以提供应用程序运行时的精确环境，可供开发人员尽快找到应用程序中的Bug；一旦在程序中加入了Log 输出代码，程序运行过程中就能生成并输出日志信息而无需人工干预。另外，日志信息可以输出到不同的地方（控制台，文件等）以备以后研究之用。
Log4net就是为这样一个目的设计的，用于.NET开发环境的日志记录包。
1.2 Log4net的安装：
用户可以从http://logging.apache.org/log4net/下载log4net的源代码。解压软件包后，在解压的src目录下将log4net.sln载入Visual Studio .NET，编译后可以得到log4net.dll。用户要在自己的程序里加入日志功能，只需将log4net.dll引入工程即可。
2 Log4net的结构
log4net 有四种主要的组件，分别是Logger（记录器）, Repository（库）, Appender（附着器）以及 Layout（布局）.
2.1 Logger
2.1.1 Logger接口
Logger是应用程序需要交互的主要组件，它用来产生日志消息。产生的日志消息并不直接显示，还要预先经过Layout的格式化处理后才会输出。
Logger提供了多种方式来记录一个日志消息，你可以在你的应用程序里创建多个Logger，每个实例化的Logger对象都被log4net框架作为命名实体(named entity)来维护。这意味着为了重用Logger对象，你不必将它在不同的类或对象间传递，只需要用它的名字为参数调用就可以了。log4net框架使用继承体系，继承体系类似于.NET中的名字空间。也就是说，如果有两个logger,分别被定义为a.b.c和a.b，那么我们说a.b是a.b.c的祖先。每一个logger都继承了祖先的属性
Log4net框架定义了一个ILog接口，所有的logger类都必须实现这个接口。如果你想实现一个自定义的logger，你必须首先实现这个接口。你可以参考在/extension目录下的几个例子。
ILog接口的定义如下：
public interface ILog
{
void Debug(object message);
void Info(object message);
void Warn(object message);
void Error(object message);
void Fatal(object message);
//以上的每一个方法都有一个重载的方法，用来支持异常处理。
//每一个重载方法都如下所示，有一个异常类型的附加参数。
void Debug(object message, Exception ex);
// &#8230;
//Boolean 属性用来检查Logger的日志级别
//（我们马上会在后面看到日志级别）
bool isDebugEnabled;
bool isInfoEnabled;
//… 其他方法对应的Boolean属性
}
Log4net框架定义了一个叫做LogManager的类，用来管理所有的logger对象。它有一个GetLogger()静态方法，用我们提供的名字参数来检索已经存在的Logger对象。如果框架里不存在该Logger对象，它也会为我们创建一个Logger对象。代码如下所示：
log4net.ILog log = log4net.LogManager.GetLogger(&#8221;logger-name&#8221;);
通常来说，我们会以类（class）的类型（type）为参数来调用GetLogger()，以便跟踪我们正在进行日志记录的类。传递的类(class)的类型(type)可以用typeof(Classname)方法来获得，或者可以用如下的反射方法来获得：
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType
尽管符号长了一些，但是后者可以用于一些场合，比如获取调用方法的类(class)的类型(type)。
2.1.2 日志的级别
正如你在ILog的接口中看到的一样，有五种不同的方法可以跟踪一个应用程序。事实上，这五种方法是运作在Logger对象设置的不同日志优先级别上。这几种不同的级别是作为常量定义在log4net.spi.Level类中。你可以在程序中使用任何一种方法。但是在最后的发布中你也许不想让所有的代码来浪费你的CPU周期，因此，框架提供了7种级别和相应的Boolean属性来控制日志记录的类型。
Level有以下几种取值



级别
允许的方法
Boolean属性
优先级别


OFF
 
 
Highest


FATAL
void Fatal(&#8230;);
bool IsFatalEnabled;
 


RROR
void Error(&#8230;);
bool IsErrorEnabled;
 


WARN
void Warn(&#8230;);
bool IsWarnEnabled;
 


INFO
void Info(&#8230;);
bool IsInfoEnabled;
 [...]]]></description>
			<content:encoded><![CDATA[<p>声明：本文内容主要译自Nauman Leghari的Using log4net，亦加入了个人的一点心得(节3.1.4)。<br />
请在这里下载<a href="http://files.cnblogs.com/dragon/Log4NetTester.rar">示例代码</a></p>
<p><span id="more-505"></span></p>
<p><strong>1 </strong><strong>简介</strong></p>
<p><strong>1.1 </strong><strong>Log4net</strong><strong>的优点：</strong></p>
<p>几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后，就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。</p>
<p>经验表明，日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点：它可以提供应用程序运行时的精确环境，可供开发人员尽快找到应用程序中的Bug；一旦在程序中加入了Log 输出代码，程序运行过程中就能生成并输出日志信息而无需人工干预。另外，日志信息可以输出到不同的地方（控制台，文件等）以备以后研究之用。</p>
<p>Log4net就是为这样一个目的设计的，用于.NET开发环境的日志记录包。</p>
<p><strong>1.2 </strong><strong>Log4net</strong><strong>的安装：</strong></p>
<p>用户可以从<a href="http://logging.apache.org/log4net/">http://logging.apache.org/log4net/</a>下载log4net的源代码。解压软件包后，在解压的src目录下将log4net.sln载入Visual Studio .NET，编译后可以得到log4net.dll。用户要在自己的程序里加入日志功能，只需将log4net.dll引入工程即可。</p>
<p><strong>2 </strong><strong>Log4net</strong><strong>的结构</strong></p>
<p>log4net 有四种主要的组件，分别是Logger（记录器）, Repository（库）, Appender（附着器）以及 Layout（布局）.</p>
<p><strong>2.1 </strong><strong>Logger</strong></p>
<p><strong>2.1.1 </strong><strong>Logger</strong><strong>接口</strong></p>
<p>Logger是应用程序需要交互的主要组件，它用来产生日志消息。产生的日志消息并不直接显示，还要预先经过Layout的格式化处理后才会输出。</p>
<p>Logger提供了多种方式来记录一个日志消息，你可以在你的应用程序里创建多个Logger，每个实例化的Logger对象都被log4net框架作为命名实体(named entity)来维护。这意味着为了重用Logger对象，你不必将它在不同的类或对象间传递，只需要用它的名字为参数调用就可以了。log4net框架使用继承体系，继承体系类似于.NET中的名字空间。也就是说，如果有两个logger,分别被定义为a.b.c和a.b，那么我们说a.b是a.b.c的祖先。每一个logger都继承了祖先的属性</p>
<p>Log4net框架定义了一个ILog接口，所有的logger类都必须实现这个接口。如果你想实现一个自定义的logger，你必须首先实现这个接口。你可以参考在/extension目录下的几个例子。</p>
<p>ILog接口的定义如下：</p>
<p>public interface ILog</p>
<p>{</p>
<p>void Debug(object message);</p>
<p>void Info(object message);</p>
<p>void Warn(object message);</p>
<p>void Error(object message);</p>
<p>void Fatal(object message);</p>
<p>//以上的每一个方法都有一个重载的方法，用来支持异常处理。</p>
<p>//每一个重载方法都如下所示，有一个异常类型的附加参数。</p>
<p>void Debug(object message, Exception ex);</p>
<p>// &#8230;</p>
<p>//Boolean 属性用来检查Logger的日志级别</p>
<p>//（我们马上会在后面看到日志级别）</p>
<p>bool isDebugEnabled;</p>
<p>bool isInfoEnabled;</p>
<p>//… 其他方法对应的Boolean属性</p>
<p>}</p>
<p>Log4net框架定义了一个叫做LogManager的类，用来管理所有的logger对象。它有一个GetLogger()静态方法，用我们提供的名字参数来检索已经存在的Logger对象。如果框架里不存在该Logger对象，它也会为我们创建一个Logger对象。代码如下所示：</p>
<p>log4net.ILog log = log4net.LogManager.GetLogger(&#8221;logger-name&#8221;);</p>
<p>通常来说，我们会以类（class）的类型（type）为参数来调用GetLogger()，以便跟踪我们正在进行日志记录的类。传递的类(class)的类型(type)可以用typeof(Classname)方法来获得，或者可以用如下的反射方法来获得：</p>
<p>System.Reflection.MethodBase.GetCurrentMethod().DeclaringType</p>
<p>尽管符号长了一些，但是后者可以用于一些场合，比如获取调用方法的类(class)的类型(type)。</p>
<p><strong>2.1.2 </strong><strong>日志的级别</strong></p>
<p>正如你在ILog的接口中看到的一样，有五种不同的方法可以跟踪一个应用程序。事实上，这五种方法是运作在Logger对象设置的不同日志优先级别上。这几种不同的级别是作为常量定义在log4net.spi.Level类中。你可以在程序中使用任何一种方法。但是在最后的发布中你也许不想让所有的代码来浪费你的CPU周期，因此，框架提供了7种级别和相应的Boolean属性来控制日志记录的类型。</p>
<p>Level有以下几种取值</p>
<table border="1" cellpadding="0">
<tbody>
<tr>
<td width="69"><strong>级别</strong></td>
<td width="118"><strong>允许的方法</strong></td>
<td width="154"><strong>Boolean</strong><strong>属性</strong></td>
<td width="81"><strong>优先级别</strong></td>
</tr>
<tr>
<td width="69"><strong>OFF</strong></td>
<td width="118"><strong> </strong></td>
<td width="154"><strong> </strong></td>
<td width="81"><strong>Highest</strong></td>
</tr>
<tr>
<td width="69"><strong>FATAL</strong></td>
<td width="118"><strong>void Fatal(&#8230;);</strong></td>
<td width="154"><strong>bool IsFatalEnabled;</strong></td>
<td width="81"><strong> </strong></td>
</tr>
<tr>
<td width="69"><strong>RROR</strong></td>
<td width="118"><strong>void Error(&#8230;);</strong></td>
<td width="154"><strong>bool IsErrorEnabled;</strong></td>
<td width="81"><strong> </strong></td>
</tr>
<tr>
<td width="69"><strong>WARN</strong></td>
<td width="118"><strong>void Warn(&#8230;);</strong></td>
<td width="154"><strong>bool IsWarnEnabled;</strong></td>
<td width="81"><strong> </strong></td>
</tr>
<tr>
<td width="69"><strong>INFO</strong></td>
<td width="118"><strong>void Info(&#8230;);</strong></td>
<td width="154"><strong>bool IsInfoEnabled;</strong></td>
<td width="81"><strong> </strong></td>
</tr>
<tr>
<td width="69"><strong>DEBUG</strong></td>
<td width="118"><strong>void Debug(&#8230;);</strong></td>
<td width="154"><strong>bool IsDebugEnabled;</strong></td>
<td width="81"><strong> </strong></td>
</tr>
<tr>
<td width="69"><strong>ALL</strong></td>
<td width="118"><strong> </strong></td>
<td width="154"><strong> </strong></td>
<td width="81"><strong>Lowest</strong></td>
</tr>
</tbody>
</table>
<p align="center">表1  Logger的日志级别</p>
<p>在log4net框架里，通过设置配置文件，每个日志对象都被分配了一个日志优先级别。如果没有给一个日志对象显式地分配一个级别，那么该对象会试图从他的祖先继承一个级别值。</p>
<p>ILog接口的每个方法都有一个预先定义好了的级别值。正如你在表1看到的，ILog的Inof()方法具有INFO级别。同样的，以此类推，Error()方法具有ERROR级别。当我们使用以上的任何一种方法时，log4net框架会检查日志对象logger的级别和方法的级别。只有当方法的级别高于日志级别时，日志请求才会被接受并执行。</p>
<p>举例说明，当你创建了一个日志对象，并且把他的级别设置为INFO。于是框架会设置日志的每个Boolean属性。当你调用相应的日志方法时，框架会检查相应的Boolean属性，以决定该方法能不能执行。如下的代码：</p>
<p>Logger.Info(&#8221;message&#8221;);</p>
<p>Logger.Debug(&#8221;message&#8221;);</p>
<p>Logger.Warn(&#8221;message&#8221;);</p>
<p>对于第一种方法，Info()的级别等与日志的级别（INFO），因此日志请求会被传递，我们可以得到输出结果”message”。</p>
<p>对于第二种方法，Debug()的级别低于日志对象logger的日志级别(INFO)，因此，日志请求被拒绝了，我们得不到任何输出。同样的，针对第三行语句，我们可以很容易得出结论。</p>
<p>在表1中有两个特殊的级别：ALL和OFF。ALL表示允许所有的日志请求。OFF是拒绝所有的请求。</p>
<p>你也可以显式地检查Logger对象的Boolean属性，如下所示：</p>
<p>if (logger.IsDebugEnabled)</p>
<p>{</p>
<p>Logger.Debug(&#8221;message&#8221;);</p>
<p>}</p>
<p><strong>2.2 </strong><strong>Repository</strong></p>
<p>Repository主要用于负责日志对象组织结构的维护。在log4net的以前版本中，框架仅支持分等级的组织结构(hierarchical organization)。这种等级结构本质上是库的一个实现，并且定义在log4net.Repository.Hierarchy 名字空间中。要实现一个Repository，需要实现log4net.Repository.ILoggerRepository 接口。但是通常并不是直接实现该接口，而是以log4net.Repository.LoggerRepositorySkeleton为基类继承。体系库 (hierarchical repository )则由log4net.Repository.Hierarchy.Hierarchy类实现。</p>
<p>如果你是个log4net框架的使用者，而非扩展者，那么你几乎不会在你的代码里用到Repository的类。相反的，你需要用到LogManager类来自动管理库和日志对象。</p>
<p><strong>2.3 </strong><strong>Appender</strong></p>
<p>一个好的日志框架应该能够产生多目的地的输出。比如说输出到控制台或保存到一个日志文件。log4net 能够很好的满足这些要求。它使用一个叫做Appender的组件来定义输出介质。正如名字所示，这些组件把它们附加到Logger日志组件上并将输出传递到输出流中。你可以把多个Appender组件附加到一个日志对象上。 Log4net框架提供了几个Appender组件。关于log4net提供的Appender组件的完整列表可以在log4net框架的帮助手册中找到。有了这些现成的Appender组件，一般来说你没有必要再自己编写了。但是如果你愿意，可以从log4net.Appender.AppenderSkeleton类继承。</p>
<p><strong>2.4 </strong><strong>Appender Filters</strong></p>
<p>一个Appender 对象缺省地将所有的日志事件传递到输出流。Appender的过滤器(Appender Filters) 可以按照不同的标准过滤日志事件。在log4net.Filter的名字空间下已经有几个预定义的过滤器。使用这些过滤器，你可以按照日志级别范围过滤日志事件，或者按照某个特殊的字符串进行过滤。你可以在API的帮助文件中发现更多关于过滤器的信息。</p>
<p><strong>2.5 </strong><strong>Layout</strong></p>
<p>Layout 组件用于向用户显示最后经过格式化的输出信息。输出信息可以以多种格式显示，主要依赖于我们采用的Layout组件类型。可以是线性的或一个XML文件。Layout组件和一个Appender组件一起工作。API帮助手册中有关于不同Layout组件的列表。一个Appender对象，只能对应一个Layout对象。要实现你自己的Layout类，你需要从log4net.Layout.LayoutSkeleton类继承，它实现了ILayout接口。</p>
<p><strong>3 </strong><strong>在程序中使用log4net</strong></p>
<p>在开始对你的程序进行日志记录前，需要先启动log4net引擎。这意味着你需要先配置前面提到的三种组件。你可以用两种方法来设定配置：在单独的文件中设定配置或在代码中定义配置。</p>
<p>因为下面几种原因，推荐在一个单独的文件中定义配置：</p>
<p>l         你不需要重新编译源代码就能改变配置；</p>
<p>l         你可以在程序正运行的时候就改变配置。这一点在一些WEB程序和远程过程调用的程序中有时很重要；</p>
<p>考虑到第一种方法的重要性，我们先看看怎样在文件中设定配置信息。</p>
<p><strong>3.1 </strong><strong>定义配置文件</strong></p>
<p>配置信息可以放在如下几种形式文件的一种中。</p>
<p>在程序的配置文件里，如AssemblyName.config 或web.config.</p>
<p>在你自己的文件里。文件名可以是任何你想要的名字，如AppName.exe.xyz等.</p>
<p>log4net框架会在相对于AppDomain.CurrentDomain.BaseDirectory 属性定义的目录路径下查找配置文件。框架在配置文件里要查找的唯一标识是&lt;log4net&gt;标签。一个完整的配置文件的例子如下：</p>
<p align="left">
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243; ?&gt;</p>
<p>&lt;configuration&gt;</p>
<p>&lt;configSections&gt;</p>
<p>&lt;section</p>
<p>type=&#8221;log4net.Config.Log4NetConfigurationSectionHandler,</p>
<p>log4net-net-1.0&#8243;</p>
<p>/&gt;</p>
<p>&lt;/configSections&gt;</p>
<p>&lt;log4net&gt;</p>
<p><strong> &lt;root&gt;</strong></p>
<p>&lt;level value=&#8221;WARN&#8221; /&gt;</p>
<p>&lt;appender-ref ref=&#8221;LogFileAppender&#8221; /&gt;</p>
<p>&lt;appender-ref ref=&#8221;ConsoleAppender&#8221; /&gt;</p>
<p><strong> &lt;/root&gt;</strong></p>
<p><strong> &lt;logger&gt;</strong></p>
<p>&lt;level value=&#8221;DEBUG&#8221;/&gt;</p>
<p><strong> &lt;/logger&gt;</strong></p>
<p><strong> &lt;appender </strong></p>
<p>type=&#8221;log4net.Appender.FileAppender&#8221; &gt;</p>
<p>&lt;param value=&#8221;log-file.txt&#8221; /&gt;</p>
<p>&lt;param value=&#8221;true&#8221; /&gt;</p>
<p><strong> &lt;layout&gt;</strong></p>
<p>&lt;param value=&#8221;[Header]\r\n&#8221;/&gt;</p>
<p>&lt;param value=&#8221;[Footer]\r\n&#8221;/&gt;</p>
<p>&lt;param</p>
<p>value=&#8221;%d [%t] %-5p %c [%x]  &#8211; %m%n&#8221;</p>
<p>/&gt;</p>
<p><strong> &lt;/layout&gt;</strong></p>
<p><strong> &lt;filter&gt;</strong></p>
<p>&lt;param value=&#8221;DEBUG&#8221; /&gt;</p>
<p>&lt;param value=&#8221;WARN&#8221; /&gt;</p>
<p><strong> &lt;/filter&gt;</strong></p>
<p><strong> &lt;/appender&gt;</strong></p>
<p><strong> &lt;appender </strong></p>
<p>type=&#8221;log4net.Appender.ConsoleAppender&#8221; &gt;</p>
<p><strong> &lt;layout&gt;</strong></p>
<p>&lt;param</p>
<p>value=&#8221;%d [%t] %-5p %c [%x] &#8211; %m%n&#8221;</p>
<p>/&gt;</p>
<p><strong> &lt;/layout&gt;</strong></p>
<p><strong> &lt;/appender&gt;</strong></p>
<p>&lt;/log4net&gt;</p>
<p>&lt;/configuration&gt;</p>
<p>你可以直接将上面的文本拷贝到任何程序中使用，但是最好还是能够理解配置文件是怎样构成的。 只有当你需要在应用程序配置文件中使用log4net配置时，才需要在&lt;configSection&gt;标签中加入&lt;section&gt;配置节点入口。对于其他的单独文件，只有&lt;log4net&gt;标签内的文本才是必需的，这些标签的顺序并不是固定的。下面我们依次讲解各个标签内文本的含义：</p>
<p><strong>3.1.1 </strong><strong>&lt;root&gt;</strong></p>
<p>&lt;root&gt;</p>
<p>&lt;level value=&#8221;WARN&#8221; /&gt;</p>
<p>&lt;appender-ref ref=&#8221;LogFileAppender&#8221; /&gt;</p>
<p>&lt;appender-ref ref=&#8221;ConsoleAppender&#8221; /&gt;</p>
<p>&lt;/root&gt;</p>
<p>在框架的体系里，所有的日志对象都是根日志(root logger)的后代。 因此如果一个日志对象没有在配置文件里显式定义，则框架使用根日志中定义的属性。在&lt;root&gt;标签里，可以定义level级别值和Appender的列表。如果没有定义LEVEL的值，则缺省为DEBUG。可以通过&lt;appender-ref&gt;标签定义日志对象使用的Appender对象。&lt;appender-ref&gt;声明了在其他地方定义的Appender对象的一个引用。在一个logger对象中的设置会覆盖根日志的设置。而对Appender属性来说，子日志对象则会继承父日志对象的Appender列表。这种缺省的行为方式也可以通过显式地设定&lt;logger&gt;标签的additivity属性为false而改变。</p>
<p>&lt;logger additivity=&#8221;false&#8221;&gt;</p>
<p>&lt;/logger&gt;</p>
<p>Additivity的值缺省是true.</p>
<p><strong>3.1.2 </strong><strong>&lt;Logger&gt;</strong></p>
<p>&lt;logger&gt;</p>
<p>&lt;level value=&#8221;DEBUG&#8221;/&gt;</p>
<p>&lt;/logger&gt;</p>
<p>&lt;logger&gt; 元素预定义了一个具体日志对象的设置。然后通过调用LogManager.GetLogger(“testAPP.Logging”)函数，你可以检索具有该名字的日志。如果LogManager.GetLogger(…)打开的不是预定义的日志对象，则该日志对象会继承根日志对象的属性。知道了这一点，我们可以说，其实&lt;logger&gt;标签并不是必须的。</p>
<p><strong>3.1.3 </strong><strong>&lt;appender&gt;</strong></p>
<p>&lt;appender</p>
<p>type=&#8221;log4net.Appender.FileAppender&#8221; &gt;</p>
<p>&lt;param value=&#8221;log-file.txt&#8221; /&gt;</p>
<p>&lt;param value=&#8221;true&#8221; /&gt;</p>
<p>&lt;layout&gt;</p>
<p>&lt;param value=&#8221;[Header]\r\n&#8221; /&gt;</p>
<p>&lt;param value=&#8221;[Footer]\r\n&#8221;/&gt;</p>
<p>&lt;param</p>
<p>value=&#8221;%d [%t] %-5p %c &#8211; %m%n&#8221;</p>
<p>/&gt;</p>
<p>&lt;/layout&gt;</p>
<p>&lt;filter&gt;</p>
<p>&lt;param value=&#8221;DEBUG&#8221; /&gt;</p>
<p>&lt;param value=&#8221;WARN&#8221; /&gt;</p>
<p>&lt;/filter&gt;</p>
<p>&lt;/appender&gt;</p>
<p>在&lt;root&gt;标签或单个的&lt;logger&gt;标签里的Appender对象可以用&lt;appender&gt;标签定义。&lt;appender&gt;标签的基本形式如上面所示。它定义了appender的名字和类型。 另外比较重要的是&lt;appender&gt;标签内部的其他标签。不同的appender有不同的&lt;param&gt;标签。在这里，为了使用FileAppender,你需要一个文件名作为参数。另外还需要一个在&lt;appender&gt;标签内部定义一个Layout对象。Layout对象定义在它自己的&lt;layout&gt;标签内。&lt;layout&gt;标签的type属性定义了Layout的类型(在本例里是PatternLayout)，同时也确定了需要提供的参数值。Header和Footer标签提供了一个日志会话(logging session)开始和结束时输出的文字。有关每种appender的具体配置的例子，可以在log4net\doc\manual\example-config-appender.html中得到。</p>
<p><strong>3.1.4 </strong><strong>log4net.Layout.PatternLayout</strong><strong>中的转换模式(ConversionPattern)</strong></p>
<p>%m(message):输出的日志消息，如ILog.Debug(…)输出的一条消息</p>
<p>%n(new line):换行</p>
<p>%d(datetime):输出当前语句运行的时刻</p>
<p>%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数</p>
<p>%t(thread id):当前语句所在的线程ID</p>
<p>%p(priority): 日志的当前优先级别，即DEBUG、INFO、WARN…等</p>
<p>%c(class):当前日志对象的名称，例如：</p>
<p>模式字符串为：%-10c -%m%n</p>
<p>代码为：</p>
<p>ILog log=LogManager.GetLogger(“Exam.Log”);</p>
<p>log.Debug(“Hello”);</p>
<p>则输出为下面的形式：</p>
<p>Exam.Log       &#8211; Hello</p>
<p>%L：输出语句所在的行号</p>
<p>%F：输出语句所在的文件名</p>
<p>%-数字：表示该项的最小长度，如果不够，则用空格填充</p>
<p>例如，转换模式为%r [%t]%-5p %c &#8211; %m%n 的 PatternLayout 将生成类似于以下内容的输出：</p>
<p>176 [main] INFO  org.foo.Bar &#8211; Located nearest gas station.</p>
<p><strong>3.1.5 </strong><strong>&lt;filter&gt;</strong></p>
<p>最后，让我们看看在Appender元素里的&lt;filter&gt;标签。它定义了应用到Appender对象的过滤器。本例中，我们使用了LevelRangeFilter过滤器,它可以只记录LevelMin和LevelMax参数指定的日志级别之间的日志事件。可以在一个Appender上定义多个过滤器（Filter）,这些过滤器将会按照它们定义的顺序对日志事件进行过滤。其他过滤器的有关信息可以在log4net的SDK文档中找到。</p>
<p><strong>3.2 </strong><strong>使用配置文件</strong></p>
<p><strong>3.2.1 </strong><strong>关联配置文件</strong></p>
<p>当我们创建了上面的配置文件后，我们接下来需要把它和我们的应用联系起来。缺省的，每个独立的可执行程序集都会定义它自己的配置。log4net框架使用 log4net.Config.DOMConfiguratorAttribute在程序集的级别上定义配置文件。</p>
<p>例如：可以在项目的AssemblyInfo.cs文件里添加以下的语句</p>
<p>[assembly:log4net.Config.DOMConfigurator(ConfigFile="filename",</p>
<p>ConfigFileExtension="ext",Watch=true/false)]</p>
<p>l         <strong>ConfigFile:</strong>指出了我们的配置文件的路径及文件名，包括扩展名。</p>
<p>l         <strong>ConfigFileExtension:</strong>如果我们对被编译程序的程序集使用了不同的文件扩展名，那么我们需要定义这个属性，缺省的，程序集的配置文件扩展名为”config”。</p>
<p>l         <strong>Watch (Boolean</strong><strong>属性):</strong> log4net框架用这个属性来确定是否需要在运行时监视文件的改变。如果这个属性为true,那么FileSystemWatcher将会被用来监视文件的改变，重命名，删除等事件。</p>
<p>其中：ConfigFile和ConfigFileExtension属性不能同时使用，ConfigFile指出了配置文件的名字，例如，ConfigFile=”Config.txt”</p>
<p>ConfigFileExtension则是指明了和可执行程序集同名的配置文件的扩展名，例如，应用程序的名称是”test.exe”,ConfigFileExtension=”txt”,则配置文件就应该是”test.exe.txt” ；</p>
<p>也可以不带参数应用DOMConfiguratio():</p>
<p>[assembly: log4net.Config.DOMConfigurator()]</p>
<p>也可以在程序代码中用DOMConfigurator类打开配置文件。类的构造函数需要一个FileInfo对象作参数，以指出要打开的配置文件名。 这个方法和前面在程序集里设置属性打开一个配置文件的效果是一样的。</p>
<p>log4net.Config.DOMConfigurator.Configure(</p>
<p>new FileInfo(&#8221;TestLogger.Exe.Config&#8221;));</p>
<p>DOMConfigurator 类还有一个方法ConfigureAndWatch(..), 用来配置框架并检测文件的变化。</p>
<p>以上的步骤总结了和配置相关的各个方面，下面我们将分两步来使用logger对象。</p>
<p><strong>3.2.2 </strong><strong>创建或获取日志对象</strong></p>
<p>日志对象会使用在配置文件里定义的属性。如果某个日志对象没有事先在配置文件里定义，那么框架会根据继承结构获取祖先节点的属性，最终的，会从根日志获取属性。如下所示：</p>
<p>Log4net.ILog log = Log4net.LogManager.GetLogger(&#8221;MyLogger&#8221;);</p>
<p><strong>3.2.3 </strong><strong>输出日志信息</strong></p>
<p>可以使用ILog的几种方法输出日志信息。你也可以在调用某方法前先检查IsXXXEnabled布尔变量，再决定是否调用输出日志信息的函数，这样可以提高程序的性能。因为框架在调用如ILog.Debug(…)这样的函数时，也会先判断是否满足Level日志级别条件。</p>
<p>if (log.IsDebugEnabled) log.Debug(&#8221;message&#8221;);</p>
<p>if (log.IsInfoEnabled) log.Info(&#8221;message);</p>
<p><strong>3.3 </strong><strong>在程序中配置log4net</strong></p>
<p>除了前面讲的用一个配置文件来配置log4net以外，还可以在程序中用代码来配置log4net框架。如下面的例子:</p>
<p>// 和PatternLayout一起使用FileAppender</p>
<p>log4net.Config.BasicConfigurator.Configure(</p>
<p>new log4net.Appender.FileAppender(</p>
<p>new log4net.Layout.PatternLayout(&#8221;%d</p>
<p>[%t]%-5p %c [%x] &#8211; %m%n&#8221;),&#8221;testfile.log&#8221;));</p>
<p>// using a FileAppender with an XMLLayout</p>
<p>log4net.Config.BasicConfigurator.Configure(</p>
<p>new log4net.Appender.FileAppender(</p>
<p>new log4net.Layout.XMLLayout(),&#8221;testfile.xml&#8221;));</p>
<p>// using a ConsoleAppender with a PatternLayout</p>
<p>log4net.Config.BasicConfigurator.Configure(</p>
<p>new log4net.Appender.ConsoleAppender(</p>
<p>new log4net.Layout.PatternLayout(&#8221;%d</p>
<p>[%t] %-5p %c &#8211; %m%n&#8221;)));</p>
<p>// using a ConsoleAppender with a SimpleLayout</p>
<p>log4net.Config.BasicConfigurator.Configure(</p>
<p>new log4net.Appender.ConsoleAppender(new</p>
<p>log4net.Layout.SimpleLayout()));</p>
<p>尽管这里用代码配置log4net也很方便，但是你却不能分别配置每个日志对象。所有的这些配置都是被应用到根日志上的。</p>
<p>log4net.Config.BasicConfigurator 类使用静态方法Configure 设置一个Appender 对象。而Appender的构造函数又会相应的要求Layout对象。你也可以不带参数直接调用BasicConfigurator.Configure()，它会使用一个缺省的PatternLayout对象，在一个ConsoleAppender中输出信息。如下所示：</p>
<p>log4net.Config.BasicConfigurator.Configure();</p>
<p>在输出时会显示如下格式的信息：</p>
<p>0 [1688] DEBUG log1 A B C &#8211; Test</p>
<p>20 [1688] INFO log1 A B C &#8211; Test</p>
<p>当log4net框架被配置好以后，就可以如前所述使用日志功能了。</p>
<p><strong>4 </strong><strong>总结</strong></p>
<p>使用log4net可以很方便地为应用添加日志功能。应用Log4net，使用者可以很精确地控制日志信息的输出，减少了多余信息，提高了日志记录性能。同时，通过外部配置文件，用户可以不用重新编译程序就能改变应用的日志行为，使得用户可以根据情况灵活地选择要记录的信息。</p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/dotnet/200909505/log4net%e4%bd%bf%e7%94%a8%e6%8c%87%e5%8d%97zz.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/dotnet/200909505/log4net%e4%bd%bf%e7%94%a8%e6%8c%87%e5%8d%97zz.html</feedburner:origLink></item>
		<item>
		<title>grideview 获得隐藏列值</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/Es2xYoy6fMk/grideview-%e8%8e%b7%e5%be%97%e9%9a%90%e8%97%8f%e5%88%97%e5%80%bc.html</link>
		<comments>http://degula.com/dotnet/200908503/grideview-%e8%8e%b7%e5%be%97%e9%9a%90%e8%97%8f%e5%88%97%e5%80%bc.html#comments</comments>
		<pubDate>Mon, 17 Aug 2009 00:51:21 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[dotnet]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>

		<guid isPermaLink="false">http://degula.com/?p=503</guid>
		<description><![CDATA[【摘要】
在Asp.net 2.0中增加了一个新的数据绑定控件：GridView，其目的用来取代Asp.net1.x中的DataGrid控件，但有一点很不爽的是，如果把某列 设置为visible=false，则不会进行数据绑定，也就是说无法直接从GridView中取到这个列内的文本。
 【全文】
在Asp.net 2.0中增加了一个新的数据绑定控件：GridView，其目的用来取代Asp.net1.x中的DataGrid控件，但有一点很不爽的是，如果把某列 设置为visible=false，则不会进行数据绑定，也就是说无法直接从GridView中取到这个列内的文本。
这一功能在DataGrid时代几乎是必须的，在对列表进行批量选中操作时非常有用（比如批量删除），隐藏列通常用于存储DataGrid行对应数据记录 的关键字的值，而现在在GridView中却行不通，着实令一大批人头疼不已，网上也有了其解决方案，其中一个如下，其原理是在行创建时设置其css样式 为不可见，这样可以避免直接设置列的visible=false带来的数据不绑定问题：

void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
//让索引为0的列不可见，实际上是产生的css代码
e.Row.Cells[0].Visible = false;
//other code if neccecary
}

个人认为此方法不够优雅，Asp.net 1.x年代本人就尽量避免使用事件，宁可在数据源DataTable中做循环遍历来进行一些或烦或简的处理。一来因为vs2003对web标准支持欠佳， 而我习惯于在Html源码模式下工作，所以为DataGrid添加一个事件是极其麻烦的事情；二来因为其性能我也不大放心，毕竟每一行都要触发一次事件。 因而在GridView中仍然不喜欢事件，而且即使vs2005对web标准的支持大大改善，但添加一个事件容易，删除一个事件还是要在两个文件中进行手 动删除才能同步，比较麻烦。
就事论事，回到标题，现提供我对这个问题的解决方案，基本思想仍然是用css使得单元格不可见，而不妨碍它的数据绑定，但我的方法却不需要在cs文件中多加一行代码，其思路如下：
（1）设置一个css类：
.hidden { display:none;}
在web标准横行的现在，我想为每个aspx链接一个common.css是基本的素质，呵呵
（2）随后在GridView的列编辑对话框中，对需要进行隐藏的列进行设置，分别设置FootStyle，HeaderStyle，ItemStyle的CssClass属性为“hidden”
Ok，这样我们就实现了隐藏列的目的，同时又能保证对其进行数据绑定。
好了，看到这里，如果你有所收获，并很高兴的马上赶回去，为你的GridView添加此设置，避免了使用事件来隐藏列，并实现了批量删除的功能。那你就大错特错了，呵呵
很可惜的是，在网上看到很多人关于GridView的这个功能的讨论，很大一部分人都是为了这个功能而来的。
是的，在DataGrid中，要实现这个功能，隐藏列来存储键值是必须的，甚至是一个初学者需要摸索才能知道的技巧。然而现在GridView是用 来替代DataGrid的，微软所作的考虑更加周全。针对DataGrid无法提供行主键的问题，它提供了两个全新的属性：DataKeys和 DataKeyNames！其SDK中的描述如下：
DataKeyNames：获取或设置一个数组，该数组包含了显示在 GridView 控件中的项的主键字段的名称。
DataKeys：获取一个 DataKey 对象集合，这些对象表示 GridView 控件中的每一行的数据键值。
看到这里，也许你会有所明白，针对批量选中操作的问题，我们有了新的方案，现在来看一个简单的实现，假设主键字段是id：

//设置主键字段名称数组，可以多个字段，
//你也可以在设计器中直接设置主键字段，多个字段用逗号隔开
GridView1.DataKeyNames = new string[] { &#8220;id&#8221; };

这样，当进行数据绑定时，GridView会自动用键值填充DataKeys集合，从而在绑定或者回传后可以通过DataKeys集合来获取某一行的键值，例如假设想获取第i行的id键值，其代码如下：

//获取第i行的id键值，注意该索引即行的索引，从header到footer都算在内
string id=GridViews1.DataKeys[i]["id"].ToString();
//通过键值对数据进行处理……

由此可见，GridView提供了新的机制来绑定额外的数据到每一行。这使得可以完全放弃原来DataGrid通过隐藏列来绑定键值的做法，显然， 现在的方案要优雅的多。当然，如果你实在需要在GridView中使用隐藏列并能够进行取值，我上面的方法不防一试，虽然我很难想到有这样的需求^_^
]]></description>
			<content:encoded><![CDATA[<p>【摘要】<br />
在Asp.net 2.0中增加了一个新的数据绑定控件：GridView，其目的用来取代Asp.net1.x中的DataGrid控件，但有一点很不爽的是，如果把某列 设置为visible=false，则不会进行数据绑定，也就是说无法直接从GridView中取到这个列内的文本。<br />
<span id="more-503"></span> 【全文】</p>
<p>在Asp.net 2.0中增加了一个新的数据绑定控件：GridView，其目的用来取代Asp.net1.x中的DataGrid控件，但有一点很不爽的是，如果把某列 设置为visible=false，则不会进行数据绑定，也就是说无法直接从GridView中取到这个列内的文本。<br />
这一功能在DataGrid时代几乎是必须的，在对列表进行批量选中操作时非常有用（比如批量删除），隐藏列通常用于存储DataGrid行对应数据记录 的关键字的值，而现在在GridView中却行不通，着实令一大批人头疼不已，网上也有了其解决方案，其中一个如下，其原理是在行创建时设置其css样式 为不可见，这样可以避免直接设置列的visible=false带来的数据不绑定问题：</p>
<div>
<div style="color: #000000;"><span style="color: #0000ff;">void</span> <span style="color: #000000;">GridView1_RowCreated</span><span style="color: #000000;">(</span><span style="color: #000000;">object</span> <span style="color: #000000;">sender</span><span style="color: #000000;">,</span> <span style="color: #000000;">GridViewRowEventArgs</span> <span style="color: #000000;">e</span><span style="color: #000000;">)</span><br />
<span style="color: #000000;">{</span><br />
<span style="color: #006600;">//让索引为0的列不可见，实际上是产生的css代码<br />
</span><span style="color: #000000;">e</span><span style="color: #000000;">.</span><span style="color: #000000;">Row</span><span style="color: #000000;">.</span><span style="color: #000000;">Cells</span><span style="color: #000000;">[</span><span style="color: #000000;">0</span><span style="color: #000000;">].</span><span style="color: #000000;">Visible</span> <span style="color: #000000;">=</span> <span style="color: #000000;">false</span><span style="color: #000000;">;</span><br />
<span style="color: #006600;">//other code if neccecary<br />
</span><span style="color: #000000;">}</span></div>
</div>
<p>个人认为此方法不够优雅，Asp.net 1.x年代本人就尽量避免使用事件，宁可在数据源DataTable中做循环遍历来进行一些或烦或简的处理。一来因为vs2003对web标准支持欠佳， 而我习惯于在Html源码模式下工作，所以为DataGrid添加一个事件是极其麻烦的事情；二来因为其性能我也不大放心，毕竟每一行都要触发一次事件。 因而在GridView中仍然不喜欢事件，而且即使vs2005对web标准的支持大大改善，但添加一个事件容易，删除一个事件还是要在两个文件中进行手 动删除才能同步，比较麻烦。</p>
<p>就事论事，回到标题，现提供我对这个问题的解决方案，基本思想仍然是用css使得单元格不可见，而不妨碍它的数据绑定，但我的方法却不需要在cs文件中多加一行代码，其思路如下：<br />
（1）设置一个css类：</p>
<div>.hidden { display:none;}</div>
<p>在web标准横行的现在，我想为每个aspx链接一个common.css是基本的素质，呵呵<br />
（2）随后在GridView的列编辑对话框中，对需要进行隐藏的列进行设置，分别设置FootStyle，HeaderStyle，ItemStyle的CssClass属性为“hidden”<br />
Ok，这样我们就实现了隐藏列的目的，同时又能保证对其进行数据绑定。</p>
<p>好了，看到这里，如果你有所收获，并很高兴的马上赶回去，为你的GridView添加此设置，避免了使用事件来隐藏列，并实现了批量删除的功能。那你就大错特错了，呵呵<br />
很可惜的是，在网上看到很多人关于GridView的这个功能的讨论，很大一部分人都是为了这个功能而来的。</p>
<p>是的，在DataGrid中，要实现这个功能，隐藏列来存储键值是必须的，甚至是一个初学者需要摸索才能知道的技巧。然而现在GridView是用 来替代DataGrid的，微软所作的考虑更加周全。针对DataGrid无法提供行主键的问题，它提供了两个全新的属性：DataKeys和 DataKeyNames！其SDK中的描述如下：<br />
DataKeyNames：获取或设置一个数组，该数组包含了显示在 GridView 控件中的项的主键字段的名称。<br />
DataKeys：获取一个 DataKey 对象集合，这些对象表示 GridView 控件中的每一行的数据键值。</p>
<p>看到这里，也许你会有所明白，针对批量选中操作的问题，我们有了新的方案，现在来看一个简单的实现，假设主键字段是id：</p>
<div>
<div style="color: #000000;"><span style="color: #006600;">//设置主键字段名称数组，可以多个字段，<br />
//你也可以在设计器中直接设置主键字段，多个字段用逗号隔开<br />
</span><span style="color: #000000;">GridView1</span><span style="color: #000000;">.</span><span style="color: #000000;">DataKeyNames</span> <span style="color: #000000;">=</span> <span style="color: #0000ff;">new</span> <span style="color: #000000;">string</span><span style="color: #000000;">[]</span> <span style="color: #000000;">{</span> <span style="color: #ff00ff;">&#8220;id&#8221;</span> <span style="color: #000000;">};</span></div>
</div>
<p>这样，当进行数据绑定时，GridView会自动用键值填充DataKeys集合，从而在绑定或者回传后可以通过DataKeys集合来获取某一行的键值，例如假设想获取第i行的id键值，其代码如下：</p>
<div>
<div style="color: #000000;"><span style="color: #006600;">//获取第i行的id键值，注意该索引即行的索引，从header到footer都算在内<br />
</span><span style="color: #000000;">string</span> <span style="color: #000000;">id</span><span style="color: #000000;">=</span><span style="color: #000000;">GridViews1</span><span style="color: #000000;">.</span><span style="color: #000000;">DataKeys</span><span style="color: #000000;">[</span><span style="color: #000000;">i</span><span style="color: #000000;">][</span><span style="color: #ff00ff;">"id"</span><span style="color: #000000;">].</span><span style="color: #000000;">ToString</span><span style="color: #000000;">();</span><br />
<span style="color: #006600;">//通过键值对数据进行处理……</span></div>
</div>
<p>由此可见，GridView提供了新的机制来绑定额外的数据到每一行。这使得可以完全放弃原来DataGrid通过隐藏列来绑定键值的做法，显然， 现在的方案要优雅的多。当然，如果你实在需要在GridView中使用隐藏列并能够进行取值，我上面的方法不防一试，虽然我很难想到有这样的需求^_^</p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/dotnet/200908503/grideview-%e8%8e%b7%e5%be%97%e9%9a%90%e8%97%8f%e5%88%97%e5%80%bc.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/dotnet/200908503/grideview-%e8%8e%b7%e5%be%97%e9%9a%90%e8%97%8f%e5%88%97%e5%80%bc.html</feedburner:origLink></item>
		<item>
		<title>ASP.NET动态创建控件</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/Y7M0X4Jw594/asp-net%e5%8a%a8%e6%80%81%e5%88%9b%e5%bb%ba%e6%8e%a7%e4%bb%b6.html</link>
		<comments>http://degula.com/dotnet/200907501/asp-net%e5%8a%a8%e6%80%81%e5%88%9b%e5%bb%ba%e6%8e%a7%e4%bb%b6.html#comments</comments>
		<pubDate>Thu, 09 Jul 2009 10:13:15 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[dotnet]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>

		<guid isPermaLink="false">http://degula.com/?p=501</guid>
		<description><![CDATA[ASP.NET动态创建控件

页面文件：
&#60;html xmlns=&#8221;http://www.w3.org/1999/xhtml&#8221; &#62;
&#60;head runat=&#8221;server&#8221;&#62;
&#60;title&#62;&#60;/title&#62;
&#60;/head&#62;
&#60;body&#62;
&#60;form id=&#8221;form1&#8243; runat=&#8221;server&#8221;&#62;
&#60;div&#62;
&#60;asp:Button ID=&#8221;createbutton&#8221; runat=&#8221;server&#8221; Text=&#8221;批量创建按钮&#8221;
onclick=&#8221;createbutton_Click&#8221; /&#62;&#60;asp:Button ID=&#8221;displaybutton&#8221;
runat=&#8221;server&#8221;  Text=&#8221;显示动态按钮的信息&#8221; onclick=&#8221;displaybutton_Click&#8221;/&#62;
&#60;asp:Table ID=&#8221;HolderTable&#8221;  runat=&#8221;server&#8221;&#62;&#60;/asp:Table&#62;
 &#60;/div&#62;
&#60;/form&#62;
&#60;/body&#62;
&#60;/html&#62;
&#8212;-上面的Table是用来存放动态控件的，用Table是因为它有行和列的概念，更易于布局设计。除了Table之外，还可以使用PlaceHolder控件或者Panel控件
代码文件：
public partial class _Default : System.Web.UI.Page
{
 protected override void OnLoad(EventArgs e)
{
CreateControl();
}
protected void createbutton_Click(object sender, EventArgs e)
{
if (ViewState["CreateControl"] == null)
{
ViewState["CreateControl"] = true;
CreateControl();
}
}
void CreateControl() {
///批量创建100个按钮
///
if (ViewState["CreateControl"]==null) return; //第一次的时候应该不要创建这些控件
for (int x = 0; x &#60; 10; x++)
{
TableRow row = new TableRow();
for (int y [...]]]></description>
			<content:encoded><![CDATA[<p>ASP.NET动态创建控件</p>
<p><span id="more-501"></span></p>
<p>页面文件：</p>
<p>&lt;html xmlns=&#8221;<a href="http://www.w3.org/1999/xhtml%22">http://www.w3.org/1999/xhtml&#8221;</a> &gt;<br />
&lt;head runat=&#8221;server&#8221;&gt;<br />
&lt;title&gt;&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;form id=&#8221;form1&#8243; runat=&#8221;server&#8221;&gt;<br />
&lt;div&gt;<br />
&lt;asp:Button ID=&#8221;createbutton&#8221; runat=&#8221;server&#8221; Text=&#8221;批量创建按钮&#8221;<br />
onclick=&#8221;createbutton_Click&#8221; /&gt;&lt;asp:Button ID=&#8221;displaybutton&#8221;<br />
runat=&#8221;server&#8221;  Text=&#8221;显示动态按钮的信息&#8221; onclick=&#8221;displaybutton_Click&#8221;/&gt;<br />
<strong><span style="color: #ff0000;">&lt;asp:Table ID=&#8221;HolderTable&#8221;  runat=&#8221;server&#8221;&gt;&lt;/asp:Table&gt;<br />
</span></strong> &lt;/div&gt;<br />
&lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>&#8212;-上面的Table是用来存放动态控件的，用Table是因为它有行和列的概念，更易于布局设计。除了Table之外，还可以使用PlaceHolder控件或者Panel控件</p>
<p>代码文件：</p>
<p>public partial class _Default : System.Web.UI.Page<br />
{</p>
<p><strong><span style="color: #ff0000;"> protected override void OnLoad(EventArgs e)<br />
{<br />
CreateControl();<br />
}</span></strong></p>
<p>protected void createbutton_Click(object sender, EventArgs e)<br />
{<br />
if (ViewState["CreateControl"] == null)<br />
{<br />
ViewState["CreateControl"] = true;<br />
CreateControl();<br />
}<br />
}</p>
<p>void CreateControl() {<br />
///批量创建100个按钮<br />
///</p>
<p>if (ViewState["CreateControl"]==null) return; //第一次的时候应该不要创建这些控件</p>
<p>for (int x = 0; x &lt; 10; x++)<br />
{<br />
TableRow row = new TableRow();<br />
for (int y = 0; y &lt; 10; y++)<br />
{<br />
TableCell cell = new TableCell();</p>
<p>Button bt = new Button();<br />
bt.Text = string.Format(&#8221;  x={0},y={1}  &#8220;, x, y);<br />
bt.Click += new EventHandler(bt_Click);<br />
cell.Controls.Add(bt);</p>
<p>row.Cells.Add(cell);<br />
}</p>
<p>HolderTable.Rows.Add(row);<br />
}<br />
}</p>
<p>void bt_Click(object sender, EventArgs e)<br />
{<br />
Trace.Write(&#8221;控件动态事件&#8221;);<br />
((Button)sender).BackColor = System.Drawing.Color.Red;<br />
Response.Write(string.Format(&#8221;你点击了该按钮：{0}&#8221;, ((Button)sender).Text));<br />
}</p>
<p>/// &lt;summary&gt;<br />
/// 显示动态创建的控件的信息<br />
/// &lt;/summary&gt;<br />
/// &lt;param name=&#8221;sender&#8221;&gt;&lt;/param&gt;<br />
/// &lt;param name=&#8221;e&#8221;&gt;&lt;/param&gt;<br />
protected void displaybutton_Click(object sender, EventArgs e)<br />
{<br />
for (int x = 0; x &lt; 10; x++)<br />
{<br />
TableRow row = HolderTable.Rows[x];<br />
for (int y = 0; y &lt; 10; y++)<br />
{<br />
Button bt = (Button)row.Cells[y].Controls[0];<br />
Response.Write(bt.Text);<br />
}<br />
}<br />
}<br />
}</p>
<p>&#8212;-这里的关键点在于，必须在Page_Load事件中每次都调用创建控件的代码。这与我们一般的理解是不一样的。</p>
<p>1. 首先讲为什么要？因为这些控件是动态添加的，在页面的源文件中并没有。所以PostBack回来之后重新构建页面时，非得再次创建。</p>
<p>2. 这样做难道不会重复创建吗？不会，因为每次都重新构建了，其实原先的控件都消失了。</p>
<p>3. 那么，重新构建之后控件的状态怎么保存的？这是通过ViewState自动保存的。</p>
<p><strong><span style="color: #ff0000;">&#8211;在动态创建控件的页面上，如果禁用ViewState，将使得页面失去作用</span></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/dotnet/200907501/asp-net%e5%8a%a8%e6%80%81%e5%88%9b%e5%bb%ba%e6%8e%a7%e4%bb%b6.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/dotnet/200907501/asp-net%e5%8a%a8%e6%80%81%e5%88%9b%e5%bb%ba%e6%8e%a7%e4%bb%b6.html</feedburner:origLink></item>
		<item>
		<title>ASP.NET SINGLE　SIGNON</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/S47il7yI07c/asp-net-single%e3%80%80signon.html</link>
		<comments>http://degula.com/dotnet/200906500/asp-net-single%e3%80%80signon.html#comments</comments>
		<pubDate>Sat, 27 Jun 2009 19:50:41 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[dotnet]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>

		<guid isPermaLink="false">http://degula.com/?p=500</guid>
		<description><![CDATA[用户多次登录问题

在web开发时，有的系统要求同一个用户在同一时间只能登录一次，也就是如果一个用户已经登录了，在退出之前如果再次登录的话需要报错。
常见的处理方法是，在用户登录时，判断此用户是否已经在Application中存在，如果存在就报错，不存在的话就加到Application中(Application是所有Session共有的，整个web应用程序唯一的一个对象)：
string strUserId = txtUser.Text;
ArrayList list = Application.Get(&#8221;GLOBAL_USER_LIST&#8221;) as ArrayList;
if (list == null)
{
list = new ArrayList();
}
for (int i = 0; i &#60; list.Count; i++)
{
if (strUserId == (list[i] as string))
{
//已经登录了，提示错误信息
lblError.Text = &#8221;此用户已经登录&#8221;;
return;
}
}
list.Add(strUserId);
Application.Add(&#8221;GLOBAL_USER_LIST&#8221;, list);
当然这里使用Cache等保存也可以。
接下来就是要在用户退出的时候将此用户从Application中去除，我们可以在Global.asax的Session_End事件中处理：
void Session_End(object sender, EventArgs e)
{
// 在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时，才会引发 Session_End 事件。如果会话模式设置为 StateServer
// 或 SQLServer，则不会引发该事件。
string strUserId = Session["SESSION_USER"] as string;
ArrayList list = Application.Get(&#8221;GLOBAL_USER_LIST&#8221;) as ArrayList;
if (strUserId != null &#38;&#38; list != null)
{
list.Remove(strUserId);
Application.Add(&#8221;GLOBAL_USER_LIST&#8221;, list);
}
}
这些都没有问题，有问题的就是当用户直接点浏览器右上角的关闭按钮时就有问题了。因为直接关闭的话，并不会立即触发Session过期事件，也就是关闭浏览器后再来登录就登不进去了。
这里有两种处理方式：
1、使用Javascript方式
在每一个页面中加入一段javascript代码：
function window.onbeforeunload()
{
if (event.clientX&#62;document.body.clientWidth &#38;&#38; event.clientY&#60;0&#124;&#124;event.altKey){
window.open(&#8221;logout.aspx&#8221;);
}
}
由于onbeforeunload方法在浏览器关闭、刷新、页面调转等情况下都会被执行，所以需要判断是点击了关闭按钮或是按下Alt+F4时才执行真正的关闭操作。
然后在logout.aspx的Page_Load中写和Session_End相同的方法，同时在logout.aspx中加入事件：
但是这样还是有问题，javascript在不同的浏览器中可能有不同的行为，还有就是当通过文件-&#62;关闭时没有判断到。
2、使用xmlhttp方法(这种方法测试下来没有问题)
在每个页面中加入如下的javascript(这些javascript也可以写在共通里，每个页面引入就可以了)
var x=0;
function myRefresh()
{
var httpRequest = new ActiveXObject(&#8221;microsoft.xmlhttp&#8221;);
httpRequest.open(&#8221;GET&#8221;, &#8221;test.aspx&#8221;, false);
httpRequest.send(null);
x++;
if(x&#60;60) //60次，也就是Session真正的过期时间是30分钟
{
setTimeout(&#8221;myRefresh()&#8221;,30*1000); //30秒
}
}
myRefresh();
在web.config中设置
&#60;sessionState mode=&#8221;InProc&#8221; timeout=&#8221;1&#8243;&#62;&#60;/sessionState&#62;
test.aspx页面就是一个空页面，只不过需要在Page_Load中加入：
Response.Expires = -1;
保证不使用缓存，每次都能调用到这个页面。
原理就是：设置Session的过期时间是一分钟，然后在每个页面上定时每30秒连接一次测试页面，保持Session有效，总共连60次，也就是 30 分钟。如果30分钟后用户还没有操作，Session就会过期。当然，如果用户直接关闭浏览器，那么一分钟后Session也会过期。这样就可以满 足要求了。
]]></description>
			<content:encoded><![CDATA[<p>用户多次登录问题</p>
<p><span id="more-500"></span></p>
<p><span>在web开发时，有的系统要求同一个用户在同一时间只能登录一次，也就是如果一个用户已经登录了，在退出之前如果再次登录的话需要报错。<br />
常见的处理方法是，在用户登录时，判断此用户是否已经在Application中存在，如果存在就报错，不存在的话就加到Application中(Application是所有Session共有的，整个web应用程序唯一的一个对象)：<br />
string strUserId = txtUser.Text;<br />
ArrayList list = Application.Get(&#8221;GLOBAL_USER_LIST&#8221;) as ArrayList;<br />
if (list == null)<br />
{<br />
list = new ArrayList();<br />
}<br />
for (int i = 0; i &lt; list.Count; i++)<br />
{<br />
if (strUserId == (list[i] as string))<br />
{<br />
//已经登录了，提示错误信息<br />
lblError.Text = &#8221;此用户已经登录&#8221;;<br />
return;<br />
}<br />
}<br />
list.Add(strUserId);<br />
Application.Add(&#8221;GLOBAL_USER_LIST&#8221;, list);<br />
当然这里使用Cache等保存也可以。</p>
<p>接下来就是要在用户退出的时候将此用户从Application中去除，我们可以在Global.asax的Session_End事件中处理：</p>
<p>void Session_End(object sender, EventArgs e)<br />
{<br />
// 在会话结束时运行的代码。<br />
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为<br />
// InProc 时，才会引发 Session_End 事件。如果会话模式设置为 StateServer<br />
// 或 SQLServer，则不会引发该事件。<br />
string strUserId = Session["SESSION_USER"] as string;<br />
ArrayList list = Application.Get(&#8221;GLOBAL_USER_LIST&#8221;) as ArrayList;<br />
if (strUserId != null &amp;&amp; list != null)<br />
{<br />
list.Remove(strUserId);<br />
Application.Add(&#8221;GLOBAL_USER_LIST&#8221;, list);<br />
}<br />
}<br />
这些都没有问题，有问题的就是当用户直接点浏览器右上角的关闭按钮时就有问题了。因为直接关闭的话，并不会立即触发Session过期事件，也就是关闭浏览器后再来登录就登不进去了。<br />
这里有两种处理方式：</p>
<p>1、使用Javascript方式<br />
在每一个页面中加入一段javascript代码：</p>
<p>function window.onbeforeunload()<br />
{<br />
if (event.clientX&gt;document.body.clientWidth &amp;&amp; event.clientY&lt;0||event.altKey){<br />
window.open(&#8221;logout.aspx&#8221;);<br />
}<br />
}<br />
由于onbeforeunload方法在浏览器关闭、刷新、页面调转等情况下都会被执行，所以需要判断是点击了关闭按钮或是按下Alt+F4时才执行真正的关闭操作。</p>
<p>然后在logout.aspx的Page_Load中写和Session_End相同的方法，同时在logout.aspx中加入事件：</p>
<p>但是这样还是有问题，javascript在不同的浏览器中可能有不同的行为，还有就是当通过文件-&gt;关闭时没有判断到。<br />
2、使用xmlhttp方法(这种方法测试下来没有问题)<br />
在每个页面中加入如下的javascript(这些javascript也可以写在共通里，每个页面引入就可以了)</p>
<p>var x=0;<br />
function myRefresh()<br />
{<br />
var httpRequest = new ActiveXObject(&#8221;microsoft.xmlhttp&#8221;);<br />
httpRequest.open(&#8221;GET&#8221;, &#8221;test.aspx&#8221;, false);<br />
httpRequest.send(null);<br />
x++;<br />
if(x&lt;60) //60次，也就是Session真正的过期时间是30分钟<br />
{<br />
setTimeout(&#8221;myRefresh()&#8221;,30*1000); //30秒<br />
}<br />
}<br />
myRefresh();<br />
在web.config中设置<br />
&lt;sessionState mode=&#8221;InProc&#8221; timeout=&#8221;1&#8243;&gt;&lt;/sessionState&gt;<br />
test.aspx页面就是一个空页面，只不过需要在Page_Load中加入：<br />
Response.Expires = -1;</p>
<p>保证不使用缓存，每次都能调用到这个页面。</p>
<p>原理就是：设置Session的过期时间是一分钟，然后在每个页面上定时每30秒连接一次测试页面，保持Session有效，总共连60次，也就是 30 分钟。如果30分钟后用户还没有操作，Session就会过期。当然，如果用户直接关闭浏览器，那么一分钟后Session也会过期。这样就可以满 足要求了。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/dotnet/200906500/asp-net-single%e3%80%80signon.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/dotnet/200906500/asp-net-single%e3%80%80signon.html</feedburner:origLink></item>
		<item>
		<title>ASP.NET调试方法[转]</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/B9DDQ4hryEw/asp-net%e8%b0%83%e8%af%95%e6%96%b9%e6%b3%95%e8%bd%ac.html</link>
		<comments>http://degula.com/dotnet/200906498/asp-net%e8%b0%83%e8%af%95%e6%96%b9%e6%b3%95%e8%bd%ac.html#comments</comments>
		<pubDate>Sat, 27 Jun 2009 19:37:16 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[dotnet]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>

		<guid isPermaLink="false">http://degula.com/?p=498</guid>
		<description><![CDATA[几种ASP.net调试方法，待查。

一：配置Config.web
一般，当我们写好的网页运行出错了，ASP.Net就会在页面上告诉我们程序有
错了，但究竟错在哪里，它是没有提示的。为了能让ASP.Net进一步提示我们出错
的信息。我们就有必要编辑Config.web中的配置信息。
可 能还有很多刚刚接触ASP.Net的人不太了解Config.web这个文件。那我就顺便介绍一下。Config.web是ASP.Net的一个配置文 件，它里面存放着关于ASP.Net的所有配置信息。当执行一个ASP.Net页面时，它会先到该页面所在的目录查找这个文件，如果没有找到，就往上一级 目录找，一直到wwwroot目录。如果都没有，它就会调用X:\WINNT\Microsoft.NET\Framework\v1.0.2204目录 中的Config.web文件(X为系统目录)。所以，如果大家要想改变所有页面的配置，就应该改WINNT目录中的那个Config.web。另外顺便 说一下，当你打开Config.web后，你会发现这是一个XML结构的配置文件。
现在你要做的第一步就是：打
开或者新建一个Config.web文件。我们分开来说：
如果是新建，你就需要用文本编辑器新建一个新的文档，然后往里面输入下
面的语句:
&#60;configuration&#62;
&#60;customerrors mode=&#8221;off&#8221;&#62;&#60;/customerrors&#62;
&#60;/configuration&#62;
输 完后选择另存为，输入文件名Config.web，将它保存到当前页面相同的文件夹中即可。如果是修改一个已经存在的Config.web文件，你只需要 用文本编辑器打开它，然后在&#60;configuration&#62;和&#60;/configuration&#62;之间的任意地方输入：
&#60;customerrors mode=&#8221;off&#8221;&#62;&#60;/customerrors&#62;即可。
第二招：Trace追踪
用过ASP的人应该都用过下面的语句吧：
Response.Write XXX
Response.End
虽然我不太喜欢ASP的编程方法，但是这种方便的调试手段还是很好的。换用
ASP.Net以后，我发现ASP.Net提供一种更强大的调试方法，它就是我们现在要说
的Trace。所谓Trace功能就是在网页的最前面加上一些标记，至于是什么标记呢？嘿嘿，我不能马上告诉你(不好，臭鸡蛋……哇！)。我是说，我要先介绍一点基础的知识啦！
我不知道大家对ASP.Net的页面标示了解多少，为了下面讲解的方便，我还是
概要的介绍一下吧！ASP.Net的页面标示指的是在每一个ASP.Net页面最上面，用
&#60;%@和%&#62;括起来的语句。它的功能是用来确定在处理ASP.Net文件的时候，需要系
统做一些什么特殊的设定。具体的语法如下：
&#60;%@ directive attribute=value %&#62;
其中：directive就是页面标示符；attribute是该标示符对应的一些属性。
注意：在属性之间需要空格，而在&#8221;=&#8221;之间不能有空格。
ASP.Net现在包含以下7种标识
@ Page,
@ Control,
@ Import,
@ Registe,
@ Assembly,
@ OutputCache,
@ Webservice
我 们用得最多的就是@ Page标示，而现在我要讲的Trace功能，也要用到@ Page。(关于这七个标示的具体应用，我会在以后发贴讲述的。)好了，回到我们的主题。要用Trace功能，你必须在页面的最上面加上：&#60;%@ Page Trace=&#8221;true&#8221; %&#62; 这句话。加好后，你就可以看看页面的运行情况了。运行该页面。你会发现在页面的下半部分出现了一大堆的数据。下面就来解释一下这些数据的含义：
Request Details:通过Request方式向浏览器所读取的数据；
Trace Information:事件发生或程序执行的过程信息；
Control Tree:网页所使用的控件及控件之间的阶层关系；
Cookies Collection:网页所使用的Cookie信息；
Headers Collection:浏览器的表头信息。
Server Variables:Server变量的数据信息。
有了这一大堆数据，我们的工作就好做多了，但且慢欢喜，Trace还提供了更强大的功能，请接着看下去。
除了让ASP.Net页面显示这一堆数据外，我们还可以将程序中用到的变量的
值实时的显示在Trace Information区段中，其方法是调用Trace.Warn或Trace.Write两个方法。他们的用法如下：
Trace.Warn(&#8221;Description&#8221;,Variables);
Trace.Write(&#8221;Description&#8221;,Variables);
我想你们一定会问，这两个有什么区别呢？回答是：在功能上，这两个是一模一样的，只是在显示上，Trace.Warn将会以红色字体表示。
 前面介绍的两招功夫都是赤手空拳的较量，可能你会觉得打得不过瘾，咱能
不能挑件别的兵器什么的耍耍呢？既然是大家的需要，我又怎么能不满足呢？不
过，说起来还是的感谢盖茨大爷，要不我就没的耍了！
好了，下面就是
第三招 查错神器Debugger
要用好的兵器，没点准备是不行的，所以我们就先来做点准备运动。
1.Config.web的设定：还记得第一招中讲的吗？对了，还是这个文件，打开它，向里面加入这条语句
&#60;compilation debugmode=&#8221;true&#8221;&#62;&#60;/compilation&#62;
说明：由于在预设情况下，ASP.Net会以正常模式来运行页面，为了能让它以查错模式编译网页，我们就必须加入这句语句。
2.启动查错工具DbgUrt.exe:这个程序放在x:\Program Files\Microsoft.Net\FrameworkSDK\GuiDebug目录里，文件名是DbgUrt.exe
3.激活查错功能:
运行DbgUrt.exe程序
&#8211;〉选取菜单Debug/Processes
&#8211;〉在出现的Processes对话框中选中Show system processes和Show processes in all sessions
&#8211;〉在Available processes列表框的最下面找到xspwp.exe(如果没有，请运行一.aspx页面，然后按Refresh键。)
&#8211;〉选取该文件后，按Attach键
&#8211;〉在出现的对话框中选中Common Language Runtime，然后按OK，回到Processes对话框
&#8211;〉按Close键
&#8211;〉在程序的主菜单中选取File/Open/File，打开你想要检测的文件。
下面正式开始页面调试。
利用DbgUrt.exe打开欲调试的文件后，我们要做的第一件事情就是：设置断
点。是不是觉得和其它Windows应用程序的调试很像（什么很像？简直就是一模
一样吗！）加断点的方法很简单，先决定需要加断点的地方，然后将光标移动到
该行，按下F9或者在该行的最前面点击鼠标左键，该句前面就会出现一个问号的
标记，这就是断点！我们当然可以设定多个断点，只要你喜欢。你要是像取消一
个断点，只需在该行重复设置断点的动作即可。
设置好断点后，只要使用浏览器浏览被调试的页面，当程序运行到断点的位
置时，它就会自动弹出DbgUrt.exe，并且停在刚才的断点位置。这是，我们就可
以利用Command Window-Immediate窗口检查变量的值了。
当我们想继续执行当前页面时，我们有几种选择：
1、按F5键，运行到下一个断点，若没有断点，则运行完该页面；
2、按F11键，执行单步操作；
3、按F10键，同样是单步操作，但它会进入子程序（函数）中的语句。
当然，DbgUrt.exe的功能肯定比我介绍的要强大的多。编写ASP.Net程序，有个这样的利器，真是省了我们很多时间啊！怎么还不快试试！ 
]]></description>
			<content:encoded><![CDATA[<p>几种ASP.net调试方法，待查。</p>
<p><span id="more-498"></span><span><br />
一：配置Config.web</p>
<p>一般，当我们写好的网页运行出错了，ASP.Net就会在页面上告诉我们程序有<br />
错了，但究竟错在哪里，它是没有提示的。为了能让ASP.Net进一步提示我们出错<br />
的信息。我们就有必要编辑Config.web中的配置信息。</p>
<p>可 能还有很多刚刚接触ASP.Net的人不太了解Config.web这个文件。那我就顺便介绍一下。Config.web是ASP.Net的一个配置文 件，它里面存放着关于ASP.Net的所有配置信息。当执行一个ASP.Net页面时，它会先到该页面所在的目录查找这个文件，如果没有找到，就往上一级 目录找，一直到wwwroot目录。如果都没有，它就会调用X:\WINNT\Microsoft.NET\Framework\v1.0.2204目录 中的Config.web文件(X为系统目录)。所以，如果大家要想改变所有页面的配置，就应该改WINNT目录中的那个Config.web。另外顺便 说一下，当你打开Config.web后，你会发现这是一个XML结构的配置文件。</p>
<p>现在你要做的第一步就是：打<br />
开或者新建一个Config.web文件。我们分开来说：<br />
如果是新建，你就需要用文本编辑器新建一个新的文档，然后往里面输入下<br />
面的语句:<br />
&lt;configuration&gt;<br />
&lt;customerrors mode=&#8221;off&#8221;&gt;&lt;/customerrors&gt;<br />
&lt;/configuration&gt;</p>
<p>输 完后选择另存为，输入文件名Config.web，将它保存到当前页面相同的文件夹中即可。如果是修改一个已经存在的Config.web文件，你只需要 用文本编辑器打开它，然后在&lt;configuration&gt;和&lt;/configuration&gt;之间的任意地方输入：<br />
&lt;customerrors mode=&#8221;off&#8221;&gt;&lt;/customerrors&gt;即可。</span></p>
<p><span>第二招：Trace追踪</p>
<p>用过ASP的人应该都用过下面的语句吧：<br />
Response.Write XXX<br />
Response.End</p>
<p>虽然我不太喜欢ASP的编程方法，但是这种方便的调试手段还是很好的。换用<br />
ASP.Net以后，我发现ASP.Net提供一种更强大的调试方法，它就是我们现在要说<br />
的Trace。所谓Trace功能就是在网页的最前面加上一些标记，至于是什么标记呢？嘿嘿，我不能马上告诉你(不好，臭鸡蛋……哇！)。我是说，我要先介绍一点基础的知识啦！</p>
<p>我不知道大家对ASP.Net的页面标示了解多少，为了下面讲解的方便，我还是<br />
概要的介绍一下吧！ASP.Net的页面标示指的是在每一个ASP.Net页面最上面，用<br />
&lt;%@和%&gt;括起来的语句。它的功能是用来确定在处理ASP.Net文件的时候，需要系<br />
统做一些什么特殊的设定。具体的语法如下：<br />
&lt;%@ directive attribute=value %&gt;<br />
其中：directive就是页面标示符；attribute是该标示符对应的一些属性。<br />
注意：在属性之间需要空格，而在&#8221;=&#8221;之间不能有空格。<br />
ASP.Net现在包含以下7种标识<br />
@ Page,<br />
@ Control,<br />
@ Import,<br />
@ Registe,<br />
@ Assembly,<br />
@ OutputCache,<br />
@ Webservice</p>
<p>我 们用得最多的就是@ Page标示，而现在我要讲的Trace功能，也要用到@ Page。(关于这七个标示的具体应用，我会在以后发贴讲述的。)好了，回到我们的主题。要用Trace功能，你必须在页面的最上面加上：&lt;%@ Page Trace=&#8221;true&#8221; %&gt; 这句话。加好后，你就可以看看页面的运行情况了。运行该页面。你会发现在页面的下半部分出现了一大堆的数据。下面就来解释一下这些数据的含义：<br />
Request Details:通过Request方式向浏览器所读取的数据；<br />
Trace Information:事件发生或程序执行的过程信息；<br />
Control Tree:网页所使用的控件及控件之间的阶层关系；<br />
Cookies Collection:网页所使用的Cookie信息；<br />
Headers Collection:浏览器的表头信息。<br />
Server Variables:Server变量的数据信息。</p>
<p>有了这一大堆数据，我们的工作就好做多了，但且慢欢喜，Trace还提供了更强大的功能，请接着看下去。</p>
<p>除了让ASP.Net页面显示这一堆数据外，我们还可以将程序中用到的变量的<br />
值实时的显示在Trace Information区段中，其方法是调用Trace.Warn或Trace.Write两个方法。他们的用法如下：<br />
Trace.Warn(&#8221;Description&#8221;,Variables);<br />
Trace.Write(&#8221;Description&#8221;,Variables);</p>
<p>我想你们一定会问，这两个有什么区别呢？回答是：在功能上，这两个是一模一样的，只是在显示上，Trace.Warn将会以红色字体表示。</span></p>
<p><span> 前面介绍的两招功夫都是赤手空拳的较量，可能你会觉得打得不过瘾，咱能<br />
不能挑件别的兵器什么的耍耍呢？既然是大家的需要，我又怎么能不满足呢？不<br />
过，说起来还是的感谢盖茨大爷，要不我就没的耍了！<br />
好了，下面就是</p>
<p>第三招 查错神器Debugger</p>
<p>要用好的兵器，没点准备是不行的，所以我们就先来做点准备运动。<br />
1.Config.web的设定：还记得第一招中讲的吗？对了，还是这个文件，打开它，向里面加入这条语句<br />
&lt;compilation debugmode=&#8221;true&#8221;&gt;&lt;/compilation&gt;<br />
说明：由于在预设情况下，ASP.Net会以正常模式来运行页面，为了能让它以查错模式编译网页，我们就必须加入这句语句。</p>
<p>2.启动查错工具DbgUrt.exe:这个程序放在x:\Program Files\Microsoft.Net\FrameworkSDK\GuiDebug目录里，文件名是DbgUrt.exe</p>
<p>3.激活查错功能:<br />
运行DbgUrt.exe程序<br />
&#8211;〉选取菜单Debug/Processes<br />
&#8211;〉在出现的Processes对话框中选中Show system processes和Show processes in all sessions<br />
&#8211;〉在Available processes列表框的最下面找到xspwp.exe(如果没有，请运行一.aspx页面，然后按Refresh键。)<br />
&#8211;〉选取该文件后，按Attach键<br />
&#8211;〉在出现的对话框中选中Common Language Runtime，然后按OK，回到Processes对话框<br />
&#8211;〉按Close键<br />
&#8211;〉在程序的主菜单中选取File/Open/File，打开你想要检测的文件。</p>
<p>下面正式开始页面调试。<br />
利用DbgUrt.exe打开欲调试的文件后，我们要做的第一件事情就是：设置断<br />
点。是不是觉得和其它Windows应用程序的调试很像（什么很像？简直就是一模<br />
一样吗！）加断点的方法很简单，先决定需要加断点的地方，然后将光标移动到<br />
该行，按下F9或者在该行的最前面点击鼠标左键，该句前面就会出现一个问号的<br />
标记，这就是断点！我们当然可以设定多个断点，只要你喜欢。你要是像取消一<br />
个断点，只需在该行重复设置断点的动作即可。</p>
<p>设置好断点后，只要使用浏览器浏览被调试的页面，当程序运行到断点的位<br />
置时，它就会自动弹出DbgUrt.exe，并且停在刚才的断点位置。这是，我们就可<br />
以利用Command Window-Immediate窗口检查变量的值了。</p>
<p>当我们想继续执行当前页面时，我们有几种选择：<br />
1、按F5键，运行到下一个断点，若没有断点，则运行完该页面；<br />
2、按F11键，执行单步操作；<br />
3、按F10键，同样是单步操作，但它会进入子程序（函数）中的语句。</p>
<p>当然，DbgUrt.exe的功能肯定比我介绍的要强大的多。编写ASP.Net程序，有个这样的利器，真是省了我们很多时间啊！怎么还不快试试！ </span></p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/dotnet/200906498/asp-net%e8%b0%83%e8%af%95%e6%96%b9%e6%b3%95%e8%bd%ac.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/dotnet/200906498/asp-net%e8%b0%83%e8%af%95%e6%96%b9%e6%b3%95%e8%bd%ac.html</feedburner:origLink></item>
		<item>
		<title>gridview删除确认</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/k6IhBDGUQa8/gridview%e5%88%a0%e9%99%a4%e7%a1%ae%e8%ae%a4.html</link>
		<comments>http://degula.com/dotnet/200906497/gridview%e5%88%a0%e9%99%a4%e7%a1%ae%e8%ae%a4.html#comments</comments>
		<pubDate>Sat, 27 Jun 2009 08:02:29 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[dotnet]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>

		<guid isPermaLink="false">http://degula.com/?p=497</guid>
		<description><![CDATA[gridview删除确认的几种方法  备忘。

1，GridView中如何使用CommandField删除时，弹出确认框?
在VS2005提供的GridView中我们可 以直接添加一个CommandField删除列：&#60;asp:CommandField ShowDeleteButton=&#8221;True&#8221; /&#62;，完后在它的RowDeleting事件中完成删除。但在多半我们在做这种删除操作时都需要先让操作者再确认下，完后再进行删除，以避免误操作 引起的误删除。
可以通过下面方法给GridView删除前加上个确认对话框。
首先，在GridView的属性对框话框中点击 “Columns”进入它的“字段”设计器。接着在“字段”设计器中选择以前已加上的那个CommandField“删除”列，这时在它的属性列表下会看 到一个“将此它段转换为 TemplateFied”的项，点击将它转换为TemplateFied列。
完后退出该字段设计器，切换到源码视图你会发现该列已由原来的：&#60;asp:CommandField ShowDeleteButton=&#8221;True&#8221; /&#62;
变为了：
CODE:
&#60;asp:TemplateField ShowHeader=&#38;amp;quot;False&#38;amp;quot;&#62;
&#60;ItemTemplate&#62;
&#60;asp:LinkButton ID=&#38;amp;quot;LinkButton1&#38;amp;quot; runat=&#38;amp;quot;server&#38;amp;quot; CausesValidation=&#38;amp;quot;False&#38;amp;quot; CommandName=&#38;amp;quot;Delete&#38;amp;quot;    Text=&#38;amp;quot;删除&#38;amp;quot;&#62;&#60;/asp:LinkButton&#62;
&#60;/ItemTemplate&#62;
最后在&#60;asp:LinkButton&#62;中加入：OnClientClick=&#38;amp;quot;return confirm(’确认要删除吗？’);&#38;amp;quot;
这样点击删除时就会先在客户端弹出“确认要删除吗？”对话框，而原来在RowDeleting事件中写的代码完全不用改变。
2，

CODE:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
if (e.Row.RowIndex &#62; -1)
{
int id = Convert.ToInt32(GridView1.DataKeys[e.Row.RowIndex].Value);
LinkButton lbtnDelete = (LinkButton)e.Row.FindControl(&#38;amp;quot;lbtnDelete&#38;amp;quot;);
if (lbtnDelete != null)
{
lbtnDelete.CommandArgument = id.ToString();
lbtnDelete.Attributes.Add(&#38;amp;quot;onClick&#38;amp;quot;, &#38;amp;quot;&#60;script&#62;return confirm(’是否确认删除！’)&#60;/script&#62;&#38;amp;quot;);
}
}
}
}
3，先引用System.windwos.Forms,然后在进行处
CODE:
using System.Windows.Forms;
protected void gvNewList_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
DialogResult result = MessageBox.Show(&#38;amp;quot;确定要删除本行吗？&#38;amp;quot;, &#38;amp;quot;信息提示!&#38;amp;quot;, MessageBoxButtons.YesNo, MessageBoxIcon.Question,MessageBoxDefaultButton.Button2,MessageBoxOptions.ServiceNotification);
if [...]]]></description>
			<content:encoded><![CDATA[<p>gridview删除确认的几种方法  备忘。</p>
<p><span id="more-497"></span></p>
<p><strong>1，GridView中如何使用CommandField删除时，弹出确认框?<br />
</strong>在VS2005提供的GridView中我们可 以直接添加一个CommandField删除列：&lt;asp:CommandField ShowDeleteButton=&#8221;True&#8221; /&gt;，完后在它的RowDeleting事件中完成删除。但在多半我们在做这种删除操作时都需要先让操作者再确认下，完后再进行删除，以避免误操作 引起的误删除。<br />
可以通过下面方法给GridView删除前加上个确认对话框。<br />
首先，在GridView的属性对框话框中点击 “Columns”进入它的“字段”设计器。接着在“字段”设计器中选择以前已加上的那个CommandField“删除”列，这时在它的属性列表下会看 到一个“将此它段转换为 TemplateFied”的项，点击将它转换为TemplateFied列。<br />
完后退出该字段设计器，切换到源码视图你会发现该列已由原来的：&lt;asp:CommandField ShowDeleteButton=&#8221;True&#8221; /&gt;<br />
变为了：</p>
<div>CODE:</div>
<div id="code787_-1">&lt;asp:TemplateField ShowHeader=&amp;amp;quot;False&amp;amp;quot;&gt;<br />
&lt;ItemTemplate&gt;<br />
&lt;asp:LinkButton ID=&amp;amp;quot;LinkButton1&amp;amp;quot; runat=&amp;amp;quot;server&amp;amp;quot; CausesValidation=&amp;amp;quot;False&amp;amp;quot; CommandName=&amp;amp;quot;Delete&amp;amp;quot;    Text=&amp;amp;quot;删除&amp;amp;quot;&gt;&lt;/asp:LinkButton&gt;<br />
&lt;/ItemTemplate&gt;<br />
最后在&lt;asp:LinkButton&gt;中加入：OnClientClick=&amp;amp;quot;return confirm(’确认要删除吗？’);&amp;amp;quot;</div>
<p>这样点击删除时就会先在客户端弹出“确认要删除吗？”对话框，而原来在RowDeleting事件中写的代码完全不用改变。<br />
<strong>2，<br />
</strong></p>
<div>CODE:</div>
<div id="code787_0">protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)<br />
{<br />
if (e.Row.RowType == DataControlRowType.DataRow)<br />
{<br />
if (e.Row.RowIndex &gt; -1)<br />
{<br />
int id = Convert.ToInt32(GridView1.DataKeys[e.Row.RowIndex].Value);<br />
LinkButton lbtnDelete = (LinkButton)e.Row.FindControl(&amp;amp;quot;lbtnDelete&amp;amp;quot;);<br />
if (lbtnDelete != null)<br />
{<br />
lbtnDelete.CommandArgument = id.ToString();<br />
lbtnDelete.Attributes.Add(&amp;amp;quot;onClick&amp;amp;quot;, &amp;amp;quot;&lt;script&gt;return confirm(’是否确认删除！’)&lt;/script&gt;&amp;amp;quot;);<br />
}<br />
}<br />
}</p>
<p>}</p></div>
<p><strong>3，先引用System.windwos.Forms,然后在进行处</strong></p>
<div>CODE:</div>
<div id="code787_1">using System.Windows.Forms;</p>
<p>protected void gvNewList_RowDeleting(object sender, GridViewDeleteEventArgs e)<br />
{<br />
DialogResult result = MessageBox.Show(&amp;amp;quot;确定要删除本行吗？&amp;amp;quot;, &amp;amp;quot;信息提示!&amp;amp;quot;, MessageBoxButtons.YesNo, MessageBoxIcon.Question,MessageBoxDefaultButton.Button2,MessageBoxOptions.ServiceNotification);<br />
if (result == DialogResult.Yes)<br />
{<br />
e.Cancel = false;<br />
}<br />
else<br />
{<br />
e.Cancel = true;<br />
}<br />
}</p></div>
<p><strong>4，添加一个删除列<br />
</strong></p>
<div>CODE:</div>
<div id="code787_2">protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)<br />
{<br />
TableCell tc = (TableCell)e.Row.Cells[e.Row.Cells.Count - 1];<br />
for (int i = 0; i &lt; tc.Controls.Count; i += 2)<br />
{<br />
// cerco il controllo ImageButton (ho utilizzato quello)<br />
Object o = tc.Controls[i];<br />
if (o is ImageButton)<br />
{<br />
// controllo trovato!<br />
// ora aggiungo l’evento js onClick per chiedere conferma all’utente<br />
ImageButton lb = (ImageButton) o;<br />
((ImageButton)lb).Attributes.Add(&amp;amp;quot;onclick&amp;amp;quot;, @&amp;amp;quot;javascript:return confirm(’Attenzione: sicuro di voler cancellare?’);&amp;amp;quot;);<br />
}<br />
}<br />
}</div>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<div>
<div><a onclick="copycode($('code787_3'));" href="http://bbs.51aspx.com/showtopic-404.html###">[复制到剪贴板]</a></div>
<p>CODE:</p></div>
<div id="code787_3">&lt;asp:TemplateField ShowHeader=&amp;amp;quot;False&amp;amp;quot;&gt;<br />
&lt;ItemStyle HorizontalAlign=&amp;amp;quot;Center&amp;amp;quot; Width=&amp;amp;quot;16px&amp;amp;quot; /&gt;<br />
&lt;ItemTemplate&gt;<br />
&lt;asp:ImageButton ID=&amp;amp;quot;imgDelete&amp;amp;quot; runat=&amp;amp;quot;server&amp;amp;quot; CausesValidation=&amp;amp;quot;False&amp;amp;quot; CommandName=&amp;amp;quot;Delete&amp;amp;quot; ImageUrl=&amp;amp;quot;~/img/ico_elimina.gif&amp;amp;quot; AlternateText=&amp;amp;quot;Cancella data&amp;amp;quot; OnClientClick=&amp;amp;quot;return confirm(’Sicuro di voler cancellare?’);&amp;amp;quot; /&gt;<br />
&lt;/ItemTemplate&gt;<br />
&lt;/asp:TemplateField&gt;</div>
<p>以上方法总结<br />
&#8212;&#8212;&#8212;Template 方式&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<div>CODE:</div>
<div id="code787_4">&lt;asp:TemplateField ShowHeader=&#8221;False&#8221;&gt;<br />
&lt;ItemTemplate&gt;<br />
&lt;aspinkButton ID=&#8221;LinkButton1&#8243; runat=&#8221;server&#8221; CausesValidation=&#8221;False&#8221; CommandName=&#8221;Delete&#8221;<br />
Text=&#8221;删除&#8221; OnClientClick=’return confirm(&#8221;Are you sure you want to delete this record?&#8221;);’&gt;&lt;/aspinkButton&gt;<br />
&lt;/ItemTemplate&gt;<br />
&lt;/asp:TemplateField&gt;</div>
<p>&#8212;&#8212;&#8212;&#8212;-RowDeleting method&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)<br />
{<br />
Response.Write(&#8221;&lt;script&gt;window.confirm(’确定删除吗？’);&lt;/script&gt;&#8221;);<br />
}</p>
<p>&#8212;&#8212;&#8212;&#8212;-RowDataBound method&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)<br />
{<br />
if (e.Row.RowType == DataControlRowType.DataRow)<br />
{<br />
((LinkButton)e.Row.Cells[4].Controls[0]).Attributes.Add(&#8221;onclick&#8221;, &#8220;javascript:return confirm(’确实要删除该记录吗?’)&#8221;);<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/dotnet/200906497/gridview%e5%88%a0%e9%99%a4%e7%a1%ae%e8%ae%a4.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/dotnet/200906497/gridview%e5%88%a0%e9%99%a4%e7%a1%ae%e8%ae%a4.html</feedburner:origLink></item>
		<item>
		<title>GridView数据操作</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/uqA1BlUZOGY/gridview%e6%95%b0%e6%8d%ae%e6%93%8d%e4%bd%9c.html</link>
		<comments>http://degula.com/dotnet/200906496/gridview%e6%95%b0%e6%8d%ae%e6%93%8d%e4%bd%9c.html#comments</comments>
		<pubDate>Sat, 27 Jun 2009 07:59:38 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[dotnet]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>

		<guid isPermaLink="false">http://degula.com/?p=496</guid>
		<description><![CDATA[在ASP.NET 2.0中，加入了许多新的功能和控件，相比asp.net 1.0/1.1，在各方面都有了很大的提高。其中，在数据控件方面，增加了不少控件，其中的Gridview控件功能十分强大。在本文中，将探讨 Gridview控件中的一些功能特性和用法，如果各位读者对Gridview控件不大了解，可以通过《使用ASP.NET 2.0中的Gridview控件》一文，来对Gridview控件有个初步的认识。

1、使用Gridview插入新记录
在Gridview控件中，可以实现插入新记录的操作（见《使用ASP.NET 2.0中的Gridview控件》）一文，但如果想实现在Gridview中，实现在Gridview控件的最后一行，提供一个空白行给用户输入要输入的 记录，那无疑是很方便的。下面将介绍其实现方法。
首先，我们打算在让用户进行选择，当用户需要新增一记录时，便点击新增按钮，之后在Gridview的最后一行里，显示一个空白行，让用户按字段进行输入，如下图所示：
当用户决定不输入新空白记录时，可以按&#8221;cancel&#8221;按钮返回，该空白行消失。要实现这样的效果，我们可以充分利用Gridview的footer的模版功能进行自定义，因为有3列，所以，在每一列的footer模版中，定义如下：
＜asp:Gridview ID=&#8221;Gridview1&#8243; Runat=&#8221;server&#8221; DataSourceID=&#8221;SqlDataSource1&#8243; DataKeyNames=&#8221;CustomerID&#8221; AutoGenerateColumns=&#8221;False&#8221; ShowFooter=&#8221;True&#8221;＞
＜Columns＞
＜asp:TemplateField＞
＜ItemTemplate＞
＜asp:Label ID=&#8221;CustomerIDLabel&#8221; Runat=&#8221;Server&#8221;＞＜%# Eval(&#8221;CustomerID&#8221;) %＞＜/asp:Label＞
＜/ItemTemplate＞
＜FooterTemplate＞
＜asp:TextBox ID=&#8221;CustomerIDTextBox&#8221; Runat=&#8221;server&#8221;＞＜/asp:TextBox＞
＜/FooterTemplate＞
＜/asp:TemplateField＞
＜asp:TemplateField＞
＜ItemTemplate＞
＜asp:Label ID=&#8221;CompanyNameLabel&#8221; Runat=&#8221;Server&#8221;＞＜%# Eval(&#8221;CompanyName&#8221;) %＞＜/asp:Label＞
＜/ItemTemplate＞
＜FooterTemplate＞
＜asp:TextBox ID=&#8221;CompanyNameTextBox&#8221; Runat=&#8221;server&#8221;＞＜/asp:TextBox＞
＜/FooterTemplate＞
＜/asp:TemplateField＞
＜asp:TemplateField＞
＜FooterTemplate＞
＜asp:DropDownList ID=&#8221;ContactTitleDropDownList&#8221; Runat=&#8221;server&#8221; DataSourceID=&#8221;SqlDataSource2&#8243; DataTextField=&#8221;ContactTitle&#8221; DataValueField=&#8221;ContactTitle&#8221;＞
＜/asp:DropDownList＞
＜asp:SqlDataSource ID=&#8221;SqlDataSource2&#8243; Runat=&#8221;server&#8221; SelectCommand=&#8221;SELECT DISTINCT [ContactTitle] FROM [Customers]&#8221;
ConnectionString=&#8221;server=localhost;uid=sa;password=xxx;database=northwind&#8221;＞
＜/asp:SqlDataSource＞
＜asp:Button ID=&#8221;Button1&#8243; Runat=&#8221;server&#8221; Text=&#8221;Add&#8221;  /＞
＜asp:Button ID=&#8221;CancelButton1&#8243; Runat=&#8221;server&#8221; Text=&#8221;Cancel&#8221;  /＞
＜/FooterTemplate＞
＜ItemTemplate＞
＜asp:DropDownList ID=&#8221;ContactTitleDropDown&#8221; SelectedValue=’＜%# Bind(&#8221;ContactTitle&#8221;) %＞’ Runat=&#8221;Server&#8221; DataSourceID=&#8221;SqlDataSource3&#8243; DataTextField=&#8221;ContactTitle&#8221; DataValueField=&#8221;ContactTitle&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>在ASP.NET 2.0中，加入了许多新的功能和控件，相比asp.net 1.0/1.1，在各方面都有了很大的提高。其中，在数据控件方面，增加了不少控件，其中的Gridview控件功能十分强大。在本文中，将探讨 Gridview控件中的一些功能特性和用法，如果各位读者对Gridview控件不大了解，可以通过《使用ASP.NET 2.0中的Gridview控件》一文，来对Gridview控件有个初步的认识。<br />
<span id="more-496"></span><br />
<strong>1、使用Gridview插入新记录</strong></p>
<p>在Gridview控件中，可以实现插入新记录的操作（见《使用ASP.NET 2.0中的Gridview控件》）一文，但如果想实现在Gridview中，实现在Gridview控件的最后一行，提供一个空白行给用户输入要输入的 记录，那无疑是很方便的。下面将介绍其实现方法。</p>
<p>首先，我们打算在让用户进行选择，当用户需要新增一记录时，便点击新增按钮，之后在Gridview的最后一行里，显示一个空白行，让用户按字段进行输入，如下图所示：</p>
<p>当用户决定不输入新空白记录时，可以按&#8221;cancel&#8221;按钮返回，该空白行消失。要实现这样的效果，我们可以充分利用Gridview的footer的模版功能进行自定义，因为有3列，所以，在每一列的footer模版中，定义如下：</p>
<p>＜asp:Gridview ID=&#8221;Gridview1&#8243; Runat=&#8221;server&#8221; DataSourceID=&#8221;SqlDataSource1&#8243; DataKeyNames=&#8221;CustomerID&#8221; AutoGenerateColumns=&#8221;False&#8221; ShowFooter=&#8221;True&#8221;＞<br />
＜Columns＞<br />
＜asp:TemplateField＞<br />
＜ItemTemplate＞<br />
＜asp:Label ID=&#8221;CustomerIDLabel&#8221; Runat=&#8221;Server&#8221;＞＜%# Eval(&#8221;CustomerID&#8221;) %＞＜/asp:Label＞<br />
＜/ItemTemplate＞<br />
＜FooterTemplate＞<br />
＜asp:TextBox ID=&#8221;CustomerIDTextBox&#8221; Runat=&#8221;server&#8221;＞＜/asp:TextBox＞<br />
＜/FooterTemplate＞<br />
＜/asp:TemplateField＞</p>
<p>＜asp:TemplateField＞<br />
＜ItemTemplate＞<br />
＜asp:Label ID=&#8221;CompanyNameLabel&#8221; Runat=&#8221;Server&#8221;＞＜%# Eval(&#8221;CompanyName&#8221;) %＞＜/asp:Label＞<br />
＜/ItemTemplate＞<br />
＜FooterTemplate＞<br />
＜asp:TextBox ID=&#8221;CompanyNameTextBox&#8221; Runat=&#8221;server&#8221;＞＜/asp:TextBox＞<br />
＜/FooterTemplate＞<br />
＜/asp:TemplateField＞</p>
<p>＜asp:TemplateField＞<br />
＜FooterTemplate＞<br />
＜asp:DropDownList ID=&#8221;ContactTitleDropDownList&#8221; Runat=&#8221;server&#8221; DataSourceID=&#8221;SqlDataSource2&#8243; DataTextField=&#8221;ContactTitle&#8221; DataValueField=&#8221;ContactTitle&#8221;＞<br />
＜/asp:DropDownList＞<br />
＜asp:SqlDataSource ID=&#8221;SqlDataSource2&#8243; Runat=&#8221;server&#8221; SelectCommand=&#8221;SELECT DISTINCT [ContactTitle] FROM [Customers]&#8221;<br />
ConnectionString=&#8221;server=localhost;uid=sa;password=xxx;database=northwind&#8221;＞<br />
＜/asp:SqlDataSource＞</p>
<p>＜asp:Button ID=&#8221;Button1&#8243; Runat=&#8221;server&#8221; Text=&#8221;Add&#8221;  /＞<br />
＜asp:Button ID=&#8221;CancelButton1&#8243; Runat=&#8221;server&#8221; Text=&#8221;Cancel&#8221;  /＞<br />
＜/FooterTemplate＞</p>
<p>＜ItemTemplate＞<br />
＜asp:DropDownList ID=&#8221;ContactTitleDropDown&#8221; SelectedValue=’＜%# Bind(&#8221;ContactTitle&#8221;) %＞’ Runat=&#8221;Server&#8221; DataSourceID=&#8221;SqlDataSource3&#8243; DataTextField=&#8221;ContactTitle&#8221; DataValueField=&#8221;ContactTitle&#8221; ＞＜/asp:DropDownList＞<br />
＜asp:SqlDataSource ID=&#8221;SqlDataSource3&#8243; Runat=&#8221;server&#8221; SelectCommand=&#8221;SELECT DISTINCT [ContactTitle] FROM [Customers]&#8221;<br />
ConnectionString=&#8221;server=localhost;uid=sa;password=xxxx;database=northwind&#8221; EnableCaching=&#8221;True&#8221;＞<br />
＜/asp:SqlDataSource＞<br />
＜/ItemTemplate＞<br />
＜/asp:TemplateField＞<br />
＜/Columns＞<br />
＜/asp:Gridview＞</p>
<p>以上为Gridview的代码，可以看到，在第一，二列的＜foottemplate＞列中，分别提供了customerid和companyname 两个文本框以供用户输入，在第三列的＜footertemplate＞列中，以dropdownlistbox的形式来显示 contracttitle.。其中，请注意第三列的footertemplate中的add和cancel两个按钮的，它们的事件代码如下</p>
<p>＜script runat=&#8221;server&#8221;＞<br />
void CancelButton1_Click(object sender, EventArgs e)<br />
{<br />
Gridview1.ShowFooter = false;<br />
}<br />
void AddButton1_Click(object sender, EventArgs e)<br />
{<br />
Gridview1.ShowFooter = true;<br />
}</p>
<p>//点add按钮时，将新增的记录更新到数据库中去<br />
void Button1_Click(object sender, EventArgs e)<br />
{<br />
TextBox customerID = Gridview1.FooterRow.FindControl(&#8221;CustomerIDTextBox&#8221;) as TextBox;<br />
TextBox companyName = Gridview1.FooterRow.FindControl(&#8221;CompanyNameTextBox&#8221;) as TextBox;<br />
DropDownList ContactTitle = Gridview1.FooterRow.FindControl(&#8221;ContactTitleDropDownList&#8221;) as DropDownList;<br />
SqlDataSource1.InsertParameters["CustomerID"].DefaultValue = customerID.Text;<br />
SqlDataSource1.InsertParameters["CompanyName"].DefaultValue = companyName.Text;<br />
SqlDataSource1.InsertParameters["ContactTitle"].DefaultValue=ContactTitle.SelectedValue;<br />
SqlDataSource1.Insert();<br />
}<br />
＜/script＞</p>
<p>其中的cancel按钮的事件，用来取消显示Gridview的footer模版，因此设置showfooter属性为false,而 addbutton1按钮，是当用户决定新增记录时点选的，此时将设置showfooter属性为true,以显示各列的foottemplate，从而 达到显示新的一个空白行的目的。</p>
<p>而在更新代码button1_click事件中，将首先使用 Gridview1.footerrow.findcontrol的方法，将用户新增的各字段的值提取出来，然后分别赋值给sqldatasource的 insertparameters集合（注意要一一对应），最后使用sqldatasource的insert方法，就可以成功向数据库增加一条新记录 了。</p>
<p>另外，为了在窗体加载时，显示数据库northwind中customers表的数据，需要设置sqldatsource1的属性，如下代码：</p>
<p>＜asp:SqlDataSource ID=&#8221;SqlDataSource1&#8243; Runat=&#8221;server&#8221;<br />
InsertCommand=&#8221;INSERT INTO [Customers] ([CustomerID], [CompanyName], [ContactTitle]) VALUES (@CustomerID, @CompanyName, @ContactTitle)&#8221;<br />
SelectCommand=&#8221;SELECT top 5 [CustomerID], [CompanyName], [ContactTitle] FROM [Customers]&#8221;<br />
ConnectionString=&#8221;server=localhost;uid=sa;password=XXXXX;database=northwind&#8221;＞<br />
＜InsertParameters＞<br />
＜asp:Parameter Type=&#8221;String&#8221; Name=&#8221;CustomerID&#8221;＞＜/asp:Parameter＞<br />
＜asp:Parameter Type=&#8221;String&#8221; Name=&#8221;CompanyName&#8221;＞＜/asp:Parameter＞<br />
＜asp:Parameter Type=&#8221;String&#8221; Name=&#8221;ContactTitle&#8221;＞＜/asp:Parameter＞<br />
＜/InsertParameters＞<br />
＜/asp:SqlDataSource＞</p>
<p>其中，必须设置insertcommand和selectcommand属性，设置数据提取和插入的语句，并且要设置好insertparameters集合中，各字段的类型和名称即可。</p>
<p><strong>2、一次性更新所有的Gridview记录</strong></p>
<p>我们经常会遇到这样的情况，在Gridview中列出的所有记录中，有时要同时修改多条记录，并且将其保存到数据库中去。那么在Gridview中应该如何实现呢？在Gridview中，有两种实现的方法，下面分别进行介绍：</p>
<p>先来看下第一种方法，本方法是使用sqldatasource来更新所有记录，但这个方法比较慢，因为每更新一条记录都要建立数据连接并执行updatecommand,会影响性能。其主要代码如下：</p>
<p>＜script runat=&#8221;server&#8221;＞<br />
void Button1_Click(object sender, EventArgs e)<br />
{<br />
for (int i = 0; i ＜ Gridview1.Rows.Count; i++)<br />
{<br />
GridviewRow row = Gridview1.Rows[i];<br />
SqlDataSource1.UpdateParameters[0].DefaultValue = ((TextBox)row.Cells[0].FindControl(&#8221;TextBox2&#8243;)).Text;<br />
SqlDataSource1.UpdateParameters[1].DefaultValue = ((TextBox)row.Cells[1].FindControl(&#8221;TextBox3&#8243;)).Text;<br />
SqlDataSource1.UpdateParameters[2].DefaultValue = Gridview1.DataKeys[i].Value.ToString();<br />
SqlDataSource1.Update();<br />
}<br />
}<br />
＜/script＞<br />
＜html xmlns=&#8221;http://www.w3.org/1999/xhtml&#8221; ＞<br />
＜head id=&#8221;Head1&#8243; runat=&#8221;server&#8221;＞<br />
＜title＞Untitled Page＜/title＞<br />
＜/head＞<br />
＜body＞<br />
＜form id=&#8221;form1&#8243; runat=&#8221;server&#8221;＞<br />
＜div＞<br />
＜asp:Gridview ID=&#8221;Gridview1&#8243; Runat=&#8221;server&#8221; DataSourceID=&#8221;SqlDataSource1&#8243; DataKeyNames=&#8221;CustomerID&#8221; AutoGenerateColumns=&#8221;False&#8221;＞<br />
＜Columns＞<br />
＜asp:TemplateField SortExpression=&#8221;CustomerID&#8221; HeaderText=&#8221;CustomerID&#8221;＞<br />
＜ItemTemplate＞<br />
＜asp:TextBox Runat=&#8221;server&#8221; Text=’＜%# Bind(&#8221;CustomerID&#8221;) %＞’ ID=&#8221;TextBox1&#8243;＞＜/asp:TextBox＞<br />
＜/ItemTemplate＞</p>
<p>＜/asp:TemplateField＞<br />
＜asp:TemplateField SortExpression=&#8221;CompanyName&#8221; HeaderText=&#8221;CompanyName&#8221;＞<br />
＜ItemTemplate＞<br />
＜asp:TextBox Runat=&#8221;server&#8221; Text=’＜%# Bind(&#8221;CompanyName&#8221;) %＞’ ID=&#8221;TextBox2&#8243;＞＜/asp:TextBox＞<br />
＜/ItemTemplate＞<br />
＜/asp:TemplateField＞</p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/dotnet/200906496/gridview%e6%95%b0%e6%8d%ae%e6%93%8d%e4%bd%9c.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/dotnet/200906496/gridview%e6%95%b0%e6%8d%ae%e6%93%8d%e4%bd%9c.html</feedburner:origLink></item>
		<item>
		<title>关于SQL92标准和Sybase,SQLServer2000,Oracle的数据类型对比关系</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/j-KTJOjXAbY/sql92-sybase-sqlserver.html</link>
		<comments>http://degula.com/database/200906494/sql92-sybase-sqlserver.html#comments</comments>
		<pubDate>Fri, 26 Jun 2009 05:56:46 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[database]]></category>

		<guid isPermaLink="false">http://degula.com/?p=494</guid>
		<description><![CDATA[关于SQL92标准和Sybase,SQLServer2000,Oracle的数据类型对比关系图表和相应的差别，对于容易混淆的部分给出了说明。


差异：
9T*f#M4v+n c d9V0SQLServer版本为2000版本，Sybase版本为12.5.1版本，Oracle版本9.2版本
 g+? y j3d c5} l01.SQLServer2000的字符类型长度最大均为8K，而Sybase字符类型的最大长度与页的大小相等。
 S&#38;K2V p*u&#8221;j3D k r#@02.SQLServer2000 中没有unichar和univarchar字符类型;在Sybase中nchar和nvarchar代表本地语言字符集，而unichar和 univarchar代表unicode方式;而SQLServer2000中nchar和nvarchar才代表unicode方式。ITPUB个人空间 C W j r g&#8221;U r3X
3.SQLServer2000中新增bigint整数类型；Sybase中没有。ITPUB个人空间 g q \4{ r P w*n
4.SQLServer2000和Sybase中都有numeric和decimal类型，这两个类型的区别在于numeric(n,0)可以用来表示identity字段，但是decimal不行。
0H5u F i w E N r O05.SQLServer2000中有ntext类型；而Sybase中没有
!X;x(&#124;-S(F&#8217;I D06.SQLServer2000中的bit类型可以表示为0/1/NULL，而Sybase中只能为1/0两种选择
 X U e c M,N07.Sybase中新增date和time类型
;&#124;.C R B g:^+g08.Oracle中新增varchar2类型
7p0b p O g3R+T&#8221;Z09.Oracle中无unichar和univarchar类型，但是nchar和nvarchar表示unicode方式ITPUB个人空间 U&#8217;E&#8221;m.x-O Z r
10.Oracle中只有date类型
&#38;H0X Z N-Z)Z*R011.Oracle中的Number类型可以代替Sybase和SQLServer中的所有数字类型
 d ^.^ k u1_&#8221;`2J(o%z012.Oracle中没有货币类型ITPUB个人空间1t)i L [...]]]></description>
			<content:encoded><![CDATA[<p>关于SQL92标准和Sybase,SQLServer2000,Oracle的数据类型对比关系图表和相应的差别，对于容易混淆的部分给出了说明。</p>
<p><span id="more-494"></span></p>
<div><img src="http://hiphotos.baidu.com/placido07/pic/item/a0956b9bf67ed895c8eaf46c.jpg" border="0" alt="" /><br />
差异：<br />
<span style="display: none;">9T*f#M4v+n c d9V0</span><span style="font-size: x-small;">SQLServer版本为2000版本，Sybase版本为12.5.1版本，Oracle版本9.2版本<br />
<span style="display: none;"> g+? y j3d c5} l0</span>1.SQLServer2000的字符类型长度最大均为8K，而Sybase字符类型的最大长度与页的大小相等。<br />
<span style="display: none;"> S&amp;K2V p*u&#8221;j3D k r#@0</span>2.SQLServer2000 中没有unichar和univarchar字符类型;在Sybase中nchar和nvarchar代表本地语言字符集，而unichar和 univarchar代表unicode方式;而SQLServer2000中nchar和nvarchar才代表unicode方式。<span style="display: none;">ITPUB个人空间 C W j r g&#8221;U r3X</span><br />
3.SQLServer2000中新增bigint整数类型；Sybase中没有。<span style="display: none;">ITPUB个人空间 g q \4{ r P w*n</span><br />
4.SQLServer2000和Sybase中都有numeric和decimal类型，这两个类型的区别在于numeric(n,0)可以用来表示identity字段，但是decimal不行。</span><br />
<span style="display: none;">0H5u F i w E N r O0</span><span style="font-size: x-small;">5.SQLServer2000中有ntext类型；而Sybase中没有<br />
<span style="display: none;">!X;x(|-S(F&#8217;I D0</span>6.SQLServer2000中的bit类型可以表示为0/1/NULL，而Sybase中只能为1/0两种选择<br />
<span style="display: none;"> X U e c M,N0</span>7.Sybase中新增date和time类型<br />
<span style="display: none;">;|.C R B g:^+g0</span>8.Oracle中新增varchar2类型<br />
<span style="display: none;">7p0b p O g3R+T&#8221;Z0</span>9.Oracle中无unichar和univarchar类型，但是nchar和nvarchar表示unicode方式<span style="display: none;">ITPUB个人空间 U&#8217;E&#8221;m.x-O Z r</span><br />
10.Oracle中只有date类型<br />
<span style="display: none;">&amp;H0X Z N-Z)Z*R0</span>11.Oracle中的Number类型可以代替Sybase和SQLServer中的所有数字类型<br />
<span style="display: none;"> d ^.^ k u1_&#8221;`2J(o%z0</span>12.Oracle中没有货币类型<span style="display: none;">ITPUB个人空间1t)i L t I,F f!r Y$X</span><br />
13.Oracle中有文件指针类型bfile<br />
<span style="display: none;">%D%S1X*d1h6J+D @0</span>14.Oracle中没有bit类型</span></div>
<div>http://hi.baidu.com/placido07/blog/item/82f4ec19ccad4f4242a9ad77.html</div>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/database/200906494/sql92-sybase-sqlserver.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/database/200906494/sql92-sybase-sqlserver.html</feedburner:origLink></item>
		<item>
		<title>关于ASP.NET MVC架构中的依赖性注入</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/ixaXCcebab8/asp-net-mvc.html</link>
		<comments>http://degula.com/dotnet/200906492/asp-net-mvc.html#comments</comments>
		<pubDate>Thu, 25 Jun 2009 13:39:33 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[dotnet]]></category>
		<category><![CDATA[asp.net]]></category>

		<guid isPermaLink="false">http://degula.com/?p=492</guid>
		<description><![CDATA[Java平台的Struct和Spring框架都 能够有效地组织J2EE应用各层的对象。不管是控制层的Action对象，还是业务层的Service对象，还是持久层的DAO对象，都可在Spring/Struct的 管理下有机地协调、运行。Spring/Struct将各层的对象以松耦合的方式组织在一起，Action对象无须关心Service对象的具体实现，Service对 象无须关心持久层对象的具体实现，各层对象的调用完全面向接口。当系统需要重构时，代码的改写量将大大减少。
其实，依赖性注入(Dependency Injection)和控制反转(Inversion of Control)二者是同一个概念。具体含义是：当某个角色(可能是一个Java实例，调用者)需要另一个角色(另一个Java实例，被调用者)的协助时，在 传统的程序设计过程中，通常由调用者来创建被调用者的实例。但在Spring/Struct里，创建被调用者的工作不再由调用者来完成，因此称为“控制反转”；创建被调用者 实例的工作通常由Spring/Struct容器来完成，然后注入调用者，因此也称为“依赖性注入”。
具有讽刺意味的是，如今的ASP.NET MVC框架中也逐渐引入了以上概念。其实，此框架本身的创建就借鉴了以上著名JAVA平台二框架的构建机理（这也恰恰反映了微软在许多方面的风格－－“为我所用”）。因此，要想全面深入地掌握ASP.NET平台的这个新的MVC框架，对于依赖注入（或控制反转）这样的基础性概念非要掌握透彻不可；否则，只能算一知半解。
]]></description>
			<content:encoded><![CDATA[<p>Java平台的Struct和Spring框架都 能够有效地组织J2EE应用各层的对象。不管是控制层的Action对象，还是业务层的Service对象，还是持久层的DAO对象，都可在Spring/Struct的 管理下有机地协调、运行。Spring/Struct将各层的对象以松耦合的方式组织在一起，Action对象无须关心Service对象的具体实现，Service对 象无须关心持久层对象的具体实现，各层对象的调用完全面向接口。当系统需要重构时，代码的改写量将大大减少。</p>
<p>其实，依赖性注入(Dependency Injection)和控制反转(Inversion of Control)二者是同一个概念。具体含义是：当某个角色(可能是一个Java实例，调用者)需要另一个角色(另一个Java实例，被调用者)的协助时，在 传统的程序设计过程中，通常由调用者来创建被调用者的实例。但在Spring/Struct里，创建被调用者的工作不再由调用者来完成，因此称为“控制反转”；创建被调用者 实例的工作通常由Spring/Struct容器来完成，然后注入调用者，因此也称为“依赖性注入”。</p>
<p>具有讽刺意味的是，如今的ASP.NET MVC框架中也逐渐引入了以上概念。其实，此框架本身的创建就借鉴了以上著名JAVA平台二框架的构建机理（这也恰恰反映了微软在许多方面的风格－－“为我所用”）。因此，要想全面深入地掌握ASP.NET平台的这个新的MVC框架，对于依赖注入（或控制反转）这样的基础性概念非要掌握透彻不可；否则，只能算一知半解。</p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/dotnet/200906492/asp-net-mvc.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/dotnet/200906492/asp-net-mvc.html</feedburner:origLink></item>
		<item>
		<title>JavaScript中Array（数组）的属性和方法</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/6NVN6wg0VpQ/javascript-array.html</link>
		<comments>http://degula.com/webdev/javascript-webdev/200906491/javascript-array.html#comments</comments>
		<pubDate>Wed, 24 Jun 2009 07:13:48 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[web develop]]></category>

		<guid isPermaLink="false">http://degula.com/?p=491</guid>
		<description><![CDATA[

没办法 ，每次用到都记不得，留一份备忘。
数组有四种定义的方式
使用构造函数：
var a = new Array();
var b = new Array(8);
var c = new Array(&#8221;first&#8221;, &#8220;second&#8221;, &#8220;third&#8221;);
或者数组直接量：
var d = ["first", "second", "third"];

属性
Array只有一个属性，就是length，length表示的是数组所占内存空间的数目，而不仅仅是数组中元素的个数，在刚才定义的数组中，b.length的值为8

&#60;script&#62;
var a = new Array(&#8220;first&#8220;, &#8220;second&#8220;, &#8220;third&#8220;)
a[48] = &#8220;12&#8220;
document.write(a.length)
//显示的结果是49
&#60;/script&#62;

数组的length属性是可写的，这是一个非常有意思的属性，我们可以通过这种方法来截取数组

&#60;script&#62;
var a = new Array(&#8220;first&#8220;, &#8220;second&#8220;, &#8220;third&#8220;)
delete a[1]
document.write(a.length)
//显示的结果是3，说明即使删除也无法改变数组的长度
var a = new Array(&#8220;first&#8220;, &#8220;second&#8220;, &#8220;third&#8220;)
a.length = 1
document.write(a.length)
//显示的结果是1，说明只剩下一个元素了
&#60;/script&#62;

方法
这里并没有包括IE和FF并不兼容的一些方法：
toString()：把数组转换成一个字符串
toLocaleString()：把数组转换成一个字符串
join()：把数组转换成一个用符号连接的字符串
shift()：将数组头部的一个元素移出
unshift()：在数组的头部插入一个元素
pop()：从数组尾部删除一个元素
push()：把一个元素添加到数组的尾部
concat()：给数组添加元素
slice()：返回数组的部分
reverse()：将数组反向排序
sort()：对数组进行排序操作
splice()：插入、删除或者替换一个数组元素
toString ()方法，toLocaleString()方法的作用类似，FF下的作用是完全相同的，IE的话如果元素是字符串，会在“,”后面加上一个空格，如果元 素是数字，会扩展到两位小数，两者都会改变字符串的length属性，所以考虑到兼容性，尽量不要使用toLocaleString()方法。

&#60;script&#62;
var a = new Array(1, 2, 3, [4, 5, [6, [...]]]></description>
			<content:encoded><![CDATA[<div id="art" style="margin: 15px;">
<div>
<p>没办法 ，每次用到都记不得，留一份备忘。</p>
<p><strong>数组有四种定义的方式</strong></p>
<p>使用构造函数：<br />
var a = new Array();<br />
var b = new Array(8);<br />
var c = new Array(&#8221;first&#8221;, &#8220;second&#8221;, &#8220;third&#8221;);<br />
或者数组直接量：<br />
var d = ["first", "second", "third"];</p>
<p><span id="more-491"></span></p>
<p><strong>属性</strong></p>
<p>Array只有一个属性，就是length，length表示的是数组所占内存空间的数目，而不仅仅是数组中元素的个数，在刚才定义的数组中，b.length的值为8</p>
<div>
<div><span style="color: gray;">&lt;</span><span style="color: blue;">script</span><span style="color: gray;">&gt;<br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">a</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">first</span><span style="color: #8b0000;">&#8220;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">second</span><span style="color: #8b0000;">&#8220;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">third</span><span style="color: #8b0000;">&#8220;</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: blue;">a</span><span style="color: olive;">[</span><span style="color: maroon;">48</span><span style="color: olive;">]</span><span style="color: gray;"> = </span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">12</span><span style="color: #8b0000;">&#8220;</span><span style="color: gray;"><br />
</span><span style="color: teal;">document</span><span style="color: gray;">.</span><span style="color: blue;">write</span><span style="color: olive;">(</span><span style="color: blue;">a</span><span style="color: gray;">.</span><span style="color: blue;">length</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: #ffa500;">//显示的结果是49</span><span style="color: gray;"><br />
&lt;</span><span style="color: #8b0000;">/</span><span style="color: red;">script&gt;</span></div>
</div>
<p>数组的length属性是可写的，这是一个非常有意思的属性，我们可以通过这种方法来截取数组</p>
<div>
<div><span style="color: gray;">&lt;</span><span style="color: blue;">script</span><span style="color: gray;">&gt;<br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">a</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">first</span><span style="color: #8b0000;">&#8220;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">second</span><span style="color: #8b0000;">&#8220;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">third</span><span style="color: #8b0000;">&#8220;</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: green;">delete</span><span style="color: gray;"> </span><span style="color: blue;">a</span><span style="color: olive;">[</span><span style="color: maroon;">1</span><span style="color: olive;">]</span><span style="color: gray;"><br />
</span><span style="color: teal;">document</span><span style="color: gray;">.</span><span style="color: blue;">write</span><span style="color: olive;">(</span><span style="color: blue;">a</span><span style="color: gray;">.</span><span style="color: blue;">length</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: #ffa500;">//显示的结果是3，说明即使删除也无法改变数组的长度</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">a</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">first</span><span style="color: #8b0000;">&#8220;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">second</span><span style="color: #8b0000;">&#8220;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">third</span><span style="color: #8b0000;">&#8220;</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: blue;">a</span><span style="color: gray;">.</span><span style="color: blue;">length</span><span style="color: gray;"> = </span><span style="color: maroon;">1</span><span style="color: gray;"><br />
</span><span style="color: teal;">document</span><span style="color: gray;">.</span><span style="color: blue;">write</span><span style="color: olive;">(</span><span style="color: blue;">a</span><span style="color: gray;">.</span><span style="color: blue;">length</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: #ffa500;">//显示的结果是1，说明只剩下一个元素了</span><span style="color: gray;"><br />
&lt;</span><span style="color: #8b0000;">/</span><span style="color: red;">script&gt;</span></div>
</div>
<p><strong>方法</strong></p>
<p>这里并没有包括IE和FF并不兼容的一些方法：<br />
toString()：把数组转换成一个字符串<br />
toLocaleString()：把数组转换成一个字符串<br />
join()：把数组转换成一个用符号连接的字符串<br />
shift()：将数组头部的一个元素移出<br />
unshift()：在数组的头部插入一个元素<br />
pop()：从数组尾部删除一个元素<br />
push()：把一个元素添加到数组的尾部<br />
concat()：给数组添加元素<br />
slice()：返回数组的部分<br />
reverse()：将数组反向排序<br />
sort()：对数组进行排序操作<br />
splice()：插入、删除或者替换一个数组元素</p>
<p>toString ()方法，toLocaleString()方法的作用类似，FF下的作用是完全相同的，IE的话如果元素是字符串，会在“,”后面加上一个空格，如果元 素是数字，会扩展到两位小数，两者都会改变字符串的length属性，所以考虑到兼容性，尽量不要使用toLocaleString()方法。</p>
<div>
<div><span style="color: gray;">&lt;</span><span style="color: blue;">script</span><span style="color: gray;">&gt;<br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">a</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: maroon;">1</span><span style="color: gray;">, </span><span style="color: maroon;">2</span><span style="color: gray;">, </span><span style="color: maroon;">3</span><span style="color: gray;">, </span><span style="color: olive;">[</span><span style="color: maroon;">4</span><span style="color: gray;">, </span><span style="color: maroon;">5</span><span style="color: gray;">, </span><span style="color: olive;">[</span><span style="color: maroon;">6</span><span style="color: gray;">, </span><span style="color: maroon;">7</span><span style="color: olive;">]])</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">b</span><span style="color: gray;"> = </span><span style="color: blue;">a</span><span style="color: gray;">.</span><span style="color: blue;">toString</span><span style="color: olive;">()</span><span style="color: gray;"> </span><span style="color: #ffa500;">//b为字符串形式的 &#8220;1, 2, 3, 4, 5, 6, 7&#8243; </span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">c</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: maroon;">1</span><span style="color: gray;">, </span><span style="color: maroon;">2</span><span style="color: gray;">, </span><span style="color: maroon;">3</span><span style="color: gray;">, </span><span style="color: olive;">[</span><span style="color: maroon;">4</span><span style="color: gray;">, </span><span style="color: maroon;">5</span><span style="color: gray;">, </span><span style="color: olive;">[</span><span style="color: maroon;">6</span><span style="color: gray;">, </span><span style="color: maroon;">7</span><span style="color: olive;">]])</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">d</span><span style="color: gray;"> = </span><span style="color: blue;">c</span><span style="color: gray;">.</span><span style="color: blue;">toLocaleString</span><span style="color: olive;">()</span><span style="color: gray;"> </span><span style="color: #ffa500;">//d为字符串形式的 &#8220;1, 2, 3, 4, 5, 6, 7&#8243; </span><span style="color: gray;"><br />
</span><span style="color: #ffa500;">//toString()方法和toLocaleString()方法都可以拆解多维数组</span><span style="color: gray;"><br />
&lt;</span><span style="color: #8b0000;">/</span><span style="color: red;">script&gt;</span></div>
</div>
<p>join()方法将数组中的所有元素转换成字符串，然后连接起来，这刚好和String的split()方法是一个相反的操作。join()默认是使用“,”作为分隔符，当然你也可以在方法中指定分隔符</p>
<div>
<div><span style="color: gray;">&lt;</span><span style="color: blue;">script</span><span style="color: gray;">&gt;<br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">a</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">first</span><span style="color: #8b0000;">&#8220;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">second</span><span style="color: #8b0000;">&#8220;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">third</span><span style="color: #8b0000;">&#8220;</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">s</span><span style="color: gray;"> = </span><span style="color: blue;">a</span><span style="color: gray;">.</span><span style="color: blue;">join</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">&#8230;</span><span style="color: #8b0000;">&#8220;</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: teal;">document</span><span style="color: gray;">.</span><span style="color: blue;">write</span><span style="color: olive;">(</span><span style="color: blue;">s</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: #ffa500;">//显示的结果是“first&#8230;second&#8230;third”</span><span style="color: gray;"><br />
&lt;</span><span style="color: #8b0000;">/</span><span style="color: red;">script&gt;</span></div>
</div>
<p>pop()方法可以从数组尾部删除若干个元素，push()方法把一个元素添加到数组的尾部，这两个方法刚好是两个相反的操作。两个都是对原来的数组进行操作，但是要注意push()方法返回的是新的数组的长度，而pop()方法则返回被删去的那个元素。</p>
<div>
<div><span style="color: gray;">&lt;</span><span style="color: blue;">script</span><span style="color: gray;">&gt;<br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">a</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: maroon;">1</span><span style="color: gray;">, </span><span style="color: maroon;">2</span><span style="color: gray;">, </span><span style="color: maroon;">3</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">b</span><span style="color: gray;"> = </span><span style="color: blue;">a</span><span style="color: gray;">.</span><span style="color: blue;">push</span><span style="color: olive;">(</span><span style="color: maroon;">4</span><span style="color: gray;">,</span><span style="color: maroon;">5</span><span style="color: gray;">,</span><span style="color: olive;">[</span><span style="color: maroon;">6</span><span style="color: gray;">,</span><span style="color: maroon;">7</span><span style="color: olive;">])</span><span style="color: gray;"> </span><span style="color: #ffa500;">//a为[1, 2, 3, 4, 5, [6, 7]]  b为6  注意push()方法不会帮你打开一个数组</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">c</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: maroon;">1</span><span style="color: gray;">, </span><span style="color: maroon;">2</span><span style="color: gray;">, </span><span style="color: maroon;">3</span><span style="color: gray;">, </span><span style="color: maroon;">4</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">first</span><span style="color: #8b0000;">&#8220;</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">d</span><span style="color: gray;"> = </span><span style="color: blue;">c</span><span style="color: gray;">.</span><span style="color: blue;">pop</span><span style="color: olive;">()</span><span style="color: gray;"> </span><span style="color: #ffa500;">//c为[1, 2, 3, 4]  d为字符串形式的&#8221;first&#8221;</span><span style="color: gray;"><br />
&lt;</span><span style="color: #8b0000;">/</span><span style="color: red;">script&gt;</span></div>
</div>
<p>shift ()方法可以从数组头部删除一个元素，unshift()方法把若干元素添加到数组的头部，这两个方法刚好是两个相反的操作。两个都是对原来的数组进行操 作，但是要注意unshift()方法返回的是新的数组的长度，而shift()方法则返回被删去的那个元素。</p>
<div>
<div><span style="color: gray;">&lt;</span><span style="color: blue;">script</span><span style="color: gray;">&gt;<br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">a</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: maroon;">1</span><span style="color: gray;">, </span><span style="color: maroon;">2</span><span style="color: gray;">, </span><span style="color: maroon;">3</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">b</span><span style="color: gray;"> = </span><span style="color: blue;">a</span><span style="color: gray;">.</span><span style="color: blue;">unshift</span><span style="color: olive;">(</span><span style="color: maroon;">4</span><span style="color: gray;">,</span><span style="color: maroon;">5</span><span style="color: gray;">,</span><span style="color: olive;">[</span><span style="color: maroon;">6</span><span style="color: gray;">,</span><span style="color: maroon;">7</span><span style="color: olive;">])</span><span style="color: gray;"> </span><span style="color: #ffa500;">//a为[4, 5, [6, 7], 1, 2, 3]  b为6  注意unshift()方法不会帮你打开一个数组，还有就是被插入数值的顺序</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">c</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">first</span><span style="color: #8b0000;">&#8220;</span><span style="color: gray;">, </span><span style="color: maroon;">1</span><span style="color: gray;">, </span><span style="color: maroon;">2</span><span style="color: gray;">, </span><span style="color: maroon;">3</span><span style="color: gray;">, </span><span style="color: maroon;">4</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">d</span><span style="color: gray;"> = </span><span style="color: blue;">c</span><span style="color: gray;">.</span><span style="color: blue;">shift</span><span style="color: olive;">()</span><span style="color: gray;"> </span><span style="color: #ffa500;">//c为[1, 2, 3, 4]  d为字符串形式的&#8221;first&#8221;</span><span style="color: gray;"><br />
&lt;</span><span style="color: #8b0000;">/</span><span style="color: red;">script&gt;</span></div>
</div>
<p>concat()方法可以返回一个在原有数组上增添了元素的数组，元素用“,”分隔，元素中如果有数组，将被展开并继续添加，但不支持多维数组形式的展开添加</p>
<div>
<div><span style="color: gray;">&lt;</span><span style="color: blue;">script</span><span style="color: gray;">&gt;<br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">a</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">first</span><span style="color: #8b0000;">&#8220;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">second</span><span style="color: #8b0000;">&#8220;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">third</span><span style="color: #8b0000;">&#8220;</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: blue;">s</span><span style="color: gray;"> = </span><span style="color: blue;">a</span><span style="color: gray;">.</span><span style="color: blue;">concat</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">fourth</span><span style="color: #8b0000;">&#8220;</span><span style="color: gray;">,</span><span style="color: olive;">[</span><span style="color: #8b0000;">"</span><span style="color: red;">fifth</span><span style="color: #8b0000;">"</span><span style="color: gray;">, </span><span style="color: #8b0000;">"</span><span style="color: red;">sixth</span><span style="color: #8b0000;">"</span><span style="color: olive;">]</span><span style="color: gray;">,</span><span style="color: olive;">[</span><span style="color: #8b0000;">"</span><span style="color: red;">seventh</span><span style="color: #8b0000;">"</span><span style="color: gray;">, </span><span style="color: olive;">[</span><span style="color: #8b0000;">"</span><span style="color: red;">eighth</span><span style="color: #8b0000;">"</span><span style="color: gray;">, </span><span style="color: #8b0000;">"</span><span style="color: red;">ninth</span><span style="color: #8b0000;">"</span><span style="color: olive;">]])</span><span style="color: gray;"><br />
</span><span style="color: teal;">document</span><span style="color: gray;">.</span><span style="color: blue;">write</span><span style="color: olive;">(</span><span style="color: blue;">s</span><span style="color: olive;">[</span><span style="color: maroon;">7</span><span style="color: olive;">])</span><span style="color: gray;"><br />
</span><span style="color: #ffa500;">// 显示的结果是“eighth, ninth”，说明“eighth, ninth”是以数组的形式被添加了进去，此是s的值为["first", "second", "third", "fourth", "fifth", "sixth", "seventh", ["eighth", "ninth"]]</span><span style="color: gray;"><br />
&lt;</span><span style="color: #8b0000;">/</span><span style="color: red;">script&gt;</span></div>
</div>
<p>slice()方法返回数组的一个片断，或者说是子数组。slice()的参数表示字数组的始末位置，如果只有一个参数，就表示从该处开始一直取到最后，如果参数出现负数，则表示倒数的某个位置。</p>
<div>
<div><span style="color: gray;">&lt;</span><span style="color: blue;">script</span><span style="color: gray;">&gt;<br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">a</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: maroon;">1</span><span style="color: gray;">, </span><span style="color: maroon;">2</span><span style="color: gray;">, </span><span style="color: maroon;">3</span><span style="color: gray;">, </span><span style="color: maroon;">4</span><span style="color: gray;">, </span><span style="color: maroon;">5</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">b</span><span style="color: gray;"> = </span><span style="color: blue;">a</span><span style="color: gray;">.</span><span style="color: blue;">slice</span><span style="color: olive;">(</span><span style="color: maroon;">3</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: #ffa500;">//b为[4, 5]</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">c</span><span style="color: gray;"> = </span><span style="color: blue;">a</span><span style="color: gray;">.</span><span style="color: blue;">slice</span><span style="color: olive;">(</span><span style="color: gray;">-</span><span style="color: maroon;">3</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: #ffa500;">//c为[3, 4, 5]</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">d</span><span style="color: gray;"> = </span><span style="color: blue;">a</span><span style="color: gray;">.</span><span style="color: blue;">slice</span><span style="color: olive;">(</span><span style="color: maroon;">1</span><span style="color: gray;">,-</span><span style="color: maroon;">1</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: #ffa500;">//d为[2, 3, 4]</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">e</span><span style="color: gray;"> = </span><span style="color: blue;">a</span><span style="color: gray;">.</span><span style="color: blue;">slice</span><span style="color: olive;">(</span><span style="color: gray;">-</span><span style="color: maroon;">3</span><span style="color: gray;">,-</span><span style="color: maroon;">1</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: #ffa500;">//e为[3, 4]</span><span style="color: gray;"><br />
&lt;</span><span style="color: #8b0000;">/</span><span style="color: red;">script&gt;</span></div>
</div>
<p>reverse()方法将数组反向排序，他并不创建和返回一个新的数组，而是在原有的数组上进行操作</p>
<div>
<div><span style="color: gray;">&lt;</span><span style="color: blue;">script</span><span style="color: gray;">&gt;<br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">a</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">first</span><span style="color: #8b0000;">&#8220;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">second</span><span style="color: #8b0000;">&#8220;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">third</span><span style="color: #8b0000;">&#8220;</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: blue;">a</span><span style="color: gray;">.</span><span style="color: blue;">reverse</span><span style="color: olive;">()</span><span style="color: gray;"><br />
</span><span style="color: teal;">document</span><span style="color: gray;">.</span><span style="color: blue;">write</span><span style="color: olive;">(</span><span style="color: blue;">a</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: #ffa500;">//显示的结果是“third,second,first”，这时候数组的顺序已经颠倒了</span><span style="color: gray;"><br />
&lt;</span><span style="color: #8b0000;">/</span><span style="color: red;">script&gt;</span></div>
</div>
<p>sort()方法的作用是对数组进行排序，这是一个非常奇特的方法，我不知道当初创作他的人是出于懒惰还是聪明，这是一个让我印象深刻的方法。<br />
sort()方法的参数是一个有两个参数，并且有返回值的函数，如果返回的值大于零，则说明前一个参数比后一个参数大，等于零则相等，小于零说明前一个参数比后一个小，而相对小的那个参数将出现在排序的前列。<br />
sort()方法直接在数组上进行操作，同时也返回值，但是两者似乎是等价的。sort()方法默认是用字母的顺序进行排序</p>
<div>
<div><span style="color: gray;">&lt;</span><span style="color: blue;">script</span><span style="color: gray;">&gt;<br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">a</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: maroon;">33</span><span style="color: gray;">, </span><span style="color: maroon;">4</span><span style="color: gray;">, </span><span style="color: maroon;">111</span><span style="color: gray;">, </span><span style="color: maroon;">543</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: blue;">a</span><span style="color: gray;">.</span><span style="color: blue;">sort</span><span style="color: olive;">(</span><span style="color: blue;">way</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: green;">function</span><span style="color: gray;"> </span><span style="color: blue;">way</span><span style="color: olive;">(</span><span style="color: blue;">x</span><span style="color: gray;">, </span><span style="color: blue;">y</span><span style="color: olive;">){</span><span style="color: gray;"><br />
</span><span style="color: green;">if</span><span style="color: gray;"> </span><span style="color: olive;">(</span><span style="color: blue;">x</span><span style="color: gray;"> % </span><span style="color: maroon;">2</span><span style="color: gray;"> ==</span><span style="color: maroon;">0</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: green;">return</span><span style="color: gray;"> </span><span style="color: maroon;">1</span><span style="color: gray;">;<br />
</span><span style="color: green;">if</span><span style="color: gray;"> </span><span style="color: olive;">(</span><span style="color: blue;">x</span><span style="color: gray;"> % </span><span style="color: maroon;">2</span><span style="color: gray;"> !=</span><span style="color: maroon;">0</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: green;">return</span><span style="color: gray;"> -</span><span style="color: maroon;">1</span><span style="color: gray;">;<br />
</span><span style="color: olive;">}</span><span style="color: gray;"><br />
</span><span style="color: #ffa500;">//排序的结果是使奇数在前偶数在后</span><span style="color: gray;"><br />
&lt;</span><span style="color: #8b0000;">/</span><span style="color: red;">script&gt;</span></div>
</div>
<p>splice()方法的作用是插入、删除或者替换一个数组元素，他不光会在原有的数组上进行修改，还会返回被处理掉的内容，因此这是一个功能强大，但是不容易使用的方法，splice()方法用前两个参数进行定位，余下的参数表示插入部分。</p>
<div>
<div><span style="color: gray;">&lt;</span><span style="color: blue;">script</span><span style="color: gray;">&gt;<br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">a</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: maroon;">1</span><span style="color: gray;">, </span><span style="color: maroon;">2</span><span style="color: gray;">, </span><span style="color: maroon;">3</span><span style="color: gray;">, </span><span style="color: maroon;">4</span><span style="color: gray;">, </span><span style="color: maroon;">5</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">b</span><span style="color: gray;"> = </span><span style="color: blue;">a</span><span style="color: gray;">.</span><span style="color: blue;">splice</span><span style="color: olive;">(</span><span style="color: maroon;">2</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: #ffa500;">//a为[1, 2]  b为[3, 4, 5]</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">c</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: maroon;">1</span><span style="color: gray;">, </span><span style="color: maroon;">2</span><span style="color: gray;">, </span><span style="color: maroon;">3</span><span style="color: gray;">, </span><span style="color: maroon;">4</span><span style="color: gray;">, </span><span style="color: maroon;">5</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">d</span><span style="color: gray;"> = </span><span style="color: blue;">c</span><span style="color: gray;">.</span><span style="color: blue;">splice</span><span style="color: olive;">(</span><span style="color: maroon;">2</span><span style="color: gray;">,</span><span style="color: maroon;">2</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: #ffa500;">//c为[1, 2, 5]  d为[3, 4]</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">e</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: maroon;">1</span><span style="color: gray;">, </span><span style="color: maroon;">2</span><span style="color: gray;">, </span><span style="color: maroon;">3</span><span style="color: gray;">, </span><span style="color: maroon;">4</span><span style="color: gray;">, </span><span style="color: maroon;">5</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">f</span><span style="color: gray;"> = </span><span style="color: blue;">f</span><span style="color: gray;">.</span><span style="color: blue;">splice</span><span style="color: olive;">(</span><span style="color: gray;">-</span><span style="color: maroon;">4</span><span style="color: gray;">,</span><span style="color: maroon;">2</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: #ffa500;">//e为[1, 4, 5]  f为[2, 3]</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">g</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: maroon;">1</span><span style="color: gray;">, </span><span style="color: maroon;">2</span><span style="color: gray;">, </span><span style="color: maroon;">3</span><span style="color: gray;">, </span><span style="color: maroon;">4</span><span style="color: gray;">, </span><span style="color: maroon;">5</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">h</span><span style="color: gray;"> = </span><span style="color: blue;">g</span><span style="color: gray;">.</span><span style="color: blue;">splice</span><span style="color: olive;">(</span><span style="color: gray;">-</span><span style="color: maroon;">2</span><span style="color: gray;">,-</span><span style="color: maroon;">2</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: #ffa500;">//第二个参数表示长度，因此负数在此无效</span><span style="color: gray;"></p>
<p></span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">i</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: maroon;">1</span><span style="color: gray;">, </span><span style="color: maroon;">2</span><span style="color: gray;">, </span><span style="color: maroon;">3</span><span style="color: gray;">, </span><span style="color: maroon;">4</span><span style="color: gray;">, </span><span style="color: maroon;">5</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">j</span><span style="color: gray;"> = </span><span style="color: blue;">i</span><span style="color: gray;">.</span><span style="color: blue;">splice</span><span style="color: olive;">(</span><span style="color: maroon;">2</span><span style="color: gray;">,</span><span style="color: maroon;">2</span><span style="color: gray;">,</span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">first</span><span style="color: #8b0000;">&#8220;</span><span style="color: gray;">,</span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">second</span><span style="color: #8b0000;">&#8220;</span><span style="color: gray;">,</span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">third</span><span style="color: #8b0000;">&#8220;</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: #ffa500;">//i为[1, 2, "first", "second", "third", 5]  j为[3, 4]  后面部分会自动前后移动，以保持数组的连续性</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">k</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: teal;">Array</span><span style="color: olive;">(</span><span style="color: maroon;">1</span><span style="color: gray;">, </span><span style="color: maroon;">2</span><span style="color: gray;">, </span><span style="color: maroon;">3</span><span style="color: gray;">, </span><span style="color: maroon;">4</span><span style="color: gray;">, </span><span style="color: maroon;">5</span><span style="color: olive;">)</span><span style="color: gray;"><br />
</span><span style="color: green;">var</span><span style="color: gray;"> </span><span style="color: blue;">l</span><span style="color: gray;"> = </span><span style="color: blue;">k</span><span style="color: gray;">.</span><span style="color: blue;">splice</span><span style="color: olive;">(</span><span style="color: maroon;">2</span><span style="color: gray;">,</span><span style="color: maroon;">2</span><span style="color: gray;">,</span><span style="color: olive;">[</span><span style="color: #8b0000;">"</span><span style="color: red;">first</span><span style="color: #8b0000;">"</span><span style="color: gray;">,</span><span style="color: #8b0000;">"</span><span style="color: red;">second</span><span style="color: #8b0000;">"</span><span style="color: olive;">]</span><span style="color: gray;">,</span><span style="color: #8b0000;">&#8220;</span><span style="color: red;">third</span><span style="color: #8b0000;">&#8220;</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: #ffa500;">//k为[1, 2, ["first", "second"], &#8220;third&#8221;, 5]  l为[3, 4]  splice()方法不会展开数组，只直接写入</span></div>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/webdev/javascript-webdev/200906491/javascript-array.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/webdev/javascript-webdev/200906491/javascript-array.html</feedburner:origLink></item>
		<item>
		<title>三种方法解决ie6透明png背景图片问题</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/ywPSFG2WT_c/ie6-png.html</link>
		<comments>http://degula.com/webdev/200906490/ie6-png.html#comments</comments>
		<pubDate>Wed, 17 Jun 2009 03:18:39 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[web开发]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[web develop]]></category>

		<guid isPermaLink="false">http://degula.com/?p=490</guid>
		<description><![CDATA[ie6中透明背景图片问题是个老大难，主要的解决方法有使用JavaScript和css滤镜等。在使用css滤镜的时候要注意的一点是图片的src要使用绝对路径，否则会找不到图片~~
下面收集了一些这方面的东西备忘
&#8212;&#8211;


方法一、通过 css 和 IE 专有属性 behavior 解决整站 png 背景透明问题
&#60;style type=&#8221;text/css&#8221;&#62;
img, div, a, input { behavior: url(/css/resources/iepngfix.htc) }
&#60;/style&#62;
htc文件内容
&#60;public:component&#62;
&#60;public:attach event=&#8221;onpropertychange&#8221; onevent=&#8221;iePNGFix(0)&#8221; /&#62;
&#60;script type=&#8221;text/javascript&#8221;&#62;
// IE5.5+ PNG Alpha Fix v1.0
// (c) 2004-2008 Angus Turnbull http://www.twinhelix.com
// This is licensed under the GNU LGPL, version 2.1 or later.
// For details, see: http://creativecommons.org/licenses/LGPL/2.1/
// This must be a path to a blank image, [...]]]></description>
			<content:encoded><![CDATA[<p>ie6中透明背景图片问题是个老大难，主要的解决方法有使用JavaScript和css滤镜等。在使用css滤镜的时候要注意的一点是图片的src要使用绝对路径，否则会找不到图片~~<br />
下面收集了一些这方面的东西备忘<br />
&#8212;&#8211;</p>
<p><span id="more-490"></span></p>
<div>
<p>方法一、通过 css 和 IE 专有属性 <strong>behavior </strong>解决整站 png 背景透明问题</p>
<p>&lt;style type=&#8221;text/css&#8221;&gt;<br />
img, div, a, input { behavior: url(/css/resources/iepngfix.htc) }<br />
&lt;/style&gt;</p>
<p>htc文件内容</p>
<p>&lt;public:component&gt;<br />
&lt;public:attach event=&#8221;onpropertychange&#8221; onevent=&#8221;iePNGFix(0)&#8221; /&gt;</p>
<p>&lt;script type=&#8221;text/javascript&#8221;&gt;</p>
<p>// IE5.5+ PNG Alpha Fix v1.0<br />
// (c) 2004-2008 Angus Turnbull <a href="http://www.twinhelix.com/">http://www.twinhelix.com</a></p>
<p>// This is licensed under the GNU LGPL, version 2.1 or later.<br />
// For details, see: <a href="http://creativecommons.org/licenses/LGPL/2.1/">http://creativecommons.org/licenses/LGPL/2.1/</a><br />
// This must be a path to a blank image, relative to the HTML document(s).<br />
// In production use I suggest &#8216;/images/blank.gif&#8217; or similar. That&#8217;s all!<br />
if (typeof blankImg == &#8216;undefined&#8217;) var blankImg = &#8216;blank.gif&#8217;;</p>
<p>//注意上面blank空白像素文件的路径</p>
<p>function filt(s, b)<br />
{<br />
var f = &#8216;DXImageTransform.Microsoft.AlphaImageLoader&#8217;;<br />
var sM = (currentStyle.backgroundRepeat == &#8216;no-repeat&#8217;) ? &#8216;crop&#8217; : &#8217;scale&#8217;;<br />
s = (s || &#8221;).replace(/\(/g, &#8216;%28&#8242;).replace(/\)/g, &#8216;%29&#8242;);</p>
<p>if (s &amp;&amp; !(/IMG|INPUT/.test(nodeName) &amp;&amp; !b) &amp;&amp;<br />
currentStyle.width == &#8216;auto&#8217; &amp;&amp; currentStyle.height == &#8216;auto&#8217;)<br />
{<br />
style.width = offsetWidth + &#8216;px&#8217;;<br />
style.height = clientHeight + &#8216;px&#8217;;<br />
if (currentStyle.display == &#8216;inline&#8217;) style.display = &#8216;inline-block&#8217;;<br />
}</p>
<p>if (filters[f])<br />
{<br />
filters[f].enabled = s ? true : false;<br />
if (s) with (filters[f]) { src = s }<br />
}<br />
else if (s) style.filter = &#8216;progid:&#8217;+f+&#8217;(src=&#8221;&#8216;+s+&#8217;&#8221;,sizingMethod=&#8221;&#8216; + sM + &#8216;&#8221;)&#8217;;<br />
}</p>
<p>function iePNGFix(init)<br />
{<br />
if (!/MSIE (5\.5|6)/.test(navigator.userAgent) || typeof filters == &#8216;unknown&#8217;) return;<br />
var evt = init ? { propertyName: &#8217;src,background&#8217; } : event;<br />
var isSrc = /src/.test(evt.propertyName);<br />
var isBg = /background/.test(evt.propertyName);<br />
var isClass = !init &amp;&amp;<br />
((this.className != this._png_class) &amp;&amp; (this.className || this._png_class));<br />
if (!(isSrc || isBg || isClass)) return;<br />
this._png_class = this.className;<br />
var blank = blankImg.match(/([^\/]+)$/)[1];</p>
<p>// Required for Whatever:hover support &#8211; erase any set BG if className changes.<br />
if (isClass &amp;&amp; ((style.backgroundImage.indexOf(&#8217;url(&#8217;) == -1) ||<br />
(style.backgroundImage.indexOf(blank) &gt; -1)))<br />
{<br />
setTimeout(function() { this.style.backgroundImage = &#8221; }, 0);<br />
return;<br />
}</p>
<p>if (isSrc &amp;&amp; this.src &amp;&amp; /IMG|INPUT/.test(nodeName))<br />
{<br />
if ((/\.png/i).test(src))<br />
{<br />
filt(src, 1);<br />
src = blankImg;<br />
}<br />
else if (src.indexOf(blank) == -1) filt();<br />
}</p>
<p>var bgSrc = currentStyle.backgroundImage || style.backgroundImage;<br />
if ((bgSrc + this.src).indexOf(blank) == -1)<br />
{<br />
var bgPNG = bgSrc.match(/^url[("']+(.*\.png[^\)"']*)[\)"']+[^\)]*$/i);</p>
<p>if (bgPNG)<br />
{<br />
style.backgroundImage = &#8216;url(&#8221;&#8216; + blankImg + &#8216;&#8221;)&#8217;;<br />
filt(bgPNG[1], 0);<br />
// Unclickable elements inside PNG backgrounds.<br />
var tags = ['a', 'input', 'select', 'textarea', 'iframe', 'object'],<br />
t = tags.length, tFix = [];<br />
while (t&#8211;)<br />
{<br />
var elms = all.tags(tags[t]), e = elms.length;<br />
while (e&#8211;) tFix.push(elms[e]);<br />
}<br />
var t = tFix.length;<br />
if (t &amp;&amp; (/relative|absolute/i).test(currentStyle.position))<br />
alert(&#8217;IEPNGFix: Children of positioned element are unclickable:\n\n&lt;&#8217; +<br />
nodeName + (id &amp;&amp; &#8216; id=&#8217; + id) + &#8216;&gt;&#8217;);<br />
while (t&#8211;)<br />
if (!(/relative|absolute/i).test(tFix[t].currentStyle.position))<br />
tFix[t].style.position = &#8216;relative&#8217;;<br />
}<br />
else filt();<br />
}<br />
}</p>
<p>iePNGFix(1);</p>
<p>&lt;/script&gt;<br />
&lt;/public:component&gt;</p>
<p>方法二、通过 css ie滤镜解决<br />
&lt;style type=&#8221;text/css&#8221;&gt;<br />
&lt;!&#8211;<br />
.pngpic { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src=&#8217;/pngpic.png&#8217;,sizingMethod=&#8217;crop&#8217;); }<br />
&#8211;&gt;<br />
&lt;/style&gt;</p>
<p>这里需要注意的是src的路径</p>
<p>方法三、通过 javascript 和 css 滤镜解决 IE 整站 png 背景透明问题<br />
&lt;script type=&#8221;text/javascript&#8221; language=&#8221;javascript&#8221;&gt;<br />
function enablePngImages() {<br />
var imgArr = document.getElementsByTagName(&#8221;IMG&#8221;);<br />
for(i=0; i&lt;imgArr.length; i++){<br />
if(imgArr[i].src.toLowerCase().lastIndexOf(&#8221;.png&#8221;) != -1){<br />
imgArr[i].style.filter = &#8220;progid:DXImageTransform.Microsoft.AlphaImageLoader(src=&#8217;&#8221; + imgArr[i].src + &#8220;&#8216;, sizingMethod=&#8217;auto&#8217;)&#8221;;<br />
imgArr[i].src = &#8220;spacer.gif&#8221;;<br />
}</p>
<p>if(imgArr[i].currentStyle.backgroundImage.lastIndexOf(&#8221;.png&#8221;) != -1){<br />
var img = imgArr[i].currentStyle.backgroundImage.substring(5,imgArr[i].currentStyle.backgroundImage.length-2);<br />
imgArr[i].style.filter = &#8220;progid:DXImageTransform.Microsoft.AlphaImageLoader(src=&#8217;&#8221;+img+&#8221;&#8216;, sizingMethod=&#8217;crop&#8217;)&#8221;;<br />
imgArr[i].style.backgroundImage = &#8220;url(spacer.gif)&#8221;;<br />
}<br />
}<br />
}</p>
<p>function enableBgPngImages(bgElements){<br />
for(i=0; i&lt;bgElements.length; i++){<br />
if(bgElements[i].currentStyle.backgroundImage.lastIndexOf(&#8221;.png&#8221;) != -1){<br />
//alert(bgElements[i]);<br />
var img = bgElements[i].currentStyle.backgroundImage.substring(5,bgElements[i].currentStyle.backgroundImage.length-2);<br />
bgElements[i].style.filter = &#8220;progid:DXImageTransform.Microsoft.AlphaImageLoader(src=&#8217;&#8221;+img+&#8221;&#8216;, sizingMethod=&#8217;crop&#8217;)&#8221;;<br />
bgElements[i].style.backgroundImage = &#8220;url(spacer.gif)&#8221;;<br />
}<br />
}<br />
}<br />
&lt;/script&gt;</p>
<p>&lt;img src=&#8221;pngpic.png&#8221; alt=&#8221;" border=&#8221;0&#8243; /&gt;<br />
&lt;!&#8211;[if lt IE 7]&gt;<br />
&lt;script type=&#8217;text/javascript&#8217;&gt;<br />
var bgElements;<br />
enablePngImages();<br />
if(bgElements){<br />
enableBgPngImages(bgElements);<br />
}<br />
&lt;/script&gt;<br />
&lt;![endif]&#8211;&gt;</p></div>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/webdev/200906490/ie6-png.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://degula.com/webdev/200906490/ie6-png.html</feedburner:origLink></item>
		<item>
		<title>GridView和DataGrid的异同</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/zlCJZBKsTKU/gridview-and-datagrid.html</link>
		<comments>http://degula.com/dotnet/200906488/gridview-and-datagrid.html#comments</comments>
		<pubDate>Thu, 04 Jun 2009 10:27:20 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[dotnet]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>

		<guid isPermaLink="false">http://degula.com/?p=488</guid>
		<description><![CDATA[一、GridView和DataGrid的异同
GridView 是 DataGrid的后继控件，在.net framework 2 中，虽然还存在DataGrid，但是GridView已经走上了历史的前台，取代DataGrid的趋势已是势不可挡。GridView和 DataGrid功能相似，都是在web页面中显示数据源中的数据，将数据源中的一行数据，也就是一条记录，显示为在web页面上输出表格中的一行。
GridView相对于DataGrid来说，具有如下优势， 功能上更加丰富，因为提供了智能 标记面板（也就是show smart tag）更加易用方便,常用的排序、分页、更新、删除等操作可以零代码实现！具有PagerTemplate属性，可以自定义用户导航页面，也就是说分页 的控制更加随心所欲。GridView和DataGrid在事件模型上也多有不同之处，DataGrid控件引发的都是单个事件，而GridView控件 会引发两个事件，一个在操作前发生，一个在操作后发生，操作前的事件多位***ing事件，操作后的事件多位***ed事件，比如Sorting 事件和sorted 事件，RowDeleting和RowDeleted事件。
二、GridView操作初步


1、显示数据源中的数据
从ToolBox中选取GridView控件拖到页面上，然后 点击右键，选择Show Smart Tag,在Choose Data Source中选择 New Data Source, 出现Data Source Configuration Wizard,选择连接字符串，可以选择已经存放在web.config中的ConnectionString ,然后可以选择是使用存储过程，还是从表或视图中选择数据。
在这一步，左侧的Where语句可以指定查询条件，点击 Where，出现Add Where Clause ,选择要设定条件的列，操作符是等于还是like还是其它，然后选择Source，也就是说要限定的条件从哪里取值，可以是Control、 Session、Form、Cookie、QueryStirng等，如果选择Control，那么需要在右侧，选中是那个控件，然后还可以设定默认值， 设定完后系统自动生成Sql 表达式和值的表达式，此时点击Add按钮，完成条件的添加，Where Cluase下出现刚刚添加的条件。如果没有点击Add，很容易设定了条件，但是因为没有添加到Where子句中，所以不起作用。
在这一步，左侧的Order By，可以让我们设定排序列，就是我们取出的记录要按照什么派逊，可以设定三个列，是升序还是降序。
在这一部，左侧的Advanced，可以设定Advanced Sql Generation Options,这里可以生成这个查询的Insert、update、Delete语句，当然，前提是您选择的字段中必须包含了主键。当您想在 GridView中不编写任何代码实现对表格的编辑、删除等操作时，就必须在配置数据源时，在这里生成Insert、Update、Delete这些语 句。 GridView中编辑删除等操作的零代码，就是根据配置数据源时自动生成的这些语句来完成数据源的更新删除等操作的。
在最后一步，您可以测试一下您刚刚生成的查询是否正确，最后点击完成，数据已经出现在页面上了，按Ctrl+F5运行。
恭喜您！您已经会使用Asp.net来显示数据库中的数据了。
2、让GridView可以分页
GridView 把数据显示出来了，但是那么多条记录罗列到一页上是不合适的，我们应该对数据 进行分页。还记得在asp时代，分页是多么的麻烦，需要编写很多的代码，而且各种分页组件也应运而生。而在GridView中，您会发现，分页是如此的简 单，只需要您轻点鼠标，在Show Smart Tag中，选中Enable Paging，表格的分页操作变完成了，是不是So Easy呢。
并不是什么数据源都可以让GridView实现自动分页的，比 如如果 DataSourceMode是DataReader，就无法实现自动分页。而且只有ObjectDataSource是界面级别的支持分页，类似我们常 用的SqlDataSource都是先提取所有的记录，然后只显示本页需要显示的记录，然后抛弃其余的记录，都有点浪费资源的啦！
当GridView的AllowPaging属性设置为 True的时候，我们实现了分页，我们 还可以对分页进行一些个性化的设置。常用的属性包括：PageIndex――设置数据显示的当前页面，默认是0，也就是数据的首页。PageSize [...]]]></description>
			<content:encoded><![CDATA[<p><span><span>一、GridView和DataGrid的异同</span></span></p>
<p ><span>GridView 是 DataGrid的后继控件，在.net framework 2 中，虽然还存在DataGrid，但是GridView已经走上了历史的前台，取代DataGrid的趋势已是势不可挡。GridView和 DataGrid功能相似，都是在web页面中显示数据源中的数据，将数据源中的一行数据，也就是一条记录，显示为在web页面上输出表格中的一行。</span></p>
<p ><span>GridView相对于DataGrid来说，具有如下优势， 功能上更加丰富，因为提供了智能 标记面板（也就是show smart tag）更加易用方便,常用的排序、分页、更新、删除等操作可以零代码实现！具有PagerTemplate属性，可以自定义用户导航页面，也就是说分页 的控制更加随心所欲。GridView和DataGrid在事件模型上也多有不同之处，DataGrid控件引发的都是单个事件，而GridView控件 会引发两个事件，一个在操作前发生，一个在操作后发生，操作前的事件多位***ing事件，操作后的事件多位***ed事件，比如Sorting 事件和sorted 事件，RowDeleting和RowDeleted事件。</span></p>
<p ><span>二、GridView操作初步</span></p>
<p ><span><span id="more-488"></span><br />
</span></p>
<p ><span>1、显示数据源中的数据</span></p>
<p ><span>从ToolBox中选取GridView控件拖到页面上，然后 点击右键，选择Show Smart Tag,在Choose Data Source中选择 New Data Source, 出现Data Source Configuration Wizard,选择连接字符串，可以选择已经存放在web.config中的ConnectionString ,然后可以选择是使用存储过程，还是从表或视图中选择数据。</span></p>
<p ><span>在这一步，左侧的Where语句可以指定查询条件，点击 Where，出现Add Where Clause ,选择要设定条件的列，操作符是等于还是like还是其它，然后选择Source，也就是说要限定的条件从哪里取值，可以是Control、 Session、Form、Cookie、QueryStirng等，如果选择Control，那么需要在右侧，选中是那个控件，然后还可以设定默认值， 设定完后系统自动生成Sql 表达式和值的表达式，此时点击Add按钮，完成条件的添加，Where Cluase下出现刚刚添加的条件。如果没有点击Add，很容易设定了条件，但是因为没有添加到Where子句中，所以不起作用。</span></p>
<p ><span>在这一步，左侧的Order By，可以让我们设定排序列，就是我们取出的记录要按照什么派逊，可以设定三个列，是升序还是降序。</span></p>
<p ><span>在这一部，左侧的Advanced，可以设定Advanced Sql Generation Options,这里可以生成这个查询的Insert、update、Delete语句，当然，前提是您选择的字段中必须包含了主键。当您想在 GridView中不编写任何代码实现对表格的编辑、删除等操作时，就必须在配置数据源时，在这里生成Insert、Update、Delete这些语 句。 GridView中编辑删除等操作的零代码，就是根据配置数据源时自动生成的这些语句来完成数据源的更新删除等操作的。</span></p>
<p ><span>在最后一步，您可以测试一下您刚刚生成的查询是否正确，最后点击完成，数据已经出现在页面上了，按Ctrl+F5运行。</span></p>
<p ><span>恭喜您！您已经会使用Asp.net来显示数据库中的数据了。</span></p>
<p ><span>2、让GridView可以分页</span></p>
<p ><span>GridView 把数据显示出来了，但是那么多条记录罗列到一页上是不合适的，我们应该对数据 进行分页。还记得在asp时代，分页是多么的麻烦，需要编写很多的代码，而且各种分页组件也应运而生。而在GridView中，您会发现，分页是如此的简 单，只需要您轻点鼠标，在Show Smart Tag中，选中Enable Paging，表格的分页操作变完成了，是不是So Easy呢。</span></p>
<p ><span>并不是什么数据源都可以让GridView实现自动分页的，比 如如果 DataSourceMode是DataReader，就无法实现自动分页。而且只有ObjectDataSource是界面级别的支持分页，类似我们常 用的SqlDataSource都是先提取所有的记录，然后只显示本页需要显示的记录，然后抛弃其余的记录，都有点浪费资源的啦！</span></p>
<p ><span>当GridView的AllowPaging属性设置为 True的时候，我们实现了分页，我们 还可以对分页进行一些个性化的设置。常用的属性包括：PageIndex――设置数据显示的当前页面，默认是0，也就是数据的首页。PageSize ――也就是一页显示多少条记录，默认为10条。在PagerSettings中，还可以对分页的导航按钮进行详细设置，在Mode属性中，可以设置： Numeric――默认的，分页用数字表示，1，2，3……。NextPrevious、NextPreviousFirstLast、 NumericFirstLast均可顾名思义，显示上一页、下一页、首页、末页等。当Mode设定不是Numeric时，那么可以通过设定 FirstPageText、LastPageText等属性来实现分页导航时，到首页、末页、下页、上页时显示的文字提示。</span></p>
<p ><span>如果想实现分页界面的完全自动控制，还可以点击 GridView右键，选择编辑模版－ PagerTemplate来实现，在模版中加入若干个Button控件，然后将Button控件的CommandName属性设置为Page,将 CommandArgument属性分别设置为First、Last、Prev、Next或者一个数字，即可实现分页操作。</span></p>
<p ><span>3、GridView中的编辑、删除、排序</span></p>
<p ><span>数据从数据源中提取出现，显示在网页上后，我们如果需要对其中的数据进行编辑、更新、删除等操作，还是不需要编写任何代码，利用GridView内置的功能即可实现。</span></p>
<p ><span>在智能标记中，点击编辑列，在Avaliable Fields中，选择ComandField，然后双击Edit,update,cancel和Delete，我们就为GridView添加了编辑和删除 功能。如果在配置数据源的时候，我们已经生成了Insert、update、delete这些语句，那么我们现在就可以执行程序。点击页面上的Edit， 出现Update和Cancel按钮，同时当前行除了主键以外的列，数值都放在了一个文本框中，可以进行编辑，然后点击Update即可保存。点击 Delete，删除当前行记录。您是不是已经被GridView强大的功能折服了呢？</span></p>
<p ><span>在Show Smart Tag中，选择Enable Sorting，这时所有列的Header都变成了一个超链接，其实这些都是一个LinkButton控件，运行代码，在网页生成的数据表中，点击第一行中的列名，即可按照当前列进行排序，再次点击则反向排序。</span></p>
<p ><span>如果您只需要对其中的几列进行排序，可以在智能标记中，选择编 辑列，选中要排序的列，然后在右 侧的属性中找到SortExpression属性，然后从下拉框中选择根据哪个字段排序，一般当然是当前字段咯，完成排序的设置。如果您不需要这一列参与 排序，那么只需要把此列的SortExpression属性后面的值删除，也就是说设置成空字符串即可。试一试，是不是排序已经尽在掌握之中了呢？</span></p>
<p ><span>三、GridView中的自定义列</span></p>
<p ><span>GridView可以根据数据源自动生成列，但是如果我们需要 自定义列的显示方式，让 GridView的列完完全全的由我们自己来控制，我们就需要用到一种特殊的列――TemplateField。因为GridView生成的列都是一个字 段一列，如果我们需要把两个字段合并为一列显示呢？我们可以使用模板列。我们可以指定包含标记和控件的模版，自定义列的布局和行为，我们可以新建一个模版 列，也可以直接把已经生成的列转换为模版列来进行个性化的设置。</span></p>
<p ><span>在GridView上单击右键，选择编辑模版，在弹出菜单中选 择要编辑的列，出现列模版的编辑 画面。其中HeaderTemplate――自定义列的标头部分显示的内容，FooterTemplate――脚注部分显示哪谌荩?/SPAN&gt; ItemTemplate――是打开网页后此列数据显示的内容，EditItemTemplate――此列处于编辑状态时如何显示， AlternatingItemTemplate――交替项显示的内容，也就是说为了显示效果，可以隔行分别以不同的风格显示。</span></p>
<p ><span>Example 1：</span></p>
<p ><span>我们现在假设有一个表，其中有一个字段是username，我 们现在产生一个自定义列，自定义 列中包含此人的照片，同时我们假定照片的路径为image/username.jpg。我们首先右键点击GridView，在智能标记中，选择编辑列，添 加一个模版列，然后编辑模版中的ItemTemplate，加入一个Image控件，然后右键点击Image控件，选择Edit DataBindings，在ImageUrl中设置Field Binding，首先我我要Bound to 数据源中的某列，因为所有图片的路径和格式是相同的，唯有名字不同而已，所以我们这里选中username字段，在format中，我们要自己定义其格 式，输入image/{0}.jpg, {0}代表的就是上面绑定的字段，下面有一个Two Way DataBinding 的复选框，就是是否双向绑定的意思，如果单向绑定，一般采用Eval，也就是说数值只从数据源传到页面上，如果双向绑定，也就是采用Bind的话，对数据 的修改可以回传到数据源之中。 </span></p>
<p ><span>在web页面执行时，不同的行因为username不同，图片的名字也会做出相应的替换。点击确定，然后执行当前网页，我们就可以看到在我们的自定义列中显示出了用户的照片。</span></p>
<p ><span>Example 2：</span></p>
<p ><span>在数据库中，存储性别的时候，一般采用bit数据类型，存储为 True或者False，在 GridView自动生成列的时候，一般使用CheckedBoxField 列来显示bit类型的数据，显示在网页上就是一个单选框，如果选中，也就是Checked了，就是男的，否则就是女的。这样看起来，很不直观，下面我们通 过自定义列将性别显示为男、女。</span></p>
<p ><span>首先在GridView的Show Smart Tag中，选择编辑列，然后双击TemplateFields ,添加了一个模版列，确定后，点击右键选择编辑模版，选中刚添加的列。在ItemTemplate中添加一个DropListDown控件，然后编辑它的 数据绑定，Edit DataBinding，把SelectedValue属性绑定到性别列。</span></p>
<p ><span>在DropListDown控件中选择 Edit Item，就是编辑其下拉列表的项，我们添加两个Item，一个的Text属性是男，Value设置为True，一个的Text属性设置为女，Value 属性设置为False。到这里，你明白了么？因为DropDownList控件的显示文本和其值是可以不一样的，我们用数据绑定取到了性别这一列的值， True或者False，然后反映到DropDownList控件上，如果值为True，因为Text属性为男的Item的Value为True，所以我 们现在运行网页，在新添加的列中，显示的不再是单选框或者True、false这些没有含义的东西，而是以下拉列表的方式显示出了当前用户是 男还是女。</span></p>
<p ><span>四、自定义列中的数据更新</span></p>
<p ><span>假设数据库中有一个&#8221;权限&#8221;字段，值为0代表未审核用户，为1 代表一般用户，为9则代表管理员 用户。根据前面所说的自定义列的办法，通过对DropListDown的绑定，在网页中显示权限为 &#8220;管理员&#8221;，而不是显示数字9。问题产生了，如果我们调整用户权限的话，比如把一般用户更改为管理员，在编辑模版中的用户权限的下拉列表，如何把它的值返 回给数据源来完成更新操作。</span></p>
<p ><span>我们在EditItemTemplate中设置的 DropListDown控件，必须选中了 Two Way DataBinding，也就是数据双向帮定，这样才能返回数据。前面我们谈到，在GridView中，事件不是单个的，是两个，一个是发生前，一个是发 生后，因为我们需要在数据更新前把下拉列表的权限值传送出去，所以我们需要对GridView1_RowUpdating 进行编码,编码如下：</span></p>
<p ><span>protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)</span></p>
<p ><span>{</span></p>
<p ><span>//当前编辑的是哪行？</span></p>
<p ><span> int index = GridView1.EditIndex;</span></p>
<p ><span>//取得当前编辑行的GridViewRow对象</span></p>
<p ><span> GridViewRow gvr = GridView1.Rows[index];</span></p>
<p ><span>//在当前行中，寻找DropListDown控件</span></p>
<p ><span> DropDownList dp = (DropDownList)gvr.FindControl(&#8221;editdrop&#8221;);</span></p>
<p ><span>//将DropListDown的值赋给NewValues集合中的权限字段。</span></p>
<p ><span> e.NewValues["rights"] = dp.SelectedValue;</span></p>
<p ><span>}</span></p>
<p ><span>2、RowDataBound事件</span></p>
<p ><span>在创建gridView控件时，必须先为GridView的每 一行创建一个 GridViewRow对象，创建每一行时，将引发一个RowCreated事件；当行创建完毕，每一行GridViewRow就要绑定数据源中的数据， 当绑定完成后，将引发RowDataBound事件。如果说我们可以利用RowCreated事件来控制每一行绑定的控件，那么我们同样可以利用 RowDataBound事件来控制每一行绑定的数据，也就是让数据如何呈现给大家。</span></p>
<p ><span>还举同样的例子，在数据表中，存在性别列，上面我们用DropListDown控件的DataBounding来表示出了中文的性别，但是毕竟不太美观，我们现在可以利用Label控件和RowDataBound事件来实现完美的中文性别显示。RowDataBound，</span></p>
<p ><span>首先，还是把性别列，设置为模板列，并添加一个Label控件，将Label控件绑定到数据源的性别段，然后我们在GridView控件属性的事件列表中双击RowDataBound，生成如下事件：</span></p>
<p ><span>Example：</span></p>
<p  align="left"><span> protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)</span></p>
<p  align="left"><span>{</span></p>
<p  align="left"><span>//判断当前行是否是数据行</span></p>
<p  align="left"><span> if (e.Row.RowType == DataControlRowType.DataRow)</span></p>
<p  align="left"><span> { //用FindControl方法找到模板中的Label控件</span></p>
<p  align="left"><span>Label lb1= (Label)e.Row.FindControl(&#8221;Label1&#8243;);</span></p>
<p  align="left"><span>//因为RowDataBound是发生在数据绑定之后，所以我们可以</span></p>
<p  align="left"><span>//判断Label绑定的数据，如果是True，就更改其text属性为男</span></p>
<p  align="left"><span> if (lb1.Text== &#8220;True&#8221;)</span></p>
<p  align="left"><span> lb1.Text = &#8220;男&#8221;;</span></p>
<p  align="left"><span> else</span></p>
<p  align="left"><span> lb1.Text = &#8220;female&#8221;;</span></p>
<p  align="left"><span> }</span></p>
<p ><span> }</span></p>
<p ><span>3、RowType</span></p>
<p ><span>RowType可以确定GridView中行的类 型，RowType是玫举变量 DataControlRowType中的一个值。RowType可以取值包括 DataRow、Footer、Header、EmptyDataRow、Pager、Separator。很多时候，我们需要判断当前是否是数据行，通 过如下代码来进行判断 ：</span></p>
<p  align="left"><span> if (e.Row.RowType == DataControlRowType.DataRow)</span></p>
<p ><span>4、RowDeleting和RowDeleted事件</span></p>
<p ><span>RowDeleting发生在删除数据之前，RowDeleted发生在删除数据之后。</span></p>
<p ><span>使用RowDeleting事件，可以在真正删除前再次确认是否删除，可以通过设置GridViewDeleteEventArgs.Cancel=True来取消删除；也可以用于判断当前数据库记录数，如果只剩一条记录且数据库不能为空则提示并取消删除操作。</span></p>
<p ><span>使用RowDeleted事件，可以在删除后，通过GridViewDeletedEventArgs的Exception属性判断删除过程中是否产生异常，如无异常，则可以显示类似于” 1 Records deleted” 之类的提示信息。</span></p>
<p ><span>Example：</span></p>
<p  align="left"><span> protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)</span></p>
<p  align="left"><span>{</span></p>
<p  align="left"><span>//取得当前行号，并取得当前行的GridViewRow对象</span></p>
<p  align="left"><span> int index=e.RowIndex ;</span></p>
<p  align="left"><span> GridViewRow gvr=GridView1.Rows[index];</span></p>
<p  align="left"><span>//取得当前行第二个单元格中的文字</span></p>
<p  align="left"><span> str1 = gvr.Cells[1].Text;</span></p>
<p  align="left"><span>//进行提示</span></p>
<p  align="left"><span> Message.Text =&#8221;您将删除一个用户，其姓名为&#8221;+str1 ;</span></p>
<p  align="left"><span> }</span></p>
<p  align="left"><span> protected void GridView1_RowDeleted(object sender, GridViewDeletedEventArgs e)</span></p>
<p  align="left"><span>{</span></p>
<p  align="left"><span>//如果没有产生异常，则提示成功删除，否则提示删除失败</span></p>
<p  align="left"><span> if (e.Exception == null)</span></p>
<p  align="left"><span> Message.Text += &#8220;&lt;br&gt;您成功删除了&#8221;+str1 ;</span></p>
<p  align="left"><span> else</span></p>
<p  align="left"><span> Message.Text += &#8220;删除失败，请联系管理员&#8221;;</span></p>
<p ><span>}</span></p>
<p ><span>5、RowEditing事件</span></p>
<p ><span>在GridView中的行进入编辑模式之前，引发RowEditing事件，如果您需要在编辑记录前进行某些预处理，可以在这里操作。如果想取消对当前行的编辑，可以把GridViewEditEventArgs 对象的 Cancel 属性设置为 true即可。</span></p>
<p ><span>Example：</span></p>
<p  align="left"><span> protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)</span></p>
<p  align="left"><span>{</span></p>
<p  align="left"><span>//用NewEidIndex取得当前编辑的行号，然后获取gridviewrow对象</span></p>
<p  align="left"><span> GridViewRow gvr = GridView1.Rows[e.NewEditIndex];</span></p>
<p  align="left"><span>//判断，如果当前编辑行姓名栏为admin用户，则取消对当前行的编辑</span></p>
<p  align="left"><span> if (gvr.Cells[1].Text ==&#8221;admin&#8221;)</span></p>
<p  align="left"><span> e.Cancel = true;</span></p>
<p ><span>}</span></p>
<p ><span>6、RowUpdating和RowUpdated事件</span></p>
<p ><span>RowUpdating事件发生在更新数据源之前，RowUpdated发生在更新数据源之后。</span></p>
<p ><span>我们可以在记录更新前利用RowUpdating做一些预处理工作，比如修改密码时，因为密码在数据库中不是明文存储，进行了hash，所以在更新密码前，应该生成其hash值，再进行更新操作。RowUpdated则可以检验更新是否成功。</span></p>
<p ><span>Example：</span></p>
<p  align="left"><span> protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)</span></p>
<p  align="left"><span> {</span></p>
<p  align="left"><span> GridViewRow gvr = GridView1.Rows[GridView1 .EditIndex ];</span></p>
<p  align="left"><span>//寻找输入密码的控件</span></p>
<p  align="left"><span> TextBox tb1 = (TextBox)gvr.FindControl(&#8221;tb_password&#8221;);</span></p>
<p  align="left"><span>//将此控件中的文本hash后，把password存入NewValues这个字典中</span></p>
<p  align="left"><span> e.NewValues ["password"] =tb1.Text .GetHashCode().ToString () ;</span></p>
<p  align="left"><span> }</span></p>
<p  align="left"><span> protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e)</span></p>
<p  align="left"><span>{</span></p>
<p  align="left"><span>//如无异常，则更新成功</span></p>
<p  align="left"><span> if (e.Exception == null)</span></p>
<p  align="left"><span> Message.Text += &#8220;更新成功！&#8221;;</span></p>
<p ><span> }</span></p>
<p ><span>7、Keys、OldValues、NewValues集合</span></p>
<p ><span>Keys字典中一般存放的是数据源中的主键字段的key和 value的对应值，如果主键由多个 字段组成，那么Keys为每个键字段添加其字段名称和值。OldValues中存放的是要更新的行的字段名和原始值，每个字段为其中的一项。 NewValues中存放的是要更新的行的字段名和修改后的值，每个字段为其中的一项。注意，主键字段只存放于keys集合中。</span></p>
<p ><span>这三个集合中的每一项都是DictionaryEntry类型的对象，我们可以用DictionaryEntry.Key来确定一个项的字段名称,用DictionaryEntry.Value来确定某项的值。</span></p>
<p ><span>在上面的例子中，为了把密码明文加密后再存入数据库，我们利用了NewValues字段，重新设置key为password的项的值。为了保证安全性，我们在更新数据前对NewValues中的所有值进行html编码：</span></p>
<p  align="left"><span>Example1: </span></p>
<p  align="left"><span>protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)</span></p>
<p  align="left"><span>{</span></p>
<p  align="left"><span>//遍历NewValues，取得其中每一对DictionaryEntry对象</span></p>
<p  align="left"><span> foreach (DictionaryEntry de in e.NewValues)</span></p>
<p  align="left"><span>//de.key就是字段名，如果此处单独更新某字段的话，也可以直接填写字段名，//比如 e.NewValues[“password”]</span></p>
<p  align="left"><span> e.NewValues[de.Key] = Server.HtmlEncode(de.Value.ToString());</span></p>
<p  align="left"><span> }</span></p>
<p ><span>Example2:</span></p>
<p  align="left"><span> protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)</span></p>
<p  align="left"><span>{</span></p>
<p  align="left"><span>//分别利用Keys、OldValues、NewValues取得主键名、原始数据和更新后数据</span></p>
<p  align="left"><span> Message .Text = e.Keys["username"] + &#8220;的email地址从&#8221; + e.OldValues["email"] + &#8220;变更为&#8221; + e.NewValues["email"];</span></p>
<p ><span>}</span></p>
<div id="ad_f10" class="ad_f10"><script src="http://www.diybl.com/ad/ad_f10.js"></script><script type="text/javascript"><!--</p>
<p>cpro_client='diybl_cpr';
cpro_at='text_image'; 
cpro_161=4; 
cpro_flush=4; 
cpro_w=360; 
cpro_h=300; 
cpro_template='text_default_360_300'; 
cpro_cbd='#F5FAFE'; 
cpro_cbg='#F5FAFE'; 
cpro_ctitle='#940F04'; 
cpro_cdesc='#333333'; 
cpro_curl='#333333'; 
cpro_cflush='#e10900'; 
cpro_uap=1;
cpro_cad=1;
cpro_channel=8900;
// --></script> <script src="http://cpro.baidu.com/cpro/ui/cp.js" type="text/javascript"></script></p>
<div style="display: none;">-</div>
</div>
<div id="ad_f11" class="ad_f11"><script src="http://www.diybl.com/ad/ad_f11.js"></script></div>
<p><strong></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/dotnet/200906488/gridview-and-datagrid.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://degula.com/dotnet/200906488/gridview-and-datagrid.html</feedburner:origLink></item>
		<item>
		<title>网页设计教程大全</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/UTGUYwQaAFA/allabout-webdesign.html</link>
		<comments>http://degula.com/other/200905487/allabout-webdesign.html#comments</comments>
		<pubDate>Tue, 19 May 2009 08:22:06 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[web开发]]></category>
		<category><![CDATA[杂]]></category>
		<category><![CDATA[web develop]]></category>

		<guid isPermaLink="false">http://degula.com/?p=487</guid>
		<description><![CDATA[60 个优秀 Web 布局设计教程
Web 布局设计是一项充满挑战的工作，不仅涉及到行业，潮流与对时尚的把握，还涉及到风格与技术，本文精选了60例优秀的 Web 布局设计，每例设计都有详细的教程，而这些设计本身具有非常好的启迪作用，可以激发设计师的创作灵感，它们体现了当今海外 Web 设计最清新的风格。
使用整洁的HTML标记构建页面
网页设计能正常显示不就够了吗？答案是否定的，如果你是一个严谨的网页设计者，你也许对这篇文章有兴趣：使用整洁的HTML标记构建页面。

大背景网页设计
在国外很多博客都采用了大型图案做背景，这样可以产生比较强的视觉冲击，你可以在这里学到如何用css实现大背景网页设计，光看技术文章当然是不够的，你可以在这里欣赏80个大背景网页设计。
解密CSS Sprites：技巧、工具和教程
CSS Sprites技术已经在网页开发中发展得较为成熟，它可以减轻服务器的负载，提高网页加载速度。这篇CSS Sprites教程 (中文翻译) 系统的介绍了CSS Sprites的概念、用途和用法，相信本文会解决你在使用CSS Sprites中遇到的大部分问题。这篇用CSS Sprites处理圆角的文章更为细致。
五个为你的设计添加光影效果的简单技巧
现实生活中无时无处不存在着光照和阴影，光影帮助我们辨别事物，认知他们的材质、尺度和透视。如果要让我们的网页设计更加自然、有动感且真实直观，正确理解光影效果就变得非常重要。以下是助你更好利用光影的五个技巧 (中文译文)，好好运用它们，能让你的设计更加精致，从众多的页面中脱颖而出。
使用css transformations 创建三维立方体
css真的很强大，不使用JavaScript, imagery,canvas或SVG，使用css transformations也能创建三维立方体，在不过目前只支持基于WebKit和Gecko的浏览器：Firefox 3.5+ -moz-transform (documentation)和 Safari 3.2+ -webkit-transform (documentation)。
]]></description>
			<content:encoded><![CDATA[<h3>60 个优秀 Web 布局设计教程</h3>
<p>Web 布局设计是一项充满挑战的工作，不仅涉及到行业，潮流与对时尚的把握，还涉及到风格与技术，本文精选了<a href="http://www.comsharp.com/GetKnowledge/zh-CN/CMS_K750.aspx">60例优秀的 Web 布局设计</a>，每例设计都有详细的教程，而这些设计本身具有非常好的启迪作用，可以激发设计师的创作灵感，它们体现了当今海外 Web 设计最清新的风格。</p>
<h3>使用整洁的HTML标记构建页面</h3>
<p>网页设计能正常显示不就够了吗？答案是否定的，如果你是一个严谨的网页设计者，你也许对这篇文章有兴趣：<a href="http://www.yeeyan.com/articles/view/oc/40030">使用整洁的HTML标记构建页面</a>。</p>
<p><span id="more-487"></span></p>
<h3>大背景网页设计</h3>
<p>在国外很多博客都采用了大型图案做背景，这样可以产生比较强的视觉冲击，你可以在这里学到<a href="http://startwmlife.com/?p=779">如何用css实现大背景网页设计</a>，光看技术文章当然是不够的，你可以在这里欣赏<a href="http://www.webdesignerwall.com/trends/80-large-background-websites/">80个大背景网页设计</a>。</p>
<h3>解密CSS Sprites：技巧、工具和教程</h3>
<p>CSS Sprites技术已经在网页开发中发展得较为成熟，它可以减轻服务器的负载，提高网页加载速度。这篇<a href="http://www.smashingmagazine.com/2009/04/27/the-mystery-of-css-sprites-techniques-tools-and-tutorials/">CSS Sprites教程</a> (<a href="http://www.yeeyan.com/articles/view/oc/39032">中文翻译</a>) 系统的介绍了CSS Sprites的概念、用途和用法，相信本文会解决你在使用CSS Sprites中遇到的大部分问题。这篇<a href="http://www.iwanna.cn/archives/2009/05/07/952/">用CSS Sprites处理圆角</a>的文章更为细致。</p>
<h3>五个为你的设计添加光影效果的简单技巧</h3>
<p>现实生活中无时无处不存在着光照和阴影，光影帮助我们辨别事物，认知他们的材质、尺度和透视。如果要让我们的网页设计更加自然、有动感且真实直观，正确理解光影效果就变得非常重要。以下是助你更好<a href="http://www.smashingmagazine.com/2009/04/20/5-simple-tricks-to-bring-light-and-shadow-into-your-designs/">利用光影的五个技巧</a> (<a href="http://blog.benhuoer.com/2009/05/5-simple-tricks-to-bring-light-and-shadow-into-your-designs/">中文译文</a>)，好好运用它们，能让你的设计更加精致，从众多的页面中脱颖而出。</p>
<h3>使用css transformations 创建三维立方体</h3>
<p>css真的很强大，不使用JavaScript, imagery,canvas或SVG，<a href="http://www.javaeye.com/news/7504-css-transformations-used-to-create-three-dimensional-cube">使用css transformations也能创建三维立方体</a>，在不过目前只支持基于WebKit和Gecko的浏览器：Firefox 3.5+ -moz-transform (documentation)和 Safari 3.2+ -webkit-transform (documentation)。</p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/other/200905487/allabout-webdesign.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/other/200905487/allabout-webdesign.html</feedburner:origLink></item>
		<item>
		<title>EclipseMaven插件报错[Eclipse is running in a JRE, but a JDK is required]</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/9m6_srGfw1c/eclipsemaven-plugin.html</link>
		<comments>http://degula.com/java/200905485/eclipsemaven-plugin.html#comments</comments>
		<pubDate>Tue, 12 May 2009 09:28:25 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[eclipse]]></category>

		<guid isPermaLink="false">http://degula.com/?p=485</guid>
		<description><![CDATA[Eclipse安装了Maven插件后，可能会报这种错误： “Eclipse is running in a JRE, but a JDK is required”
这是因为在Eclipse.ini配置中没有指定-vm参数，修改如下重启Eclipse问题就解决了：
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
-vm
C:\jdk1.6.0\bin\javaw.exe
-vmargs
-Xms40m
-Xmx256m
]]></description>
			<content:encoded><![CDATA[<p>Eclipse安装了Maven插件后，可能会报这种错误： “Eclipse is running in a JRE, but a JDK is required”</p>
<p>这是因为在Eclipse.ini配置中没有指定-vm参数，修改如下重启Eclipse问题就解决了：</p>
<pre>-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
<strong>-vm
C:\jdk1.6.0\bin\javaw.exe</strong>
-vmargs
-Xms40m
-Xmx256m</pre>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/java/200905485/eclipsemaven-plugin.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/java/200905485/eclipsemaven-plugin.html</feedburner:origLink></item>
		<item>
		<title>T61/NVIDIA Quadro 140M 不能玩星际和极品飞车解决方法</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/6vk9y5rGVxM/t61.html</link>
		<comments>http://degula.com/degula_tips/200905483/t61.html#comments</comments>
		<pubDate>Sat, 09 May 2009 11:36:41 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[DEGULA流水账]]></category>
		<category><![CDATA[game]]></category>

		<guid isPermaLink="false">http://degula.com/?p=483</guid>
		<description><![CDATA[由于t61是宽屏分辨率是1280*800，玩星际的时候就显示一个小窗口，极品飞车10还无法启动，今天google了一下，装2007.12月驱动就能解决了。嘿嘿，都是新版驱动惹的祸
]]></description>
			<content:encoded><![CDATA[<p>由于t61是宽屏分辨率是1280*800，玩星际的时候就显示一个小窗口，极品飞车10还无法启动，今天google了一下，装2007.12月驱动就能解决了。嘿嘿，都是新版驱动惹的祸</p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/degula_tips/200905483/t61.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/degula_tips/200905483/t61.html</feedburner:origLink></item>
		<item>
		<title>mysql命令行的基本用法(linux和windows)</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/rdPZyr9h4bo/mysq-commandline.html</link>
		<comments>http://degula.com/database/200905482/mysq-commandline.html#comments</comments>
		<pubDate>Thu, 07 May 2009 08:28:10 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[database]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://degula.com/?p=482</guid>
		<description><![CDATA[基础介绍:
1.在linux下使用下列命令,请确认mysql的bin目录是否已经加入到PATH路径中,或者是已经进入到mysql安装路径下的bin目录
查看PATH
shell&#62; echo $PATH
或者
shell&#62; cd /usr/local/mysql/bin

2.windows下,请运行cmd后,同样检查mysql的bin目录是否已加入到系统的PATH路径中,或直接进入mysql的安装目录
下面所有操作都是确认你以检查mysql的bin目录已加入到系统的PATH路径中,或已经进入mysql的安装目录的bin目录下
1]如何创建mysqld数据库的管理用户？
数据库安装好后，我们应该为mysql数据库创建一个管理帐号。要把root用户设置为管理员，我们应该运行下面的命令；
shell&#62; mysqladmin -u root password 123456
通过上面的命令，我们可以知道，mysql数据库的管理员是root，密码是123456。
2]如何进入mysql数据库？以mysql数据库管理员root，密码为123456为例；
shell&#62; mysql -uroot -p123456
输出上面的命令后，出现的是如下的提示；
Welcome to the MySQL monitor. Commands end with ; or /g.
Your MySQL connection id is 6 to server version: 3.23.58
Type &#8216;help;&#8217; or &#8216;/h&#8217; for help. Type &#8216;/c&#8217; to clear the buffer.
mysql&#62;
注意：操作这些命令的时候，应该把mysqld服务器打开。这些新手兄弟早就知道了吧：)
3]如何在数据库中操作命令呢，我想这是mysql手册都有的，我主要说几个要注意的地方。其实我也会不了几个命令。如果自己想学的弟兄，也不是什么难事；在windows中操作过mysql的，其实在这里也是一样的，mysql是跨平台的数据库，用法都是相同的。
在mysql数据库中，每操作一个命令，都是;号结尾的，可能有的新手弟兄，忘记输入了；号结尾，结果退不出来。:):)
1]查看mysql中都有哪些数据库？
代码:
mysql&#62;
show databases;
+&#8212;&#8212;&#8212;-+
&#124; Database &#124;
+&#8212;&#8212;&#8212;-+
&#124; mysql       &#124;
&#124; test            [...]]]></description>
			<content:encoded><![CDATA[<p>基础介绍:<br />
1.在linux下使用下列命令,请确认mysql的bin目录是否已经加入到PATH路径中,或者是已经进入到mysql安装路径下的bin目录<br />
查看PATH<br />
shell&gt; echo $PATH<br />
或者<br />
shell&gt; cd /usr/local/mysql/bin<a name="entrymore"></a></p>
<p><span id="more-482"></span><br />
2.windows下,请运行cmd后,同样检查mysql的bin目录是否已加入到系统的PATH路径中,或直接进入mysql的安装目录</p>
<p>下面所有操作都是确认你以检查mysql的bin目录已加入到系统的PATH路径中,或已经进入mysql的安装目录的bin目录下</p>
<p>1]如何创建mysqld数据库的管理用户？</p>
<p>数据库安装好后，我们应该为mysql数据库创建一个管理帐号。要把root用户设置为管理员，我们应该运行下面的命令；</p>
<p>shell&gt; mysqladmin -u root password 123456</p>
<p>通过上面的命令，我们可以知道，mysql数据库的管理员是root，密码是123456。</p>
<p>2]如何进入mysql数据库？以mysql数据库管理员root，密码为123456为例；</p>
<p>shell&gt; mysql -uroot -p123456</p>
<p>输出上面的命令后，出现的是如下的提示；</p>
<p>Welcome to the MySQL monitor. Commands end with ; or /g.<br />
Your MySQL connection id is 6 to server version: 3.23.58</p>
<p>Type &#8216;help;&#8217; or &#8216;/h&#8217; for help. Type &#8216;/c&#8217; to clear the buffer.</p>
<p>mysql&gt;</p>
<p>注意：操作这些命令的时候，应该把mysqld服务器打开。这些新手兄弟早就知道了吧：)</p>
<p>3]如何在数据库中操作命令呢，我想这是mysql手册都有的，我主要说几个要注意的地方。其实我也会不了几个命令。如果自己想学的弟兄，也不是什么难事；在windows中操作过mysql的，其实在这里也是一样的，mysql是跨平台的数据库，用法都是相同的。</p>
<p>在mysql数据库中，每操作一个命令，都是;号结尾的，可能有的新手弟兄，忘记输入了；号结尾，结果退不出来。:):)</p>
<p>1]查看mysql中都有哪些数据库？</p>
<p>代码:<br />
mysql&gt;<br />
show databases;<br />
+&#8212;&#8212;&#8212;-+<br />
| Database |<br />
+&#8212;&#8212;&#8212;-+<br />
| mysql       |<br />
| test            |<br />
+&#8212;&#8212;&#8212;-+<br />
2 rows in set (0.00 sec) mysql&gt;<br />
在mysql安装好，设置好管理员后，第一次进入系统，我们用show databases;命令查看数据库的列表，发现有两个数据库，mysql和test，这是系统自建的，是让大家练习用的。</p>
<p>4]如何创建和删除一个数据库？</p>
<p>比如我要创建一个名为linux的数据库，应该运行如下命令</p>
<p>mysql&gt; create database [数据库名];</p>
<p>所以我们应该运行如下的命令，来创建名为linux的数据库</p>
<p>mysql&gt; create database linux;<br />
Query OK, 1 row affected (0.00 sec)</p>
<p>是不是建好了呢？？肯定是建好了，因为都有OK了:)</p>
<p>查看是不是有linux这个数据库了呢？</p>
<p>代码:<br />
mysql&gt; show databases;<br />
+&#8212;&#8212;&#8212;-+<br />
| Database |<br />
+&#8212;&#8212;&#8212;-+<br />
| linux |<br />
| mysql |<br />
| test |<br />
+&#8212;&#8212;&#8212;-+<br />
3 rows in set (0.00 sec)</p>
<p>那我们如何删除一个数据库呢？？<br />
mysql&gt; drop database [数据库名];</p>
<p>比如我们要把刚才创建的linux数据库删除，应该用下面的命令；<br />
mysql&gt; drop database linux;<br />
Query OK, 0 rows affected (0.00 sec)</p>
<p>是不是已经删除了呢？？</p>
<p>代码:<br />
mysql&gt; show databases;<br />
+&#8212;&#8212;&#8212;-+<br />
| Database |<br />
+&#8212;&#8212;&#8212;-+<br />
| mysql |<br />
| test |<br />
+&#8212;&#8212;&#8212;-+<br />
2 rows in set (0.00 sec)</p>
<p>5]如何操作一个数据库呢，这个问题就比较多了，建议还是看一下mysql的手册吧。里面的东西太多了。如果操作一个数据库，首先是要指定一个数据库为当前数据库，应该用use命令</p>
<p>mysql&gt;use [数据库];</p>
<p>比如我想指定linux这个数据库为当前数据库，应该是</p>
<p>mysql&gt; use linux;<br />
Database changed</p>
<p>6]如何备份数据库？？</p>
<p>比如我们要备份mysql中已经存在的名为linux的数据库，要用到命令mysqldump</p>
<p>命令格式如下：</p>
<p>shell&gt; mysqldump -uroot -p linux &gt; /root/linux.sql<br />
Enter password:在这里输入数据库的密码</p>
<p>通过上面的命令，我们要明白两件事，首先备份数据库是要以数据库管理员的身份备份；其次：备份目的地是/root，备份的文件名是linux.sql。其实备份的位置和文件名，根据自己的情况来定。文件名可以自己来取，路径也可以自己来安排；</p>
<p>比如我想把linux的数据库备份到/home/beinan，数据库的文件名为linuxsir031130.sql，所以应该输入如下的命令。<br />
shell&gt; mysqldump -uroot -p linux &gt; /home/beinan/linuxsir031130.sql<br />
Enter password:在这里输入数据库管理员root的数据库密码</p>
<p>这样我们到/home/beinan目录下就能发现mysql中名为linux的数据库的备份文件linuxsir031130.sql</p>
<p>综上所述，我们学习时要学会变通。:):)</p>
<p>5]如何把把备份的数据库导入到数据库中？</p>
<p>首先我们还是要操作上面几个过程，比如添加数据库管理员(如果您没有添加过mysql数据库管理员的话)，创建数据库等。</p>
<p>比如我们要把在/home/beinan这个目录中的linuxsir031130.sql这个备份，导入名为linux的数据库中，应该如下操作；</p>
<p>shell&gt; mysql -uroot -p linux &lt; /home/beinan/linuxsir031130.sql<br />
Enter password:在这里输入密码</p>
<p>如果机器好，数据库比较小，几分钟就好了。</p>
<p>6]其它一些比较常用的mysql指令；</p>
<p>查看状态<br />
mysql&gt; show status;</p>
<p>查看进程</p>
<p>代码:<br />
mysql&gt; show processlist;<br />
+&#8212;-+&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8212;&#8212;+&#8212;&#8212;+&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+| Id | User | Host | db | Command | Time | State | Info |<br />
+&#8212;-+&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8212;&#8212;+&#8212;&#8212;+&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+| 16 | root | localhost | NULL | Query | 0 | NULL | show processlist |<br />
+&#8212;-+&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8212;&#8212;+&#8212;&#8212;+&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
1 row in set (0.00 sec)</p>
<p>查看表，应该先指定一个数据库为当前数据库；比如是名为linux的数据库；</p>
<p>mysql&gt;use linux;<br />
mysql&gt; show tables;<br />
Empty set (0.00 sec)</p>
<p>7]对mysql数据库常用命令的一点补充；</p>
<p>几个常用的mysql相关的管理命令</p>
<p>mysql 命令：基本文本的，显示和使用的mysql数据库。前面已经简单的提过用法；比如登录等。</p>
<p>mysqladmin 命令，用来创建和维护mysql数据库的命令，前面已经简单的提过；</p>
<p>isamchk 是用来修复、检查和优化.ism后缀的数据库文件；</p>
<p>mysqldump 是用于备份数据库，前面已经简单的说明过；</p>
<p>myisamchk 用来修复.myi后缀的数据库文件；</p>
<p>比如我们要检查名为linux的数据库.myi数据库表是否存在问题，应该用下面的命令；</p>
<p>要把mysqld服务器停下来<br />
shell&gt; ../share/mysql.server stop</p>
<p>然后执行<br />
shell&gt; myisamchk ../var/linux/*.MYI</p>
<p>上面的命令的意思就是检查所有的.myi文件，数据库的目录在../var/linux/目录中</p>
<p>如果有问题，应该用-r参数来修复<br />
shell&gt; myisamchk -r ../var/linux/*.MYI</p>
<p>6]mysqlshow 命令：显示用户选择的数据库和表<br />
shell&gt; mysqlshow -uroot -p [数据库名]</p>
<p>比如我要查看名为linux的数据库；应该是：</p>
<p>shell&gt; mysqlshow -uroot -p linux</p>
<p>好了,到这里,你可能已经知道命令行下的所有基本操作了~</p>
<p>更改ROOT帐号名</p>
<p>update set user=&#8221;新名字&#8221; where user=&#8221;旧名字&#8221;;</p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/database/200905482/mysq-commandline.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/database/200905482/mysq-commandline.html</feedburner:origLink></item>
		<item>
		<title>无限级别导航菜单</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/Dijr28sHy8k/nav-menu.html</link>
		<comments>http://degula.com/webdev/200905480/nav-menu.html#comments</comments>
		<pubDate>Thu, 07 May 2009 00:33:33 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[web开发]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web develop]]></category>

		<guid isPermaLink="false">http://degula.com/?p=480</guid>
		<description><![CDATA[无限级别导航菜单




无限级导航菜单(All Levels Navigational Menu (v2.1))是一个基于CSS/HTML的列表，它支持无限级子菜单。此菜单小巧且易用（菜单代码是简单的HTML列表），而且所有的菜单的链接对搜索 引擎友好。此外，这个菜单以一定的方式结构化，所以它很容易被定制外观。
菜单支持水平导航和垂直导航两种方式，官方提供了很多的模板供参考和快速上手。

访问官网网站&#62;&#62;
下载（仅包括两个简单的演示，了解更多请查看官方网站）
]]></description>
			<content:encoded><![CDATA[<h2>无限级别导航菜单</h2>
<p><span class="submitted"><br />
</span></p>
<div class="content clear-block">
<p><img src="http://my.chinahtml.com:8082/sites/default/files/2009/04/19/menu.jpg" alt="" width="538" height="253" /><br />
无限级导航菜单(All Levels Navigational Menu (v2.1))是一个基于CSS/HTML的列表，它支持无限级子菜单。此菜单小巧且易用（菜单代码是简单的HTML列表），而且所有的菜单的链接对搜索 引擎友好。此外，这个菜单以一定的方式结构化，所以它很容易被定制外观。</p>
<p>菜单支持水平导航和垂直导航两种方式，官方提供了很多的模板供参考和快速上手。<br />
<img src="http://my.chinahtml.com:8082/sites/default/files/2009/04/19/menu2.jpg" alt="" width="593" height="235" /><br />
<a href="http://www.dynamicdrive.com/dynamicindex1/ddlevelsmenu/generator.htm">访问官网网站&gt;&gt;</a></p>
<p><a href="http://www.dynamicdrive.com/dynamicindex1/ddlevelsmenu/ddlevelsmenu.zip">下载</a>（仅包括两个简单的演示，了解更多请查看官方网站）</div>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/webdev/200905480/nav-menu.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/webdev/200905480/nav-menu.html</feedburner:origLink></item>
		<item>
		<title>MooTools 入门教程 (二)(关于UnObtrusive Javascript)</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/vJUmd6FKjvg/mootools-tips2.html</link>
		<comments>http://degula.com/webdev/javascript-webdev/200904478/mootools-tips2.html#comments</comments>
		<pubDate>Tue, 28 Apr 2009 00:46:22 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[web develop]]></category>

		<guid isPermaLink="false">http://degula.com/degula_tips/200904478/mootools-%e5%85%a5%e9%97%a8%e6%95%99%e7%a8%8b-%e4%ba%8c%e5%85%b3%e4%ba%8eunobtrusive-javascript.html</guid>
		<description><![CDATA[MooTools是一个非常出色的Javascript框架,跟更流行的JQuery框架相比,它的语法可读性更好,因此也有许多开发者在项目中选择Mootools.在(上一课)中我们学习了 MooTools 的一些基本技巧, 这里继续上次的内容,介绍一下MooTools操作DOM元素的基本方法.&#160; 1. &#34;Obtrusive&#34; 的实现方法     什么样的代码是 Obtrusive 的呢:(关于UnObtrusive Javascript如果不理解请看最后的参考文献,这里就不翻译了),看看下面的代码:
&#60;ul id=&#34;myList&#34;&#62;
&#60;li id=&#34;li_1&#34;&#62;      &#60;a href=&#34;#&#34; onClick=&#34;javascript:getId(&#8217;1&#8242;)&#34;&#62;Get this ID&#60;/a&#62;       &#60;/li&#62;       &#60;li id=&#34;li_2&#34;&#62;       &#60;a href=&#34;#&#34; onClick=&#34;javascript:getId(2)&#34;&#62;Get this ID&#60;/a&#62;   [...]]]></description>
			<content:encoded><![CDATA[<p>MooTools是一个非常出色的Javascript框架,跟更流行的JQuery框架相比,它的语法可读性更好,因此也有许多开发者在项目中选择Mootools.在(<a href="http://degula.com/webdev/javascript-webdev/200904472/mootools-tips1.html">上一课</a>)中我们学习了 MooTools 的一些基本技巧, 这里继续上次的内容,介绍一下MooTools操作DOM元素的基本方法.&#160; <br /><strong>1. &quot;Obtrusive&quot; 的实现方法</strong>     <br />什么样的代码是 Obtrusive 的呢:(关于UnObtrusive Javascript如果不理解请看最后的参考文献,这里就不翻译了),看看下面的代码:</p>
<blockquote><p>&lt;ul id=&quot;myList&quot;&gt;</p>
<p>&lt;li id=&quot;li_1&quot;&gt;      <br />&lt;a href=&quot;#&quot; onClick=&quot;javascript:getId(&#8217;1&#8242;)&quot;&gt;Get this ID&lt;/a&gt;       <br />&lt;/li&gt;       <br />&lt;li id=&quot;li_2&quot;&gt;       <br />&lt;a href=&quot;#&quot; onClick=&quot;javascript:getId(2)&quot;&gt;Get this ID&lt;/a&gt;       <br />&lt;/li&gt;       <br />&lt;li id=&quot;li_3&quot;&gt;       <br />&lt;a href=&quot;#&quot; onClick=&quot;javascript:getId(3)&quot;&gt;Get this ID&lt;/a&gt;       <br />&lt;/li&gt;</p>
<p>&lt;/ul&gt;</p>
</blockquote>
<p>getId()方法的Javascript 代码:</p>
<p> <span id="more-478"></span><br />
<blockquote>
<p>&lt;script type=&quot;text/javascript&quot;&gt;      <br />function getId(el){</p>
<p>var listElement = el;      <br />alert(&quot;The ID of the list element you&#8217;ve chosen is: li_&quot;+listElement);</p>
<p>}      <br />&lt;/script&gt;</p>
</blockquote>
<p>为什么这种写法是obtrusive的呢<em>?</em>. 因为在html代码中有对Javascript代码的调用:</p>
<blockquote><p>&lt;a href=&quot;#&quot; onClick=&quot;javascript:getId(&#8217;1&#8242;)&quot;&gt;Get this ID&lt;/a&gt;</p>
</blockquote>
<p>&#160; <br /><strong>2. 使用Mootools实现 unobtrusive 的Javascript调用</strong>     <br />先把html中的Javascript调用去掉:</p>
<blockquote><p>&lt;ul id=&quot;myList&quot;&gt;</p>
<p>&lt;li id=&quot;li_1&quot;&gt;&lt;a href=&quot;#&quot;&gt;Get this ID&lt;/a&gt;&lt;/li&gt;      <br />&lt;li id=&quot;li_2&quot;&gt;&lt;a href=&quot;#&quot;&gt;Get this ID&lt;/a&gt;&lt;/li&gt;       <br />&lt;li id=&quot;li_3&quot;&gt;&lt;a href=&quot;#&quot;&gt;Get this ID&lt;/a&gt;&lt;/li&gt;</p>
<p>&lt;/ul&gt;</p>
</blockquote>
<p>引入MooTools:</p>
<blockquote><p>&lt;script type=&quot;text/javascript&quot; src=&quot;mootools.svn.js&quot;&gt;&lt;/script&gt;</p>
</blockquote>
<p><strong>关键的<a href="http://degula.com/category/webdev/javascript-webdev">Javascript</a>代码:</strong></p>
<blockquote><p>&lt;script type=&quot;text/javascript&quot;&gt;</p>
<p>window.addEvent(&#8217;load&#8217;, function(){      <br />$(&#8217;myList&#8217;).getElements(&#8217;li&#8217;).each(function(el){       <br />el.getElement(&#8217;a').addEvent(&#8217;click&#8217;, function(listID){       <br />alert(&quot;The ID of the list element you&#8217;ve chosen is: &quot;+listID);       <br />}.pass(el.id)       <br />);       <br />});       <br />});</p>
<p>&lt;/script&gt;</p>
</blockquote>
<p>源代码如下:    <br /><img alt="" src="http://2.bp.blogspot.com/_TqPdHmAEwTM/Rx5U5LulHqI/AAAAAAAAAbo/NpIXE-ezOuU/s400/page_white_code_red.png" align="absMiddle" border="0" /> <a href="http://www.box.net/shared/z0l28p9g5d">Download source code</a>     <br />参考文献:</p>
<p>关于UnObtrusive Javascript</p>
<p><a href="http://www.cn-cuckoo.com/2007/08/14/unobtrusive-javascript-progressive-enhancement-gracefully-degrade-82.html">从几个与 DOM 脚本编程有关的术语翻译说起</a></p>
<p><a href="http://onlinetools.org/articles/unobtrusivejavascript/">Unobtrusive Javascript</a>     <br /><strong>相关文章</strong>     <br /><a href="http://degula.com/webdev/javascript-webdev/200904472/mootools-tips1.html">MooTools 入门教程 (一)</a></p>
<p>转载请给个链接,谢谢! 本文来自<a href="http://degula.com">degula</a></p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/webdev/javascript-webdev/200904478/mootools-tips2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/webdev/javascript-webdev/200904478/mootools-tips2.html</feedburner:origLink></item>
		<item>
		<title>笑话一则</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/g8AQ2A7t6xo/joke.html</link>
		<comments>http://degula.com/other/200904477/joke.html#comments</comments>
		<pubDate>Mon, 27 Apr 2009 01:17:29 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[杂]]></category>
		<category><![CDATA[笑话]]></category>

		<guid isPermaLink="false">http://degula.com/?p=477</guid>
		<description><![CDATA[中国最短的笑话：为人民服务中国
最好的借口：国情，特色
中国最漂亮的牌坊：信访局
中国最常用的官方语
1：目前**情绪稳定中国最常用的官方语
2：目前事故已得到妥善处理
中国最强悍的陆战队：城管
中国最可爱的人：高棺，叫兽，妓者
中国最恐怖的游戏：躲猫猫
中国最恐怖的现象：被自杀
中国最权威调查：民众对治安满意率95%
中国最神秘的单位：某单位中国最贱的民：屁民
中国最权威的两大部门:上级部门，有关部门
中国最真实的真相：在进一步调查中
中国最幸福的人：二奶
中国最自豪的新闻：GDP增长率
中国最神秘的机构：组织
中国最动听的话：一切权力属于人民
中国外交部最常用口头禅1：表示强烈强烈强烈谴责
中国外交部最常用口头禅2：由此产生的一切后果由*方承担！
中国最有特色的的统计词：负增长
中国最好吃的面：基本面
中国最神密的会：工会
中国最有希望的人：待富者
中国最好的职业：公污员 
]]></description>
			<content:encoded><![CDATA[<p>中国最短的笑话：为人民服务中国<br />
最好的借口：国情，特色<br />
中国最漂亮的牌坊：信访局<br />
中国最常用的官方语<br />
1：目前**情绪稳定中国最常用的官方语<br />
2：目前事故已得到妥善处理<br />
中国最强悍的陆战队：城管<br />
中国最可爱的人：高棺，叫兽，妓者<br />
中国最恐怖的游戏：躲猫猫<br />
中国最恐怖的现象：被自杀<br />
中国最权威调查：民众对治安满意率95%<br />
中国最神秘的单位：某单位中国最贱的民：屁民<br />
中国最权威的两大部门:上级部门，有关部门<br />
中国最真实的真相：在进一步调查中<br />
中国最幸福的人：二奶<br />
中国最自豪的新闻：GDP增长率<br />
中国最神秘的机构：组织<br />
中国最动听的话：一切权力属于人民<br />
中国外交部最常用口头禅1：表示强烈强烈强烈谴责<br />
中国外交部最常用口头禅2：由此产生的一切后果由*方承担！<br />
中国最有特色的的统计词：负增长<br />
中国最好吃的面：基本面<br />
中国最神密的会：工会<br />
中国最有希望的人：待富者<br />
中国最好的职业：公污员 </p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/other/200904477/joke.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/other/200904477/joke.html</feedburner:origLink></item>
		<item>
		<title>.Net资源大全</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/mxW_kkxYn6c/net-resources.html</link>
		<comments>http://degula.com/dotnet/200904475/net-resources.html#comments</comments>
		<pubDate>Tue, 21 Apr 2009 07:14:31 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[dotnet]]></category>
		<category><![CDATA[.net]]></category>

		<guid isPermaLink="false">http://degula.com/?p=475</guid>
		<description><![CDATA[.Net General

微软.Net中文主页
.NET Framework开发中心
微软.Net Framework中文产品支持中心
微软.Net Framework中文新闻组(Web)
微软VB.Net中文新闻组(Web)
博客园 .NET 2.0 专题
孟宪会之精彩世界
微软.NET俱乐部
MSDN中文网络广播
AspxBoy教程网
天极网微软开发专栏
中国IT实验室DOTNET频道
阿良.Net主页
中国IT实验室.Net电子教程下载
中国IT实验室.Net源码
清风网络学院.Net专栏
vs2005入门 .net 2.0系列视频教程
.NET 事件模型教程
.net教程及参考资料下载
VS2005.com—专注于MS.NET技术

asp.net

ASP.NET中文官方网
MSDN ASP.NET开发中心
Asp.Net 1.1快速入门教程
Asp.Net 2.0快速入门教程
ASP.NET 2.0快速入门系列教程
微软Asp.Net中文新闻组(Web)
中国.NET俱乐部
CSDN ASP.NET频道
AspxCN
Asp.Net中文俱乐部
AspNetPager免费分页控件
51aspx—asp.net源码下载
网易学院 ASP.NET
清风网络学院 Asp.Net开发
多客IT教程网 Asp.Net
Scott  Mitchell的ASP.NET2.0教程中文版
基督山ASP.NET网上教程
VS2005控件演示
ASP.NET高级教程—实战篇
编程中国asp.net教程
酷网动力asp.net专栏
友佳学院asp.net专栏
编程爱好者asp.net文档中心
烁空网页编程开发技术文档

Visual Studio

Visual Studio开发中心
Visual Studio最新中文知识库文章
微软Visual Studio  2005中文产品支持中心
博客园Visual Studio 2005专题
Visual Studio 2005入门视频教程
Visual Studio 2005  How-to文章
Visual Studio 2005疑难解答

Visual C#.Net

Visual C#开发中心
微软C#中文产品支持中心
C#最新中文知识库文章
Koders源代码搜索引擎(英)
微软C#中文新闻组(Web)
中国C#技术学习中心
中文C#技术网
清风网络学院C#专栏
中国IT实验室C#电子教程下载
天新网C#专题
C#开源资源大全
C#教程及语言参考
C#语言教程文章
酷网动力C#专栏
编程爱好者C#文档中心

VB.NET

酷网动力vb.net专栏
编程爱好者vb.net文档中心
微软VB.NET Step By Step 系列课程
MSDN Visual Basic开发中心

.NET社区

CSDN社区
微软.Net Framework中文新闻组(Web)
微软Asp.Net中文新闻组(Web)
微软C#中文新闻组(Web)
微软VB.Net中文新闻组(Web)

.NET博客

博客园
博客堂
Scott Guthrie博客中文版
思归呓语
蝈蝈俊
清清月儿 .NET万花筒
Cat in DotNet

Ajax

ASP.NET AJAX 英文官方网站(英)
Asp.Net Ajax 软件工具包(英)
博客园Asp.Net Ajax专题
ASP.NET [...]]]></description>
			<content:encoded><![CDATA[<p><strong>.Net General</strong></p>
<ul>
<li><a href="http://www.microsoft.com/china/net/" target="_blank"><span style="color: #000000;">微软.Net中文主页</span></a></li>
<li><a href="http://www.microsoft.com/china/msdn/developercenter/netframework/default.mspx" target="_blank"><span style="color: #000000;">.NET Framework开发中心</span></a></li>
<li><a href="http://support.microsoft.com/ph/548" target="_blank"><span style="color: #000000;">微软.Net Framework中文产品支持中心</span></a></li>
<li><a href="http://www.microsoft.com/China/community/dgbrowser/zh-cn/default.mspx?dg=microsoft.public.cn.dotnet.framework&amp;amp;lang=zh&amp;amp;cr=CN" target="_blank"><span style="color: #000000;">微软.Net Framework中文新闻组(Web)</span></a></li>
<li><a href="http://www.microsoft.com/China/community/dgbrowser/zh-cn/default.mspx?dg=microsoft.public.cn.dotnet.languages.vb&amp;amp;lang=zh&amp;amp;cr=CN" target="_blank"><span style="color: #000000;">微软VB.Net中文新闻组(Web)</span></a></li>
<li><a href="http://dotnet2.cnblogs.com/" target="_blank"><span style="color: #000000;">博客园 .NET 2.0 专题</span></a></li>
<li><a href="http://dotnet.aspx.cc/" target="_blank"><span style="color: #000000;">孟宪会之精彩世界</span></a></li>
<li><a href="http://msdn2.microsoft.com/zh-cn/community/bb220812.aspx" target="_blank"><span style="color: #000000;">微软.NET俱乐部</span></a></li>
<li><a href="http://www.microsoft.com/china/msdn/events/webcasts/shared/Webcast/MSDNWebCast.aspx" target="_blank"><span style="color: #000000;">MSDN中文网络广播</span></a></li>
<li><a href="http://www.aspxboy.com/" target="_blank"><span style="color: #000000;">AspxBoy教程网</span></a></li>
<li><a href="http://dev.yesky.com/SoftChannel/72342380434423808/index.shtml" target="_blank"><span style="color: #000000;">天极网微软开发专栏</span></a></li>
<li><a href="http://dotnet.chinaitlab.com/Index.html/" target="_blank"><span style="color: #000000;">中国IT实验室DOTNET频道</span></a></li>
<li><a href="http://www.chenjiliang.com/" target="_blank"><span style="color: #000000;">阿良.Net主页</span></a></li>
<li><a href="http://download.chinaitlab.com/program/list/93_1.html" target="_blank"><span style="color: #000000;">中国IT实验室.Net电子教程下载</span></a></li>
<li><a href="http://download.chinaitlab.com/code/list/34_1.html" target="_blank"><span style="color: #000000;">中国IT实验室.Net源码</span></a></li>
<li><a href="http://www.win-day.com.cn/InfoList/Catalog_78_1.html" target="_blank"><span style="color: #000000;">清风网络学院.Net专栏</span></a></li>
<li><a href="http://www.cnblogs.com/thcjp/category/68479.html" target="_blank"><span style="color: #000000;">vs2005入门 .net 2.0系列视频教程</span></a></li>
<li><a href="http://blog.joycode.com/percyboy/archive/2005/01/22/43438.aspx" target="_blank"><span style="color: #000000;">.NET 事件模型教程</span></a></li>
<li><a href="http://www.xia8.com/SoftList/Catalog_151_SoftTime_Desc_1.html" target="_blank"><span style="color: #000000;">.net教程及参考资料下载</span></a></li>
<li><a href="http://www.vs2005.com/" target="_blank"><span style="color: #000000;">VS2005.com—专注于MS.NET技术</span></a></li>
</ul>
<p><span id="more-475"></span><strong><a title="asp.net" href="http://blog.csdn.net/dshpsky/" target="_blank"><span style="color: #770000;">asp.net</span></a></strong></p>
<ul>
<li><a href="http://www.asp.net/cn/" target="_blank"><span style="color: #000000;">ASP.NET中文官方网</span></a></li>
<li><a href="http://www.microsoft.com/china/msdn/developercenter/ASPNET/ASPNETDC.aspx" target="_blank"><span style="color: #000000;">MSDN ASP.NET开发中心</span></a></li>
<li><a href="http://chs.gotdotnet.com/quickstart/aspplus/doc/quickstart.aspx" target="_blank"><span style="color: #000000;">Asp.Net 1.1快速入门教程</span></a></li>
<li><a href="http://dotnet.blyct.com/aspnet/Default.aspx" target="_blank"><span style="color: #000000;">Asp.Net 2.0快速入门教程</span></a></li>
<li><a href="http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/consyscourse/ASPnet2.0.aspx" target="_blank"><span style="color: #000000;">ASP.NET 2.0快速入门系列教程</span></a></li>
<li><a href="http://www.microsoft.com/China/community/dgbrowser/zh-cn/default.mspx?dg=microsoft.public.cn.dotnet.framework.aspnet&amp;amp;lang=zh&amp;amp;cr=CN" target="_blank"><span style="color: #000000;">微软Asp.Net中文新闻组(Web)</span></a></li>
<li><a href="http://www.chinaaspx.com/" target="_blank"><span style="color: #000000;">中国.NET俱乐部</span></a></li>
<li><a href="http://dotnet.csdn.net/aspnet.aspx" target="_blank"><span style="color: #000000;">CSDN ASP.NET频道</span></a></li>
<li><a href="http://www.aspx.cn/html/web/aspnet/" target="_blank"><span style="color: #000000;">AspxCN</span></a></li>
<li><a href="http://www.aspxclub.com/" target="_blank"><span style="color: #000000;">Asp.Net中文俱乐部</span></a></li>
<li><a href="http://www.webdiyer.com/" target="_blank"><span style="color: #000000;">AspNetPager免费分页控件</span></a></li>
<li><a href="http://www.51aspx.com/" target="_blank"><span style="color: #000000;">51aspx—asp.net源码下载</span></a></li>
<li><a href="http://tech.163.com/special/A/0009159F/ASP.net.html" target="_blank"><span style="color: #000000;">网易学院 ASP.NET</span></a></li>
<li><a href="http://www.win-day.com.cn/InfoList/Catalog_94_7.html" target="_blank"><span style="color: #000000;">清风网络学院 Asp.Net开发</span></a></li>
<li><a href="http://www.duoko.com/vc/25/HTML_025_2.html" target="_blank"><span style="color: #000000;">多客IT教程网 Asp.Net</span></a></li>
<li><a href="http://lovecherry.cnblogs.com/lovecherry/archive/2006/07/02/440840.html" target="_blank"><span style="color: #000000;">Scott  Mitchell的ASP.NET2.0教程中文版</span></a></li>
<li><a href="http://jinjohn.diy.myrice.com/wlgl/winnt/aspx/aspjc/aspx0001.htm" target="_blank"><span style="color: #000000;">基督山ASP.NET网上教程</span></a></li>
<li><a href="http://www.cnblogs.com/thcjp/category/59325.html" target="_blank"><span style="color: #000000;">VS2005控件演示</span></a></li>
<li><a href="http://www.blueidea.com/tech/program/2006/3537.asp" target="_blank"><span style="color: #000000;">ASP.NET高级教程—实战篇</span></a></li>
<li><a href="http://www.bc-cn.net/Article/net/aspx/jc/" target="_blank"><span style="color: #000000;">编程中国asp.net教程</span></a></li>
<li><a href="http://www.aspcool.com/lanmu/browse.asp?bbsuser=aspnet" target="_blank"><span style="color: #000000;">酷网动力asp.net专栏</span></a></li>
<li><a href="http://www.jztop.com/dev/aspnet/" target="_blank"><span style="color: #000000;">友佳学院asp.net专栏</span></a></li>
<li><a href="http://www.programfan.com/article/article.asp?classid=18" target="_blank"><span style="color: #000000;">编程爱好者asp.net文档中心</span></a></li>
<li><a href="http://book.socut.com/" target="_blank"><span style="color: #000000;">烁空网页编程开发技术文档</span></a></li>
</ul>
<p><strong>Visual Studio</strong></p>
<ul>
<li><a href="http://www.microsoft.com/china/msdn/vstudio/default.aspx" target="_blank"><span style="color: #000000;">Visual Studio开发中心</span></a></li>
<li><a href="http://support.microsoft.com/gp/kb_modify_vs/zh-cn" target="_blank"><span style="color: #000000;">Visual Studio最新中文知识库文章</span></a></li>
<li><a href="http://support.microsoft.com/?scid=ph;zh-cn;3041" target="_blank"><span style="color: #000000;">微软Visual Studio  2005中文产品支持中心</span></a></li>
<li><a href="http://dotnet2.cnblogs.com/default.html?cateid=33021" target="_blank"><span style="color: #000000;">博客园Visual Studio 2005专题</span></a></li>
<li><a href="http://soft.yesky.com/lesson/227/3005227.shtml" target="_blank"><span style="color: #000000;">Visual Studio 2005入门视频教程</span></a></li>
<li><a href="http://support.microsoft.com/ph/3041/zh-cn/?aid=1&amp;amp;GSA_AC_More1" target="_blank"><span style="color: #000000;">Visual Studio 2005  How-to文章</span></a></li>
<li><a href="http://support.microsoft.com/ph/3041/zh-cn/?aid=3&amp;amp;GSA_AC_More3" target="_blank"><span style="color: #000000;">Visual Studio 2005疑难解答</span></a></li>
</ul>
<p><strong>Visual C#.Net</strong></p>
<ul>
<li><a href="http://www.microsoft.com/china/msdn/developercenter/VCSharp/default.mspx" target="_blank"><span style="color: #000000;">Visual C#开发中心</span></a></li>
<li><a href="http://support.microsoft.com/ph/1108" target="_blank"><span style="color: #000000;">微软C#中文产品支持中心</span></a></li>
<li><a href="http://support.microsoft.com/gp/kb_modify_csharp/zh-cn" target="_blank"><span style="color: #000000;">C#最新中文知识库文章</span></a></li>
<li><a href="http://www.koders.com/csharpreport.aspx" target="_blank"><span style="color: #000000;">Koders源代码搜索引擎(英)</span></a></li>
<li><a href="http://www.microsoft.com/China/community/dgbrowser/zh-cn/default.mspx?dg=microsoft.public.cn.dotnet.languages.csharp&amp;amp;lang=zh&amp;amp;cr=CN" target="_blank"><span style="color: #000000;">微软C#中文新闻组(Web)</span></a></li>
<li><a href="http://www.studycs.com/" target="_blank"><span style="color: #000000;">中国C#技术学习中心</span></a></li>
<li><a href="http://www.chinacs.net/" target="_blank"><span style="color: #000000;">中文C#技术网</span></a></li>
<li><a href="http://www.win-day.com.cn/InfoList/Catalog_96_1.html" target="_blank"><span style="color: #000000;">清风网络学院C#专栏</span></a></li>
<li><a href="http://download.chinaitlab.com/program/list/98_1.html" target="_blank"><span style="color: #000000;">中国IT实验室C#电子教程下载</span></a></li>
<li><a href="http://dev.21tx.com/dotnet/csharp/" target="_blank"><span style="color: #000000;">天新网C#专题</span></a></li>
<li><a href="http://www.cs-open.com/" target="_blank"><span style="color: #000000;">C#开源资源大全</span></a></li>
<li><a href="http://study.qqcf.com/sort/219/list_2_1.htm" target="_blank"><span style="color: #000000;">C#教程及语言参考</span></a></li>
<li><a href="http://www.mysheji.com/Article/List/List_108.html" target="_blank"><span style="color: #000000;">C#语言教程文章</span></a></li>
<li><a href="http://www.aspcool.com/lanmu/browse.asp?bbsuser=csharp" target="_blank"><span style="color: #000000;">酷网动力C#专栏</span></a></li>
<li><a href="http://www.programfan.com/article/article.asp?classid=15" target="_blank"><span style="color: #000000;">编程爱好者C#文档中心</span></a></li>
</ul>
<p><strong>VB.NET</strong></p>
<ul>
<li><a href="http://www.aspcool.com/lanmu/browse.asp?bbsuser=vbnet" target="_blank"><span style="color: #000000;">酷网动力vb.net专栏</span></a></li>
<li><a href="http://www.programfan.com/article/article.asp?classid=16" target="_blank"><span style="color: #000000;">编程爱好者vb.net文档中心</span></a></li>
<li><a href="http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/consyscourse/VBNETStepByStep.aspx" target="_blank"><span style="color: #000000;">微软VB.NET Step By Step 系列课程</span></a></li>
<li><a href="http://www.microsoft.com/china/msdn/developercenter/VB/VBDC.aspx" target="_blank"><span style="color: #000000;">MSDN Visual Basic开发中心</span></a></li>
</ul>
<p><strong>.NET社区</strong></p>
<ul>
<li><a href="http://community.csdn.net/" target="_blank"><span style="color: #000000;">CSDN社区</span></a></li>
<li><a href="http://www.microsoft.com/China/community/dgbrowser/zh-cn/default.mspx?dg=microsoft.public.cn.dotnet.framework&amp;amp;lang=zh&amp;amp;cr=CN" target="_blank"><span style="color: #000000;">微软.Net Framework中文新闻组(Web)</span></a></li>
<li><a href="http://www.microsoft.com/China/community/dgbrowser/zh-cn/default.mspx?dg=microsoft.public.cn.dotnet.framework.aspnet&amp;amp;lang=zh&amp;amp;cr=CN" target="_blank"><span style="color: #000000;">微软Asp.Net中文新闻组(Web)</span></a></li>
<li><a href="http://www.microsoft.com/China/community/dgbrowser/zh-cn/default.mspx?dg=microsoft.public.cn.dotnet.languages.csharp&amp;amp;lang=zh&amp;amp;cr=CN" target="_blank"><span style="color: #000000;">微软C#中文新闻组(Web)</span></a></li>
<li><a href="http://www.microsoft.com/China/community/dgbrowser/zh-cn/default.mspx?dg=microsoft.public.cn.dotnet.languages.vb&amp;amp;lang=zh&amp;amp;cr=CN" target="_blank"><span style="color: #000000;">微软VB.Net中文新闻组(Web)</span></a></li>
</ul>
<p><strong>.NET博客</strong></p>
<ul>
<li><a href="http://www.cnblogs.com/" target="_blank"><span style="color: #000000;">博客园</span></a></li>
<li><a href="http://www.joycode.com/" target="_blank"><span style="color: #000000;">博客堂</span></a></li>
<li><a href="http://blog.joycode.com/scottgu/" target="_blank"><span style="color: #000000;">Scott Guthrie博客中文版</span></a></li>
<li><a href="http://blog.joycode.com/saucer/" target="_blank"><span style="color: #000000;">思归呓语</span></a></li>
<li><a href="http://blog.joycode.com/ghj/" target="_blank"><span style="color: #000000;">蝈蝈俊</span></a></li>
<li><a href="http://blog.csdn.net/21aspnet/" target="_blank"><span style="color: #000000;">清清月儿 .NET万花筒</span></a></li>
<li><a href="http://cathsfz.cnblogs.com/" target="_blank"><span style="color: #000000;">Cat in DotNet</span></a></li>
</ul>
<p><strong>Ajax</strong></p>
<ul>
<li><a href="http://ajax.asp.net/" target="_blank"><span style="color: #000000;">ASP.NET AJAX 英文官方网站(英)</span></a></li>
<li><a href="http://ajax.asp.net/ajaxtoolkit/" target="_blank"><span style="color: #000000;">Asp.Net Ajax 软件工具包(英)</span></a></li>
<li><a href="http://atlas.cnblogs.com/" target="_blank"><span style="color: #000000;">博客园Asp.Net Ajax专题</span></a></li>
<li><a href="http://bbs.langsin.com/forumdisplay.php?fid=21&amp;amp;page=1" target="_blank"><span style="color: #000000;">ASP.NET AJAX 视频</span></a></li>
<li><a href="http://www.asp.net/learn/videos/default.aspx?tabid=63#ajax" target="_blank"><span style="color: #000000;">ASP.NET AJAX &#8220;How Do  I?&#8221;视频教程系统(英)</span></a></li>
<li><a href="http://ajax.schwarz-interactive.de/CSharpSample/" target="_blank"><span style="color: #000000;">Ajax.NET</span></a></li>
<li><a href="http://www.magicajax.net/" target="_blank"><span style="color: #000000;">MagicAjax.NET</span></a></li>
<li><a href="http://anthemdotnet.com/" target="_blank"><span style="color: #000000;">Anthem.NET</span></a></li>
<li><a href="http://ajax.cnrui.cn/" target="_blank"><span style="color: #000000;">AJAX CNRUI</span></a></li>
</ul>
<p><strong>工具下载</strong></p>
<ul>
<li><a href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;amp;FamilyID=262D25E3-F589-4842-8157-034D1E7CF3A3" target="_blank"><span style="color: #000000;">.NET Framework 1.1  版可再发行组件包</span></a></li>
<li><a href="http://www.microsoft.com/downloads/details.aspx?familyid=04DBAF2E-61ED-43F4-8D2A-CCB2BAB7B8EB&amp;amp;displaylang=zh-cn" target="_blank"><span style="color: #000000;">.NET Framework 1.1  版简体中文语言包</span></a></li>
<li><a href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;amp;FamilyID=9b3a2ca6-3647-4070-9f41-a333c6b9181d" target="_blank"><span style="color: #000000;">.NET Framework 1.1  版软件开发工具包</span></a></li>
<li><a href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;amp;FamilyID=A8F5654F-088E-40B2-BBDB-A83353618B38" target="_blank"><span style="color: #000000;">.NET Framework 1.1 Service Pack  1</span></a></li>
<li><a href="http://www.microsoft.com/downloads/details.aspx?familyid=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&amp;amp;displaylang=zh-cn" target="_blank"><span style="color: #000000;">.NET Framework 2.0  版可再发行组件包(x86)</span></a></li>
<li><a href="http://www.microsoft.com/downloads/details.aspx?familyid=FE6F2099-B7B4-4F47-A244-C96D69C35DEC&amp;amp;displaylang=zh-cn" target="_blank"><span style="color: #000000;">.NET Framework 2.0  软件开发工具包(SDK)(x86)</span></a></li>
<li><a href="http://www.microsoft.com/downloads/details.aspx?familyid=39C8B63B-F64B-4B68-A774-B64ED0C32AE7&amp;amp;displaylang=zh-cn" target="_blank"><span style="color: #000000;">.NET Framework 2.0  版简体中文语言包(x86)</span></a></li>
<li><a href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;amp;FamilyID=10CC340B-F857-4A14-83F5-25634C3BF043" target="_blank"><span style="color: #000000;">.NET Framework 3.0 可再发行组件包</span></a></li>
<li><a href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;amp;FamilyID=5677DDC4-5035-401F-95C3-CC6F46F6D8F7" target="_blank"><span style="color: #000000;">Visual Studio 2005 Team Suite  180天试用版</span></a></li>
<li><a href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;amp;FamilyID=B2C27A7F-D875-47D5-B226-E2578A116E12" target="_blank"><span style="color: #000000;">Visual Studio 2005  专业版90天试用版</span></a></li>
<li><a href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;amp;FamilyID=bb4a75ab-e2d4-4c96-b39d-37baf6b5b1dc" target="_blank"><span style="color: #000000;">Visual Studio 2005 SP1</span></a></li>
<li><a href="http://ajax.asp.net/downloads/default.aspx?tabid=47" target="_blank"><span style="color: #000000;">ASP.NET Ajax 1.1</span></a></li>
<li><a href="http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=AtlasControlToolkit" target="_blank"><span style="color: #000000;">Asp.Net AJAX Control  Toolkit</span></a></li>
<li><a href="http://www.aisto.com/roeder/dotnet/" target="_blank"><span style="color: #000000;">Reflector</span></a></li>
</ul>
<p><strong>开源程序</strong></p>
<ul>
<li><a href="http://www.dasblog.net/" target="_blank"><span style="color: #000000;">DasBlog &#8211; 基于asp.net的博客引擎</span></a></li>
<li><a href="http://umbraco.org/" target="_blank"><span style="color: #000000;">Umbroca &#8211; ASP.NET CMS系统</span></a></li>
<li><a href="http://www.ifdefined.com/bugtrackernet.html" target="_blank"><span style="color: #000000;">BugTracker.NET—bug跟踪系统</span></a></li>
<li><a href="http://www.screwturn.eu/" target="_blank"><span style="color: #000000;">ScrewTurn Wiki &#8211; ASP.NET维基引擎</span></a></li>
<li><a href="http://www.rssbandit.org/" target="_blank"><span style="color: #000000;">RssBandit &#8211; 功能很强的Rss阅读器</span></a></li>
<li><a href="http://subtextproject.com/" target="_blank"><span style="color: #000000;">SubText &#8211; 个人博客平台</span></a></li>
</ul>
<p><strong><span style="font-size: small;">.NET开源项目</span></strong></p>
<p><strong>SharpDevelop</strong><br />
强大的插件系统，通过Addin构建成一个功能齐全的.net开发IDE。核心是AddInTree。跟随这个项目开发许多有用的组件，比如功能文本编辑器（ICSharpCode.TextEditor），SharpZipLib等。<br />
链接：<a href="http://www.icsharpcode.net/" target="_blank"><span style="color: #000000;">http://www.icsharpcode.net/</span></a></p>
<p><strong>DotNetNuke</strong><br />
这个就是著名DNN，使用VB.NET进行开发。通过其基本架构可进行堆积木式快速建站。而且支持子网站系统。其由asp.net  Portal start kit进化而来。<br />
链接：<a href="http://www.dnnchina.net/" target="_blank"><span style="color: #000000;">http://www.dnnchina.net/</span></a> ，<a href="http://www.dotnetnuke.com/" target="_blank"><span style="color: #000000;">http://www.dotnetnuke.com</span></a></p>
<p><strong>Community  Server<br />
</strong>这个也是一个很著名的ASP.NET项目，记得好像最早系统原形为asp.net Forums，后来加入了.Text Blog  和nGallery成为一个完整的通用系统。对应的中文版本为宝玉修改的CCS。<br />
链接：<a href="http://communityserver.org/" target="_blank"><span style="color: #000000;">http://communityserver.org/</span></a></p>
<p><strong>Rainbow</strong><br />
另外一个类似于DNN的系统，使用C#进行开发。<br />
链接：<a href="http://www.rainbowportal.net/" target="_blank"><span style="color: #000000;">http://www.rainbowportal.net/</span></a></p>
<p><strong>RssBandit</strong><br />
一个客户端的RSS查看器，使用C#  进行开发，最大的特点是数据存储采用xml文件。<br />
链接：<a href="http://www.rssbandit.org/" target="_blank"><span style="color: #000000;">http://www.rssbandit.org/</span></a></p>
<p><strong>FreeTextbox</strong><br />
Web上的一个Html超文本编辑器，早些版本是开源的，现在还是免费使用，不过源代码需要购买。<br />
链接：<a href="http://www.freetextbox.com/" target="_blank"><span style="color: #000000;">http://www.freetextbox.com</span></a></p>
<p><strong>World  Wind</strong><br />
使用.NET开发的一个Windows窗体系统，以地球外观看得角度提供全球定位功能，类似于Google  Earth。<br />
链接：<a href="http://worldwind.arc.nasa.gov/" target="_blank"><span style="color: #000000;">http://worldwind.arc.nasa.gov</span></a></p>
<p><strong>log4net</strong><br />
对应Java中的log4j。一个强大的日志管理模块。<br />
链接：<a href="http://logging.apache.org/log4net/" target="_blank"><span style="color: #000000;">http://logging.apache.org/log4net/</span></a></p>
<p><strong>Monodevelop</strong><br />
非Windows  系统下的.net 平台开发工具。<br />
链接：<a href="http://www.monodevelop.com/" target="_blank"><span style="color: #000000;">http://www.monodevelop.com</span></a></p>
<p><strong>Paint.NET</strong><br />
使用.net开发的画图软件，功能不错。<br />
链接：<a href="http://www.getpaint.net/index.html" target="_blank"><span style="color: #000000;">http://www.getpaint.net/index.html</span></a></p>
<p><strong>Nunit</strong><br />
对应Java中的Junit，非常著名的单元测试工具。<br />
链接：<a href="http://www.nunit.org/" target="_blank"><span style="color: #000000;">http://www.nunit.org/</span></a></p>
<p><strong>FCKeditor</strong><br />
Web上的又一个Html超文本编辑器。<br />
链接：<a href="http://www.fckeditor.net/" target="_blank"><span style="color: #000000;">http://www.fckeditor.net/</span></a></p>
<p><strong>Nlog</strong><br />
一个日志管理库，类似于Log4Net。<br />
链接：<a href="http://www.nlog-project.org/" target="_blank"><span style="color: #000000;">http://www.nlog-project.org/</span></a></p>
<p><strong>ManagedSpy</strong><br />
.net  平台下的Spy ++，支持通过.net 2.0开的Windows Forms应用程序。<br />
链接：<a href="http://msdn.microsoft.com/msdnmag/issues/06/04/ManagedSpy/" target="_blank"><span style="color: #000000;">http://msdn.microsoft.com/msdnmag/issues/06/04/ManagedSpy/</span></a></p>
<p><strong>Guidance  Explore</strong><br />
类似于一个.net平台编程问题简答的FAQ。不过提供的都是英文。<br />
链接：<a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=guidanceExplorer" target="_blank"><span style="color: #000000;">http://www.codeplex.com/Wiki/View.aspx?ProjectName=guidanceExplorer</span></a></p>
<p><strong>Terrarium</strong><br />
一个.net开发的多人游戏。玩这个游戏可以提高编程能力。<br />
链接：<a href="http://www.windowsforms.net/Default.aspx?tabindex=4&amp;amp;tabid=49" target="_blank"><span style="color: #000000;">http://www.windowsforms.net/Default.aspx?tabindex=4&amp;tabid=49</span></a></p>
<p><strong>TaskVision</strong><br />
任务管理系统，一个经典的Smart  Client智能客户端程序。<br />
链接：<a href="http://www.windowsforms.net/Default.aspx?tabindex=4&amp;amp;tabid=49" target="_blank"><span style="color: #000000;">http://www.windowsforms.net/Default.aspx?tabindex=4&amp;tabid=49</span></a></p>
<p><strong>IssueVision</strong><br />
事务管理系统，Smart  Client智能客户端程序。<br />
链接：<a href="http://www.windowsforms.net/Default.aspx?tabindex=4&amp;amp;tabid=49" target="_blank"><span style="color: #000000;">http://www.windowsforms.net/Default.aspx?tabindex=4&amp;tabid=49</span></a></p>
<p><strong>FotoVision</strong><br />
又一个值得学习的.net开发的Windows应用程序。<br />
链接：<a href="http://www.windowsforms.net/Default.aspx?tabindex=4&amp;amp;tabid=49" target="_blank"><span style="color: #000000;">http://www.windowsforms.net/Default.aspx?tabindex=4&amp;tabid=49</span></a></p>
<p><strong>Infragistics  Tracker Application</strong><br />
由Infragistics开发的Smart Client智能客户端程序。<br />
链接：<a href="http://www.windowsforms.net/Default.aspx?tabindex=4&amp;amp;tabid=49" target="_blank"><span style="color: #000000;">http://www.windowsforms.net/Default.aspx?tabindex=4&amp;tabid=49</span></a></p>
<p><strong>Windows  Forms RSS Portal</strong><br />
一个.net 开发的聚合器。<br />
链接：<a href="http://www.windowsforms.net/Default.aspx?tabindex=4&amp;amp;tabid=49" target="_blank"><span style="color: #000000;">http://www.windowsforms.net/Default.aspx?tabindex=4&amp;tabid=49</span></a></p>
<p><strong>Enterprise  Library</strong><br />
微软的企业库，对原早些时候开发的一些Block 模块进行整合提供企业统一的接口，新版本使用了.net  2.0的的许多功能。<br />
链接：<a href="http://msdn.microsoft.com/practices/" target="_blank"><span style="color: #000000;">http://msdn.microsoft.com/practices/</span></a></p>
<p><strong>PetShop</strong><br />
基于N-tier设计的电子商务网站，没什么好说的了。<br />
链接：<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/bdasamppet4.asp" target="_blank"><span style="color: #000000;">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/bdasamppet4.asp</span></a></p>
<p><strong>XmlNotepad</strong><br />
一个用.net  开发的xml文件编辑器。<br />
链接：<a href="http://www.microsoft.com/china/msdn/library/data/xml/xmlnotepad.mspx" target="_blank"><span style="color: #000000;">http://www.microsoft.com/china/msdn/library/data/xml/xmlnotepad.mspx</span></a></p>
<p><strong>DockManager  Control</strong><br />
一个很不错的实现类似于VS 2005的界面某些功能的组件。<br />
链接：<a href="http://www.codeproject.com/vb/net/DockPanelSkin.asp" target="_blank"><span style="color: #000000;">http://www.codeproject.com/vb/net/DockPanelSkin.asp</span></a></p>
<p><strong>Starter  Kits for Visual Web  Developer</strong><br />
该套件为学习研究应用asp.net2.0的开发人员提供许多宝贵资源，很不错。<br />
链接：<a href="http://www.asp.net/downloads/starterkits/default.aspx?tabid=62" target="_blank"><span style="color: #000000;">http://www.asp.net/downloads/starterkits/default.aspx?tabid=62</span></a></p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/dotnet/200904475/net-resources.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/dotnet/200904475/net-resources.html</feedburner:origLink></item>
		<item>
		<title>13个让WordPress达到最高性能的优化技巧</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/s-9bTKtmNgQ/13wordpress-tips.html</link>
		<comments>http://degula.com/wordpress/200904474/13wordpress-tips.html#comments</comments>
		<pubDate>Tue, 21 Apr 2009 02:29:59 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wp-hack]]></category>
		<category><![CDATA[wp-speedup]]></category>

		<guid isPermaLink="false">http://degula.com/?p=474</guid>
		<description><![CDATA[性能是任何成功网站的一个关键因素。越来越多的人选择使用WordPress搭建个人博客、CMS内容展示或是企业网站，但可能由于高流量或一些未知的原因，导致你的WordPress性能越来越低，尤其对于大多数主机质量一般流量却很高的个人站长来说。
本文里，我们就为你介绍一些你可能还不知道或是没有发现的WordPress优化技巧，彻底的学习并贯彻实施它们，能大幅度的提高你的WordPress整体性能。
首先，看一些简单基础的WordPress优化步骤
1. 升级到最新版本的WordPress
相对于之前的版本，WordPress 2.7 拥有许多性能改善，可以预见的是，以后的版本也会在这方面加强。所以随时保持 升级 到最新版本WordPress是一个简单实用的优化步骤。

2. 移除多余的插件和保持插件为最新版本
移除任何你并不使用的Wordpress插件. 禁用它们并从你的Web服务器上删除它们. 禁用它们是因为WordPress程序会检查一个插件是否启用， 如果你根本不需要那个插件，何必浪费WordPress的时间，更浪费你服务器的时间.
同时，保持你正在使用的插件为最新版本也是很重要的. 很多插件的更新并没有加入新的功能，但这并不代表你就没必要更新。插件的更新里面可能对一些代码进行了优化，能让插件运行的更加良好，同时也让你的整个WordPress站点提高性能。
3. 减少PHP和数据库查询
Wpcandy发布过一篇 simple ways to speed up WordPress(提速WordPress的简单方式) . 详细的介绍了如何减少PHP和数据库查询.
简单的说，把能用HTML直接输出的代码就直接用HTML输出，而不是PHP。比如打开你WordPress主题的header.php，什么字符集声明，feed地址等等，很多东西都是可以把PHP代码直接换成静态HTML的。
在帕兰映像里面，我甚至把分类，页面输出这些都直接用HTML。当然，并不建议你也这样，也得根据实际情况和不同需求。你只要记住，那种固定不变或很久才变一次的内容，完全可以用HTML代码替换掉。
提示: 如果你是做一个公开发布的WordPress主题，千万别这么干，因为它可能并不适用于每个用户。
4. 优化和修复你的数据库(从phpmyadmin)
你应该定时(每周或每半个月)登录一下你的phpmyadmin，然后对你的各个WordPress表进行优化和修复，很简单，你只需要选中这些表，然后进行”Optimize table”和”Repair table”即可。(如果要慎重起见，你最好还是同时备份一下你的数据库。安全和性能同时抓，何乐而不为？)

照顾好你的图像
5. 使用可靠的图像存储服务

尝试把你常用的Web图像，CSS和Javascript等存储到Amazon S3 Storage service ，这里是一个教程:  this step by step guide.
注: Amozon S3存储服务是收费的，一般博客当然不会用。如果你的流量确实很高或者是企业级网站，那相对之下，它的收费算蛮便宜的了。
你还可以尝试 WP-Offload这个WordPress插件, 它可以提高你的博客性能。(注: 我也没用这个插件，有兴趣的朋友可以去下了研究一下。)

提示: 如果你是那种选择把图片放到第三方存储服务的人，真的要谨慎选择。试想一下，把图片存在你的主机上造成流量消耗当机但你的图片还在，你后期的修复整理也容 易。如果把图片存放在第三方存储服务，而这个服务又非常不靠谱，一会儿免费，一会儿收费，一会儿又直接把你整个帐户都封了。这时候就算图片还在，你网站中 原来的图片引用都失效，你需要花大把的时间去搞定这件事。
所以我给你的建议就是: 要么选择一个非常优秀的收费存储服务，储如Amozon S3。要么买个超强的主机。要么宁可存在自己的主机上，不管这个主机性能如何。
6. 使用工具优化你的图像
Shrink O’Matic 是一个 AIR 应用程序，它可以让你轻松的改变图像大小. 支持 JPGs, GIFs 和 PNGs. 只需要简单的拖拽即可实现。
注: [...]]]></description>
			<content:encoded><![CDATA[<p>性能是任何成功网站的一个关键因素。越来越多的人选择使用<a href="http://degula.com/category/wordpress/" target="_blank">WordPress</a>搭建个人博客、CMS内容展示或是企业网站，但可能由于高流量或一些未知的原因，导致你的WordPress性能越来越低，尤其对于大多数主机质量一般流量却很高的个人站长来说。</p>
<p>本文里，我们就为你介绍一些你可能还不知道或是没有发现的WordPress优化技巧，彻底的学习并贯彻实施它们，能大幅度的提高你的WordPress整体性能。</p>
<h3>首先，看一些简单基础的WordPress优化步骤</h3>
<h4>1. 升级到最新版本的WordPress</h4>
<p>相对于之前的版本，WordPress 2.7 拥有许多性能改善，可以预见的是，以后的版本也会在这方面加强。所以随时保持 <a href="http://wordpress.org/download/">升级 </a>到<a href="http://parandroid.com/wordpress-safety-recommendations-and-techniques/" target="_blank">最新版本WordPress</a>是一个简单实用的优化步骤。</p>
<p><span id="more-474"></span></p>
<h4>2. 移除多余的插件和保持插件为最新版本</h4>
<p>移除任何你并不使用的Wordpress插件. 禁用它们并从你的Web服务器上删除它们. 禁用它们是因为WordPress程序会检查一个插件是否启用， 如果你根本不需要那个插件，何必浪费WordPress的时间，更浪费你服务器的时间.</p>
<p>同时，保持你正在使用的插件为最新版本也是很重要的. 很多插件的更新并没有加入新的功能，但这并不代表你就没必要更新。插件的更新里面可能对一些代码进行了优化，能让插件运行的更加良好，同时也让你的整个WordPress站点提高性能。</p>
<h4>3. 减少PHP和数据库查询</h4>
<p>Wpcandy发布过一篇 <a href="http://wpcandy.com/articles/tutorials/4-simple-ways-to-speed-up-wordpress.html">simple ways to speed up WordPress(提速WordPress的简单方式)</a> . 详细的介绍了如何减少PHP和数据库查询.</p>
<p>简单的说，把能用HTML直接输出的代码就直接用HTML输出，而不是PHP。比如打开你WordPress主题的header.php，什么字符集声明，feed地址等等，很多东西都是可以把PHP代码直接换成静态HTML的。</p>
<p>在帕兰映像里面，我甚至把分类，页面输出这些都直接用HTML。当然，并不建议你也这样，也得根据实际情况和不同需求。你只要记住，那种固定不变或很久才变一次的内容，完全可以用HTML代码替换掉。</p>
<p><span style="color: #888888;">提示</span>: 如果你是做一个公开发布的WordPress主题，千万别这么干，因为它可能并不适用于每个用户。</p>
<h4>4. 优化和修复你的数据库(从phpmyadmin)</h4>
<p>你应该定时(每周或每半个月)登录一下你的<a href="http://parandroid.com/8-wordpress-sql-hacks/" target="_blank">phpmyadmin</a>，然后对你的各个WordPress表进行优化和修复，很简单，你只需要选中这些表，然后进行”Optimize table”和”Repair table”即可。(如果要慎重起见，你最好还是同时备份一下你的数据库。安全和性能同时抓，何乐而不为？)</p>
<p><img class="aligncenter size-full wp-image-7868" title="wordpress_speed_5" src="http://parandroid.com/wp-content/uploads/2009/03/wordpress_speed_5.jpg" alt="wordpress_speed_5 13个让WordPress达到最高性能的优化技巧" width="439" height="151" /></p>
<h3>照顾好你的图像</h3>
<h4>5. 使用可靠的图像存储服务</h4>
<ul>
<li>尝试把你常用的Web图像，CSS和Javascript等存储到<a href="http://aws.amazon.com/s3/">Amazon S3 Storage service</a> ，这里是一个教程:  <a href="http://www.labnol.org/internet/host-images-files-on-amazon-s3-storage/4923/">this step by step guide</a>.<br />
注: Amozon S3存储服务是收费的，一般博客当然不会用。如果你的流量确实很高或者是企业级网站，那相对之下，它的收费算蛮便宜的了。</li>
<li>你还可以尝试 <a href="http://wordpress.org/extend/plugins/wp-offload/">WP-Offload这个WordPress插件</a>, 它可以提高你的博客性能。(注: 我也没用这个插件，有兴趣的朋友可以去下了研究一下。)</li>
</ul>
<p><span style="color: #888888;">提示</span>: 如果你是那种选择把图片放到第三方存储服务的人，真的要谨慎选择。试想一下，把图片存在你的主机上造成流量消耗当机但你的图片还在，你后期的修复整理也容 易。如果把图片存放在第三方存储服务，而这个服务又非常不靠谱，一会儿免费，一会儿收费，一会儿又直接把你整个帐户都封了。这时候就算图片还在，你网站中 原来的图片引用都失效，你需要花大把的时间去搞定这件事。</p>
<p>所以我给你的建议就是: 要么选择一个非常优秀的收费存储服务，储如Amozon S3。要么买个超强的主机。要么宁可存在自己的主机上，不管这个主机性能如何。</p>
<h4>6. 使用工具优化你的图像</h4>
<p><a href="http://toki-woki.net/p/Shrink-O-Matic/" target="_blank">Shrink O’Matic</a> 是一个 AIR 应用程序，它可以让你轻松的改变图像大小. 支持 JPGs, GIFs 和 PNGs. 只需要简单的拖拽即可实现。</p>
<p>注: 原文里推荐的这个工具，还有很多类似的软件啦，大家自己找找。在使用之前，明白哪种图像格式能让图像Size更小，追求图像质量还是最高压缩等等都是非常重要的。相关知识自己去Google吧。</p>
<h3>更深入的WordPress性能提高</h3>
<h4>7. 安装WordPress Super Cache插件</h4>
<p><a href="http://wordpress.org/extend/plugins/wp-super-cache/" target="_blank">WordPress Super Cache</a>插件绝对优秀，不多做介绍，大多数WordPress用户都应该比较熟悉，用过便知。只是使用之后也会有些后遗症很难处理，比如一些需要跟踪确认广告代码的广告商，会无法跟踪到。网上也有一切解决方法，但我还没见过很完美的。</p>
<h4>8. PHP Speedy WP</h4>
<p><a href="http://aciddrop.com/php-speedy/" target="_blank">PHP Speedy</a>是一个PHP脚本库，主要适用于调用了很多JS文件和CSS文件的PHP网站。而<a href="http://aciddrop.com/2008/12/11/php-speedy-wp-05-now-works-with-wordpress-27/">PHP Speedy WP</a> 就是专为WordPress用户方便操作的插件。如果我们使用了很多插件，在head头部里面会有很多的js和css文件调用，使用这个插件，能加快这些东西的载入速度。</p>
<h4>9.  WP CSS</h4>
<p><a href="http://wordpress.org/extend/plugins/wp-css/" target="_blank">WP CSS</a>也是一个WordPress插件。它可以gzip压缩和移除你CSS文件中的空白区。还有缓存什么什么的。(这个我也还没用过，具体功能还不也解，有兴趣的朋友去试试。)</p>
<h4>10. DB Cache</h4>
<p><a href="http://wordpress.org/extend/plugins/db-cache/" target="_blank">DB Cache/数据库缓存</a>。此插件缓存每个数据库查询。这是非常快的，并使用小型磁盘空间缓存。我也没有尝试过这个插件，不过有很多WordPress用户推荐过这个插件。</p>
<h4>11. 通过Ajax Libraries API加速你的脚本框架载入</h4>
<p>简单讲，调用Google Code里面的大型框架 &#8211; <a href="http://code.google.com/apis/ajaxlibs/" target="_blank">Ajax Libraries API</a>。对这些框架的载入，让Google的服务去承担:) 常用的有:</p>
<ul>
<li><a href="http://code.google.com/apis/ajaxlibs/documentation/index.html#jquery">jQuery</a></li>
<li><a href="http://code.google.com/apis/ajaxlibs/documentation/index.html#prototype">prototype</a></li>
<li><a href="http://code.google.com/apis/ajaxlibs/documentation/index.html#script_aculo_us">script.aculo.us</a></li>
<li><a href="http://code.google.com/apis/ajaxlibs/documentation/index.html#mootools">MooTools</a></li>
<li><a href="http://code.google.com/apis/ajaxlibs/documentation/index.html#dojo">dojo</a></li>
</ul>
<p>调用方法就不必介绍了吧。这里重点补充分享我个人的一些看法: <strong>不要一味跟风的使用特效</strong>。</p>
<p>Javascript, Ajax尤其是后生可畏当下火热的jQuery库让我们可以创建很多漂亮的效果。但在我看来，为了提高浏览体验、网站规划布局等实用的特效才值得去使用。 也就是说，你使用这个特效，目标应该是提高可用性，而不是单纯为了视觉。(当然，这主要是对于大多数网站来说，尤其是流量很高更需要提高性能的网站)。</p>
<p>比如我认识的一些朋友，看见”<a href="http://parandroid.com/click-on-the-anchor-link-pages-rolling-effects-javascript-smooth-scroll/" target="_blank">点击滑动锚链接至目标区域”</a>的特效很好看，就非得给自己用上。也不管这个特效有多大，就为了这个特效，调用一个jQuery框架。或者是明明几行js就可以搞定的tabs内容，就为了让它滑动的时候好看点，就又添加上几十KB的JS。而事实上，这些特效就真的提高浏览体验了?</p>
<p>javascript, ajax, jquery等等都是伟大的Web开发技术， 这根本质疑不了。但用的时候权衡利弊是很重要的。</p>
<h4>12. 显示页面载入时间和查询次数</h4>
<p>在主题的底部加入显示载入时间和查询次数的信息，能有助于你也也解你自己博客的性能情况。而通常，这个信息是没必要出来的。所以你可以使用下面的代码:</p>
<pre><code class="php">&lt;!--&lt;?php echo get_num_queries(); ?&gt; queries in &lt;?php timer_stop(1); ?&gt;  seconds.--&gt;
</code></pre>
<p>这个代码被注释掉了。你要查询的时候，查看源文件即可。没必要显示出来，应该不会有多少访客有兴趣了解你的WordPress性能。</p>
<h4>13. Optimize DB</h4>
<p>又是一个优化Mysql数据库的插件 &#8211; <a href="http://yoast.com/wordpress/optimize-db/" target="_blank">Optimize DB</a>。且它的使用很简单，点击一下优化按钮即可。</p>
<p><strong>英文原文</strong>:<a title="13 Great WordPress Speed Tips &amp; Tricks for MAX Performance" href="http://www.noupe.com/wordpress/13-great-wordpress-speed-tips-tricks-for-max-performance.html">13 Great WordPress Speed Tips &amp; Tricks for MAX Performance</a><br />
<strong>中文译文</strong>: 13个让WordPress达到最高性能的优化技巧/帕兰映像</p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/wordpress/200904474/13wordpress-tips.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://degula.com/wordpress/200904474/13wordpress-tips.html</feedburner:origLink></item>
		<item>
		<title>MooTools 入门教程 (一)</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/sDJrtZPdcpg/mootools-tips1.html</link>
		<comments>http://degula.com/webdev/javascript-webdev/200904472/mootools-tips1.html#comments</comments>
		<pubDate>Mon, 20 Apr 2009 08:02:47 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[MooTools]]></category>
		<category><![CDATA[web develop]]></category>

		<guid isPermaLink="false">http://degula.com/webdev/javascript-webdev/200904472/mootools-%e5%85%a5%e9%97%a8%e6%95%99%e7%a8%8b-%e4%b8%80.html</guid>
		<description><![CDATA[本文是MooTools系列教程的第一部分,本系列教程为MooTools新手提供了一些入门的技巧,对刚刚开始接触MooTools的朋友非常有用.
本教程的其他部分稍后推出:)
MooTools 入门教程 (二)
占位二
在第一课中,我们将会学习如何操作元素的属性,如使用ID操作一个DOM元素,getStyle(),setStyle()的用法(操作元素的CSS属性),使用toInt()将string类型转换为number类型等.

1. 引入 Mootols 框架
下载最新的 MooTools 并在 &#60;head&#62; 里添加:
&#60;script type=&#8221;text/javascript&#8221; src=&#8221;mootools.svn.js&#8221;&#62;&#60;/script&#62;
2. 获得一个 DOM 元素
使用如下方法获得ID为&#8217;myElement&#8217;的DOM元素:
var element = $(&#8217;myElement&#8217;);
等同于javascript代码:
var element = document.getElementById(&#8217;myElement&#8217;);
使用 $$ 可以得到一个DOM元素内的一组元素对象,如:
$$(&#8217;#myElement li.myListElement&#8217;);
上面的代码获得ID=&#8217;myElement&#8217;里面的一组标签为 &#60;li&#62; 并且 class=&#8221;myListElement&#8221; 的元素.
3. setStyle() and get Style()
get和set元素属性(height, background, color&#8230;)的方法. 设置属性可以使用下面代码:
$(&#8221;myElement&#8221;).setStyle(&#8221;height&#8221;, &#8220;200px&#8221;)
也可以在一个方法里设置多个属性:
$(&#8221;myElement&#8221;).setStyles({
background: &#8220;#DEDEDE&#8221;,
border:&#8221;solid 1px #999999&#8243;,
width: &#8220;700px&#8221;
height: &#8220;80px&#8221;
});
获得一个属性的值使用getStyle()方法:
$(&#8221;myElement&#8221;).getStyle(&#8221;height&#8221;)
上面代码返回 ID=&#8221;myElement&#8221;的元素的height, 如 &#8220;200px&#8221;,如果想返回数字200,则需要使用toInt()方法:
$(&#8221;myElement&#8221;).getStyle(&#8221;height&#8221;).toInt()
4. Unobtrusive Javascript
Unobtrusive的Javascript指的是尽量令Javascript代码和页面代码分离,如使用事件机制而不是将方法的调用写在DOM中:
&#60;script type=&#8221;text/javascript&#8221;&#62;
window.addEvent(&#8217;domready&#8217;, function() {
//Some lines of code here&#8230;
});
&#60;/script&#62;
给元素&#8221;myElement&#8221;添加一个click事件:
&#60;script type=&#8221;text/javascript&#8221;&#62;
window.addEvent(&#8217;domready&#8217;, function() [...]]]></description>
			<content:encoded><![CDATA[<p>本文是MooTools系列教程的第一部分,本系列教程为MooTools新手提供了一些入门的技巧,对刚刚开始接触MooTools的朋友非常有用.</p>
<p>本教程的其他部分稍后推出:)<br />
<a href="http://degula.com/webdev/javascript-webdev/200904472/mootools-tips1mootools-tips1.html ">MooTools 入门教程 (二)</a><br />
<a href="http://degula.com">占位二</a></p>
<p>在第一课中,我们将会学习如何操作元素的属性,如使用ID操作一个DOM元素,getStyle(),setStyle()的用法(操作元素的CSS属性),使用toInt()将string类型转换为number类型等.</p>
<p><span id="more-472"></span></p>
<p><strong>1. 引入 Mootols 框架</strong><br />
下载最新的 <a href="http://mootools.net/">MooTools</a> 并在 &lt;head&gt; 里添加:</p>
<blockquote><p>&lt;script type=&#8221;text/javascript&#8221; src=&#8221;mootools.svn.js&#8221;&gt;&lt;/script&gt;</p></blockquote>
<p><strong>2. 获得一个 DOM 元素</strong><br />
使用如下方法获得ID为&#8217;myElement&#8217;的DOM元素:</p>
<blockquote><p>var element = $(&#8217;myElement&#8217;);</p></blockquote>
<p>等同于javascript代码:</p>
<blockquote><p>var element = document.getElementById(&#8217;myElement&#8217;);</p></blockquote>
<p>使用 $$ 可以得到一个DOM元素内的一组元素对象,如:</p>
<blockquote><p>$$(&#8217;#myElement li.myListElement&#8217;);</p></blockquote>
<p>上面的代码获得ID=&#8217;myElement&#8217;里面的一组标签为 &lt;li&gt; 并且 class=&#8221;myListElement&#8221; 的元素.<br />
<strong>3. setStyle() and get Style()</strong><br />
get和set元素属性(height, background, color&#8230;)的方法. 设置属性可以使用下面代码:</p>
<blockquote><p>$(&#8221;myElement&#8221;).setStyle(&#8221;height&#8221;, &#8220;200px&#8221;)</p></blockquote>
<p>也可以在一个方法里设置多个属性:</p>
<blockquote><p>$(&#8221;myElement&#8221;).setStyles({</p>
<p>background: &#8220;#DEDEDE&#8221;,<br />
border:&#8221;solid 1px #999999&#8243;,<br />
width: &#8220;700px&#8221;<br />
height: &#8220;80px&#8221;</p>
<p>});</p></blockquote>
<p>获得一个属性的值使用getStyle()方法:</p>
<blockquote><p>$(&#8221;myElement&#8221;).getStyle(&#8221;height&#8221;)</p></blockquote>
<p>上面代码返回 ID=&#8221;myElement&#8221;的元素的height, 如 &#8220;200px&#8221;,如果想返回数字200,则需要使用toInt()方法:</p>
<blockquote><p>$(&#8221;myElement&#8221;).getStyle(&#8221;height&#8221;).toInt()</p></blockquote>
<p><strong>4. Unobtrusive <a href="http://degula.com/category/webdev/javascript-webdev">Javascript</a></strong><br />
Unobtrusive的Javascript指的是尽量令Javascript代码和页面代码分离,如使用事件机制而不是将方法的调用写在DOM中:</p>
<blockquote><p>&lt;script type=&#8221;text/javascript&#8221;&gt;<br />
window.addEvent(&#8217;domready&#8217;, function() {<br />
//Some lines of code here&#8230;<br />
});<br />
&lt;/script&gt;</p></blockquote>
<p>给元素&#8221;myElement&#8221;添加一个click事件:</p>
<blockquote><p>&lt;script type=&#8221;text/javascript&#8221;&gt;<br />
window.addEvent(&#8217;domready&#8217;, function() {<br />
$(&#8217;myElement&#8217;).addEvent(&#8217;click&#8217;, function() {<br />
alert(&#8217;Hello World!&#8217;);<br />
});<br />
});<br />
&lt;/script&gt;</p></blockquote>
<p>相应的HTML代码为:</p>
<blockquote><p>&lt;a href=&#8221;home.html&#8221; id=&#8221;myElement&#8221;&gt;<br />
Try to click here!<br />
&lt;/a&gt;</p></blockquote>
<p>传统的obtrusive的写法为将click方法写在&lt;a&gt;标签中:</p>
<blockquote><p>&lt;a href=&#8221;home.html&#8221; id=&#8221;myElement&#8221; onClick=&#8221;javascript:doSomething()&#8221; &gt;<br />
Try to click here!&lt;/a&gt;</p></blockquote>
<p><strong>实例1: 更改背景色 background color</strong></p>
<p>假设有如下HTML代码:</p>
<blockquote><p>&lt;div id=&#8221;myLayer&#8221;&gt;<br />
&lt;a href=&#8221;#&#8221; id=&#8221;myElement&#8221;&gt;Change Background&lt;/a&gt;<br />
&lt;/div&gt;</p></blockquote>
<p>更改背景色代码:</p>
<blockquote><p>&lt;script type=&#8221;text/javascript&#8221;&gt;<br />
window.addEvent(&#8217;domready&#8217;, function() {<br />
$(&#8217;myElement&#8217;).addEvent(&#8217;click&#8217;, function() {<br />
$(&#8217;myLayer&#8217;).setStyle(&#8217;background&#8217;, &#8216;#DEDEDE&#8217;);<br />
});<br />
});<br />
&lt;/script&gt;</p></blockquote>
<p><strong>实例2: 更改/重置背景色</strong><br />
下面看一个稍微复杂一点的例子,HTML代码:</p>
<blockquote><p>&lt;div id=&#8221;myLayer&#8221;&gt;<br />
&lt;a href=&#8221;#&#8221; id=&#8221;myElement&#8221;&gt;Change Background&lt;/a&gt;<br />
&lt;/div&gt;</p></blockquote>
<p>Javascript 代码:</p>
<blockquote><p>&lt;script type=&#8221;text/javascript&#8221;&gt;<br />
window.addEvent(&#8217;domready&#8217;, function() {</p>
<p>$(&#8217;myElement&#8217;).addEvent(&#8217;click&#8217;, function() {</p>
<p>var currentBgColor = $(&#8217;myLayer&#8217;).getStyle(&#8217;background&#8217;);<br />
if(currentBgColor==&#8221;){<br />
$(&#8217;myLayer&#8217;).setStyle(&#8217;background&#8217;, &#8216;#DEDEDE&#8217;);<br />
} else {<br />
$(&#8217;myLayer&#8217;).setStyle(&#8217;background&#8217;, &#8216;#FFFFFF&#8217;);<br />
}</p>
<p>});</p>
<p>});<br />
&lt;/script&gt;</p></blockquote>
<p><a href="http://www.box.net/shared/3ztrf64g8k"><span style="color: #ff00ff;">下载源代码</span></a><br />
如你所见,使用MooTools大大简化了<a href="http://degula.com/category/webdev/javascript-webdev">Javascript</a>代码,下一课我们将一起学习一些更复杂的操作DOM对象的方法,如web开发中最常用到的表单操作.敬请期待:).</p>
<p><a href="http://woork.blogspot.com/2008/08/mootools-basic-tips-for-web-designer.html">原文:地址</a> <a href="http://degula.com">翻译:德古拉|degula.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/webdev/javascript-webdev/200904472/mootools-tips1.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://degula.com/webdev/javascript-webdev/200904472/mootools-tips1.html</feedburner:origLink></item>
		<item>
		<title>IIS性能优化指南</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/tBE3Et4RIUQ/iis-opt.html</link>
		<comments>http://degula.com/webdev/200904470/iis-opt.html#comments</comments>
		<pubDate>Fri, 17 Apr 2009 05:20:19 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[web开发]]></category>
		<category><![CDATA[iis]]></category>
		<category><![CDATA[web develop]]></category>
		<category><![CDATA[web server]]></category>

		<guid isPermaLink="false">http://degula.com/?p=470</guid>
		<description><![CDATA[Windows Server自带的互联网信息服务器（Internet Information Server，IIS）是架设网站服务器的常用工具，它是一个既简单而又麻烦的东西，新手都可以使用IIS架设一个像模像样的Web站点来，但配置、优化 IIS的性能，使得网站访问性能达到最优状态却不是一件简单的事情，这里我就介绍一下如何一步一步的优化你的IIS服务器。

服务器端环境，我们以Windows Server 2003的IIS6.0为例，客户端环境为Mozilla Firefox 3.0，同时安装Yahoo的YSlow扩展。
YSlow是 Yahoo开发者团队发布的一款基于Firebug的插件。用于分析网页，并根据一些高性能网站的规则进行相应的评级打分，对于网页性能优化有很好的帮助 作用，告诉你那些部分影响了你的网页速度，并告诉你如何基于某些规则而进行优化。我们对于IIS的优化策略就是基于YSlow的。
使用安装了YSlow的Firefox打开目标网站，然后点击YSlow图标，点击Performance，如下图所示。

其中Performance Grade为YSlow对你网站的评级，A（100分）为最高，F为最低，后面列出如何进行修改，下面我以IIS 6.0为例介绍一下如何进行优化网站性能。
1、减少HTTP请求数量
这主要是修改网站代码，减少外部图片、CSS、JS等文件数量，手动合并多个CSS/JavaScript文件。IIS那里不用设置。
2、使用CDN
对于小网站来说，这个就免了吧。当然有钱人可以试试，可以从技术上解决用户访问网站响应速度慢的问题。
3、启用内容过期
对于静态文件启用内容过期可以提高访问性能。首先网站的目录要划分合理，图片、CSS、JavaScript均放在单独目录下，然后在IIS中选择目 录，点属性-HTTP头，启用内容过期，可以选择30天后过去，这样，用户浏览器将比较当前日期和截止日期，以便决定是显示缓存页还是从服务器请求更新的 页，由于图片、CSS、JS通常变化较少，因此基本上都从本地缓存读取，从而加快显示速度。

4、启用Gzip压缩
HTTP压缩是在Web服务器和浏览器间传输压缩文本内容的方法。HTTP压缩采用通用的压缩算法如Gzip等压缩HTML、JavaScript或 CSS文件。压缩的最大好处就是降低了网络传输的数据量，从而提高客户端浏览器的访问速度。
使用方法是，右击“网站”-&#62;“属性”，选择“服务”。在“HTTP压缩”框中选中“压缩静态文件”，“临时目录”建议单独设置另一个盘的目录下。

之后，IIS管理器中，右击“Web服务扩展”-&#62;“增加一个新的Web服务扩展”，在“扩展名”中输入“HTTPCompression”，添 加“要求的文件”为C:\WINDOWS\system32\inetsrv\gzip.dll，其中Windows系统目录根据您的安装可能有所不同， 选中“设置扩展状态为允许”。

最后，使用文本编辑器打开C:\Windows\System32\inetsrv\MetaBase.xml，在HcFileExtensions中 增加需要压缩的静态文件后缀名，默认为HTML和TXT文件，建议再添加上js、css等，不要添加图片或ZIP等已经被压缩的文件。
5、将样式文件放在头部
这是基本的HTML代码风格，将所有的CSS文件都放在HTML页面的头部。
6、将脚本文件放在尾部
这也是基本的HTML代码风格，将所有的JavaScript文件都放在HTML页面的尾部。
7、避免CSS表达式
这点很简单，因为大多数人从来不用CSS表达式。
8、使用外部的JavaScript和CSS
将所有的JavaScript和CSS都做成外部文件的形式进行引用，这主要是为了让这些文件可以被浏览器缓存起来，参见第三点的介绍。
9、减少DNS查询
域名的DNS查询会带来额外的访问开销，减少页面内文件的主机域名数量，一个页面的主机域名保持在2-4个以内，这样就不会降低页面的装入速度。
10、压缩JavaScript文件
压缩脚本文件，删除不必要的字符，可以改善加载时间，目前有很多JavaScript文件的压缩工具，我这里有一个GUI界面的JS压缩工具供下载。
11、避免重定向
网页的重定向会带来额外的运行开销，因此要避免页面进行重定向跳转操作。
12、删除重复脚本
一个页面两次包含同一个JavaScript文件会影响加载的性能，因此需要将重复的脚本文件删除。
13、配置ETag
这是一个令人迷惑的问题。理论上说将服务器的ETag删除会提高HTTP请求的性能，但是按照微软官方提供的修改方法配置IIS 6.0，并没有实际效果，最终我使用了一个第三方的DLL文件，以ISAPI的方式实现了删除ETag的功能。
经过上面这些网站前端重构和WEB服务器的配置修改，我们的页面结构就变得更加规范，重构的页面大多都会取得不错的YSlow的评分，总体来说性能提升了不少。对于最终用户来说，也会明显感受到访问网站速度变快了很多，网站的浏览体验得到了较好的提升。
参考书籍：高性能网站建设指南 —— 电子工业出版社出版

原文地址：http://www.williamlong.info/archives/1752.html

]]></description>
			<content:encoded><![CDATA[<p>Windows Server自带的互联网信息服务器（Internet Information Server，IIS）是架设网站服务器的常用工具，它是一个既简单而又麻烦的东西，新手都可以使用IIS架设一个像模像样的Web站点来，但配置、优化 IIS的性能，使得网站访问性能达到最优状态却不是一件简单的事情，这里我就介绍一下如何一步一步的优化你的IIS服务器。</p>
<p><span id="more-470"></span></p>
<p>服务器端环境，我们以Windows Server 2003的IIS6.0为例，客户端环境为Mozilla Firefox 3.0，同时安装Yahoo的YSlow扩展。</p>
<p><a href="http://www.williamlong.info/archives/985.html" target="_blank">YSlow</a>是 Yahoo开发者团队发布的一款基于Firebug的插件。用于分析网页，并根据一些高性能网站的规则进行相应的评级打分，对于网页性能优化有很好的帮助 作用，告诉你那些部分影响了你的网页速度，并告诉你如何基于某些规则而进行优化。我们对于IIS的优化策略就是基于YSlow的。</p>
<p>使用安装了YSlow的Firefox打开目标网站，然后点击YSlow图标，点击Performance，如下图所示。</p>
<p style="text-align: center;"><img src="http://www.williamlong.info/upload/1752_1.jpg" alt="YSlow" width="450" height="460" /></p>
<p>其中Performance Grade为YSlow对你网站的评级，A（100分）为最高，F为最低，后面列出如何进行修改，下面我以IIS 6.0为例介绍一下如何进行优化网站性能。</p>
<p><strong>1、减少HTTP请求数量</strong></p>
<p>这主要是修改网站代码，减少外部图片、CSS、JS等文件数量，手动合并多个CSS/JavaScript文件。IIS那里不用设置。</p>
<p><strong>2、使用CDN</strong></p>
<p>对于小网站来说，这个就免了吧。当然有钱人可以试试，可以从技术上解决用户访问网站响应速度慢的问题。</p>
<p><strong>3、启用内容过期</strong></p>
<p>对于静态文件启用内容过期可以提高访问性能。首先网站的目录要划分合理，图片、CSS、JavaScript均放在单独目录下，然后在IIS中选择目 录，点属性-HTTP头，启用内容过期，可以选择30天后过去，这样，用户浏览器将比较当前日期和截止日期，以便决定是显示缓存页还是从服务器请求更新的 页，由于图片、CSS、JS通常变化较少，因此基本上都从本地缓存读取，从而加快显示速度。</p>
<p style="text-align: center;"><img src="http://www.williamlong.info/upload/1752_2.jpg" alt="启用内容过期" width="443" height="409" /></p>
<p><strong>4、启用Gzip压缩</strong></p>
<p>HTTP压缩是在Web服务器和浏览器间传输压缩文本内容的方法。HTTP压缩采用通用的压缩算法如Gzip等压缩HTML、JavaScript或 CSS文件。压缩的最大好处就是降低了网络传输的数据量，从而提高客户端浏览器的访问速度。</p>
<p>使用方法是，右击“网站”-&gt;“属性”，选择“服务”。在“HTTP压缩”框中选中“压缩静态文件”，“临时目录”建议单独设置另一个盘的目录下。</p>
<p style="text-align: center;"><img src="http://www.williamlong.info/upload/1752_3.jpg" alt="启用Gzip压缩" width="450" height="431" /></p>
<p>之后，IIS管理器中，右击“Web服务扩展”-&gt;“增加一个新的Web服务扩展”，在“扩展名”中输入“HTTPCompression”，添 加“要求的文件”为C:\WINDOWS\system32\inetsrv\gzip.dll，其中Windows系统目录根据您的安装可能有所不同， 选中“设置扩展状态为允许”。</p>
<p style="text-align: center;"><img src="http://www.williamlong.info/upload/1752_4.jpg" alt="启用Gzip压缩" /></p>
<p>最后，使用文本编辑器打开C:\Windows\System32\inetsrv\MetaBase.xml，在HcFileExtensions中 增加需要压缩的静态文件后缀名，默认为HTML和TXT文件，建议再添加上js、css等，不要添加图片或ZIP等已经被压缩的文件。</p>
<p><strong>5、将样式文件放在头部</strong></p>
<p>这是基本的HTML代码风格，将所有的CSS文件都放在HTML页面的头部。</p>
<p><strong>6、将脚本文件放在尾部</strong></p>
<p>这也是基本的HTML代码风格，将所有的JavaScript文件都放在HTML页面的尾部。</p>
<p><strong>7、避免CSS表达式</strong></p>
<p>这点很简单，因为大多数人从来不用CSS表达式。</p>
<p><strong>8、使用外部的JavaScript和CSS</strong></p>
<p>将所有的JavaScript和CSS都做成外部文件的形式进行引用，这主要是为了让这些文件可以被浏览器缓存起来，参见第三点的介绍。</p>
<p><strong>9、减少DNS查询</strong></p>
<p>域名的DNS查询会带来额外的访问开销，减少页面内文件的主机域名数量，一个页面的主机域名保持在2-4个以内，这样就不会降低页面的装入速度。</p>
<p><strong>10、压缩JavaScript文件</strong></p>
<p>压缩脚本文件，删除不必要的字符，可以改善加载时间，目前有很多JavaScript文件的压缩工具，我这里有一个GUI界面的<a href="http://www.williamlong.info/download/JsMinGUI.zip">JS压缩工具</a>供下载。</p>
<p><strong>11、避免重定向</strong></p>
<p>网页的重定向会带来额外的运行开销，因此要避免页面进行重定向跳转操作。</p>
<p><strong>12、删除重复脚本</strong></p>
<p>一个页面两次包含同一个JavaScript文件会影响加载的性能，因此需要将重复的脚本文件删除。</p>
<p><strong>13、配置ETag</strong></p>
<p>这是一个令人迷惑的问题。理论上说将服务器的ETag删除会提高HTTP请求的性能，但是按照微软官方提供的<a href="http://support.microsoft.com/kb/922703/" target="_blank">修改方法</a>配置IIS 6.0，并没有实际效果，最终我使用了一个<a href="http://www.williamlong.info/download/RemEtag.zip">第三方的DLL文件</a>，以ISAPI的方式实现了删除ETag的功能。</p>
<p>经过上面这些网站前端重构和WEB服务器的配置修改，我们的页面结构就变得更加规范，重构的页面大多都会取得不错的YSlow的评分，总体来说性能提升了不少。对于最终用户来说，也会明显感受到访问网站速度变快了很多，网站的浏览体验得到了较好的提升。</p>
<p>参考书籍：高性能网站建设指南 —— 电子工业出版社出版</p>
<div class="post-body">
<blockquote><p>原文地址：<a href="http://www.williamlong.info/archives/1752.html">http://www.williamlong.info/archives/1752.html</a></p></blockquote>
</div>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/webdev/200904470/iis-opt.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/webdev/200904470/iis-opt.html</feedburner:origLink></item>
		<item>
		<title>C#文件操作一(zz)</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/I-J9yW0c3F0/csharp-file1.html</link>
		<comments>http://degula.com/dotnet/200904468/csharp-file1.html#comments</comments>
		<pubDate>Fri, 17 Apr 2009 00:39:50 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[dotnet]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[c#]]></category>

		<guid isPermaLink="false">http://degula.com/?p=468</guid>
		<description><![CDATA[ 微软的.Net框架为我们提供了基于流的I/O操作方式，这样就大大简化了开发者的工作。因为我们可以对一系列的通用对象进行操作，而不必关心该I/O操作是和本机的文件有关还是和网络中的数据有关。.Net框架主要为我们提供了一个System.IO命名空间，该命名空间基本包含了所有和I/O操作相关的类。
 
 

本文将向大家介绍一些基本的文件操作方法，包括对文件系统中的目录和文件的操作，还有就是文件的读写操作等。通过运用System.IO.DirectoryInfo类和System.IO.FileInfo类我们可以轻易的完成与目录和文件相关的操作，而通过运用System.IO.StreamReader类和System.IO.StreamWriter类我们可以方便的完成与文件的读写相关的操作。
 
命名空间概览
下面的表格显示了System.IO命名空间中最重要的一些类，通过运用这些类我们就能完成基本的文件操作。
 
表1



类名
功能和用途


BinaryReader、BinaryWriter
读写二进制数据


Directory、File、DirectoryInfo以及FileInfo
创建、删除并移动目录和文件，通过属性获取特定目录和文件的相关信息


FileStream
以随机方式访问文件


MemoryStream
访问存储在内存中的数据


StreamReader 、StreamWriter
读写文本数据信息


StringReader、StringWriter
运用字符串缓冲读写文本数据信息



运用DirectoryInfo类和FileInfo类
DirectoryInfo类和FileInfo类的基类都是FileSystemInfo类，这个类是一个抽象类，也就是说你不可以实例化该类，只能通过继承产生其子类并实例化其子类。然而你却可以运用由该类定义的各种属性，下面的表格显示了该类已经定义了的各种属性。 
表2



属性
功能和用途


Attributes
返回和文件相关的属性值，运用了FileAttributes枚举类型值


CreationTime
返回文件的创建时间


Exists
检查文件是否存在于给定的目录中


Extension
返回文件的扩展名


LastAccessTime
返回文件的上次访问时间


FullName
返回文件的绝对路径


LastWriteTime
返回文件的上次写操作时间


Name
返回给定文件的文件名


Delete（）
删除一个文件的方法，请务必谨慎地运用该方法



DirectoryInfo类提供了创建、删除和移动目录等方法，要运用表2中的各种属性，我们首先得创建一个DirectoryInfo类的对象，然后就可以访问其各种属性了。




DirectoryInfo dir1 = new DirectoryInfo(@"F:\Test");
Console.WriteLine("Full Name is : {0}", dir1.FullName);
Console.WriteLine("Attributes are : {0}", dir1.Attributes.ToString());




&#60;/ccid_nobr&#62; 
同时，我们还可以运用FileAttributes枚举类型值来获取和文件相关的各种属性，下面的表格就显示了该枚举类型中的各种值。
 
表3
 
&#60;ccid_nobr&#62;



值
功能和用途


Archive
返回文件的存档状态


Compressed
返回文件是否被压缩


Directory
返回文件是否是一个目录


Encrypted
返回文件是否被加密


Hidden
返回文件是否是隐藏的


Offline
表明文件数据是不可得的


ReadOnly
表明文件是只读的


System
表明文件是一个系统文件



&#60;/ccid_nobr&#62;
 
目录下的文件操作
运用DirectoryInfo类的对象我们可以轻松的实现对目录以及和目录中的文件相关的操作，假如你要获得某个目录F:\Pictures下的所有BMP文件，那么通过下面的代码就可以实现该功能。
&#60;ccid_nobr&#62;
&#60;/ccid_nobr&#62; 
上面的代码中我们首先创




DirectoryInfo dir = new DirectoryInfo(@"F:\ Pictures");
FileInfo[] bmpfiles = dir.GetFiles("*.bmp);
Console.WriteLine("Total number of bmp files", bmpfiles.Length);
Foreach( FileInfo f in bmpfiles)
{
  Console.WriteLine("Name is : {0}", f.Name);
  Console.WriteLine("Length of the file is : {0}", f.Length);
  Console.WriteLine("Creation time is : {0}", f.CreationTime);
  [...]]]></description>
			<content:encoded><![CDATA[<div><span id="zoom" class="a14c"> 微软的.Net框架为我们提供了基于流的I/O操作方式，这样就大大简化了开发者的工作。因为我们可以对一系列的通用对象进行操作，而不必关心该I/O操作是和本机的文件有关还是和网络中的数据有关。.Net框架主要为我们提供了一个System.IO命名空间，该命名空间基本包含了所有和I/O操作相关的类。</span></div>
<p> </p>
<p> <span id="more-468"></span></p>
<p><span id="zoom" class="a14c"></span></p>
<p style="text-indent: 2em;">本文将向大家介绍一些基本的文件操作方法，包括对文件系统中的目录和文件的操作，还有就是文件的读写操作等。通过运用System.IO.DirectoryInfo类和System.IO.FileInfo类我们可以轻易的完成与目录和文件相关的操作，而通过运用System.IO.StreamReader类和System.IO.StreamWriter类我们可以方便的完成与文件的读写相关的操作。</p>
<p style="text-indent: 2em;"> </p>
<p><span style="color: #000099;"><strong>命名空间概览</strong></span></p>
<p style="text-indent: 2em;">下面的表格显示了System.IO命名空间中最重要的一些类，通过运用这些类我们就能完成基本的文件操作。</p>
<p style="text-indent: 2em;"> </p>
<p>表1</p>
<table class="content" style="width: 472px; height: 141px;" border="1" width="472">
<tbody>
<tr>
<td>类名</td>
<td>功能和用途</td>
</tr>
<tr>
<td>BinaryReader、BinaryWriter</td>
<td>读写二进制数据</td>
</tr>
<tr>
<td>Directory、File、DirectoryInfo以及FileInfo</td>
<td>创建、删除并移动目录和文件，通过属性获取特定目录和文件的相关信息</td>
</tr>
<tr>
<td>FileStream</td>
<td>以随机方式访问文件</td>
</tr>
<tr>
<td>MemoryStream</td>
<td>访问存储在内存中的数据</td>
</tr>
<tr>
<td>StreamReader 、StreamWriter</td>
<td>读写文本数据信息</td>
</tr>
<tr>
<td>StringReader、StringWriter</td>
<td>运用字符串缓冲读写文本数据信息</td>
</tr>
</tbody>
</table>
<p><span style="color: #000099;"><strong>运用DirectoryInfo类和FileInfo类</strong></span></p>
<p style="text-indent: 2em;">DirectoryInfo类和FileInfo类的基类都是FileSystemInfo类，这个类是一个抽象类，也就是说你不可以实例化该类，只能通过继承产生其子类并实例化其子类。然而你却可以运用由该类定义的各种属性，下面的表格显示了该类已经定义了的各种属性。 </p>
<p>表2</p>
<table class="content" style="width: 456px; height: 183px;" border="1" width="456">
<tbody>
<tr>
<td>属性</td>
<td>功能和用途</td>
</tr>
<tr>
<td>Attributes</td>
<td>返回和文件相关的属性值，运用了FileAttributes枚举类型值</td>
</tr>
<tr>
<td>CreationTime</td>
<td>返回文件的创建时间</td>
</tr>
<tr>
<td>Exists</td>
<td>检查文件是否存在于给定的目录中</td>
</tr>
<tr>
<td>Extension</td>
<td>返回文件的扩展名</td>
</tr>
<tr>
<td>LastAccessTime</td>
<td>返回文件的上次访问时间</td>
</tr>
<tr>
<td>FullName</td>
<td>返回文件的绝对路径</td>
</tr>
<tr>
<td>LastWriteTime</td>
<td>返回文件的上次写操作时间</td>
</tr>
<tr>
<td>Name</td>
<td>返回给定文件的文件名</td>
</tr>
<tr>
<td>Delete（）</td>
<td>删除一个文件的方法，请务必谨慎地运用该方法</td>
</tr>
</tbody>
</table>
<p>DirectoryInfo类提供了创建、删除和移动目录等方法，要运用表2中的各种属性，我们首先得创建一个DirectoryInfo类的对象，然后就可以访问其各种属性了。</p>
<table style="width: 436px; height: 81px;" border="1" cellspacing="0" cellpadding="2" width="436" align="center">
<tbody>
<tr>
<td class="code">
<pre>DirectoryInfo dir1 = new DirectoryInfo(@"F:\Test");
Console.WriteLine("Full Name is : {0}", dir1.FullName);
Console.WriteLine("Attributes are : {0}", dir1.Attributes.ToString());</pre>
</td>
</tr>
</tbody>
</table>
<p>&lt;/ccid_nobr&gt; </p>
<p style="text-indent: 2em;">同时，我们还可以运用FileAttributes枚举类型值来获取和文件相关的各种属性，下面的表格就显示了该枚举类型中的各种值。</p>
<p style="text-indent: 2em;"> </p>
<p>表3</p>
<p style="text-indent: 2em;"> </p>
<p>&lt;ccid_nobr&gt;</p>
<table class="content" style="width: 454px; height: 165px;" border="1" width="454">
<tbody>
<tr>
<td>值</td>
<td>功能和用途</td>
</tr>
<tr>
<td>Archive</td>
<td>返回文件的存档状态</td>
</tr>
<tr>
<td>Compressed</td>
<td>返回文件是否被压缩</td>
</tr>
<tr>
<td>Directory</td>
<td>返回文件是否是一个目录</td>
</tr>
<tr>
<td>Encrypted</td>
<td>返回文件是否被加密</td>
</tr>
<tr>
<td>Hidden</td>
<td>返回文件是否是隐藏的</td>
</tr>
<tr>
<td>Offline</td>
<td>表明文件数据是不可得的</td>
</tr>
<tr>
<td>ReadOnly</td>
<td>表明文件是只读的</td>
</tr>
<tr>
<td>System</td>
<td>表明文件是一个系统文件</td>
</tr>
</tbody>
</table>
<p>&lt;/ccid_nobr&gt;</p>
<p style="text-indent: 2em;"> </p>
<p><span style="color: #000099;"><strong>目录下的文件操作</strong></span></p>
<p style="text-indent: 2em;">运用DirectoryInfo类的对象我们可以轻松的实现对目录以及和目录中的文件相关的操作，假如你要获得某个目录F:\Pictures下的所有BMP文件，那么通过下面的代码就可以实现该功能。</p>
<p style="text-indent: 2em;">&lt;ccid_nobr&gt;</p>
<p>&lt;/ccid_nobr&gt; </p>
<p style="text-indent: 2em;">上面的代码中我们首先创</p>
<table style="width: 430px; height: 225px;" border="1" cellspacing="0" cellpadding="2" width="430" align="center">
<tbody>
<tr>
<td class="code">
<pre>DirectoryInfo dir = new DirectoryInfo(@"F:\ Pictures");
FileInfo[] bmpfiles = dir.GetFiles("*.bmp);
Console.WriteLine("Total number of bmp files", bmpfiles.Length);
Foreach( FileInfo f in bmpfiles)
{
  Console.WriteLine("Name is : {0}", f.Name);
  Console.WriteLine("Length of the file is : {0}", f.Length);
  Console.WriteLine("Creation time is : {0}", f.CreationTime);
  Console.WriteLine("Attributes of the file are : {0}",
                    f.Attributes.ToString());
}</pre>
</td>
</tr>
</tbody>
</table>
<p>建了一个DirectoryInfo对象，然后通过调用该对象的GetFiles方法获取目录F:\Pictures下的所有以bmp为扩展名的文件，该方法返回的值是一个FileInfo类型的数组，每个元素则代表一个文件。最后，程序还列举了每个BMP文件的相关属性。</p>
<p style="text-indent: 2em;"> </p>
<p><span style="color: #000099;"><strong>创建子目录</strong></span></p>
<p style="text-indent: 2em;">运用DirectoryInfo类创建子目录是非常容易的，你只要调用其中CreateSubdirectory（）方法即可，演示代码如下。</p>
<p style="text-indent: 2em;">&lt;ccid_nobr&gt;</p>
<table style="width: 420px; height: 207px;" border="1" cellspacing="0" cellpadding="2" width="420" align="center">
<tbody>
<tr>
<td class="code">
<pre>DirectoryInfo dir = new DirectoryInfo(@"F:\ Pictures");
try
{
  dir.CreateSubdirectory("Sub");
  dir.CreateSubdirectory(@"Sub\MySub");
}
catch(IOException e)
{
  Console.WriteLine(e.Message);
}</pre>
</td>
</tr>
</tbody>
</table>
<p>&lt;/ccid_nobr&gt; </p>
<p style="text-indent: 2em;"> </p>
<p><span style="color: #000099;"><strong>运用FileInfo类创建、删除文件</strong></span></p>
<p style="text-indent: 2em;">通过FileInfo类，我们可以方便地创建出文件，并可以访问文件的属性同时还可以对文件进行打开文件、关闭文件、读写文件等基本的操作。下面的代码显示了如何创建一个文本文件并且去访问其创建时间、文件的绝对路径以及文件属性等文件信息，最后程序还给出了删除文件的方法。 </p>
<table border="1" cellspacing="0" cellpadding="2" width="550" align="center">
<tbody>
<tr>
<td class="code">
<pre>FileInfo fi = new FileInfo(@"F:\Myprogram.txt");
FileStream fs = fi.Create();
Console.WriteLine("Creation Time: {0}",fi.CreationTime);
Console.WriteLine("Full Name: {0}",fi.FullName);
Console.WriteLine("FileAttributes: {0}",fi.Attributes.ToString());
Console.WriteLine("Press any key to delete the file");
Console.Read();
fstr.Close();
fi.Delete();</pre>
</td>
</tr>
</tbody>
</table>
<p><span style="color: #000099;"><strong>理解FileInfo类的Open（）方法</strong></span></p>
<p style="text-indent: 2em;">我们在对文件进行读写操作之前必须打开文件，FileInfo类为我们提供了一个 Open（）方法，该方法包含了两个枚举类型值的参数，一个为FileMode枚举类型值，另一个为FileAccess枚举类型值。通过设定这两个参数值，我们可以对文件的访问模式和操作权限进行控制。下面的两个表格分别显示了FileMode枚举类型的值和FileAccess枚举类型的值。</p>
<p style="text-indent: 2em;"> 表4</p>
<table class="content" style="width: 438px; height: 129px;" border="1" width="438">
<tbody>
<tr>
<td>值</td>
<td>功能和用途</td>
</tr>
<tr>
<td>Append</td>
<td>打开文件并添加数据，运用该方法时FileAccess枚举类型值应为Write。</td>
</tr>
<tr>
<td>Create</td>
<td>创建一个新文件，有可能会覆盖已经存在的文件。</td>
</tr>
<tr>
<td>CreateNew</td>
<td>创建一个新文件，如果该文件已经存在，则抛出IOException异常。</td>
</tr>
<tr>
<td>Open</td>
<td>打开一个已经存在的文件。</td>
</tr>
<tr>
<td>OpenOrCreate</td>
<td>打开文件，如果该文件不存在，则创建之。</td>
</tr>
<tr>
<td>Truncate</td>
<td>截短一个已经存在的文件。</td>
</tr>
</tbody>
</table>
<p>表5</p>
<table class="content" style="width: 434px; height: 75px;" border="1" width="434">
<tbody>
<tr>
<td>值</td>
<td>功能和用途</td>
</tr>
<tr>
<td>Read</td>
<td>可以从一个文件中读取数据。</td>
</tr>
<tr>
<td>ReadWrite</td>
<td>可以从一个文件中读取数据，同时还可以向文件中写入数据。</td>
</tr>
<tr>
<td>Write</td>
<td>可以向文件中写入数据。</td>
</tr>
</tbody>
</table>
<p>下面的代码显示了Open（）方法的具体运用方法。</p>
<table border="1" cellspacing="0" cellpadding="2" width="550" align="center">
<tbody>
<tr>
<td class="code">
<pre>FileInfo f = new FileInfo("F:\MyFile.txt");
FileStream s = f.Open(FileMode.OpenorWrite, FileAccess.Read);</pre>
</td>
</tr>
</tbody>
</table>
<p><span style="color: #000099;"><strong>运用StreamReader类和StreamWriter类实现文件的读写操作</strong></span></p>
<p style="text-indent: 2em;">对文件的读写操作应该是最重要的文件操作，System.IO命名空间为我们提供了诸多文件读写操作类，在这里我要向大家介绍最常用也是最基本的StreamReader类和StreamWriter类。从这两个类的名称我们不难发现它们都是基于流的读写操作类。</p>
<p style="text-indent: 2em;">我们可以通过File类的OpenText（）方法来获取一个StreamReader对象，通过该对象我们可以实现对文本文件的读操作，方法如下：</p>
<table border="1" cellspacing="0" cellpadding="2" width="550" align="center">
<tbody>
<tr>
<td class="code">
<pre>Console.WriteLine("Reading the contents from the file");
StreamReader s = File.OpenText("MyText.txt");
string read = null;
while ((read = s.ReadLine()) != null)
{
  Console.WriteLine(read);
}
s.Close();</pre>
</td>
</tr>
</tbody>
</table>
<p>而通过调用FileInfo类的CreateText（）方法我们可以获取一个StreamWriter对象，调用StreamWriter类的WriteLine（）我们就可以向文本文件中写入数据了，方法如下：</p>
<table border="1" cellspacing="0" cellpadding="2" width="550" align="center">
<tbody>
<tr>
<td class="code">
<pre>FileInfo f = new FileInfo("MyText.txt")
StreamWriter w = f.CreateText();
w.WriteLine("This is from");
w.WriteLine("Chapter 1");
w.WriteLine("Of C# Module");
w.Write(w.NewLine);
w.WriteLine("Thanks for your time");
w.Close();</pre>
</td>
</tr>
</tbody>
</table>
<p><span style="color: #000099;"><strong>总结</strong></span></p>
<p style="text-indent: 2em;">以上我简要地向大家介绍了C#文件操作的基本知识和方法，通过本文大家不难发现.Net框架下I/O操作的方便性。读者在学习了本文后，如果要进行一些基本的文件操作，那么对于System.IO命名空间中的诸如DirectoryInfo类、 FileInfo类、FileStream类、StreamReader类以及StreamWriter类等类一定得有基本了解并在实际应用中灵活使用之。如果要对文件操作有更进一步的控制，那么不妨去研究一下System.IO命名空间中的更为具体和细节的一些类。最后，希望本文对大家能有所帮助。</p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/dotnet/200904468/csharp-file1.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/dotnet/200904468/csharp-file1.html</feedburner:origLink></item>
		<item>
		<title>使用link或@import引入css文件的区别</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/N6hi5S-hNmI/link-or-import.html</link>
		<comments>http://degula.com/webdev/css/200904466/link-or-import.html#comments</comments>
		<pubDate>Fri, 17 Apr 2009 00:29:30 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[web develop]]></category>

		<guid isPermaLink="false">http://degula.com/?p=466</guid>
		<description><![CDATA[最近在研究taobao的网站,发现其中页面引入css的方式多为使用@import的方式:
 


Css代码 


&#60;style type=&#8220;text/css&#8221; media=&#8220;screen&#8221;&#62;   
    @import url(&#8220;http://taoke.alimama.com/css/newmyalimama/instance/overlay.css?t=11240510&#8243;);   
    @import url(&#8220;http://taoke.alimama.com/css/newmyalimama/instance/module/myalimama.css?t=11240510&#8243;);   
    @import url(&#8220;http://taoke.alimama.com/css/newmyalimama/instance/module/myalimama/sale.css?t=11240510&#8243;);   
    @import url(&#8220;http://taoke.alimama.com/css/newmyalimama/instance/ie_hacks.css?t=11240510&#8243;);   
    @import url(&#8220;http://taoke.alimama.com/css/newmyalimama/instance/safari3_hacks.css?t=11240510&#8243;);   
    @import url(&#8220;http://taoke.alimama.com/css/newmyalimama/instance/cps/cps.css?t=11240510&#8243;);   
    @import url(&#8220;http://taoke.alimama.com/css/newmyalimama/instance/cps/fcps.css?t=11240510&#8243;);   
    @import url(&#8220;http://taoke.alimama.com/css/newmyalimama/instance/cps/cps_list.css?t=11240510&#8243;);   
    @import url(&#8220;http://taoke.alimama.com/css/std_notice.css?t=11240510&#8243;);   
    @import url(&#8220;http://taoke.alimama.com/css/newmyalimama/instance/buttons.css?t=11240510&#8243;);   
       
&#60;/style&#62;  


	&#60;style type="text/css" media="screen"&#62;
		@import url("http://taoke.alimama.com/css/newmyalimama/instance/overlay.css?t=11240510");
		@import url("http://taoke.alimama.com/css/newmyalimama/instance/module/myalimama.css?t=11240510");
		@import url("http://taoke.alimama.com/css/newmyalimama/instance/module/myalimama/sale.css?t=11240510");
		@import url("http://taoke.alimama.com/css/newmyalimama/instance/ie_hacks.css?t=11240510");
		@import url("http://taoke.alimama.com/css/newmyalimama/instance/safari3_hacks.css?t=11240510");
		@import url("http://taoke.alimama.com/css/newmyalimama/instance/cps/cps.css?t=11240510");
		@import url("http://taoke.alimama.com/css/newmyalimama/instance/cps/fcps.css?t=11240510");
		@import url("http://taoke.alimama.com/css/newmyalimama/instance/cps/cps_list.css?t=11240510");
		@import url("http://taoke.alimama.com/css/std_notice.css?t=11240510");
		@import url("http://taoke.alimama.com/css/newmyalimama/instance/buttons.css?t=11240510");

	&#60;/style&#62;
 在google上搜到了不少答案,备忘如下:
 
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;下面内容为google来的&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
淘宝网页中大部分是这样写的
&#60;style type=&#8221;text/css&#8221; media=&#8221;screen&#8221;&#62;
@import url(&#8221;http://www.taobao.com/home/css/global/v2.0.css?t=20070518.css&#8221;);
&#60;/style&#62;
    而很多网站使用的都是link
&#60;link rel=&#8221;stylesheet&#8221; rev=&#8221;stylesheet&#8221; href=&#8221;default.css&#8221; type=&#8221;text/css&#8221; media=&#8221;all&#8221; /&#62;
    而像google 百度 163等网站他们都是直接写在网页中
    当然使用链接link和导入import的好处就是易于维护，但当网速比较慢的时候，会出现加载中断的情况，导致页面排版错误
    他俩的作用相同
    唯一的不同是服务对象不一样
    @import 为CSS服务
    link是为当前的页服务
    经典有网友说 @import会优先执行。
    外部引用CSS中 link与@import的区别
    这两天刚写完XHTML加载CSS的几种方式，其中外部引用CSS分为两种方式link和@import。
    本质上，这两种方式都是为了加载CSS文件，但还是存在着细微的差别。
    差别1 ：老祖宗的差别。link属于XHTML标签，而@import完全是CSS提供的一种方式。
link标签除了可以加载CSS外，还可以做很多其它的事情，比如定义RSS，定义rel连接属性等，@import就只能加载CSS了。
    差别2： 加载顺序的差别。当一个页面被加载的时候（就是被浏览者浏览的时候），link引用的CSS会同时被加载，而@import引用的CSS [...]]]></description>
			<content:encoded><![CDATA[<p>最近在研究taobao的网站,发现其中页面引入css的方式多为使用@import的方式:</p>
<p> <span id="more-466"></span></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Css代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://bluedusk.javaeye.com/blog/344000#"><img src="http://bluedusk.javaeye.com/images/icon_copy.gif" alt="复制代码" /></a></div>
</div>
<ol class="dp-default">
<li><span><span>&lt;style type=</span><span class="string"><span style="color: #0000ff;">&#8220;text/css&#8221;</span></span><span> media=</span><span class="string"><span style="color: #0000ff;">&#8220;screen&#8221;</span></span><span>&gt;   </span></span></li>
<li><span>    @import url(</span><span class="string"><span style="color: #0000ff;">&#8220;http://taoke.alimama.com/css/newmyalimama/instance/overlay.css?t=11240510&#8243;</span></span><span>);   </span></li>
<li><span>    @import url(</span><span class="string"><span style="color: #0000ff;">&#8220;http://taoke.alimama.com/css/newmyalimama/instance/module/myalimama.css?t=11240510&#8243;</span></span><span>);   </span></li>
<li><span>    @import url(</span><span class="string"><span style="color: #0000ff;">&#8220;http://taoke.alimama.com/css/newmyalimama/instance/module/myalimama/sale.css?t=11240510&#8243;</span></span><span>);   </span></li>
<li><span>    @import url(</span><span class="string"><span style="color: #0000ff;">&#8220;http://taoke.alimama.com/css/newmyalimama/instance/ie_hacks.css?t=11240510&#8243;</span></span><span>);   </span></li>
<li><span>    @import url(</span><span class="string"><span style="color: #0000ff;">&#8220;http://taoke.alimama.com/css/newmyalimama/instance/safari3_hacks.css?t=11240510&#8243;</span></span><span>);   </span></li>
<li><span>    @import url(</span><span class="string"><span style="color: #0000ff;">&#8220;http://taoke.alimama.com/css/newmyalimama/instance/cps/cps.css?t=11240510&#8243;</span></span><span>);   </span></li>
<li><span>    @import url(</span><span class="string"><span style="color: #0000ff;">&#8220;http://taoke.alimama.com/css/newmyalimama/instance/cps/fcps.css?t=11240510&#8243;</span></span><span>);   </span></li>
<li><span>    @import url(</span><span class="string"><span style="color: #0000ff;">&#8220;http://taoke.alimama.com/css/newmyalimama/instance/cps/cps_list.css?t=11240510&#8243;</span></span><span>);   </span></li>
<li><span>    @import url(</span><span class="string"><span style="color: #0000ff;">&#8220;http://taoke.alimama.com/css/std_notice.css?t=11240510&#8243;</span></span><span>);   </span></li>
<li><span>    @import url(</span><span class="string"><span style="color: #0000ff;">&#8220;http://taoke.alimama.com/css/newmyalimama/instance/buttons.css?t=11240510&#8243;</span></span><span>);   </span></li>
<li><span>       </span></li>
<li><span>&lt;/style&gt;  </span></li>
</ol>
</div>
<pre class="css" style="display: none;">	&lt;style type="text/css" media="screen"&gt;
		@import url("http://taoke.alimama.com/css/newmyalimama/instance/overlay.css?t=11240510");
		@import url("http://taoke.alimama.com/css/newmyalimama/instance/module/myalimama.css?t=11240510");
		@import url("http://taoke.alimama.com/css/newmyalimama/instance/module/myalimama/sale.css?t=11240510");
		@import url("http://taoke.alimama.com/css/newmyalimama/instance/ie_hacks.css?t=11240510");
		@import url("http://taoke.alimama.com/css/newmyalimama/instance/safari3_hacks.css?t=11240510");
		@import url("http://taoke.alimama.com/css/newmyalimama/instance/cps/cps.css?t=11240510");
		@import url("http://taoke.alimama.com/css/newmyalimama/instance/cps/fcps.css?t=11240510");
		@import url("http://taoke.alimama.com/css/newmyalimama/instance/cps/cps_list.css?t=11240510");
		@import url("http://taoke.alimama.com/css/std_notice.css?t=11240510");
		@import url("http://taoke.alimama.com/css/newmyalimama/instance/buttons.css?t=11240510");

	&lt;/style&gt;</pre>
<p> 在google上搜到了不少答案,备忘如下:</p>
<p> </p>
<p><span style="color: #3366ff;">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;下面内容为google来的&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span></p>
<p>淘宝网页中大部分是这样写的</p>
<p>&lt;style type=&#8221;text/css&#8221; media=&#8221;screen&#8221;&gt;</p>
<p>@import url(&#8221;http://www.taobao.com/home/css/global/v2.0.css?t=20070518.css&#8221;);</p>
<p>&lt;/style&gt;</p>
<p>    而很多网站使用的都是link</p>
<p>&lt;link rel=&#8221;stylesheet&#8221; rev=&#8221;stylesheet&#8221; href=&#8221;default.css&#8221; type=&#8221;text/css&#8221; media=&#8221;all&#8221; /&gt;</p>
<p>    而像google 百度 163等网站他们都是直接写在网页中</p>
<p>    当然使用链接link和导入import的好处就是易于维护，但当网速比较慢的时候，会出现加载中断的情况，导致页面排版错误</p>
<p>    他俩的作用相同</p>
<p>    唯一的不同是服务对象不一样</p>
<p>    @import 为CSS服务</p>
<p>    link是为当前的页服务</p>
<p>    经典有网友说 @import会优先执行。</p>
<p>    外部引用CSS中 link与@import的区别</p>
<p>    这两天刚写完XHTML加载CSS的几种方式，其中外部引用CSS分为两种方式link和@import。</p>
<p>    本质上，这两种方式都是为了加载CSS文件，但还是存在着细微的差别。</p>
<p>   <strong> 差别1</strong> ：老祖宗的差别。link属于XHTML标签，而@import完全是CSS提供的一种方式。</p>
<p>link标签除了可以加载CSS外，还可以做很多其它的事情，比如定义RSS，定义rel连接属性等，@import就只能加载CSS了。</p>
<p>    <strong>差别2：</strong> 加载顺序的差别。当一个页面被加载的时候（就是被浏览者浏览的时候），link引用的CSS会同时被加载，而@import引用的CSS 会等到页面全部被下载完再被加载。所以有时候浏览@import加载CSS的页面时开始会没有样式（就是闪烁），网速慢的时候还挺明显（梦之都加载CSS 的方式就是使用@import，我一边下载一边浏览梦之都网页时，就会出现上述问题）。</p>
<p>    <strong>差别3：</strong> 兼容性的差别。由于@import是CSS2.1提出的所以老的浏览器不支持，@import只有在IE5以上的才能识别，而link标签无此问题。</p>
<p>    <strong>差别4：</strong> 使用dom控制样式时的差别。当使用javascript控制dom去改变样式的时候，只能使用link标签，因为@import不是dom可以控制的。</p>
<p>    大致就这几种差别了（如果还有什么差别，大家告诉我，我再补充上去），其它的都一样，从上面的分析来看，还是使用link标签比较好。</p>
<p> </p>
<p>原文链接: <span style="color: #3366ff;">http://www.aono82.com/v11/news/31/20081229133408.htm</span></p>
<p>&#8212;&#8212;&#8212;</p>
<div id="body">
<h1>The @import Hack</h1>
<p>Early browsers are notorious for malfunctioning when presented with CSS rules they can&#8217;t handle (Netscape Navigator 4 will crash at the sight of certain rules). The import hack allows you to hide entire stylesheets from version 4 and older browsers by linking them with a method they don&#8217;t understand: the @import rule. <a href="http://www.w3.org/TR/REC-CSS2/cascade.html#at-import"><span style="color: #108ac6;">[CSS2:@import]</span></a></p>
<p>The @import rule links to an external stylesheet from <em>within</em> a stylesheet (external or in a STYLE element), however, early browsers do not understand the syntax and simply ignore the statement (and the stylesheet it references).</p>
<p>For a table of all variations on the @import hack, take a look at: <a href="http://imfo.ru/csstest/css_hacks/import.php"><span style="color: #108ac6;">http://imfo.ru/csstest/css_hacks/import.php</span></a></p>
<h2>Typical @import Setup</h2>
<p>Begin with two stylesheets:</p>
<p>simple.css (only simple rules for early browsers)</p>
<p>modern.css (advanced CSS2, rules to override rules in simple.css)</p>
<p>Create a third stylesheet &#8220;import.css&#8221; containing only:</p>
<pre>@import "modern.css";</pre>
<p>Link the simple.css and import.css in the HEAD of the document:</p>
<pre>&lt;link rel="stylesheet" type="text/css" href="simple.css" /&gt;
&lt;link rel="stylesheet" type="text/css" href="import.css" /&gt;</pre>
<p>(The simple stylesheet /must/ be linked first.)</p>
<h2>The Effect</h2>
<p>All CSS1 browsers will load simple.css and import.css, however, only modern browsers will understand the @import rule and also load modern.css. Since modern.css is linked <em>after</em> simple.css, its rules will override those in simple.css more easily.</p>
<h2>Alternate Syntax</h2>
<p>Different versions of the import rule have varying levels of support from older browsers.</p>
<pre>@import "style.css";      /* hidden from nearly all v4 browsers  */
@import url('style.css'); /* IE4 can understand, but not NN4 */
...</pre>
<p><a href="http://www.digbyswift.com/development/css/filters/"><span style="color: #108ac6;">[Browser support for different syntaxes]</span></a></p>
<h2>Example CSS files</h2>
<pre>/* simple.css */
body {
  background:white;
  color:#666666;
}</pre>
<pre>/* modern.css */
body {
  font-size:87%;
  line-height:1.4em;
  text-align:justify;
}</pre>
<h2>media=&#8221;all&#8221; (Simpler Hiding From Nav4)</h2>
<p>If you only have ONE stylesheet you need to hide from Nav4 (only one SS can be hidden this way), you can link to the stylesheet with a media rule:</p>
<pre>&lt;link rel="stylesheet" type="text/css" href="simple.css" /&gt;
&lt;link rel="stylesheet" type="text/css" href="hiddenFromNav4.css" media="all" /&gt;</pre>
<h2>media not &#8220;all&#8221; (Hiding CSS from IE)</h2>
<p>If you have a stylesheet that needs to be hidden from IE (all versions) give it a mediatype different from &#8220;all&#8221;, i.e. &#8220;screen&#8221;.</p>
<pre>&lt;style type="text/css"&gt;@import "modern.css" screen;&lt;/style&gt;</pre>
<h2>Why use the import.css file?</h2>
<p>Using link elements allows us to more easily adapt to a system with alternate stylesheets. (See <a href="http://css-discuss.incutio.com/?page=StyleSwitching"><span style="color: #108ac6;">StyleSwitching</span></a> ). If alternate stylesheets are not a concern, the file import.css is not needed. The @import rule can be placed in a STYLE element as such:</p>
<pre>&lt;link rel="stylesheet" type="text/css" href="simple.css" /&gt;
&lt;style type="text/css"&gt; @import "modern.css"; &lt;/style&gt;</pre>
<h2>Why not put @import at the bottom of simple.css?</h2>
<p>According to the CSS specs, @import rules must precede any other CSS rules in a stylesheet, so this creates the need to place it in its own stylesheet for these purposes.</p>
<p> </p>
<p><span style="color: #3366ff;">原文链接: http://css-discuss.incutio.com/?page=ImportHack</span></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p> </p>
<p> </p>
<p><strong>Question: </strong>What&#8217;s the Difference Between @import and link for CSS?</p>
<p>External style sheets are an important part of every Web designer&#8217;s bag of tricks, but there are two ways to include them in your pages: @import and &lt;link&gt;. How do you decide which method is better? This FAQ discusses the differences between the two methods, why you might use one over another, and how to decide.</p>
<p><strong>Answer: </strong></p>
<h3>The Difference Between @import and &lt;link&gt;</h3>
<p>Before deciding which method to use to include your style sheets, you should understand what the two methods were intended to be used for.</p>
<p><strong>&lt;link&gt;</strong> &#8211; Linking is the first method for including an external style sheet on your Web pages. It is intended to link together your Web page with your style sheet. It is added to the &lt;head&gt; of your HTML document like this:</p>
<blockquote class="yes"><p>&lt;link href=&#8221;styles.css&#8221; type=&#8221;text/css&#8221; /&gt;</p></blockquote>
<p><strong>@import</strong> &#8211; Importing allows you to import one style sheet into another. This is slightly different than the link scenario, because you can import style sheets inside a linked style sheet. But if you include an @import in the head of your HTML document, it is written:</p>
<blockquote class="yes"><p>&lt;style type=&#8221;text/css&#8221;&gt;@import url(&#8221;styles.css&#8221;);&lt;/style&gt;</p></blockquote>
<p>From a standards viewpoint, there is no difference between linking to an external style sheet or importing it. Either way is correct, and either way will work equally well (in most cases). But there are a few reasons you might want to use one over the other.</p>
<h3>Why Use @import?</h3>
<p>The most common reason given for using @import instead (or along with) &lt;link&gt; is because older browsers didn&#8217;t recognize @import, so you could hide styles from them. Specifically:</p>
<ul>
<li>hides the style sheet from Netscape 4, IE 3 and 4 (not 4.72)<br />
<blockquote class="yes"><p>@import url(../style.css);</p></blockquote>
</li>
<li>hides the style sheet from Netscape 4, IE 3 and 4 (not 4.72), Konqueror 2, and Amaya 5.1<br />
<blockquote class="yes"><p>@import url(&#8221;../style.css&#8221;);</p></blockquote>
</li>
<li>hides the style sheet from Netscape 4, IE 6 and below<br />
<blockquote class="yes"><p>@import url(../style.css) screen;</p></blockquote>
</li>
<li>hides the style sheet from Netscape 4, IE 4 and below, Konqueror 2<br />
<blockquote class="yes"><p>@import &#8220;../styles.css&#8221;;</p></blockquote>
</li>
</ul>
<p>Another use for the @import method is to use multiple style sheets on a page, but only one link in your &lt;head&gt;. For example, a corporation might have a global style sheet for every page on the site, with sub-sections having additional styles that only apply to that sub-section. By linking to the sub-section style sheet and importing the global styles at the top of that style sheet, you don&#8217;t have to maintain a gigantic style sheet with all the styles for the site and every sub-section. The only requirement is that any @import rules need to come before the rest of your style rules. And remember that <a href="http://webdesign.about.com/od/advancedcss/a/aa073007.htm"><span style="color: #108ac6;">inheritance</span></a> can still be a problem.</p>
<h3>Why Use &lt;link&gt;?</h3>
<p>The number one reason for using linked style sheets is to provide alternate style sheets for your customers. Browsers like Firefox, Safari, and Opera support the rel=&#8221;alternate stylesheet&#8221; attribute and when there is one available will allow viewers to switch between them. You can also use a <a href="http://javascript.about.com/library/blswitch.htm"><span style="color: #108ac6;">JavaScript switcher</span></a> to switch between style sheets in IE. This is most often used with <a href="http://webdesign.about.com/od/accessibility/a/aa070406.htm"><span style="color: #108ac6;">Zoom Layouts</span></a> for accessibility purposes.</p>
<p>One of the drawbacks to using @import is that if you have a very simple &lt;head&gt; with just the @import rule in it, your pages may display a flash of unstyled content (<a href="http://www.bluerobot.com/web/css/fouc.asp"><span style="color: #108ac6;">FOUC</span></a> ) as they are loading. This can be jarring to your viewers. A simple fix to this is to make sure you have at least one additional &lt;link&gt; or &lt;script&gt; element in your &lt;head&gt;.</p>
<h3>What About the Media Type?</h3>
<p>Many writers make the statement that you can use the <a href="http://webdesign.about.com/od/css/qt/tipcssmedia.htm"><span style="color: #108ac6;">media type</span></a> to hide style sheets from older browsers. Often, they mention this as a benefit to using either @import or &lt;link&gt;, but the truth is you can set the media type with either method, and browsers that don&#8217;t support media types won&#8217;t view them in either case. For example, Netscape 4 doesn&#8217;t recognize media types, so you can use the link tag to hide a style sheet from that browser just as easily as the @import rule:</p>
<blockquote class="yes"><p>&lt;link href=&#8221;styles-nons4.css&#8221; media=&#8221;all&#8221; type=&#8221;text/css&#8221; /&gt;</p></blockquote>
<p>And some versions of IE (6 and below) don&#8217;t support the media type on the @import rule, so you can use that to hide the style sheet from them:</p>
<blockquote class="yes"><p>&lt;style type=&#8221;text/css&#8221;&gt;@import url(styles.css) all;&lt;/style&gt;</p></blockquote>
<h3>So Which Method Should You Use?</h3>
<p>Personally, I prefer to use &lt;link&gt; and then import style sheets into my external style sheets. That way I only have 1 or 2 lines of code to adjust in my HTML documents. But the bottom line is that it&#8217;s up to you. If you&#8217;re more comfortable with @import, then go for it! Both methods are standards compliant and unless you&#8217;re planning on supporting really old browsers (like Netscape 4) there&#8217;s no strong reason for using either.</p>
<p> </p>
<p>原文链接: <span style="color: #3366ff;">http://webdesign.about.com/od/beginningcss/f/css_import_link.htm</span></div>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/webdev/css/200904466/link-or-import.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/webdev/css/200904466/link-or-import.html</feedburner:origLink></item>
		<item>
		<title>表单之美-记那些出色的表单Form设计</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/uHubAiucAN0/pretty-forms.html</link>
		<comments>http://degula.com/webdev/200904464/pretty-forms.html#comments</comments>
		<pubDate>Thu, 16 Apr 2009 09:25:43 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[web开发]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[web develop]]></category>

		<guid isPermaLink="false">http://degula.com/webdev/200904464/%e8%a1%a8%e5%8d%95%e4%b9%8b%e7%be%8e-%e8%ae%b0%e9%82%a3%e4%ba%9b%e5%87%ba%e8%89%b2%e7%9a%84%e8%a1%a8%e5%8d%95form%e8%ae%be%e8%ae%a1.html</guid>
		<description><![CDATA[一些出色的表单设计，来自Noupe。下面介绍不多，因为它们是在是都很出色！有了这些设计，一定能让你的网站锦上添花，大家各取所需吧。
1. 表单设计
Fancy Form Design Using CSS
非常有用的css教程，教你如何制作漂亮又好用的表单.


Sensible Forms: A Form Usability Checklist
Follow these guidelines, and you’ll be off to a good start for creating sensible forms by using a form usability checklist.
2. Styling Beautiful Forms
How to create perfect form markup and style it with CSS
This post will explain different choices when marking up the forms, and [...]]]></description>
			<content:encoded><![CDATA[<p>一些出色的表单设计，来自Noupe。下面介绍不多，因为它们是在是都很出色！有了这些设计，一定能让你的网站锦上添花，大家各取所需吧。</p>
<h5>1. 表单设计</h5>
<h6><a href="http://www.sitepoint.com/article/fancy-form-design-css/">Fancy Form Design Using CSS</a></h6>
<p>非常有用的css教程，教你如何制作漂亮又好用的表单.</p>
<p><a href="http://www.sitepoint.com/article/fancy-form-design-css/"></a></p>
<p><span id="more-464"></span></p>
<h6><a href="http://www.alistapart.com/articles/sensibleforms/">Sensible Forms: A Form Usability Checklist</a></h6>
<p>Follow these guidelines, and you’ll be off to a good start for creating sensible forms by using a form usability checklist.</p>
<h5>2. Styling Beautiful Forms</h5>
<h6><a href="http://fecklessmind.com/2009/01/23/how-to-reliable-css-forms/">How to create perfect form markup and style it with CSS</a></h6>
<p>This post will explain different choices when marking up the forms, and the CSS styling involved in making them cross-browser compatible.</p>
<p><a href="http://fecklessmind.com/2009/01/23/how-to-reliable-css-forms/"></a></p>
<p><a href="http://code.fecklessmind.com/reliable-forms-with-css/vertical.html">Check out the vertical layout</a><br />
<a href="http://code.fecklessmind.com/reliable-forms-with-css/horizontal.html">the horizontal layout</a></p>
<h6><a href="http://www.jankoatwarpspeed.com/post/2008/07/09/Justify-elements-using-jQuery-and-CSS.aspx">Justify elements using jQuery and CSS </a></h6>
<p>使用Jquery和css调整表单元素:</p>
<pre>$(document).ready(function() {
    var max = 0;
    $("label").each(function(){
        if ($(this).width() &gt; max)
            max = $(this).width();
    });
    $("label").width(max);
});</pre>
<p><a href="http://www.jankoatwarpspeed.com/post/2008/07/09/Justify-elements-using-jQuery-and-CSS.aspx"></a></p>
<h6><a href="http://cssglobe.com/post/3875/cssg-collections-web-forms">CSSG Forms Collection</a></h6>
<p>5 个独特的form设计.</p>
<p><a href="http://cssglobe.com/post/3875/cssg-collections-web-forms"></a></p>
<p><a href="http://cssglobe.com/collections/forms/">demo 地址</a></p>
<h6><a href="http://woork.blogspot.com/2008/06/form-elements-design-using-css-and-list.html">FORM elements design using CSS and list (ul and dl)</a></h6>
<p>使用 &lt;ul&gt; 和&lt;li&gt;设计的表单.</p>
<p><a href="http://woork.blogspot.com/2008/06/form-elements-design-using-css-and-list.html"></a></p>
<h6><a href="http://trif3cta.com/blog/entry/xhtml-css-web-forms-5-simple-techniques/">XHTML/CSS web forms: 5 simple techniques</a></h6>
<p>5种表单设计的XHTML/CSS简单技术.</p>
<p><a href="http://trif3cta.com/blog/entry/xhtml-css-web-forms-5-simple-techniques/"></a></p>
<h6><a href="http://www.emblematiq.com/projects/niceforms/">Niceforms </a></h6>
<p>Ready to Go 的表单设计，直接拿来用就行了.</p>
<p><a href="http://www.emblematiq.com/projects/niceforms/"></a></p>
<p><a href="http://www.emblematiq.com/niceforms/v20/niceforms.html">demo 地址</a></p>
<h5>2. 修饰你的表单</h5>
<h6><a href="http://buildinternet.com/2009/01/changing-form-input-styles-on-focus-with-jquery/">Changing Form Input Styles on Focus with jQuery</a></h6>
<p>.</p>
<p><a href="http://buildinternet.com/2009/01/changing-form-input-styles-on-focus-with-jquery/"></a></p>
<p><a href="http://buildinternet.com/live/jqueryform/jqueryform1.php">demo 地址</a></p>
<h6><a href="http://www.askthecssguy.com/2007/03/form_field_hints_with_css_and.html">Form field hints with CSS and JavaScript</a></h6>
<p>表单输入提示.</p>
<p><a href="http://www.askthecssguy.com/2007/03/form_field_hints_with_css_and.html"></a></p>
<p><a href="http://www.askthecssguy.com/examples/formfieldhints/example06.html">demo 地址</a></p>
<h6><a href="http://www.jankoatwarpspeed.com/post/2008/06/09/Building-a-better-web-forms-Context-highlighting-using-jQuery.aspx">Context highlighting using jQuery </a></h6>
<p>高亮显示当前编辑内容.</p>
<p><a href="http://www.jankoatwarpspeed.com/post/2008/06/09/Building-a-better-web-forms-Context-highlighting-using-jQuery.aspx"></a></p>
<p><a href="http://www.jankoatwarpspeed.com/examples/ContextHighlighting/">demo 地址</a></p>
<h6><a href="http://woork.blogspot.com/2008/04/improve-form-usability-with-auto.html">Improve form usability with auto messages</a></h6>
<p>淡入淡出效果的自动信息框.</p>
<p><a href="http://woork.blogspot.com/2008/04/improve-form-usability-with-auto.html"></a></p>
<h6><a href="http://www.shauninman.com/archive/2007/09/10/styling_file_inputs_with_css_and_the_dom">为输入设定样式</a></h6>
<p>使用Css和Dom，让你的input区域更漂亮.</p>
<p><a href="http://www.shauninman.com/archive/2007/09/10/styling_file_inputs_with_css_and_the_dom"></a></p>
<p><a href="http://www.shauninman.com/assets/examples/styling-file-inputs/">demo 地址</a></p>
<h6><a href="http://web-kreation.com/index.php/tutorials/nice-login-and-signup-panel-using-mootools-12/">Show/hide a nice Login Panel using Mootools 1.2</a></h6>
<p>使用Mootools1.2实现的滑动注册/登陆面板</p>
<p><a href="http://web-kreation.com/index.php/tutorials/nice-login-and-signup-panel-using-mootools-12/"></a></p>
<p><a href="http://web-kreation.com/demos/login_form_mootools_1.2/">demo 地址</a></p>
<h6><a href="http://lipidity.com/fancy-form/">FancyForm </a></h6>
<p>.</p>
<p><a href="http://lipidity.com/fancy-form/"></a></p>
<p><a href="http://lipidity.com/fancy-form/#example">demo 地址</a></p>
<h5>表单验证</h5>
<h6><a href="http://www.askthecssguy.com/2007/05/validation_hints_for_your_form_1.html">Validation Hints for your form</a></h6>
<p>表单输入提示.</p>
<p><a href="http://www.askthecssguy.com/2007/05/validation_hints_for_your_form_1.html"></a></p>
<h6><a href="http://mootools.floor.ch/en/labs/formcheck/forum-registration/">Form.Check</a></h6>
<p>基于mootools 的表单验证脚本.</p>
<p><a href="http://mootools.floor.ch/en/labs/formcheck/forum-registration/"></a></p>
<h6><a href="http://zendold.lojcomm.com.br/fvalidator">fValidator</a></h6>
<p>开源的Javascript表单验证工具.</p>
<p><a href="http://zendold.lojcomm.com.br/fvalidator"></a></p>
<p><a href="http://zendold.lojcomm.com.br/fvalidator/#selflink_examples">Check out the demo here</a></p>
<h6><a href="http://www.phatfusion.net/validate/">Validate</a></h6>
<p>基于mootools的验证表单，非常简洁舒服.</p>
<p><a href="http://www.phatfusion.net/validate/"></a></p>
<p><a href="http://www.phatfusion.net/validate/">demo 地址</a></p>
<h5>PHP &amp; Ajaxifing Forms</h5>
<h6><a href="http://cssrevolt.com/upload/files/protoformclass/">ProtoForm</a></h6>
<p>基于Prototype的表单验证。可以验证 (input, textarea, radio, select, checkbox) Email, Date, Telephone number and Url.等 大小只有4k.</p>
<p><a href="http://cssrevolt.com/upload/files/protoformclass/"></a></p>
<p><a href="http://www.cssrevolt.com/upload/files/protoform/">demo 地址</a></p>
<h6><a href="http://nettuts.com/javascript-ajax/submit-a-form-without-page-refresh-using-jquery/">Submit A Form Without Page Refresh using jQuery</a></h6>
<p>基于JQuery的免刷新提交</p>
<p><a href="http://nettuts.com/javascript-ajax/submit-a-form-without-page-refresh-using-jquery/"></a></p>
<p><a href="http://nettuts.com/demos/contactform/">demo</a>地址</p>
<h6><a href="http://web-kreation.com/index.php/articles/lightform-free-ajaxphp-contact-form/">LightForm ::: Free Ajax/PHP Contact Form</a></h6>
<p>LightForm 一个不错的联系人表单，很漂亮.</p>
<p><a href="http://web-kreation.com/index.php/articles/lightform-free-ajaxphp-contact-form/"></a></p>
<p><a href="http://web-kreation.com/demos/LightForm/">Check out the demo here</a></p>
<h6><a href="http://www.brandspankingnew.net/specials/ajax_autosuggest/ajax_autosuggest_autocomplete.html">Autosuggest / Autocomplete with Ajax</a></h6>
<p>Ajax表单自动完成，自动完成的数据需要以xml或json的方式提供。</p>
<p><a href="http://www.brandspankingnew.net/specials/ajax_autosuggest/ajax_autosuggest_autocomplete.html"></a></p>
<p><a href="http://www.brandspankingnew.net/specials/ajax_autosuggest/ajax_autosuggest_autocomplete.html">demo地址</a></p>
<p>更多请访问：<a href="http://www.noupe.com/php/beautiful-forms.html">原文地址</a></p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/webdev/200904464/pretty-forms.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/webdev/200904464/pretty-forms.html</feedburner:origLink></item>
		<item>
		<title>80+最流行的wordpress主题</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/WUgc5AAcEHM/80popular-wptheme.html</link>
		<comments>http://degula.com/wordpress/200904463/80popular-wptheme.html#comments</comments>
		<pubDate>Mon, 13 Apr 2009 02:49:24 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wp-theme]]></category>

		<guid isPermaLink="false">http://degula.com/?p=463</guid>
		<description><![CDATA[Delicious上收藏将近7K了,可见其流行度.这80+主题都是由smashingmagazine精心挑选的,虽然不是最新的,但是绝对够经典.一睹为快吧.
地址:  在这里
]]></description>
			<content:encoded><![CDATA[<p>Delicious上收藏将近7K了,可见其流行度.这80+主题都是由smashingmagazine精心挑选的,虽然不是最新的,但是绝对够经典.一睹为快吧.</p>
<p>地址:  <a href="http://www.smashingmagazine.com/2007/02/09/83-beautiful-wordpress-themes-you-probably-havent-seen/">在这里</a></p>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/wordpress/200904463/80popular-wptheme.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/wordpress/200904463/80popular-wptheme.html</feedburner:origLink></item>
		<item>
		<title>固定表头列头CSS代码</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/GB1qiPBpQRw/css-fixed-tablehead.html</link>
		<comments>http://degula.com/webdev/css/200904461/css-fixed-tablehead.html#comments</comments>
		<pubDate>Mon, 13 Apr 2009 01:41:24 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[web develop]]></category>

		<guid isPermaLink="false">http://degula.com/?p=461</guid>
		<description><![CDATA[web开发中经常出现一些数据量很大的表格,这时就需要固定表头或列头了.这里有一段固定表/列头的CSS代码.希望对大家有用.


    固定表头和列
    &#60;!--
        .FixedTitleRow
        {
            position: relative;
            top: expression(this.offsetParent.scrollTop);
     [...]]]></description>
			<content:encoded><![CDATA[<p>web开发中经常出现一些数据量很大的表格,这时就需要固定表头或列头了.这里有一段固定表/列头的CSS代码.希望对大家有用.</p>
<p><span id="more-461"></span></p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;">    固定表头和列
    <span style="color: #808080; font-style: italic;">&lt;!--</span>
<span style="color: #808080; font-style: italic;">        .FixedTitleRow</span>
<span style="color: #808080; font-style: italic;">        {</span>
<span style="color: #808080; font-style: italic;">            position: relative;</span>
<span style="color: #808080; font-style: italic;">            top: expression(this.offsetParent.scrollTop);</span>
<span style="color: #808080; font-style: italic;">            z-index: 10;</span>
<span style="color: #808080; font-style: italic;">            background-color: #E6ECF0;</span>
<span style="color: #808080; font-style: italic;">        } </span>
&nbsp;
<span style="color: #808080; font-style: italic;">        .FixedTitleColumn</span>
<span style="color: #808080; font-style: italic;">        {</span>
<span style="color: #808080; font-style: italic;">            position: relative;</span>
<span style="color: #808080; font-style: italic;">            left: expression(this.parentElement.offsetParent.scrollLeft);</span>
<span style="color: #808080; font-style: italic;">        } </span>
&nbsp;
<span style="color: #808080; font-style: italic;">        .FixedDataColumn</span>
<span style="color: #808080; font-style: italic;">        {</span>
<span style="color: #808080; font-style: italic;">            position: relative;</span>
<span style="color: #808080; font-style: italic;">            left: expression(this.parentElement.offsetParent.parentElement.scrollLeft);</span>
<span style="color: #808080; font-style: italic;">            background-color: #E6ECF0;</span>
<span style="color: #808080; font-style: italic;">        }</span>
&nbsp;
<span style="color: #808080; font-style: italic;">--&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;scrollDiv&quot;</span> <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;overflow: auto; width: 400px; cursor: default; display: inline; position: absolute; height: 200px;&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">table</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;accountTable&quot;</span> <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;table-layout: auto; height: 230px;&quot;</span> <span style="color: #000066;">border</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #000066;">cellspacing</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000066;">cellpadding</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000066;">width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;550&quot;</span> bordercolor<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;lightgrey&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">tbody</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">tr</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedTitleRow&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedTitleColumn&quot;</span>&gt;</span>ID0<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedTitleColumn&quot;</span>&gt;</span>CK0<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedTitleColumn&quot;</span>&gt;</span>Code0<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedTitleColumn&quot;</span>&gt;</span>Descirption0<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedTitleColumn&quot;</span>&gt;</span>TOL0<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>XS0<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>SS0<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>MS0<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>DS0<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>BS0<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>XL0<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>ML0<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>DL0<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>EM0<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>BM0<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">tr</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>88<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>88<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>88<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>88<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>88<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>22<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>22<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>22<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>22<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>22<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>22<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>22<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>22<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>22<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>22<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>111<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>111<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>1111<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>This is Test<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>1<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>001<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>002<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>003<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>004<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>005<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>006<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>007<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>008<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>009<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>010<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>111<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>111<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>1111<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>This is Test<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>1<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>001<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>002<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>003<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>004<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>005<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>006<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>007<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>008<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>009<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>010<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>11<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>111<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>111<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>is is Test<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>1<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>001<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>002<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>003<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>004<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>005<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>006<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>007<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>008<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>009<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>010<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>111<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>11<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>1111<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>this is Test<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FixedDataColumn&quot;</span>&gt;</span>1<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>001<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>002<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>003<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>04<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>005<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>006<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>007<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>008<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>009<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span>010<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">tbody</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">table</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://degula.com/webdev/css/200904461/css-fixed-tablehead.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/webdev/css/200904461/css-fixed-tablehead.html</feedburner:origLink></item>
		<item>
		<title>Sybase在Dbvisualizer中出现乱码解决</title>
		<link>http://feedproxy.google.com/~r/Degula/~3/0lvWmT6ZIus/sybase-dbvisualizer.html</link>
		<comments>http://degula.com/database/200904456/sybase-dbvisualizer.html#comments</comments>
		<pubDate>Mon, 13 Apr 2009 00:57:17 +0000</pubDate>
		<dc:creator>德古拉</dc:creator>
				<category><![CDATA[database]]></category>

		<guid isPermaLink="false">http://degula.com/?p=456</guid>
		<description><![CDATA[在Database Url中添加字符集即可,这里的格式和代码中不太一样
在java中写法:
jdbc:sybase:Tds:hostname:port/dbname?charset=eucgb&#38;jconnect_version=4
Dbvisualizer中写法:
jdbc:jtds:sybase:&#62;//10.135.2.2:5000;DatabaseName=abis;charset=eucgb
]]></description>
			<content:encoded><![CDATA[<p>在Database Url中添加字符集即可,这里的格式和代码中不太一样</p>
<p>在java中写法:</p>
<blockquote><p>jdbc:sybase:Tds:hostname:port/dbname?charset=eucgb&amp;jconnect_version=4</p></blockquote>
<p>Dbvisualizer中写法:</p>
<blockquote><p>jdbc:jtds:sybase:&gt;//10.135.2.2:5000;DatabaseName=abis;charset=eucgb</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://degula.com/database/200904456/sybase-dbvisualizer.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://degula.com/database/200904456/sybase-dbvisualizer.html</feedburner:origLink></item>
	</channel>
</rss>
