﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-网站开发-随笔分类-Asp.net</title><link>http://www.blogjava.net/ljy032/category/16947.html</link><description>asp.net</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 09:37:33 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 09:37:33 GMT</pubDate><ttl>60</ttl><item><title>一个关于模态弹出窗口刷新父窗体的问题。急</title><link>http://www.blogjava.net/ljy032/archive/2007/02/09/99012.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Fri, 09 Feb 2007 06:48:00 GMT</pubDate><guid>http://www.blogjava.net/ljy032/archive/2007/02/09/99012.html</guid><wfw:comment>http://www.blogjava.net/ljy032/comments/99012.html</wfw:comment><comments>http://www.blogjava.net/ljy032/archive/2007/02/09/99012.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljy032/comments/commentRss/99012.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljy032/services/trackbacks/99012.html</trackback:ping><description><![CDATA[
		<h2 class="title" id="article_title">问：<br />我在做一套系统的时候碰到这样一个问题。<br />弹出的模态窗口不能刷新父窗体。例如我新增数据是在模态窗口而添加成功了关闭后父窗体只能手动刷新。这样就严重影响了一些效果。<br />我尝试过一些方法但是始终不对。请各位高手进来一下。</h2>
		<h2 class="title">用OPEN打开的不管是在关闭窗体时自动刷新都没有任何问题。见下例</h2>
		<h2 class="title">父窗体代码<br />&lt;%@ page contentType="text/html; charset=GBK" %&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;a href="javascript:void(0)" onclick="window.open('2.html','','')"&gt;open&lt;/a&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</h2>
		<h2 class="title">子窗体代码<br />&lt;%@ page contentType="text/html; charset=GBK" %&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body onUnload="opener.location.reload()"&gt;<br />&lt;!-<br />用按纽直接刷新父窗体<br />&lt;a href="javascript:opener.location.reload()"&gt;刷新&lt;/a&gt;<br />-&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</h2>
		<h2 class="title"> </h2>
		<h2 class="title">换做模态后的程序。<br />父窗体代码<br />&lt;%@ page contentType="text/html; charset=GBK" %&gt;&lt;HEAD&gt;<br />&lt;body onUnload="opener.location.reload()"&gt;<br />&lt;script language="JavaScript"&gt;<br />function showabout()<br />{<br />  var returnValue=showModalDialog('2.html','','dialogWidth:520px;dialogHeight:510px;help:no;center:yes;resizable:no;status:no;scroll:no');<br />}  <br />void(0);<br />&lt;/script&gt;<br />&lt;a href="javascript:void(0)" onClick="showabout()"&gt;open&lt;/a&gt;</h2>
		<h2 class="title">子窗体代码<br />&lt;%@ page contentType="text/html; charset=GBK" %&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body onUnload="opener.location.reload()"&gt;<br />&lt;a href="javascript:opener.location.reload()"&gt;刷新&lt;/a&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</h2>
		<h2 class="title"> </h2>
		<h2 class="title">请各位参考一下上面的代码，我感觉错误好象是出在<br />opener.location.reload（）</h2>
		<h2 class="title">谢谢<br />______________________________________________________________________________________________<br />答1：<br />模态窗口不能在子窗口中直接刷新父窗口</h2>
		<h2 class="title">父窗体代码<br />&lt;%@ page contentType="text/html; charset=GBK" %&gt;&lt;HEAD&gt;<br />&lt;body onUnload="opener.location.reload()"&gt;<br />&lt;script language="JavaScript"&gt;<br />function showabout()<br />{<br />  var returnValue=showModalDialog('2.html','','dialogWidth:520px;dialogHeight:510px;help:no;center:yes;resizable:no;status:no;scroll:no');<br />  location.reload()//模态窗口传值下来后就可以刷新了.<br />}  <br />void(0);<br />&lt;/script&gt;<br />&lt;a href="javascript:void(0)" onClick="showabout()"&gt;open&lt;/a&gt;</h2>
		<h2 class="title">子窗体代码<br />&lt;%@ page contentType="text/html; charset=GBK" %&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body onUnload="opener.location.reload()"&gt;<br />&lt;a href="javascript:opener.location.reload()"&gt;刷新&lt;/a&gt;//???在子窗口中不能刷新父窗口,只有window.close下去后才可刷新.<br />&lt;/body&gt;<br />&lt;/html&gt;</h2>
		<h2 class="title">______________________________________________________________________________________________<br />答2：<br />模态对话框是不能用opener引用父窗口的，而是需要父窗口主动传递指针变量的<br />这个window.showModalDialog有第二个参数，就是做这个用的，你需要把window穿过去，就是这样<br />var returnValue=showModalDialog('2.html',window,'dialogWidth:520px;dialogHeight:510px;help:no;center:yes;resizable:no;status:no;scroll:no');<br />这样在对话框中就可以引用父窗口对象，怎么引用呢，通过window.dialogArgument就可以应用父窗口了。</h2>
		<h2 class="title">______________________________________________________________________________________________<br />答3：<br />谢谢。我终于搞定了。<br />上面的dialogArgument差个S<br />我调了半天。发现在body里面应该加上location<br />也就是&lt;body onUnload="window.dialogArguments.location.reload()"&gt;<br /></h2>
<img src ="http://www.blogjava.net/ljy032/aggbug/99012.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljy032/" target="_blank">风雨兼程</a> 2007-02-09 14:48 <a href="http://www.blogjava.net/ljy032/archive/2007/02/09/99012.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>asp.net中动态变更CSS </title><link>http://www.blogjava.net/ljy032/archive/2007/02/09/98984.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Fri, 09 Feb 2007 05:09:00 GMT</pubDate><guid>http://www.blogjava.net/ljy032/archive/2007/02/09/98984.html</guid><wfw:comment>http://www.blogjava.net/ljy032/comments/98984.html</wfw:comment><comments>http://www.blogjava.net/ljy032/archive/2007/02/09/98984.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljy032/comments/commentRss/98984.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljy032/services/trackbacks/98984.html</trackback:ping><description><![CDATA[在asp.net中，有的时候要动态变换CSS，比如有的时候做个性化页面，可以这样做<br />&lt;head&gt;<br />&lt;link id="MyStyleSheet" rel="stylesheet" type="text/css" runat="server" /&gt;<br />&lt;/head&gt;<br />之后，在要更换CSS的页面中，使用如下代码<br />Sub Page_Load(Sender As Object, E As EventArgs)<br />If Not (IsPostBack)<br />MyStyleSheet.Attributes.Add("href","/css/flostyle.css")<br />End If<br />End Sub  <br /><img src ="http://www.blogjava.net/ljy032/aggbug/98984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljy032/" target="_blank">风雨兼程</a> 2007-02-09 13:09 <a href="http://www.blogjava.net/ljy032/archive/2007/02/09/98984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态改变Asp.net页面标题</title><link>http://www.blogjava.net/ljy032/archive/2007/02/09/98982.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Fri, 09 Feb 2007 05:08:00 GMT</pubDate><guid>http://www.blogjava.net/ljy032/archive/2007/02/09/98982.html</guid><wfw:comment>http://www.blogjava.net/ljy032/comments/98982.html</wfw:comment><comments>http://www.blogjava.net/ljy032/archive/2007/02/09/98982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljy032/comments/commentRss/98982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljy032/services/trackbacks/98982.html</trackback:ping><description><![CDATA[
		<h2>
				<font size="2">1.引用命字空间<br /><font color="#800080">use System.Web.UI.HtmlControls.HtmlGenericControl</font><br />在Asp.net 中你可以使用HtmlGenericControl()来动态改变页面Title(标题)<br /><br /><br /><br />2.为HTML Title标签设置ID，并将其作为服务器端运行<br />&lt;HTML&gt;<br />  &lt;HEAD&gt;<br />    <font color="#800080">&lt;TITLE ID=MyPageTitle Runat=Server&gt; &lt;/TITLE&gt;</font><br />  &lt;/HEAD&gt;<br /> &lt;BODY&gt;<br />  &lt;/BODY&gt;<br />&lt;/HTML&gt;<br /><br /><br /><br />3.将Title标设设为Runat=server后，就可以后台代码进行访问~~,通过InnerText或InnerHtml<br />来改变其值.<br />public class Use_This : System.Web.UI.Page<br /> {<br />  </font>
				<font size="2">
						<font color="#800080">
								<strong>Private System.Web.UI.HtmlControls.HtmlGenericControl SetMyTitle;</strong>
								<br />
						</font>  private void Page_Load(object sender, System.EventArgs e)<br />  {<br /></font>
				<strong>
						<br />
				</strong>
				<font size="2">   <strong><font color="#800080">SetMyTitle.InnerText = "~哈哈~";</font></strong><br /><br />  }<br />}</font>
		</h2>
		<br />
<img src ="http://www.blogjava.net/ljy032/aggbug/98982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljy032/" target="_blank">风雨兼程</a> 2007-02-09 13:08 <a href="http://www.blogjava.net/ljy032/archive/2007/02/09/98982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怎样实现动态添加删除表单中的行</title><link>http://www.blogjava.net/ljy032/archive/2007/01/29/96583.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Mon, 29 Jan 2007 10:58:00 GMT</pubDate><guid>http://www.blogjava.net/ljy032/archive/2007/01/29/96583.html</guid><wfw:comment>http://www.blogjava.net/ljy032/comments/96583.html</wfw:comment><comments>http://www.blogjava.net/ljy032/archive/2007/01/29/96583.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljy032/comments/commentRss/96583.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljy032/services/trackbacks/96583.html</trackback:ping><description><![CDATA[
		<p>&lt;script LANGUAGE="JAVASCRIPT"&gt;<br />var i= 0;<br />var a = 0; <br />function insertRow(){<br />　var otr=myTable.insertRow(myTable.rows.length);<br />　var ocell=otr.insertCell(0);<br />　ocell.innerHTML="&lt;input type=file name='f1'+a+''&gt;"<br />　var ocell=otr.insertCell(1);<br />   ocell.innerHTML="&lt;input type=file name='f2'+a+''&gt;"<br />   var ocell=otr.insertCell(2);<br />   ocell.innerHTML="&lt;input type=button name='del'+a+'' value=删除 onclick=myTable.deleteRow(event.srcElement.parentElement.parentElement.rowIndex)&gt;"<br />   i++;<br />   a++;<br />}<br />&lt;/SCRIPT&gt;<br />&lt;/HEAD&gt;<br />&lt;BODY&gt;<br />&lt;table id="myTable" border=1 width=600 &gt;<br />&lt;/table&gt;<br />&lt;input type=button onclick="insertRow()"　 value="插入行"&gt;<br />&lt;/BODY&gt;<br /><br />2<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "<a href="http://www.w3.org/TR/html4/loose.dtd">http://www.w3.org/TR/html4/loose.dtd</a>"&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br />&lt;title&gt;添加删除行&lt;/title&gt;<br />&lt;/head&gt;</p>
		<p>&lt;body&gt;&lt;script LANGUAGE="JAVASCRIPT"&gt;<br />var j= 1;<br />var i= 0;<br />var a = 0; <br />function insertRow(){<br />　var otr=myTable.insertRow(myTable.rows.length);<br />　    var ocell=otr.insertCell(0);                                          <br />　 ocell.innerHTML="&lt;input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text  size='12' maxlength='7'name='num"+a+"'&gt;"<br />　    var ocell=otr.insertCell(1);<br />   ocell.innerHTML="&lt;select name='adsl"+a+"'&gt;&lt;option value='1'&gt;ADSL&lt;/option&gt;&lt;option value='2'&gt; LAN&lt;/option&gt;&lt;/select&gt;"<br />      var ocell=otr.insertCell(2);                                          <br />   ocell.innerHTML="&lt;input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'value='"+j+"'&gt;"<br />      var ocell=otr.insertCell(3);                                          <br />   ocell.innerHTML="&lt;input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'&gt;"<br />      var ocell=otr.insertCell(4);                                          <br />   ocell.innerHTML="&lt;input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'&gt;"<br />      var ocell=otr.insertCell(5);  <br />   ocell.innerHTML="&lt;input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'&gt;"      <br />     var  ocell=otr.insertCell(6);<br />   ocell.innerHTML="&lt;input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=button name='del'+a+'' value=删除 onclick=myTable.deleteRow(event.srcElement.parentElement.parentElement.rowIndex)&gt;"<br />   j++;<br />   i++;<br />   a++;<br />}<br />&lt;/SCRIPT&gt;<br />&lt;/HEAD&gt;<br />&lt;BODY&gt;<br />&lt;table id="myTable"width="778" border="1" align="center" cellspacing="0" bordercolorlight="#66CC33" bordercolordark="ffffff"&gt;<br />  &lt;tr&gt;<br />    &lt;td&gt;&lt;div align="center"&gt;号码&lt;/div&gt;&lt;/td&gt;<br />    &lt;td nowrap&gt;&lt;div align="center"&gt;宽度类型&lt;/div&gt;&lt;/td&gt;<br />    &lt;td nowrap&gt;&lt;div align="center"&gt;起始时间&lt;/div&gt;&lt;/td&gt;<br />    &lt;td nowrap&gt;&lt;div align="center"&gt;优惠时间&lt;/div&gt;&lt;/td&gt;<br />    &lt;td nowrap&gt;&lt;div align="center"&gt;优惠金额&lt;/div&gt;&lt;/td&gt;<br />    &lt;td nowrap&gt;&lt;div align="center"&gt;备注&lt;/div&gt;&lt;/td&gt;<br />    &lt;td nowrap&gt;&lt;div align="center"&gt;删除&lt;/div&gt;&lt;/td&gt;<br />  &lt;/tr&gt;<br />&lt;/table&gt;<br />&lt;p align="center"&gt;<br />  &lt;input type=button onclick="insertRow()"value="插入行"&gt;<br />&lt;/p&gt;</p>
		<p>&lt;p&gt;&amp;nbsp;&lt;/p&gt;<br />&lt;/BODY&gt;</p>
		<p>&lt;/body&gt;<br />&lt;/html&gt;<br /><br />3<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "<a href="http://www.w3.org/TR/html4/loose.dtd">http://www.w3.org/TR/html4/loose.dtd</a>"&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br />&lt;title&gt;添加删除行&lt;/title&gt;<br />&lt;/head&gt;</p>
		<p>&lt;body&gt;&lt;script LANGUAGE="JAVASCRIPT"&gt;<br />var i= 0;<br />var a = 0; <br />function insertRow(){<br />　var otr=myTable.insertRow(myTable.rows.length);<br />　    var ocell=otr.insertCell(0);                                          <br />　 ocell.innerHTML="&lt;input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text  size='12' maxlength='7'name='num"+a+"'&gt;"<br />　    var ocell=otr.insertCell(1);<br />   ocell.innerHTML="&lt;select onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'name='adsl"+a+"'&gt;&lt;option value='1'&gt;ADSL&lt;/option&gt;&lt;option value='2'&gt; LAN&lt;/option&gt;&lt;/select&gt;"<br />      var ocell=otr.insertCell(2);                                          <br />   ocell.innerHTML="&lt;input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'value='"+a+"'&gt;"<br />      var ocell=otr.insertCell(3);                                          <br />   ocell.innerHTML="&lt;input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'&gt;"<br />      var ocell=otr.insertCell(4);                                          <br />   ocell.innerHTML="&lt;input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'&gt;"<br />      var ocell=otr.insertCell(5);  <br />   ocell.innerHTML="&lt;input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'&gt;"      <br />     var  ocell=otr.insertCell(6);<br />   ocell.innerHTML="&lt;input type=button name='del'+a+'' value=删除 onclick=myTable.deleteRow(event.srcElement.parentElement.parentElement.rowIndex)&gt;"</p>
		<p>   i++;<br />   a++;<br />}<br />function deleteRow()<br />{<br />   tr=document.getElementById("myTable").rows;<br />   if(tr.length&gt;1)tr[tr.length-1].removeNode();<br />}<br />&lt;/SCRIPT&gt;<br />&lt;/HEAD&gt;<br />&lt;BODY&gt;<br />&lt;table id="myTable"width="778" border="1" align="center" cellspacing="0" bordercolorlight="#66CC33" bordercolordark="ffffff"&gt;<br />  &lt;tr&gt;<br />    &lt;td&gt;&lt;div align="center"&gt;号码&lt;/div&gt;&lt;/td&gt;<br />    &lt;td nowrap&gt;&lt;div align="center"&gt;宽度类型&lt;/div&gt;&lt;/td&gt;<br />    &lt;td nowrap&gt;&lt;div align="center"&gt;起始时间&lt;/div&gt;&lt;/td&gt;<br />    &lt;td nowrap&gt;&lt;div align="center"&gt;优惠时间&lt;/div&gt;&lt;/td&gt;<br />    &lt;td nowrap&gt;&lt;div align="center"&gt;优惠金额&lt;/div&gt;&lt;/td&gt;<br />    &lt;td nowrap&gt;&lt;div align="center"&gt;备注&lt;/div&gt;&lt;/td&gt;<br />    &lt;td nowrap&gt;&lt;div align="center"&gt;删除&lt;/div&gt;&lt;/td&gt;<br />  &lt;/tr&gt;<br />&lt;/table&gt;<br />&lt;p align="center"&gt;<br />  &lt;input type=button onclick="insertRow()"value="插入行"&gt;<br />  &lt;input type=button onclick="deleteRow()"value="删除行"&gt;<br />&lt;/p&gt;</p>
		<p>&lt;p&gt;&amp;nbsp;&lt;/p&gt;<br />&lt;/BODY&gt;</p>
		<p>&lt;/body&gt;<br />&lt;/html&gt;</p>
<img src ="http://www.blogjava.net/ljy032/aggbug/96583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljy032/" target="_blank">风雨兼程</a> 2007-01-29 18:58 <a href="http://www.blogjava.net/ljy032/archive/2007/01/29/96583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件上传</title><link>http://www.blogjava.net/ljy032/archive/2006/12/16/88128.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Sat, 16 Dec 2006 03:31:00 GMT</pubDate><guid>http://www.blogjava.net/ljy032/archive/2006/12/16/88128.html</guid><wfw:comment>http://www.blogjava.net/ljy032/comments/88128.html</wfw:comment><comments>http://www.blogjava.net/ljy032/archive/2006/12/16/88128.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljy032/comments/commentRss/88128.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljy032/services/trackbacks/88128.html</trackback:ping><description><![CDATA[ function OutputUpload(id,title) { var tblMain=document.getElementById("Table2"); var tbl=document.getElementById("Table3"); var isExsitfile=document.getElementById("file"+id); var text=document.createTextNode("上传:"+title+"虚拟形象图片"); if(isExsitfile==null) { var str= "<input id="file&quot;+id+&quot;" type="file" size="50" name="File" />"; tbl.rows[id].cells[0].insertAdjacentHTML("beforeEnd",str) ; tbl.rows[id].cells[0].appendChild(text); } else { tbl.rows[id].cells[0].removeChild(isExsitfile); tbl.rows[id].cells[0].innerText=""; } }<br /><br />if(Request.Form["CHK"]!=null)<br />   {   string chkvalue=Request.Form["CHK"].ToString();<br />    string[] mylayer=chkvalue.Split(new char[]{','});<br />    string layer="";<br />    for(int i=0;i&lt;mylayer.Length;i++)<br />    {      <br />     <br />     if(layer!="")<br />     {<br />      layer+="_";<br />     }<br />     layer+=mylayer[i];<br />     <br />    }<br />    ViewState["layer"]=layer;<br />       <br />    //得到数据库编号<br />    if(itemid1.ToString()==null)<br />    {<br />     itemid1=itemid1+1;<br />    }<br />    else<br />    {<br />     itemid1=GetItemID()+1;<br />    }<br />    System.Web.HttpFileCollection files=System.Web.HttpContext.Current.Request.Files;<br />    try<br />    {<br />     for(int i=0;i&lt;files.Count;i++)<br />     {   <br />      string fid=itemid1+".gif";<br />      HttpPostedFile postedFile=files[i];<br />      <br />      if(postedFile.FileName.Length&gt;0)<br />      {<br />       string fileName,fileExtension;<br />       fileName=System.IO.Path.GetFileName(postedFile.FileName);<br />       fileExtension=System.IO.Path.GetExtension(fileName); 
<p></p><p>       if(fileExtension!=GlobalVars.FILETAILNAME[0])<br />       {<br />        Response.Write("&lt;script&gt;alert(\"文件格式不正确！！！\")&lt;/script&gt;");<br />        return;<br />       }<br />       if(i==0)<br />       {<br />        //上传图片到服务器上   <br />        BLL.Visual_Items bll=new BLL.Visual_Items();<br />        bool tf=bll.Exists(this.txtName.Text);<br />        if(tf==false)<br />        {   <br />         if(System.IO.Directory.Exists(Server.MapPath(Request.ApplicationPath) + "<a href="file://images//img_Visual//show//0">\\images\\img_Visual\\show\\0</a>"))<br />         {<br />          postedFile.SaveAs(Server.MapPath(Request.ApplicationPath) + "<a href="file://images//img_Visual//show//0//">\\images\\img_Visual\\show\\0\\</a>" + fid); <br />         }<br />         else<br />         {<br />          System.IO.Directory.CreateDirectory(Server.MapPath(Request.ApplicationPath) + "<a href="file://images//img_Visual//show//0">\\images\\img_Visual\\show\\0</a>");<br />          postedFile.SaveAs(Server.MapPath(Request.ApplicationPath) + "<a href="file://images//img_Visual//show//0//">\\images\\img_Visual\\show\\0\\</a>" + fid); <br />         }<br />         // 把图片的信息记录保留到数据库中<br />         string s="images/img_Visual/show/0/"+fid;<br />         AddData(s,itemid1,layer);</p><p>        }<br />        else<br />        {<br />         this.Response.Write("&lt;script&gt;alert('数据库已存在此条数据!')&lt;/script&gt;");<br />        }</p><p>       }<br />       else<br />       {<br />        if(System.IO.Directory.Exists(Server.MapPath(Request.ApplicationPath) + "<a href="file://images//img_Visual//show//%22+mylayer%5Bi-1">\\images\\img_Visual\\show\\"+mylayer[i-1</a>]))<br />        {<br />         postedFile.SaveAs(Server.MapPath(Request.ApplicationPath) + "<a href="file://images//img_Visual//show//%22+mylayer%5Bi-1%5D+%22//">\\images\\img_Visual\\show\\"+mylayer[i-1]+"\\</a>" + fid);<br />        }<br />        else<br />        {<br />         System.IO.Directory.CreateDirectory(Server.MapPath(Request.ApplicationPath) + "<a href="file://images//img_Visual//show//%22+mylayer%5Bi-1">\\images\\img_Visual\\show\\"+mylayer[i-1</a>]);<br />         postedFile.SaveAs(Server.MapPath(Request.ApplicationPath) + "<a href="file://images//img_Visual//show//%22+mylayer%5Bi-1%5D+%22//">\\images\\img_Visual\\show\\"+mylayer[i-1]+"\\</a>" + fid);</p><p>        }<br />       }<br />      }<br />      else<br />      {<br />       Response.Write("&lt;script&gt;alert(\"虚拟形象图片不能为空！\")&lt;/script&gt;");<br />       return ;</p><p>      }<br />     }  <br />    }<br />    catch(Exception ex)<br />    {<br />     string sRawURL = Request.RawUrl;</p><p>     if(sRawURL.IndexOf("?") &gt; -1)<br />     {<br />      sRawURL = sRawURL.Substring(0,sRawURL.IndexOf("?"));<br />     }    <br />     <br />     Response.Write(ex.ToString());<br />    } <br />   }<br />   else<br />   {<br />               Response.Write("&lt;script&gt;alert(\"请选择虚拟形象所属层！！\")&lt;/script&gt;");<br />   }<br /><br /><script language="javascript"><![CDATA[
	     function OutputUpload(id,title)
	     {
	      var tblMain=document.getElementById("Table2");
	      var tbl=document.getElementById("Table3");
	      var isExsitfile=document.getElementById("file"+id);
	      var text=document.createTextNode("上传:"+title+"虚拟形象图片");
	      if(isExsitfile==null)
	      {
	         var str= "<INPUT  type='file' id='file"+id+"' size='50' NAME='File' >";
	         tbl.rows[id].cells[0].insertAdjacentHTML("beforeEnd",str) ;
	         tbl.rows[id].cells[0].appendChild(text);
	         
	      }
	      else
	      {
	      tbl.rows[id].cells[0].removeChild(isExsitfile);
	      tbl.rows[id].cells[0].innerText="";
	      }
	     }
		]]&gt;</script><script language="javascript"><![CDATA[
	     function OutputUpload(id,title)
	     {
	      var tblMain=document.getElementById("Table2");
	      var tbl=document.getElementById("Table3");
	      var isExsitfile=document.getElementById("file"+id);
	      var text=document.createTextNode("上传:"+title+"虚拟形象图片");
	      if(isExsitfile==null)
	      {
	         var str= "<INPUT  type='file' id='file"+id+"' size='50' NAME='File' >";
	         tbl.rows[id].cells[0].insertAdjacentHTML("beforeEnd",str) ;
	         tbl.rows[id].cells[0].appendChild(text);
	         
	      }
	      else
	      {
	      tbl.rows[id].cells[0].removeChild(isExsitfile);
	      tbl.rows[id].cells[0].innerText="";
	      }
	     }
		]]&gt;</script></p><img src ="http://www.blogjava.net/ljy032/aggbug/88128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljy032/" target="_blank">风雨兼程</a> 2006-12-16 11:31 <a href="http://www.blogjava.net/ljy032/archive/2006/12/16/88128.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>构建安全的数据访问</title><link>http://www.blogjava.net/ljy032/archive/2006/11/17/81768.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Fri, 17 Nov 2006 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/ljy032/archive/2006/11/17/81768.html</guid><wfw:comment>http://www.blogjava.net/ljy032/comments/81768.html</wfw:comment><comments>http://www.blogjava.net/ljy032/archive/2006/11/17/81768.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljy032/comments/commentRss/81768.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljy032/services/trackbacks/81768.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本页内容http://www.microsoft.com/china/technet/security/guidance/secmod87.mspx																																																																														本模块内容																	...&nbsp;&nbsp;<a href='http://www.blogjava.net/ljy032/archive/2006/11/17/81768.html'>阅读全文</a><img src ="http://www.blogjava.net/ljy032/aggbug/81768.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljy032/" target="_blank">风雨兼程</a> 2006-11-17 15:08 <a href="http://www.blogjava.net/ljy032/archive/2006/11/17/81768.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DataGrid使用技巧小总结-个性化分页及复杂表头 </title><link>http://www.blogjava.net/ljy032/archive/2006/11/10/80391.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Fri, 10 Nov 2006 06:31:00 GMT</pubDate><guid>http://www.blogjava.net/ljy032/archive/2006/11/10/80391.html</guid><wfw:comment>http://www.blogjava.net/ljy032/comments/80391.html</wfw:comment><comments>http://www.blogjava.net/ljy032/archive/2006/11/10/80391.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljy032/comments/commentRss/80391.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljy032/services/trackbacks/80391.html</trackback:ping><description><![CDATA[  在使用<span lang="EN-US">DataGrid 的时候,总是会有各种各样的需求,在和数据库打交道的项目中用的最多的恐怕就属<span lang="EN-US">DataGrid 了吧,微软有时候做的就差那么一点点,所以就需要我们自己来动手实现啦.</span></span><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"></span></span></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"></span></span></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US">DataGrid </span></b><b><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自定义分页导航</span><span lang="EN-US"><p></p></span></b></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">无需任何其他第三方控件,在<span lang="EN-US"><font face="Arial">DataGrid 自己分页的基础上再个性化一点.</font></span><br />效果：<span lang="EN-US">  <br /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">让DataGrid自己的分页实现这样的效果<br />[<b style="mso-bidi-font-weight: normal"><span style="COLOR: #ff6600">1</span></b>][2][3][4][5][6] 
<p></p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype>   
</p><p></p><p></p></span></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">让DataGrid自己的分页实现这样的效果<br />[<b style="mso-bidi-font-weight: normal"><span style="COLOR: #ff6600">1</span></b>][2][3][4][5][6] 
<p></p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype>   
</p><p></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">private void grid_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)<br />  {<br />   if(e.Item.ItemType==ListItemType.Pager)<br />   {    <br />    foreach (Control c in e.Item.Cells[0].Controls)<br />    {<br />     if (c is Label)  <span style="COLOR: green">//</span></span><span style="FONT-SIZE: 9pt; COLOR: green; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">当前页数</span><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><br />     {<br />        Label lblpage=(Label)c;<br /><span style="COLOR: green">//      lblpage.ForeColor= System.Drawing.ColorTranslator.FromHtml("#e<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="78" unitname="a" w:st="on">78a</chmetcnv>29"); //#e<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="78" unitname="a" w:st="on">78a</chmetcnv>29 ,#FF0000     <br />//      lblpage.Font.Bold=true;<br /></span>        lblpage.Text="[&lt;font color=#e<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="78" unitname="a" w:st="on">78a</chmetcnv>29&gt;&lt;b&gt;"+lblpage.Text+"&lt;/b&gt;&lt;/font&gt;]";     <br />     <span style="COLOR: green"> //((Label)c).ForeColor = System.Drawing.Color.Green;      <br />//      break;<br /></span>     }<br />     if(c is LinkButton) <span style="COLOR: green">//</span></span><span style="FONT-SIZE: 9pt; COLOR: green; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">链接的其他页数</span><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><br />     {      <br />         LinkButton linkButton = (LinkButton)c;       <br />         linkButton.Text = "[" + linkButton.Text+"]"; <br />     }<br />    }    <br />   }<br />  } 
<p></p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><p> </p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><p> </p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US">DataGrid</span></b><b><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等控件中的自动编号：</span><span lang="EN-US"><p></p></span></b></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">添加一个模版列：</span><span lang="EN-US" style="mso-bidi-font-weight: bold"><p></p></span></p><p></p><p class="MsoNormal" style="BACKGROUND: #e6e6e6; MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">&lt;</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">asp:TemplateColumn </span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">HeaderText</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">="No."&gt;</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><br />    </span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">&lt;</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">ItemStyle </span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">HorizontalAlign</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">="Center"&gt;&lt;/</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">ItemStyle</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">&gt;</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><br />    </span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">&lt;</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">ItemTemplate</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">&gt;</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><br />        </span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">&lt;</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">asp:Label </span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">runat</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">="server"</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"> Text</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">='&lt;%# </span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">dgCustomize.CurrentPageIndex*dgCustomize.PageSize+dgCustomize.Items.Count+1 %</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">&gt;</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">'&gt;<br />        </span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">&lt;/</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">asp:Label</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">&gt;</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><br />    </span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">&lt;/</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">ItemTemplate</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">&gt;</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><br /></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">&lt;/</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: maroon; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">asp:TemplateColumn</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">&gt;</span><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p></p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><p> </p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><p> </p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US"><a href="http://mblogger.cn/taye/posts/22534.aspx"><span style="COLOR: purple; TEXT-DECORATION: none; text-underline: none">DataGrid</span><span lang="EN-US" style="COLOR: purple; FONT-FAMILY: 宋体; TEXT-DECORATION: none; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-underline: none"><span lang="EN-US">中创建复杂表头</span></span></a><p></p></span></b></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt">方法一：用<span lang="EN-US">table</span>实现</span></b><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p></p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">  &lt;form id="Form1" method="post" runat="server"&gt;<br />   &lt;TABLE id="Table1" runat="server" cellSpacing="1" cellPadding="2" width="580" border="1"<br />    bgcolor="#cc6633" bordercolor="#cc9966" style="FONT-SIZE:<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="9" unitname="pt" w:st="on">9pt</chmetcnv>;BORDER-BOTTOM:0px"&gt;<br />    &lt;TR align="center"&gt;<br />     &lt;TD colspan="2" width="380" style="HEIGHT: 21px"&gt;&lt;/TD&gt;<br />     &lt;TD width="200" colspan="2" style="HEIGHT: 21px"&gt;&lt;/TD&gt;<br />    &lt;/TR&gt;<br />    &lt;TR align="center"&gt;<br />     &lt;TD width="200" bgcolor="#66cc99"&gt;&lt;FONT face="</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">宋体<span lang="EN-US">"&gt;&lt;/FONT&gt;&lt;/TD&gt;<br />     &lt;TD width="180" bgcolor="white"&gt;&lt;FONT face="</span>宋体<span lang="EN-US">"&gt;&lt;/FONT&gt;&lt;/TD&gt;<br />     &lt;TD width="160" bgcolor="#99cccc"&gt;&lt;/TD&gt;<br />     &lt;TD width="40" bgcolor="#009999"&gt;&lt;/TD&gt;<br />    &lt;/TR&gt;<br />   &lt;/TABLE&gt;<br />   &lt;asp:DataGrid id="DataGrid1" width="580px" AlternatingItemStyle-BackColor="#6699ff" CellPadding="2"<br />    CellSpacing="1" BorderWidth="1" BorderColor="#cc9966" Font-Size="<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="9" unitname="pt" w:st="on">9pt</chmetcnv>" runat="server" ShowHeader="False"<br />    AutoGenerateColumns="False"&gt;<br />    &lt;Columns&gt;<br />     &lt;asp:BoundColumn DataField="Title"&gt;<br />      &lt;ItemStyle Width="200px"&gt;&lt;/ItemStyle&gt;<br />     &lt;/asp:BoundColumn&gt;<br />     &lt;asp:BoundColumn DataField="CreateDate"&gt;<br />      &lt;ItemStyle Width="180px"&gt;&lt;/ItemStyle&gt;<br />     &lt;/asp:BoundColumn&gt;<br />     &lt;asp:BoundColumn DataField="pid"&gt;<br />      &lt;ItemStyle Width="160px"&gt;&lt;/ItemStyle&gt;<br />     &lt;/asp:BoundColumn&gt;<br />     &lt;asp:BoundColumn DataField="HitCount"&gt;<br />      &lt;ItemStyle Width="40px"&gt;&lt;/ItemStyle&gt;<br />     &lt;/asp:BoundColumn&gt;<br />    &lt;/Columns&gt;<br />   &lt;/asp:DataGrid&gt;   <br />  &lt;/form&gt;  
<p></p></span></span></p><p></p><div style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; PADDING-BOTTOM: 1pt; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-element: para-border-div; mso-border-bottom-alt: solid windowtext .75pt"><p class="MsoNormal" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; MARGIN: 0cm 0cm 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none; TEXT-ALIGN: center; mso-pagination: widow-orphan; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm" align="center"><span style="DISPLAY: none; FONT-SIZE: 8pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 0pt; mso-bidi-font-family: Arial; mso-hide: all">窗体顶端</span><span lang="EN-US" style="DISPLAY: none; FONT-SIZE: 8pt; FONT-FAMILY: Arial; mso-font-kerning: 0pt; mso-hide: all"><p></p></span></p><p></p></div><table class="MsoNormalTable" style="BORDER-RIGHT: #cc9966 1pt outset; BORDER-TOP: #cc9966 1pt outset; BACKGROUND: #cc6633; BORDER-LEFT: #cc9966 1pt outset; WIDTH: 435pt; BORDER-BOTTOM: medium none; mso-padding-alt: 1.5pt 1.5pt 1.5pt 1.5pt; mso-cellspacing: .7pt; mso-border-top-alt: outset #CC9966 .75pt; mso-border-left-alt: outset #CC9966 .75pt; mso-border-right-alt: outset #CC9966 .75pt" cellspacing="1" cellpadding="0" width="580" border="1"><tbody><tr style="HEIGHT: 15.75pt; mso-yfti-irow: 0; mso-yfti-firstrow: yes"><td style="BORDER-RIGHT: #cc9966 1pt inset; PADDING-RIGHT: 1.5pt; BORDER-TOP: #cc9966 1pt inset; PADDING-LEFT: 1.5pt; PADDING-BOTTOM: 1.5pt; BORDER-LEFT: #cc9966 1pt inset; WIDTH: 285pt; PADDING-TOP: 1.5pt; BORDER-BOTTOM: #cc9966 1pt inset; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: inset #CC9966 .75pt" width="380" colspan="2"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #cc9966 1pt inset; PADDING-RIGHT: 1.5pt; BORDER-TOP: #cc9966 1pt inset; PADDING-LEFT: 1.5pt; PADDING-BOTTOM: 1.5pt; BORDER-LEFT: #cc9966 1pt inset; WIDTH: 150pt; PADDING-TOP: 1.5pt; BORDER-BOTTOM: #cc9966 1pt inset; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: inset #CC9966 .75pt" width="200" colspan="2"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td></tr><tr style="mso-yfti-irow: 1; mso-yfti-lastrow: yes"><td style="BORDER-RIGHT: #cc9966 1pt inset; PADDING-RIGHT: 1.5pt; BORDER-TOP: #cc9966 1pt inset; PADDING-LEFT: 1.5pt; BACKGROUND: #66cc99; PADDING-BOTTOM: 1.5pt; BORDER-LEFT: #cc9966 1pt inset; WIDTH: 150pt; PADDING-TOP: 1.5pt; BORDER-BOTTOM: #cc9966 1pt inset; mso-border-alt: inset #CC9966 .75pt" width="200"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #cc9966 1pt inset; PADDING-RIGHT: 1.5pt; BORDER-TOP: #cc9966 1pt inset; PADDING-LEFT: 1.5pt; BACKGROUND: white; PADDING-BOTTOM: 1.5pt; BORDER-LEFT: #cc9966 1pt inset; WIDTH: 135pt; PADDING-TOP: 1.5pt; BORDER-BOTTOM: #cc9966 1pt inset; mso-border-alt: inset #CC9966 .75pt" width="180"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #cc9966 1pt inset; PADDING-RIGHT: 1.5pt; BORDER-TOP: #cc9966 1pt inset; PADDING-LEFT: 1.5pt; BACKGROUND: #99cccc; PADDING-BOTTOM: 1.5pt; BORDER-LEFT: #cc9966 1pt inset; WIDTH: 120pt; PADDING-TOP: 1.5pt; BORDER-BOTTOM: #cc9966 1pt inset; mso-border-alt: inset #CC9966 .75pt" width="160"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #cc9966 1pt inset; PADDING-RIGHT: 1.5pt; BORDER-TOP: #cc9966 1pt inset; PADDING-LEFT: 1.5pt; BACKGROUND: #009999; PADDING-BOTTOM: 1.5pt; BORDER-LEFT: #cc9966 1pt inset; WIDTH: 30pt; PADDING-TOP: 1.5pt; BORDER-BOTTOM: #cc9966 1pt inset; mso-border-alt: inset #CC9966 .75pt" width="40"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td></tr><tr><td style="BORDER-RIGHT: #cc9966; BORDER-TOP: #cc9966; BORDER-LEFT: #cc9966; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="200"></td><td style="BORDER-RIGHT: #cc9966; BORDER-TOP: #cc9966; BORDER-LEFT: #cc9966; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="179"></td><td style="BORDER-RIGHT: #cc9966; BORDER-TOP: #cc9966; BORDER-LEFT: #cc9966; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="160"></td><td style="BORDER-RIGHT: #cc9966; BORDER-TOP: #cc9966; BORDER-LEFT: #cc9966; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="41"></td></tr></tbody></table><div style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 1pt; BORDER-BOTTOM: medium none; mso-element: para-border-div; mso-border-top-alt: solid windowtext .75pt"><p class="MsoNormal" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; MARGIN: 0cm 0cm 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none; TEXT-ALIGN: center; mso-pagination: widow-orphan; mso-padding-alt: 1.0pt 0cm 0cm 0cm; mso-border-top-alt: solid windowtext .75pt" align="center"><span style="DISPLAY: none; FONT-SIZE: 8pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 0pt; mso-bidi-font-family: Arial; mso-hide: all">窗体底端</span><span lang="EN-US" style="DISPLAY: none; FONT-SIZE: 8pt; FONT-FAMILY: Arial; mso-font-kerning: 0pt; mso-hide: all"><p></p></span></p><p></p></div><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt">方法二：动态生成表头</span></b><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p></p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt">生成双层表头<span lang="EN-US">:</span></span></b><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><br />  private void grid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)<br />  { 
<p></p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">   if (e.Item.ItemType == ListItemType.Header)<br />   {<br />//    e.Item.Cells[0].ColumnSpan = 1;//</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">这是第一列的跨列数<span lang="EN-US"><br />    StringBuilder strtext=new StringBuilder();<br />    strtext.Append("<a href="http://blog.csdn.net/litp/Local%20Settings/Temp/WebCatcher/%3c/td"><span style="mso-bidi-font-size: 12.0pt"><u>\\&lt;/td</u></span></a>&gt;");<br />    strtext.Append("&lt;td colspan=4&gt;</span>生活照明<span lang="EN-US">&lt;/td&gt;");<br />    strtext.Append("&lt;td colspan=2&gt;</span>一般照明<span lang="EN-US">&lt;/td&gt;");<br />    strtext.Append("&lt;td colspan=2&gt;</span>工付业<span lang="EN-US">&lt;/td&gt;");<br />    strtext.Append("&lt;td colspan=2&gt;</span>农业<span lang="EN-US">&lt;/td&gt;");<br />    strtext.Append("&lt;td colspan=2&gt;</span>合计<span lang="EN-US">&lt;/td&gt;");<br />    strtext.Append("&lt;/tr&gt;");<br />    strtext.Append("&lt;tr&gt;");<br />    strtext.Append("&lt;td&gt;" + e.Item.Cells[0].Text);                <br />    e.Item.Cells[0].Text =strtext.ToString(); 
<p></p></span></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">   } 
<p></p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">} 
<p></p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">整个表头内容：<span lang="EN-US">&lt;tr&gt;&lt;td&gt;  <span style="COLOR: blue">e.Item.Cells[0].Text =</span></span><span style="COLOR: blue">的内容</span><span lang="EN-US">  &lt;/td&gt;&lt;/tr&gt; 
<p></p></span></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">加起来就是表头的样式。<span lang="EN-US"><p></p></span></span></p><p></p><table class="MsoNormalTable" style="WIDTH: 225pt; mso-cellspacing: 0cm" cellspacing="0" cellpadding="0" width="300" border="1"><tbody><tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; BACKGROUND: #99ccff; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8" colspan="4"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">生活照明<span lang="EN-US"><p></p></span></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; BACKGROUND: #99ccff; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8" colspan="2"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">一般照明<span lang="EN-US"><p></p></span></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; BACKGROUND: #99ccff; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8" colspan="2"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">工付业<span lang="EN-US"><p></p></span></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; BACKGROUND: #99ccff; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8" colspan="2"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">农业<span lang="EN-US"><p></p></span></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; BACKGROUND: #99ccff; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8" colspan="2"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">合计<span lang="EN-US"><p></p></span></span></p><p></p></td></tr><tr style="mso-yfti-irow: 1; mso-yfti-lastrow: yes"><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td></tr><tr><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="19"></td><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="19"></td><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="20"></td><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="20"></td><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="39"></td><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="39"></td><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="30"></td><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="30"></td><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="21"></td><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="21"></td><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="21"></td><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="21"></td></tr></tbody></table><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p></p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt">生成三层表头<span lang="EN-US">:</span></span></b><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p></p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">if (e.Item.ItemType == ListItemType.Header)<br />   {    <br />    StringBuilder strtext=new StringBuilder();<br />    strtext.Append("&lt;/td&gt;");<br />    strtext.Append("&lt;td colspan= <span style="COLOR: blue">6</span>&gt;</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">当月<span lang="EN-US">&lt;/td&gt;");<br />    strtext.Append("&lt;/tr&gt;"); 
<p></p></span></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p></p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">    strtext.Append("&lt;tr&gt;"); <br />    strtext.Append("&lt;td colspan=2&gt;</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">居民<span lang="EN-US">&lt;/td&gt;");<br />    strtext.Append("&lt;td colspan=2&gt;</span>一般<span lang="EN-US">&lt;/td&gt;");<br />    strtext.Append("&lt;td colspan=2&gt;</span>工付业<span lang="EN-US">&lt;/td&gt;");<br />    strtext.Append("&lt;/tr&gt;"); 
<p></p></span></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p></p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">    strtext.Append("&lt;tr&gt;");<br />    strtext.Append("&lt;td&gt;" + e.Item.Cells[0].Text);                <br />    e.Item.Cells[0].Text =strtext.ToString();<br />   } 
<p></p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p></p></span></p><p></p><table class="MsoNormalTable" style="WIDTH: 225pt; mso-cellspacing: 0cm" cellspacing="0" cellpadding="0" width="300" border="1"><tbody><tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; BACKGROUND: lightcyan; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8" colspan="6"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">当月<span lang="EN-US"><p></p></span></span></p><p></p></td></tr><tr style="mso-yfti-irow: 1"><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; BACKGROUND: lavender; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8" colspan="2"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">居民<span lang="EN-US"><p></p></span></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; BACKGROUND: lavender; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8" colspan="2"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">一般<span lang="EN-US"><p></p></span></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; BACKGROUND: lavender; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8" colspan="2"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">工付业<span lang="EN-US"><p></p></span></span></p><p></p></td></tr><tr style="mso-yfti-irow: 2; mso-yfti-lastrow: yes"><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p> </p></span></p><p></p></td></tr><tr><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="44"></td><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="44"></td><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="44"></td><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="44"></td><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="63"></td><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="63"></td></tr></tbody></table><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p></p></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p></p></span></p><img src ="http://www.blogjava.net/ljy032/aggbug/80391.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljy032/" target="_blank">风雨兼程</a> 2006-11-10 14:31 <a href="http://www.blogjava.net/ljy032/archive/2006/11/10/80391.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Datagrid怎么根据选择的checkbox编辑和更新多行记录？ </title><link>http://www.blogjava.net/ljy032/archive/2006/11/10/80388.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Fri, 10 Nov 2006 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/ljy032/archive/2006/11/10/80388.html</guid><wfw:comment>http://www.blogjava.net/ljy032/comments/80388.html</wfw:comment><comments>http://www.blogjava.net/ljy032/archive/2006/11/10/80388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljy032/comments/commentRss/80388.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljy032/services/trackbacks/80388.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 网友问这个问题，写了一个简单的例子：前台：  1&lt;%@ Page language="c#" Codebehind="WebForm4.aspx.cs" AutoEventWireup="false" Inherits="WebApplication25.WebForm4" %&gt;  2&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Tran...&nbsp;&nbsp;<a href='http://www.blogjava.net/ljy032/archive/2006/11/10/80388.html'>阅读全文</a><img src ="http://www.blogjava.net/ljy032/aggbug/80388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljy032/" target="_blank">风雨兼程</a> 2006-11-10 14:28 <a href="http://www.blogjava.net/ljy032/archive/2006/11/10/80388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2006年it人士必去的10个网站 </title><link>http://www.blogjava.net/ljy032/archive/2006/11/08/79856.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Wed, 08 Nov 2006 07:14:00 GMT</pubDate><guid>http://www.blogjava.net/ljy032/archive/2006/11/08/79856.html</guid><wfw:comment>http://www.blogjava.net/ljy032/comments/79856.html</wfw:comment><comments>http://www.blogjava.net/ljy032/archive/2006/11/08/79856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljy032/comments/commentRss/79856.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljy032/services/trackbacks/79856.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.cnblogs.com/ouyang/archive/2006/07/24/458346.html">2006年it人士必去的10个网站 </a>
		</div>
		<p>1、chinaunix<br />网址：<a href="http://www.chinaunix.net/">http://www.chinaunix.net/</a><br />简介：中国最大的linux/unix技术社区。 </p>
		<p>2、itpub<br />网址：<a href="http://www.itpub.net/">http://www.itpub.net/</a><br />简介：有名气的IT技术论坛，看看它的alexa排名就知道有多火了，尤其以数据库技术讨论热烈而闻名。ITPUB论坛的前身是建立在smiling的oracle小组。</p>
		<p>3、51cto<br />网址：<a href="http://www.51cto.com/">http://www.51cto.com/</a><br />简介：由国内知名IT门户网站管理团队，获近千万风险投资，于2005年8月正式创立，是国内首家定位于网络技术人员的综合性服务平台，是中国最大的网络技术网站。</p>
		<p>4、csdn<br />网址：<a href="http://www.csdn.net/">http://www.csdn.net/</a><br />简介：于1999年3月成立，是中国最大的软件开发人员网站，社区热心高手众多，并有不少MVP(微软最有价值专家)长期活跃在这里，类似悬赏的积分制度，也使论坛增添不少乐趣。</p>
		<p>5、落伍者<br />网址：<a href="http://www.im286.com/">http://www.im286.com/</a><br />简介：网站站长都应该知道的地方，只是论坛id需要手工审核。</p>
		<p>6、蓝色理想<br />网址：<a href="http://www.blueidea.com/">http://www.blueidea.com/</a><br />简介：有名的关于网站设计的网站，拥有大量忠实网友。</p>
		<p>7、it写作社区<br />网址：<a href="http://www.donews.com/">http://www.donews.com/</a><br />简介：一个可以让你的思维活跃起来的地方,在这里it评论人和撰稿人可以找到很多的文字素材。</p>
		<p>8、博客堂<br />网址：<a href="http://blog.joycode.com/">http://blog.joycode.com/</a><br />简介：众多MVP交流的地方，这里有各类最新技术，只是网站成员采用邀请制，不提供注册或者申请功能。</p>
		<p>9、it英雄榜<br />网址：<a href="http://www.itheroes.cn/">http://www.itheroes.cn/</a><br />简介：网站以介绍it界人士为主，广大从事it的人员可以从中获取他们的经验。</p>
		<p>10、邪恶八进制<br />网址：<a href="http://www.eviloctal.com/">http://www.eviloctal.com/</a><br />简介：目前为数不多的一个讨论气氛浓厚，技术水平高的网络安全网站，邪恶八进制信息安全团队也是一个管理规范、人员素质高的网络安全小组。</p>
<img src ="http://www.blogjava.net/ljy032/aggbug/79856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljy032/" target="_blank">风雨兼程</a> 2006-11-08 15:14 <a href="http://www.blogjava.net/ljy032/archive/2006/11/08/79856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>datagrid的正反双向排序 </title><link>http://www.blogjava.net/ljy032/archive/2006/11/08/79848.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Wed, 08 Nov 2006 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/ljy032/archive/2006/11/08/79848.html</guid><wfw:comment>http://www.blogjava.net/ljy032/comments/79848.html</wfw:comment><comments>http://www.blogjava.net/ljy032/archive/2006/11/08/79848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljy032/comments/commentRss/79848.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljy032/services/trackbacks/79848.html</trackback:ping><description><![CDATA[呵呵，本没有写文章之意，看到好友<strong>阿好（hbzxf)</strong>的文章，也决定把平时的一些东西写出来和大家分享！有疏漏之处，敬请大家指教！
<p>     在asp.net中利用datagrid控件按列进行排序很是方便。可是我们只能单项排序！如果我们需要正反排序那么就需要加入一些代码控制一下,下面我来详细讲解一下这个过程。</p><p>  首先我们需要将datagird控件的属性设置为 AllowSorting="True"，且需要排序列需要制定排序表达式 eg: SortExpression="kmdm"。设置好这些，我们进入代码文件，来编写响应排序的事件.</p><p>  首先在Page_Load时间中加入如下代码：</p><p>   if (!IsPostBack)<br />   {<br />    if(this.kjkm_dg.Attributes["SortExpression"]==null) //这里kjkm_dg为datagrid   ID<br />    {<br />     this.kjkm_dg.Attributes["SortExpression"]="kmdm";  //这里给datagrid增加一个排序属性，且默认排序表达式为kmdm;<br />     kjkm_dg.Attributes["SortDirection"]="ASC"; //这里给datagrid增加一个排序方向属性,且默认为升序排列;<br />    }<br />    mikecatbind(); //绑定函数,下面介绍<br />   }</p><p>  protected void mikecatbind()<br />  {<br />   string sqlStr="select * from zc_kjkm";<br />   DataView dv=new DataView();<br />   <br />   string SortExpression=kjkm_dg.Attributes["SortExpression"];<br />   string SortDirection=kjkm_dg.Attributes["SortDirection"];<br />   dv=us.Bind(sqlStr).Tables[0].DefaultView;  //来自web service的dataset,这里随便一个ds就可以;<br />   dv.Sort=SortExpression+" "+SortDirection; //指定视图的排序方式;<br />   kjkm_dg.DataSource=dv; //指定数据源<br />   kjkm_dg.DataBind(); //数据绑定</p><p>}</p><p>   进行完上面的设置后我们进入重要的环节，排序事件的编写:</p><p>  private void kjkm_dg_SortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)<br />  {<br />   string SortExpression=e.SortExpression.ToString();  //获得当前排序表达式<br />   string SortDirection="ASC"; //为排序方向变量赋初值<br />   if(SortExpression==kjkm_dg.Attributes["SortExpression"])  //如果为当前排序列<br />   {<br />    <font color="#ee1111">SortDirection=(kjkm_dg.Attributes["SortDirection"].ToString()==SortDirection?"DESC":"ASC");     //获得下一次的排序状态</font></p><p> }<br />   kjkm_dg.Attributes["SortExpression"]=SortExpression;<br />   kjkm_dg.Attributes["SortDirection"]=SortDirection;<br />   mikecatbind();<br />  }</p><img src ="http://www.blogjava.net/ljy032/aggbug/79848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljy032/" target="_blank">风雨兼程</a> 2006-11-08 14:53 <a href="http://www.blogjava.net/ljy032/archive/2006/11/08/79848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>每个开发人员现在应该下载的十种必备工具</title><link>http://www.blogjava.net/ljy032/archive/2006/11/07/79600.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Tue, 07 Nov 2006 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/ljy032/archive/2006/11/07/79600.html</guid><wfw:comment>http://www.blogjava.net/ljy032/comments/79600.html</wfw:comment><comments>http://www.blogjava.net/ljy032/archive/2006/11/07/79600.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/ljy032/comments/commentRss/79600.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljy032/services/trackbacks/79600.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr>
								<td class="listItem">
										<div id="">
												<p>用于编写单元测试的 NUnit</p>
										</div>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<div id="">
												<p>用于创建代码文档资料的 NDoc</p>
										</div>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<div id="">
												<p>用于生成解决方案的 NAnt</p>
										</div>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<div id="">
												<p>用于生成代码的 CodeSmith</p>
										</div>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<div id="">
												<p>用于监视代码的 FxCop</p>
										</div>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<div id="">
												<p>用于编译少量代码的 Snippet Compiler</p>
										</div>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<div id="">
												<p>两种不同的转换器工具：ASP.NET 版本转换器和 Visual Studio .NET 项目转换器</p>
										</div>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<div id="">
												<p>用于生成正则表达式的 Regulator</p>
										</div>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<div id="">
												<p>用于分析程序集的 .NET Reflector</p>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
		<div id="">
				<p>
						<b>本文使用了下列技术：</b>
				</p>
		</div>
		<div id="">
				<p>.NET、C# 或 Visual Basic .NET、Visual Studio .NET</p>
		</div>
		<div id="">
				<p>除非您使用能够获得的最佳工具，否则您无法期望生成一流的应用程序。除了像 Visual Studio®.NET 这样的著名工具以外，还可以从 .NET 社区获得许多小型的、不太为人所知的工具。在本文中，我将向您介绍一些目前可以获得的、面向 .NET 开发的最佳免费工具。我将引导您完成一个有关如何使用其中每种工具的快速教程 — 一些工具在许多时候可以使您节约一分钟，而另一些工具则可能彻底改变您编写代码的方式。因为我要在本篇文章中介绍如此之多的不同工具，所以我无法详尽讨论其中每种工具，但您应该了解到有关每种工具的足够信息，以便判断哪些工具对您的项目有用。</p>
		</div>
		<center>
				<img title="" height="6" alt="*" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/3squares.gif" width="30" border="0" />
		</center>
		<div style="HEIGHT: 18px">
		</div>
		<h5 style="PADDING-TOP: 2px">本页内容</h5>
		<table style="MARGIN-TOP: 7px; MARGIN-BOTTOM: 12px" cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EQAA">
												<img height="9" alt="Snippet Compiler" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EQAA">Snippet Compiler</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EPAA">
												<img height="9" alt="Regulator" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EPAA">Regulator</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EOAA">
												<img height="9" alt="CodeSmith" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EOAA">CodeSmith</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#ENAA">
												<img height="9" alt="生成自定义模板" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#ENAA">生成自定义模板</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EMAA">
												<img height="9" alt="NUnit" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EMAA">NUnit</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#ELAA">
												<img height="9" alt="编写 NUnit 测试" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#ELAA">编写 NUnit 测试</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EKAA">
												<img height="9" alt="FxCop" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EKAA">FxCop</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EJAA">
												<img height="9" alt="Lutz Roeder 的 .NET Reflector" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EJAA">Lutz Roeder 的 .NET Reflector</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EIAA">
												<img height="9" alt="NDoc" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EIAA">NDoc</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EHAA">
												<img height="9" alt="NAnt" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EHAA">NAnt</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EGAA">
												<img height="9" alt="实际运行的 NAnt" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EGAA">实际运行的 NAnt</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EFAA">
												<img height="9" alt="转换工具" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EFAA">转换工具</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EEAA">
												<img height="9" alt="小结" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#EEAA">小结</a>
								</td>
						</tr>
				</tbody>
		</table>
		<div id="">
				<a name="EQAA">
				</a>
				<h2>Snippet Compiler</h2>
				<div id="">
						<p>Snippet Compiler 是一个基于 Windows® 的小型应用程序，您可以通过它来编写、编译和运行代码。如果您具有较小的代码段，并且您不希望为其创建完整的 Visual Studio .NET 项目（以及伴随该项目的所有文件），则该工具将很有用。</p>
				</div>
				<div id="">
						<p>例如，假设我希望向您说明如何从 Microsoft?.NET 框架中启动另一个应用程序。在 Snippet Compiler 中，我将通过新建一个能够创建小型控制台应用程序的文件开始。可以在该控制台应用程序的 Main 方法内部创建代码片段，而这正是我要在这里做的事情。下面的代码片段演示了如何从 .NET 框架中创建记事本实例： </p>
				</div>
				<pre class="codeSample">System.Diagnostics.Process proc = new System.Diagnostics.Process();proc.StartInfo.FileName= "notepad.exe";proc.Start();proc.WaitForExit();</pre>
				<div id="">
						<p>当然该代码片段本身无法编译，而这正是 Snippet Compiler 的用武之地。图 1 显示了 Snippet Compiler 中的这一代码示例。</p>
				</div>
				<div style="WIDTH: 400px">
						<img height="320" alt="" src="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/art/TMHTEDSDN01.gif" width="400" border="0" />
						<br />
						<p class="figureCaption">
								<b>图</b>
								<b> 1</b> Snippet Compiler</p>
						<div class="figureRule">
						</div>
				</div>
				<div id="">
						<p>要测试该代码片段，只须按 play（运行）按钮（绿色三角形），它就会在调试模式下运行。该代码片段将生成一个弹出式控制台应用程序，并且将显示记事本。当您关闭记事本时，该控制台应用程序也将关闭。</p>
				</div>
				<div id="">
						<p>就我个人而言，我是在尝试为某位向我求助的人士创建一个小型示例时，才发现 Snippet Compiler 是如此宝贵的 — 如果不使用该工具，则我通常必须新建一个项目，确保每个部分都能编译通过，然后将代码片段发送给求助者，并删除该项目。Snippet Compiler 使得这一过程变得更加容易、更加愉快。</p>
				</div>
				<div id="">
						<p>Snippet Compiler 由 Jeff Key 编写，并且可以从 <a href="http://www.sliver.com/dotnet/SnippetCompiler" target="_blank">http://www.sliver.com/dotnet/SnippetCompiler</a> 下载。</p>
				</div>
		</div>
		<div id="">
				<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
						<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">
								<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
						</a>
						<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">返回页首</a>
				</div>
				<a name="EPAA">
				</a>
				<h2>Regulator</h2>
				<div id="">
						<p>Regulator 是最后一个添加到我的头等工具清单中的。它是一种很有特色的工具，能够使生成和测试正则表达式变得很容易。人们对正则表达式重新产生了兴趣，因为它们在 .NET 框架中受到很好的支持。正则表达式用来基于字符、频率和字符顺序定义字符串中的模式。它们最常见的用途是作为验证用户输入有效性的手段或者作为在较大字符串中查找字符串的方法 — 例如，在 Web 页上查找 URL 或电子邮件地址。</p>
				</div>
				<div id="">
						<p>Regulator 使您可以输入一个正则表达式以及一些针对其运行该表达式的输入内容。这样，在应用程序中实现该正则表达式之前，您可以了解它将产生什么效果以及它将返回哪些种类的匹配项。<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/art/TMHTEDSDN02.htm" target="_blank">图 2</a> 显示了带有简单正则表达式的 Regulator。</p>
				</div>
				<div id="">
						<p>文档中包含该正则表达式 — 在该示例中，它是 [0-9]*，应该匹配一行中任意数量的数字。右下侧的框中含有针对该正则表达式的输入，而左下侧的框显示了该正则表达式在输入内容中找到的匹配项。在这样的单独应用程序中编写和测试正则表达式，要比尝试在您的应用程序中处理它们容易得多。</p>
				</div>
				<div id="">
						<p>Regulator 中的最佳功能之一是能够在 regexlib.com 搜索联机正则表达式库。例如，如果您在搜索框中输入字符串“phone”，您将找到 20 种以上能够匹配各种电话号码的不同的正则表达式，包括用于英国、澳大利亚的表达式以及其他许多电话号码。Regulator 由 Roy Osherove 编写，并且可以在 <a href="http://royo.is-a-geek.com/regulator" target="_blank">http://royo.is-a-geek.com/regulator</a> 下载。</p>
				</div>
		</div>
		<div id="">
				<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
						<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">
								<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
						</a>
						<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">返回页首</a>
				</div>
				<a name="EOAA">
				</a>
				<h2>CodeSmith</h2>
				<div id="">
						<p>CodeSmith 是一种基于模板的代码生成工具，它使用类似于 ASP.NET 的语法来生成任意类型的代码或文本。与其他许多代码生成工具不同，CodeSmith 不要求您订阅特定的应用程序设计或体系结构。使用 CodeSmith，可以生成包括简单的强类型集合和完整应用程序在内的任何东西。</p>
				</div>
				<div id="">
						<p>当您生成应用程序时，您经常需要重复完成某些特定的任务，例如编写数据访问代码或者生成自定义集合。CodeSmith 在这些时候特别有用，因为您可以编写模板自动完成这些任务，从而不仅提高您的工作效率，而且能够自动完成那些最为乏味的任务。CodeSmith 附带了许多模板，包括对应于所有 .NET 集合类型的模板以及用于生成存储过程的模板，但该工具的真正威力在于能够创建自定义模板。为了使您能够入门，我将快速介绍一下如何生成自定义模板。</p>
				</div>
		</div>
		<div id="">
				<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
						<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">
								<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
						</a>
						<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">返回页首</a>
				</div>
				<a name="ENAA">
				</a>
				<h2>生成自定义模板</h2>
				<div id="">
						<p>CodeSmith 模板只是一些可以在任意文本编辑器中创建的文本文件。它们的唯一要求是用 .cst 文件扩展名来保存它们。我将要生成的示例模板将接受一个字符串，然后基于该字符串生成一个类。创建模板的第一步是添加模板头，它可声明模板的语言、目标语言以及简要模板说明： </p>
				</div>
				<pre class="codeSample">&lt;%@ CodeTemplate Language="C#"       TargetLanguage="C#"    Description="Car Template" %&gt;</pre>
				<div id="">
						<p>模板的下一部分是属性声明，在这里可声明将在模板每次运行时指定的属性。就该模板而言，我要使用的唯一属性只是一个字符串，因此属性声明如下所示： </p>
				</div>
				<pre class="codeSample">&lt;%@ Property Name="ClassName" Type="String" Category="Context"     Description="Class Name" %&gt;</pre>
				<div id="">
						<p>该属性声明将使 ClassName 属性出现在 CodeSmith 属性窗口中，以便可以在模板运行时指定它。下一步是实际生成模板主体，它非常类似于用 ASP.NET 进行编码。您可以在<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/art/TMHTEDSDN03.htm" target="_blank">图 3</a> 中查看该模板的主体。[<b>编辑更新 — </b><b>6/16/2004</b>：图 3 中的代码已被更新，以便对多线程操作保持安全。]</p>
				</div>
				<div id="">
						<p>正如您所见，该模板接受字符串输入并使用该类名生成单独的类。在模板主体中，使用与 ASP.NET 中相同的起始和结束标记。在该模板中，我只是插入属性值，但您还可以在这些标记内部使用任意类型的 .NET 代码。在该模板完成之后，您就可以通过双击它或者从 CodeSmith 应用程序中打开它将其加载到 CodeSmith 中。<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/art/TMHTEDSDN04.htm" target="_blank">图 4</a> 显示了已经加载到 CodeSmith 中的该模板。</p>
				</div>
				<div id="">
						<p>您可以看到左侧的属性正是我在该模板中声明的属性。如果我输入“SingletonClass”作为类名，并单击 Generate 按钮，则将生成<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/art/TMHTEDSDN03.htm" target="_blank">图 3</a> 的底部显示的类。</p>
				</div>
				<div id="">
						<p>CodeSmith 使用起来相当容易，如果能够正确应用，则可以产生一些令人难以置信的结果。面向代码生成的应用程序中最常见的部分之一是数据访问层。CodeSmith 包括一个名为 SchemaExplorer 的特殊的程序集，可用来从表、存储过程或几乎任何其他 SQL Server? 对象生成模板。</p>
				</div>
				<div id="">
						<p>CodeSmith 由 Eric J. Smith 编写，并且可以在 <a href="http://www.ericjsmith.net/codesmith" target="_blank">http://www.ericjsmith.net/codesmith</a> 下载。</p>
				</div>
		</div>
		<div id="">
				<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
						<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">
								<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
						</a>
						<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">返回页首</a>
				</div>
				<a name="EMAA">
				</a>
				<h2>NUnit</h2>
				<div id="">
						<p>NUnit 是为 .NET 框架生成的开放源代码单元测试框架。NUnit 使您可以用您喜欢的语言编写测试，从而测试应用程序的特定功能。当您首次编写代码时，单元测试是一种测试代码功能的很好方法，它还提供了一种对应用程序进行回归测试的方法。NUnit 应用程序提供了一个用于编写单元测试的框架，以及一个运行这些测试和查看结果的图形界面。</p>
				</div>
		</div>
		<div id="">
				<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
						<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">
								<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
						</a>
						<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">返回页首</a>
				</div>
				<a name="ELAA">
				</a>
				<h2>编写 NUnit 测试</h2>
				<div id="">
						<p>作为示例，我将测试 .NET 框架中 Hashtable 类的功能，以确定是否可以添加两个对象并且随后检索这些对象。我的第一步是添加对 NUnit.Framework 程序集的引用，该程序集将赋予我对 NUnit 框架的属性和方法的访问权。接下来，我将创建一个类并用 TestFixture 属性标记它。该属性使 NUnit 可以知道该类包含 NUnit 测试： </p>
				</div>
				<pre class="codeSample">using System;using System.Collections;using NUnit.Framework;namespace NUnitExample{    [TestFixture]    public class HashtableTest {        public HashtableTest() {                    }    }}</pre>
				<div id="">
						<p>下一步，我将创建一个方法并用 [Test] 属性标记它，以便 NUnit 知道该方法是一个测试。然后，我将建立一个 Hashtable 并向其添加两个值，再使用 Assert.AreEqual 方法查看我是否可以检索到与我添加到 Hashtable 的值相同的值，如下面的代码所示： </p>
				</div>
				<pre class="codeSample">[Test]public void HashtableAddTest(){    Hashtable ht = new Hashtable();                ht.Add("Key1", "Value1");    ht.Add("Key2", "Value2");    Assert.AreEqual("Value1", ht["Key1"], "Wrong object returned!");    Assert.AreEqual("Value2", ht["Key2"], "Wrong object returned!");}</pre>
				<div id="">
						<p>这将确认我可以首先向 Hashtable 中添加值并随后检索相应的值 — 这是一个很简单的测试，但能够表现 NUnit 的功能。存在许多测试类型以及各种 Assert 方法，可使用它们来测试代码的每个部分。</p>
				</div>
				<div id="">
						<p>要运行该测试，我需要生成项目，在 NUnit 应用程序中打开生成的程序集，然后单击 Run 按钮。图 5 显示了结果。当我看到那个大的绿色条纹时，我有一种兴奋和头晕的感觉，因为它让我知道测试已经通过了。这个简单的示例表明 NUnit 和单元测试是多么方便和强大。由于能够编写可以保存的单元测试，并且每当您更改代码时都可以重新运行该单元测试，您不仅可以更容易地检测到代码中的缺陷，而且最终能够交付更好的应用程序。</p>
				</div>
				<div style="WIDTH: 400px">
						<img height="233" alt="" src="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/art/TMHTEDSDN05.gif" width="400" border="0" />
						<br />
						<p class="figureCaption">
								<b>图</b>
								<b> 5</b> NUnit</p>
						<div class="figureRule">
						</div>
				</div>
				<div id="">
						<p>NUnit 是一个开放源代码项目，并且可以从 <a href="http://www.nunit.org/" target="_blank">http://www.nunit.org</a> 下载。还有一个优秀的 NUnit Visual Studio .NET 外接程序，它使您可以直接从 Visual Studio 中运行单元测试。您可以在 <a href="http://sourceforge.net/projects/nunitaddin" target="_blank">http://sourceforge.net/projects/nunitaddin</a> 找到它。有关 NUnit 及其在测试驱动开发中的地位的详细信息，请参阅文章“<a href="http://msdn.microsoft.com/msdnmag/issues/04/04/ExtremeProgramming/" target="_blank">Test-Driven C#: Improve the Design and Flexibility of Your Project with Extreme Programming Techniques</a>”（<i>MSDN</i> ®<i>Magazine</i> 2004 年 4 月刊）。</p>
				</div>
		</div>
		<div id="">
				<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
						<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">
								<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
						</a>
						<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">返回页首</a>
				</div>
				<a name="EKAA">
				</a>
				<h2>FxCop</h2>
				<div id="">
						<p>.NET 框架非常强大，这意味着存在创建优秀应用程序的极大可能，但是也同样存在创建劣质程序的可能。FxCop 是有助于创建更好的应用程序的工具之一，它所采用的方法是：使您能够分析程序集，并使用一些不同的规则来检查它是否符合这些规则。FxCop 随附了由 Microsoft 创建的固定数量的规则，但您也可以创建并包括您自己的规则。例如，如果您决定所有的类都应该具有一个不带任何参数的默认构造函数，则可以编写一条规则，以确保程序集的每个类上都具有一个构造函数。这样，无论是谁编写该代码，您都将获得一定程度的一致性。如果您需要有关创建自定义规则的详细信息，请参阅 John Robbins 的有关该主题的 <a href="http://msdn.microsoft.com/msdnmag/issues/04/06/bugslayer/" target="_blank">Bugslayer</a> 专栏文章（<i>MSDN</i> ®<i> Magazine</i> 2004 年 6 月刊）。</p>
				</div>
				<div id="">
						<p>那么，让我们观察一下实际运行的 FxCop，并且看一下它在我一直在处理的 NUnitExample 程序集中找到哪些错误。当您打开 FxCop 时，您首先需要创建一个 FxCop 项目，然后向其添加您要测试的程序集。在将该程序集添加到项目以后，就可以按 Analyze，FxCop 将分析该程序集。<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/art/TMHTEDSDN06.htm" target="_blank">图 6</a> 中显示了在该程序集中找到的错误和警告。</p>
				</div>
				<div id="">
						<p>FxCop 在我的程序集中找到了几个问题。您可以双击某个错误以查看详细信息，包括规则说明以及在哪里可以找到更多信息。（您可以做的一件有趣的事情是在框架程序集上运行 FxCop 并查看发生了什么事情。）</p>
				</div>
				<div id="">
						<p>FxCop 可以帮助您创建更好的、更一致的代码，但它无法补偿低劣的应用程序设计或非常简单拙劣的编程。FxCop 也不能替代对等代码检查，但是因为它可以在进行代码检查之前捕获大量错误，所以您可以花费更多时间来解决严重的问题，而不必担心命名约定。FxCop 由 Microsoft 开发，并且可以从 <a href="http://www.gotdotnet.com/team/fxcop" target="_blank">http://www.gotdotnet.com/team/fxcop</a> 下载。</p>
				</div>
		</div>
		<div id="">
				<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
						<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">
								<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
						</a>
						<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">返回页首</a>
				</div>
				<a name="EJAA">
				</a>
				<h2>Lutz Roeder 的 .NET Reflector</h2>
				<div id="">
						<p>下一个必不可少的工具称为 .NET Reflector，它是一个类浏览器和反编译器，可以分析程序集并向您展示它的所有秘密。.NET 框架向全世界引入了可用来分析任何基于 .NET 的代码（无论它是单个类还是完整的程序集）的反射概念。反射还可以用来检索有关特定程序集中包含的各种类、方法和属性的信息。使用 .NET Reflector，您可以浏览程序集的类和方法，可以分析由这些类和方法生成的 Microsoft 中间语言 (MSIL)，并且可以反编译这些类和方法并查看 C# 或 Visual Basic ®.NET 中的等价类和方法。</p>
				</div>
				<div id="">
						<p>为了演示 .NET Reflector 的工作方式，我将加载和分析前面已经显示的 NUnitExample 程序集。图 7 显示了 .NET Reflector 中加载的该程序集。</p>
				</div>
				<div style="WIDTH: 250px">
						<img height="432" alt="" src="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/art/TMHTEDSDN07.gif" width="250" border="0" />
						<br />
						<p class="figureCaption">
								<b>图</b>
								<b> 7</b> NUnitExample 程序集</p>
						<div class="figureRule">
						</div>
				</div>
				<div id="">
						<p>在 .NET Reflector 内部，有各种可用来进一步分析该程序集的工具。要查看构成某个方法的 MSIL，请单击该方法并从菜单中选择 Disassembler。</p>
				</div>
				<div id="">
						<p>除了能够查看 MSIL 以外，您还可以通过选择 Tools 菜单下的 Decompiler 来查看该方法的 C# 形式。通过在 Languages 菜单下更改您的选择，您还可以查看该方法被反编译到 Visual Basic .NET 或 Delphi 以后的形式。以下为 .NET Reflector 生成的代码： </p>
				</div>
				<pre class="codeSample">public void HashtableAddTest(){     Hashtable hashtable1;    hashtable1 = new Hashtable();    hashtable1.Add("Key1", "Value1");    hashtable1.Add("Key2", "Value2");    Assert.AreEqual("Value1", hashtable1["Key1"],        "Wrong object returned!");    Assert.AreEqual("Value2", hashtable1["Key2"],       "Wrong object returned!");}</pre>
				<div id="">
						<p>前面的代码看起来非常像我为该方法实际编写的代码。以下为该程序集中的实际代码： </p>
				</div>
				<pre class="codeSample">public void HashtableAddTest(){    Hashtable ht = new Hashtable();                ht.Add("Key1", "Value1");    ht.Add("Key2", "Value2");    Assert.AreEqual("Value1", ht["Key1"],        "Wrong object returned!");    Assert.AreEqual("Value2", ht["Key2"],        "Wrong object returned!");}</pre>
				<div id="">
						<p>尽管上述代码中存在一些小的差异，但它们在功能上是完全相同的。</p>
				</div>
				<div id="">
						<p>虽然该示例是一种显示实际代码与反编译代码之间对比的好方法，但在我看来，它并不代表 .NET Reflector 所具有的最佳用途 — 分析 .NET 框架程序集和方法。.NET 框架提供了许多执行类似操作的不同方法。例如，如果您需要从 XML 中读取一组数据，则存在多种使用 XmlDocument、XPathNavigator 或 XmlReader 完成该工作的不同方法。通过使用 .NET Reflector，您可以查看 Microsoft 在编写数据集的 ReadXml 方法时使用了什么，或者查看他们在从配置文件读取数据时做了哪些工作。.NET Reflector 还是一个了解以下最佳实施策略的优秀方法：创建诸如 HttpHandlers 或配置处理程序之类的对象，因为您可以了解到 Microsoft 工作组实际上是如何在框架中生成这些对象的。</p>
				</div>
				<div id="">
						<p>.NET Reflector 由 Lutz Roeder 编写，并且可以从 <a href="http://www.aisto.com/roeder/dotnet" target="_blank">http://www.aisto.com/roeder/dotnet</a> 下载。</p>
				</div>
		</div>
		<div id="">
				<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
						<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">
								<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
						</a>
						<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">返回页首</a>
				</div>
				<a name="EIAA">
				</a>
				<h2>NDoc</h2>
				<div id="">
						<p>编写代码文档资料几乎总是一项令人畏惧的任务。我所说的不是早期设计文档，甚至也不是更为详细的设计文档；我说的是记录类上的各个方法和属性。NDoc 工具能够使用反射来分析程序集，并使用从 C# XML 注释生成的 XML 自动为代码生成文档资料。XML 注释仅适用于 C#，但有一个名为 VBCommenter 的 Visual Studio .NET Power Toy，它能够为 Visual Basic .NET 完成类似的工作。此外，下一版本的 Visual Studio 将为更多语言支持 XML 注释。</p>
				</div>
				<div id="">
						<p>使用 NDoc 时，您仍然在编写代码的技术文档，但您是在编写代码的过程中完成了文档编写工作（在 XML 注释中），而这更容易忍受。使用 NDoc 时，第一步是为您的程序集打开 XML 注释生成功能。右键单击该项目并选择 Properties | Configuration Properties | Build，然后在 XML Documentation File 选项中输入用于保存 XML 文件的路径。当该项目生成时，将创建一个 XML 文件，其中包含所有 XML 注释。下面是 NUnit 示例中的一个用 XML 编写了文档的方法： </p>
				</div>
				<pre class="codeSample">/// &lt;summary&gt;/// This test adds a number of values to the Hashtable collection /// and then retrieves those values and checks if they match./// &lt;/summary&gt;[Test]public void HashtableAddTest(){    //Method Body Here}</pre>
				<div id="">
						<p>有关该方法的 XML 文档资料将被提取并保存在 XML 文件中，如下所示： </p>
				</div>
				<pre class="codeSample">&lt;member name="M:NUnitExample.HashtableTest.HashtableAddTest"&gt;  &lt;summary&gt;This test adds a number of values to the Hashtable collection    and then retrieves those values and checks if they match.&lt;/summary&gt; &lt;/member&gt;</pre>
				<div id="">
						<p>NDoc 使用反射来考察您的程序集，然后读取该文档中的 XML，并且将它们进行匹配。NDoc 使用该数据来创建任意数量的不同文档格式，包括 HTML 帮助文件 (CHM)。在生成 XML 文件以后，下一步是将程序集和 XML 文件加载到 NDoc 中，以便可以对它们进行处理。通过打开 NDoc 并单击 Add 按钮，可以容易地完成该工作。</p>
				</div>
				<div id="">
						<p>在将程序集和 XML 文件加载到 NDoc 中并且使用可用的属性范围自定义输出以后，单击 Generate 按钮将启动生成文档资料的过程。使用默认的属性，NDoc 可以生成一些非常吸引人并且实用的 .html 和 .chm 文件，从而以快速有效的方式自动完成原来非常乏味的任务。</p>
				</div>
				<div id="">
						<p>NDoc 是一个开放源代码项目，并且可以从 <a href="http://ndoc.sourceforge.net/" target="_blank">http://ndoc.sourceforge.net</a> 下载。</p>
				</div>
		</div>
		<div id="">
				<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
						<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">
								<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
						</a>
						<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">返回页首</a>
				</div>
				<a name="EHAA">
				</a>
				<h2>NAnt</h2>
				<div id="">
						<p>NAnt 是一个基于 .NET 的生成工具，与当前版本的 Visual Studio .NET 不同，它使得为您的项目创建生成过程变得非常容易。当您拥有大量从事单个项目的开发人员时，您不能依赖于从单个用户的座位进行生成。您也不希望必须定期手动生成该项目。您更愿意创建每天晚上运行的自动生成过程。NAnt 使您可以生成解决方案、复制文件、运行 NUnit 测试、发送电子邮件，等等。遗憾的是，NAnt 缺少漂亮的图形界面，但它的确具有可以指定应该在生成过程中完成哪些任务的控制台应用程序和 XML 文件。注意，MSBuild（属于 Visual Studio 2005 的新的生成平台）为每种健壮的生成方案进行了准备，并且由基于 XML 的项目文件以类似的方式驱动。</p>
				</div>
		</div>
		<div id="">
				<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
						<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">
								<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
						</a>
						<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">返回页首</a>
				</div>
				<a name="EGAA">
				</a>
				<h2>实际运行的 NAnt</h2>
				<div id="">
						<p>在该示例中，我将为前面创建的 NUnitExample 解决方案创建一个 NAnt 版本文件。首先，我需要创建一个具有 .build 扩展名的 XML 文件，将其放在我的项目的根目录中，然后向该文件的顶部添加一个 XML 声明。我需要添加到该文件的第一个标记是 project 标记： </p>
				</div>
				<pre class="codeSample">&lt;?xml version="1.0"?&gt;&lt;project name="NUnit Example" default="build" basedir="."&gt;    &lt;description&gt;The NUnit Example Project&lt;/description&gt;&lt;/project&gt;</pre>
				<div id="">
						<p>项目标记还用于设置项目名称、默认目标以及基目录。Description 标记用于设置该项目的简短说明。</p>
				</div>
				<div id="">
						<p>接下来，我将添加 property 标记，该标记可用于将设置存储到单个位置（随后可以从文件中的任意位置访问该位置）。在该例中，我将创建一个名为 debug 的属性，我可以随后将其设置为 true 或 false，以反映我是否要在调试配置下编译该项目。（最后，这一特定属性并未真正影响如何生成该项目；它只是您设置的一个变量，当您真正确定了如何生成该项目时将读取该变量。）</p>
				</div>
				<div id="">
						<p>接下来，我需要创建一个 target 标记。一个项目可以包含多个可在 NAnt 运行时指定的 target。如果未指定 target，则使用默认 target（我在 project 元素中设置的 target）。在该示例中，默认 target 是 build。让我们观察一下 target 元素，它将包含大多数生成信息： </p>
				</div>
				<pre class="codeSample">&lt;target name="build" description="compiles the source code"&gt;&lt;/target&gt;</pre>
				<div id="">
						<p>在 target 元素内，我将把 target 的名称设置为 build，并且创建有关该 target 将做哪些工作的说明。我还将创建一个 csc 元素，该元素用于指定应该传递给 csc C# 编译器的数据。让我们看一下该 csc 元素： </p>
				</div>
				<pre class="codeSample">&lt;csc target="library" output=".\bin\debug\NUnitExample.dll"     debug="${debug}"&gt;&lt;references&gt;    &lt;includes name="C:\program files\NUnit V2.1\bin\NUnit.Framework.dll"/&gt;&lt;/references&gt;    &lt;sources&gt;       &lt;includes name="HashtableTest.cs"/&gt;    &lt;/sources&gt;&lt;/csc&gt;</pre>
				<div id="">
						<p>首先，我必须设置该 csc 元素的 target。在该例中，我将创建一个 .dll 文件，因此我将 target 设置为 library。接下来，我必须设置 csc 元素的 output，它是将要创建 .dll 文件的位置。最后，我需要设置 debug 属性，它确定了是否在调试中编译该项目。因为我在前面创建了一个用于存储该值的属性，所以我可以使用下面的字符串来访问该属性的值：${debug}。Csc 元素还包含一些子元素。我需要创建两个元素：references 元素将告诉 NAnt 需要为该项目引用哪些程序集，sources 元素告诉 NAnt 要在生成过程中包含哪些文件。在该示例中，我引用了 NUnit.Framework.dll 程序集并包含了 HashtableTest.cs 文件。<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/art/TMHTEDSDN08.htm" target="_blank">图 8</a> 中显示了完整的生成文件。（您通常还要创建一个干净的 target，用于删除生成的文件，但为了简洁起见，我已经将其省略。）</p>
				</div>
				<div id="">
						<p>要生成该文件，我需要转到我的项目的根目录（生成文件位于此处），然后从该位置执行 nant.exe。如果生成成功，您可以在该应用程序的 bin 目录中找到 .dll 和 .pdb 文件。尽管使用 NAnt 肯定不像在 Visual Studio 中单击 Build 那样简单，但它仍然是一种非常强大的工具，可用于开发按自动计划运行的生成过程。NAnt 还包括一些有用的功能，例如能够运行单元测试或者复制附加文件（这些功能没有受到当前 Visual Studio 生成过程的支持）。</p>
				</div>
				<div id="">
						<p>NAnt 是一个开放源代码项目，并且可以从 <a href="http://nant.sourceforge.net/" target="_blank">http://nant.sourceforge.net</a> 下载。</p>
				</div>
		</div>
		<div id="">
				<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
						<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">
								<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
						</a>
						<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">返回页首</a>
				</div>
				<a name="EFAA">
				</a>
				<h2>转换工具</h2>
				<div id="">
						<p>我已经将两个独立的工具合在一起放在标题“转换工具”下面。这两个工具都非常简单，但又可能极为有用。第一个工具是 ASP.NET 版本转换器，它可用于转换 ASP.NET（虚拟目录在它下面运行）的版本。第二个工具是 Visual Studio Converter，它可用于将项目文件从 Visual Studio .NET 2002 转换到 Visual Studio .NET 2003。</p>
				</div>
				<div id="">
						<p>当 IIS 处理请求时，它会查看正在请求的文件的扩展名，然后基于该 Web 站点或虚拟目录的扩展名映射，将请求委派给 ISAPI 扩展或者自己处理该请求。这正是 ASP.NET 的工作方式；将为所有 ASP.NET 扩展名注册扩展名映射，并将这些扩展名映射导向 aspnet_isapi.dll。这种工作方式是完美无缺的，除非您安装了 ASP.NET 1.1 — 它会将扩展名映射升级到新版本的 aspnet_isapi.dll。当在 ASP.NET 1.0 上生成的应用程序试图用 1.1 版运行时，这会导致错误。要解决该问题，可以将所有扩展名映射重新转换到 1.0 版的 aspnet_isapi.dll，但是由于有 18 种扩展名映射，所以手动完成这一工作将很枯燥。这正是 ASP.NET 版本转换器可以发挥作用的时候。使用这一小型实用工具，可以转换任何单个 ASP.NET 应用程序所使用的 .NET 框架的版本。</p>
				</div>
				<div style="WIDTH: 280px">
						<img height="232" alt="" src="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/art/TMHTEDSDN09.gif" width="280" border="0" />
						<br />
						<p class="figureCaption">
								<b>图</b>
								<b> 9</b> ASP.NET 版本转换器</p>
						<div class="figureRule">
						</div>
				</div>
				<div id="">
						<p>图 9 显示了实际运行的 ASP.NET 版本转换器。它的使用方法非常简单，只须选择相应的应用程序，然后选择您希望该应用程序使用的 .NET 框架版本。该工具随后将使用 aspnet_regiis.exe 命令行工具将该应用程序转换到所选版本的框架。随着将来版本的 ASP.NET 和 .NET 框架的发布，该工具将变得更为有用。</p>
				</div>
				<div id="">
						<p>ASP.NET 版本转换器由 Denis Bauer 编写，并且可以从 <a href="http://www.denisbauer.com/NETTools/ASPNETVersionSwitcher.aspx" target="_blank">http://www.denisbauer.com/NETTools/ASPNETVersionSwitcher.aspx</a> 下载。</p>
				</div>
				<div id="">
						<p>Visual Studio .NET 项目转换器（参见图 10）非常类似于 ASP.NET 版本转换器，区别在于它用于转换 Visual Studio 项目文件的版本。尽管在 .NET 框架的 1.0 版和 1.1 版之间只有很小的差异，但一旦将项目文件从 Visual Studio .NET 2002 转换到 Visual Studio .NET 2003，将无法再把它转换回去。虽然这在大多数时候可能不会成为问题（因为在 .NET 框架 1.0 版和 1.1 版之间几乎没有什么破坏性的更改），但在某些时刻您可能需要将项目转换回去。该转换器可以将任何解决方案或项目文件从 Visual Studio 7.1 (Visual Studio .NET 2003) 转换到 Visual Studio 7.0 (Visual Studio .NET 2002)，并在必要时进行反向转换。</p>
				</div>
				<div style="WIDTH: 340px">
						<img height="251" alt="" src="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/art/TMHTEDSDN10.gif" width="340" border="0" />
						<br />
						<p class="figureCaption">
								<b>图</b>
								<b> 10</b> Visual Studio .NET 项目转换器</p>
						<div class="figureRule">
						</div>
				</div>
				<div id="">
						<p>Visual Studio .NET 项目转换器由 Dacris Software 编写。该工具可以从 <a href="http://www.codeproject.com/macro/vsconvert.asp" target="_blank">http://www.codeproject.com/macro/vsconvert.asp</a> 下载。</p>
				</div>
		</div>
		<div id="">
				<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
						<a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">
								<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
						</a>
						<a class="topOfPage" href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx#top">返回页首</a>
				</div>
				<a name="EEAA">
				</a>
				<h2>小结</h2>
				<div id="">
						<p>本文采用走马观花的方式介绍了上述工具，但我已经试图起码向您提供足够的信息以激起您的好奇心。我相信本文已经让您在某种程度上领悟了几个免费工具，您可以立即开始使用这些工具来编写更好的项目。同时，我还要敦促您确保自己拥有所有其他可以获得的合适工具，无论是最新版本的 Visual Studio、功能强大的计算机还是免费的实用工具。拥有合适的工具将使一切变得大不相同。</p>
				</div>
		</div>
		<br />
<img src ="http://www.blogjava.net/ljy032/aggbug/79600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljy032/" target="_blank">风雨兼程</a> 2006-11-07 14:19 <a href="http://www.blogjava.net/ljy032/archive/2006/11/07/79600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在ASP.NET 中实现单点登录</title><link>http://www.blogjava.net/ljy032/archive/2006/11/07/79598.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Tue, 07 Nov 2006 06:11:00 GMT</pubDate><guid>http://www.blogjava.net/ljy032/archive/2006/11/07/79598.html</guid><wfw:comment>http://www.blogjava.net/ljy032/comments/79598.html</wfw:comment><comments>http://www.blogjava.net/ljy032/archive/2006/11/07/79598.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljy032/comments/commentRss/79598.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljy032/services/trackbacks/79598.html</trackback:ping><description><![CDATA[
		<p>由于某些原因，在我们的应用中会遇到一个用户只能在一个地方登录的情况，也就是我们通常所说的单点登录。在ASP.NET中实现单点登录其实很简单，下面就把主要的方法和全部代码进行分析。</p>
		<p>
				<b>实现思路</b>
		</p>
		<p>利用Cache的功能，我们把用户的登录信息保存在Cache中，并设置过期时间为Session失效的时间，因此，一旦Session失效，我们的Cache也过期；而Cache对所有的用户都可以访问，因此，用它保存用户信息比数据库来得方便。</p>
		<p>
				<b>
						<a href="http://dotnet.aspx.cc/Exam/SingleLogin.aspx">查看示例</a>
				</b>
		</p>
		<p>
				<b>SingleLogin.aspx代码</b>
		</p>
		<p>
				<font face="Courier New">&lt;%@ Page language="c#" Codebehind="SingleLogin.aspx.cs" AutoEventWireup="false"<br /> Inherits="eMeng.Exam.SingleLogin" %&gt;<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" &gt;<br />&lt;HTML&gt;<br />&lt;HEAD&gt;<br />&lt;title&gt;单点登录测试&lt;/title&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br />&lt;meta http-equiv="Author" content="孟子E章"&gt;<br />&lt;meta http-equiv="WebSite" content="<a href="http://dotnet.aspx.cc/">http://dotnet.aspx.cc/</a>"&gt;<br />&lt;style&gt;<br />H3 { FONT: 17px 宋体 }<br />INPUT { FONT: 12px 宋体 }<br />SPAN { FONT: 12px 宋体 }<br />P { FONT: 12px 宋体 }<br />H4 { FONT: 12px 宋体 }<br />&lt;/style&gt;<br />&lt;/HEAD&gt;<br />&lt;body MS_POSITIONING="GridLayout"&gt;<br />&lt;form id="Form1" method="post" runat="server"&gt;<br />  &lt;div align="center"&gt;<br />    &lt;h3&gt;单点登录测试&lt;/h3&gt;<br />    &lt;p&gt;用户名称：&lt;asp:TextBox id="UserName" runat="server"&gt;&lt;/asp:TextBox&gt;&lt;/p&gt;<br />    &lt;p&gt;用户密码：&lt;asp:TextBox id="PassWord" runat="server" TextMode="Password"&gt;&lt;/asp:TextBox&gt;&lt;/p&gt;<br />    &lt;p&gt;&lt;asp:Button id="Login" runat="server" Text=" 登  录 "&gt;&lt;/asp:Button&gt;&lt;/p&gt;<br />    &lt;p&gt;&lt;asp:Label id="Msg" runat="server"&gt;&lt;/asp:Label&gt;&lt;/p&gt;<br />  &lt;/div&gt;<br />&lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/HTML&gt;</font>
		</p>
		<p>
				<font face="Courier New">SingleLogin.aspx.cs代码</font>
		</p>
		<p>
				<font face="Courier New">using System;<br />using System.Collections;<br />using System.ComponentModel;<br />using System.Data;<br />using System.Drawing;<br />using System.Web;<br />using System.Web.SessionState;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />using System.Web.UI.HtmlControls;</font>
		</p>
		<p>
				<font face="Courier New">namespace eMeng.Exam<br />{<br />/// &lt;summary&gt;<br />/// SingleLogin 的摘要说明。<br />/// 实现单点登录<br />/// &lt;/summary&gt;<br />public class SingleLogin : System.Web.UI.Page<br />{<br />protected System.Web.UI.WebControls.TextBox UserName;<br />protected System.Web.UI.WebControls.TextBox PassWord;<br />protected System.Web.UI.WebControls.Label Msg;<br />protected System.Web.UI.WebControls.Button Login;</font>
		</p>
		<p>
				<font face="Courier New">private void Page_Load(object sender, System.EventArgs e)<br />{<br />  // 实际例子可访问：<br />  // <a href="http://dotnet.aspx.cc/Exam/SingleLogin.aspx">http://dotnet.aspx.cc/Exam/SingleLogin.aspx</a><br />}</font>
		</p>
		<p>
				<font face="Courier New">#region Web 窗体设计器生成的代码<br />override protected void OnInit(EventArgs e)<br />{<br />  InitializeComponent();<br />  base.OnInit(e);<br />}</font>
		</p>
		<p>
				<font face="Courier New">/// &lt;summary&gt;<br />/// 设计器支持所需的方法 - 不要使用代码编辑器修改<br />/// 此方法的内容。<br />/// &lt;/summary&gt;<br />private void InitializeComponent()<br />{<br />  this.Login.Click += new System.EventHandler(this.Login_Click);<br />  this.Load += new System.EventHandler(this.Page_Load);<br />}<br />#endregion</font>
		</p>
		<p>
				<font face="Courier New">private void Login_Click(object sender, System.EventArgs e)<br />{<br />  // 作为唯一标识的Key，应该是唯一的，这可根据需要自己设定规则。<br />  // 做为测试，这里用用户名和密码的组合来做标识；也不进行其它的错误检查。</font>
		</p>
		<p>
				<font face="Courier New">  // 生成Key<br />  string sKey = UserName.Text + "_" + PassWord.Text;<br />  // 得到Cache中的给定Key的值<br />  string sUser = Convert.ToString(Cache[sKey]);<br />  // 检查是否存在<br />  if (sUser == null || sUser == String.Empty)<br />  {<br />    // Cache中没有该Key的项目，表名用户没有登录，或者已经登录超时<br />    // 注意下面使用的TimeSpan构造函数重载版本的方法，是进行是否登录判断的关键。<br />    TimeSpan SessTimeOut = new TimeSpan(0,0,System.Web.HttpContext.Current.Session.Timeout,0,0);<br />    HttpContext.Current.Cache.Insert(sKey,sKey,null,DateTime.MaxValue,SessTimeOut,<br />      System.Web.Caching.CacheItemPriority.NotRemovable,null);<br />    Session["User"] = sKey;<br />    // 首次登录，您可以做您想做的工作了。<br />    Msg.Text="&lt;h4 style='color:red'&gt;嗨！欢迎您访问&lt;a href='http://dotnet.aspx.cc/'&gt;【孟宪会之精彩世界】"；<br />    Msg.Text += "&lt;/a&gt;，祝您浏览愉快！：）&lt;/h4&gt;";<br />  }<br />  else<br />  {<br />    // 在 Cache 中发现该用户的记录，表名已经登录过，禁止再次登录<br />    Msg.Text="&lt;h4 style='color:red'&gt;抱歉，您好像已经登录了呀：－（&lt;/h4&gt;";<br />   return;<br />  }<br />}<br />}<br />}</font>
		</p>
<img src ="http://www.blogjava.net/ljy032/aggbug/79598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljy032/" target="_blank">风雨兼程</a> 2006-11-07 14:11 <a href="http://www.blogjava.net/ljy032/archive/2006/11/07/79598.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP.NET应用中十大常见的潜在问题 </title><link>http://www.blogjava.net/ljy032/archive/2006/11/07/79597.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Tue, 07 Nov 2006 06:08:00 GMT</pubDate><guid>http://www.blogjava.net/ljy032/archive/2006/11/07/79597.html</guid><wfw:comment>http://www.blogjava.net/ljy032/comments/79597.html</wfw:comment><comments>http://www.blogjava.net/ljy032/archive/2006/11/07/79597.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljy032/comments/commentRss/79597.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljy032/services/trackbacks/79597.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<p>Jeff Prosise在《MSDN杂志》2006年7月期上的文章历数ASP.NET应用中常见的，容易出错，影响性能和扩缩性的潜在问题</p>
				<p>Keep Sites Running Smoothly By Avoiding These 10 Common ASP.NET Pitfalls<br /><a href="http://msdn.microsoft.com/msdnmag/issues/06/07/WebAppFollies/">http://msdn.microsoft.com/msdnmag/issues/06/07/WebAppFollies/</a></p>
				<p>1。设置输出缓存的用户控件，如果用LoadControl动态装载，LoadControl返回对象属于PartialCachingControl类，其中的CachedControl也许并不存在，无法转换成原用户控件对象类</p>
				<p>2。在 IIS 6.0 中，在设置kernel模式输出缓存的情形下，OutputCacheModule模块有时会保留缓存输出的Set-Cookie header，导致会话串门(cross-session)，即一个用户能看到其他用户的会话数据</p>
				<p>具体参考KB文章<br />An ASP.NET page is stored in the HTTP.sys kernel cache in IIS 6.0 when the ASP.NET page generates an HTTP header that contains a Set-Cookie response<br /><a href="http://support.microsoft.com/kb/917072">http://support.microsoft.com/kb/917072</a></p>
				<p>或者禁止kernel模式输出缓存<br />&lt;httpRuntime enableKernelOutputCache="false" /&gt;</p>
				<p>具体参考<br /><a href="http://support.microsoft.com/kb/820129">http://support.microsoft.com/kb/820129</a></p>
				<p>3。 Forms 认证Ticket的存活时间。在ASP.NET 1.*中，在没有用编码设置的情形下，如果是持久保存，存活时间是50年，如果是非持久保存，存活时间是30分钟。这个问题在ASP.NET 2.0中已经解决，默认存活时间会用web.config里的设置。在ASP.NET 1.*中，只能用编码来解决，具体编码参考原文中的例子。</p>
				<p>4。 View State，如果滥用的话，是无声的性能杀手，特别是DataGrids和GridViews等，应该设置EnableViewState=false，或者考虑通过更改LoadPageStateFromPersistenceMedium/SavePageStateToPersistenceMedium把View State放在服务器端。</p>
				<p>5。如果使用SQL Server做会话状态服务器的话，默认情形下，每个请求会访问状态服务器2次，造成性能下降。解决方案是，在不用会话状态的页面里，设置</p>
				<p>&lt;%@ Page EnableSessionState="false" ... %&gt; </p>
				<p>在只读会话状态的页面里，设置</p>
				<p>&lt;%@ Page EnableSessionState="ReadOnly" ... %&gt; </p>
				<p>6。在ASP.NET 2.0应用中，如果在web.config里设置</p>
				<p>&lt;roleManager enabled="true" /&gt; </p>
				<p>默认情形下，角色数据是不缓存的，如果角色管理器需要确认当前用户的角色的话，会访问数据库，导致性能下降，解决方案是设置把角色数据缓存在Cookie里(这个Cookie是加过密的)</p>
				<p>&lt;roleManager enabled="true" cacheRolesInCookie="true" /&gt;</p>
				<p>7。Profile 特性持久化问题，在默认情形下，ASP.NET profile管理器使用XML持久机制持久化自定义Profile类，不保存这些类的私有成员，解决方案是把这些类标为[Serializable]或实现ISerializable ，这样profile管理器会使用binary serializer </p>
				<p>8。过长的数据库查询或I/O操作会导致线程池的饱和，导致ASP.NET的性能下降。ASP.NET 2.0提供了异步网页(asynchronous page)机制来缓解这个问题。具体参考Jeff Prosise在《MSDN杂志》2005年10月期上的文章</p>
				<p>Asynchronous Pages in ASP.NET 2.0<br /><a href="http://msdn.microsoft.com/msdnmag/issues/05/10/WickedCode/">http://msdn.microsoft.com/msdnmag/issues/05/10/WickedCode/</a></p>
				<p>9。&lt;identity impersonate="true" /&gt; 导致客户端用户的身份模拟，要慎用，避免用身份模拟(Impersonation)替代ACL授权。</p>
				<p>10。别太有信心，多用Profiler剖析你的应用对数据库的访问情形。重视数据库的设计，认识到DataSet和DataAdapter对web应用也许并不合适，数据访问层要恰当设计，防止粗劣细分(poor factorization)，避免在相对简单的操作上浪费太多的CPU周期，导致性能下降</p>
		</div>
<img src ="http://www.blogjava.net/ljy032/aggbug/79597.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljy032/" target="_blank">风雨兼程</a> 2006-11-07 14:08 <a href="http://www.blogjava.net/ljy032/archive/2006/11/07/79597.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Asp.net动态生成html页面 </title><link>http://www.blogjava.net/ljy032/archive/2006/11/07/79594.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Tue, 07 Nov 2006 06:01:00 GMT</pubDate><guid>http://www.blogjava.net/ljy032/archive/2006/11/07/79594.html</guid><wfw:comment>http://www.blogjava.net/ljy032/comments/79594.html</wfw:comment><comments>http://www.blogjava.net/ljy032/archive/2006/11/07/79594.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljy032/comments/commentRss/79594.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljy032/services/trackbacks/79594.html</trackback:ping><description><![CDATA[此功能适用于后台数据库功能不强的web站点，即大部分文本不是存放在数据库的记录中，而是放在html文件或者xml文件中，仅仅把索引放到数据库中，如文章标题、类别、查询关键字等。这样适合于后台没有诸如MS Sql Server这样的数据库支持的Web站点。 <br /><br />适用于新闻发布系统，比如sina、163等都是采用动态生成html页面的。 <br /><br />适用于需动态定制页面的程序。比如论坛、聊天室等。可以加载定制好的html页面，来加强美观。 <br /><br />思路 <br /><br />1. 利用如Dw-Mx这样的工具生成html格式的模板，在需要添加格式的地方加入特殊标记(如$htmlformat$),动态生成文件时利用代码读取此模板，然后获得前台输入的内容，添加到此模板的标记位置中，生成新文件名后写入磁盘，写入后再向数据库中写入相关数据。 <br /><br />2. 使用后台代码硬编码Html文件，可以使用HtmlTextWriter类来写html文件。 <br /><br />优点 <br /><br />1. 可以建立非常复杂的页面，利用包含js文件的方法，在js文件内加入document.write()方法可以在所有页面内加入如页面头，广告等内容。 <br /><br />2. 静态html文件利用MS Windows2000的Index Server可以建立全文搜索引擎，利用asp.net可以以DataTable的方式得到搜索结果。而Win2000的Index服务无法查找xml文件的内容。如果包括了数据库搜索与Index索引双重查找，那么此搜索功能将非常强大。 <br /><br />3. 节省服务器的负荷，请求一个静态的html文件比一个aspx文件服务器资源节省许多。 <br /><br />缺点 <br /><br />思路二： 如果用硬编码的方式，工作量非常大，需要非常多的html代码。调试困难。而且使用硬编码生成的html样式无法修改，如果网站更换样式，那么必须得重新编码，给后期带来巨大的工作量。 <br /><br />因此这里采用的是第一种思路 <br /><br />示列代码 <br /><br />1.定义(template.htm)html模板页面 <br /><br />&lt;html&gt; <br /><br />&lt;head&gt; <br /><br />&lt;title&gt;&lt;/title&gt; <br /><br />&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt; <br /><br />&lt;/head&gt; <br /><br />&lt;body &gt; <br /><br />&lt;table $htmlformat[0] height="100%" border="0" width="100%" cellpadding="10" cellspacing="0" bgcolor="#eeeeee" style="border:1px solid #000000"&gt; <br /><br />&lt;tr&gt; <br /><br />&lt;td width="100%" valign="middle" align="left"&gt; <br /><br />&lt;span style="color: $htmlformat[1];font-size: $htmlformat[2]"&gt;$htmlformat[3]&lt;/span&gt; <br /><br />&lt;/td&gt; <br /><br />&lt;/tr&gt; <br /><br />&lt;/table&gt; <br /><br />&lt;/body&gt; <br /><br />&lt;/html&gt; <br /><br />2.asp.net代码： <br /><br />//---------------------读html模板页面到stringbuilder对象里---- <br /><br />string[] format=new string[4];//定义和htmlyem标记数目一致的数组 <br /><br />StringBuilder htmltext=new StringBuilder(); <br /><br />try <br /><br />{ <br /><br />using (StreamReader sr = new StreamReader("存放模板页面的路径和页面名")) <br /><br />{ <br /><br />String line; <br /><br />while ((line = sr.ReadLine()) != null) <br /><br />{ <br /><br />htmltext.Append(line); <br /><br />} <br /><br />sr.Close(); <br /><br />} <br /><br />} <br /><br />catch <br /><br />{ <br /><br />Response.Write("&lt;Script&gt;alert('读取文件错误')&lt;/Script&gt;"); <br /><br />} <br /><br />//---------------------给标记数组赋值------------ <br /><br />format[0]="background=\"bg.jpg\"";//背景图片 <br /><br />format[1]= "#990099";//字体颜色 <br /><br />format[2]="150px";//字体大小 <br /><br />format[3]= "&lt;marquee&gt;生成的模板html页面&lt;/marquee&gt;";//文字说明 <br /><br />//----------替换htm里的标记为你想加的内容 <br /><br />for(int i=0;i&lt;4;i++) <br /><br />{ <br /><br />htmltext.Replace("$htmlformat["+i+"]",format[i]); <br /><br />} <br /><br />//----------生成htm文件------------------―― <br /><br />try <br /><br />{ <br /><br />using(StreamWriter sw=new StreamWriter("存放路径和页面名",false,System.Text.Encoding.GetEncoding("GB2312"))) <br /><br />{ <br /><br />sw.WriteLine(htmltext); <br /><br />sw.Flush(); <br /><br />sw.Close(); <br /><br />} <br /><br />} <br /><br />catch <br /><br />{ <br /><br />Response.Write ("The file could not be wirte:"); <br /><br />} <br /><br />小结 <br /><br />用此方法可以方便的生成html文件。程序使用了是循环替换，因此对需替换大量元素的模板速度非常快。<br /><img src ="http://www.blogjava.net/ljy032/aggbug/79594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljy032/" target="_blank">风雨兼程</a> 2006-11-07 14:01 <a href="http://www.blogjava.net/ljy032/archive/2006/11/07/79594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>