﻿<?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>IT博客-Randy's Knowledge Base</title><link>http://www.cnitblog.com/cqrandy/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 04 May 2026 20:55:12 GMT</lastBuildDate><pubDate>Mon, 04 May 2026 20:55:12 GMT</pubDate><ttl>60</ttl><item><title>[转载]软件公司内部协作平台的选型（项目/BUG/需求管理及用户支持）</title><link>http://www.cnitblog.com/cqrandy/archive/2007/05/30/27762.html</link><dc:creator>CqRandy</dc:creator><author>CqRandy</author><pubDate>Wed, 30 May 2007 02:00:00 GMT</pubDate><guid>http://www.cnitblog.com/cqrandy/archive/2007/05/30/27762.html</guid><wfw:comment>http://www.cnitblog.com/cqrandy/comments/27762.html</wfw:comment><comments>http://www.cnitblog.com/cqrandy/archive/2007/05/30/27762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cqrandy/comments/commentRss/27762.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cqrandy/services/trackbacks/27762.html</trackback:ping><description><![CDATA[下面是在考虑公司内部的协作平台时的选型说明，贴出来供有需要的弟兄参考。<br>&nbsp;<br>&#8220;软件开发协作平台&#8221;需求是<br>a.支持项目管理、BUG及用户支持管理；b.内部公告；c.可定制流程、可自定义字段；d.权限控制；e.Email通知及监控 f.统计报表及导出 g.最好易扩展<br><br>狂找一顿后的选型结果就是：&#8220;URTracker+Excel&#8221;。0321Update:最终还是&#8220;Mantis+Excel&#8221;了，考虑到URTracker收费的问题，因为要推广到全公司5个帐号就不够了。<br><br>具体操作的模式是：用excel来做项目计划、任务分解、记录指派、进度总结；用URTracker来分派任务并作进度反馈/跟踪。其中用&#8220;分级/组合&#8221;的效果可以做出像project那样任务分级下拉、收起的效果，用&#8220;数据透视表&#8221;可以方便实现统计分析的效果。project就没必要用了，常用的功能无非就是那几个，实在不需要这么庞大无聊的东西，excel就很好用。<br><br>注：选它的理由，是它可以很方便的定制流程、自定义字段，而且把项目管理和bug管理、需求管理都可以通过定制的方式，纳入同一个平台了;另外你可以看到它的sql server数据库，这样很方便你写sql或扩展程序，以得到需要的统计分析报表。mantis的字段也可以自定义，但唯一的不足就是不能加流程状态，它可以定制流程，但是状态就是那几个状态，加不了。<br><br>当然，&#8220;工具配合的是管理&#8221;，关键还是人。没有相应的理念，再好的工具也是白费。目前这个平台也未经验证，具体使用效果，以后再来总结。<br><br>需注意，URTracker是收费的，但是有5个帐号的免费版，可以满足小团队。以后如果要注册，45元/帐号，应该也可以接受。如果你一定要免费，那可以用mantis代替之，缺陷是流程定制的效果差点。<br>&nbsp;<br>1.URTracker：<br><a href="http://www.lealsoft.com/urtracker/"><font color=#21600b><u>http://www.lealsoft.com/urtracker/</u></font></a><br>优点：可以满足我们的需求，操作也较符合国内习惯，另外是.net+sql 做的，可方便自行扩展。(内部公告可以用知识库来代替)<br>缺点：收费。(但是有5个帐号的免费版)<br><br>2.Mantis：<br><a href="http://www.mantisbt.org/"><font color=#21600b><u>www.mantisbt.org/</u></font></a><br>如果要用免费的软件，就是这个了。它的不足除了流程状态不能加外，项目管理只能通过当一个bug项目来做，这样感觉可能不是很爽，有点折衷。<br><br>3.http://at.tryphpgroupware.org/phpgroupware/login.php <br>优点：可支持项目管理及bug,内部公告。(流程及自定义字段未知)。另外集成的功能模块较多，日历、论坛、wiki等。开源免费。国外开源会不断升级。<br>缺点：操作习惯没这么好，另外是php+mysql做的，较难扩展。<br><br>4.http://egroupware.outdoor-training.de/egw-head/login.php<br>优点：可支持项目管理及bug,内部公告。(流程及自定义字段好像不行?)。另外集成的功能模块较多，日历、论坛、wiki等。开源免费。国外开源会不断升级。<br>缺点：操作习惯没这么好，另外是php+mysql做的，较难扩展。<br><br>5.Sawin2006研发协作平台<br><a href="http://www.sawin.cn/OpenProject/sawin2006/welcome.htm"><font color=#21600b><u>http://www.sawin.cn/OpenProject/sawin2006/welcome.htm</u></font></a><br>界面、流程不符合我们的需求，不作考虑。<br>支持需求管理及bug管理。开源。<br><br>6.BugFree:<br><a href="http://bugfree.1zsoft.com/Demo/"><font color=#21600b><u>http://bugfree.1zsoft.com/Demo/</u></font></a><br>功能较简单，不能满足项目管理的需求。优点是界面设计比较清晰。用来做bug管理还是可以的。当然个人感觉Mantis用惯了。<br><br>7.https://gforge.org/<br>可能更适合开源软件，效果未知。可以支持项目管理及bug管理。<br><br>8.JIRA：<br>据说也可以支持项目管理和bug，且还可以，不过是收费的(对开源项目免费)。见<br><a href="http://blog.csdn.net/judyxm/archive/2006/04/26/678456.aspx"><font color=#21600b><u>http://blog.csdn.net/judyxm/archive/2006/04/26/678456.aspx</u></font></a>&nbsp;<br><br>9.其他收费的软件，应该还有些。在此不找了。<br><a href="http://www.php-open.com/"><font color=#21600b><u>http://www.php-open.com/</u></font></a> 有些开源软件。<br><br>最后，最近的发现，Windows SharePoint Services 3.0似乎都可以满足需求，似乎很不错。不过太庞大了点，维护也不好做，暂不考虑了。说明见这里：<a href="http://www.cnblogs.com/cleo/archive/2007/03/16/SharePointV3_Templates_Demo.html"><font color=#21600b><u>http://www.cnblogs.com/cleo/archive/2007/03/16/SharePointV3_Templates_Demo.html</u></font></a><br>
<img src ="http://www.cnitblog.com/cqrandy/aggbug/27762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cqrandy/" target="_blank">CqRandy</a> 2007-05-30 10:00 <a href="http://www.cnitblog.com/cqrandy/archive/2007/05/30/27762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> [最新版]Asp.net Ajax 编程备忘录----细数28个服务器端控件 [转载] </title><link>http://www.cnitblog.com/cqrandy/archive/2007/02/15/23097.html</link><dc:creator>CqRandy</dc:creator><author>CqRandy</author><pubDate>Thu, 15 Feb 2007 00:51:00 GMT</pubDate><guid>http://www.cnitblog.com/cqrandy/archive/2007/02/15/23097.html</guid><wfw:comment>http://www.cnitblog.com/cqrandy/comments/23097.html</wfw:comment><comments>http://www.cnitblog.com/cqrandy/archive/2007/02/15/23097.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cqrandy/comments/commentRss/23097.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cqrandy/services/trackbacks/23097.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.Accordion    功能：实现了QQ、Msn好友分类的折叠效果，就像包含了多个CollapsiblePanels    细节： (1)不要把Accordion放在Table种同时又把 FadeTransitions 设置为True，这将引起布局混乱                (2)每一个 AccordionPane control 有一个Header 和Content的 templa...&nbsp;&nbsp;<a href='http://www.cnitblog.com/cqrandy/archive/2007/02/15/23097.html'>阅读全文</a><img src ="http://www.cnitblog.com/cqrandy/aggbug/23097.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cqrandy/" target="_blank">CqRandy</a> 2007-02-15 08:51 <a href="http://www.cnitblog.com/cqrandy/archive/2007/02/15/23097.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何生成静态页</title><link>http://www.cnitblog.com/cqrandy/archive/2006/09/02/16310.html</link><dc:creator>CqRandy</dc:creator><author>CqRandy</author><pubDate>Sat, 02 Sep 2006 13:45:00 GMT</pubDate><guid>http://www.cnitblog.com/cqrandy/archive/2006/09/02/16310.html</guid><wfw:comment>http://www.cnitblog.com/cqrandy/comments/16310.html</wfw:comment><comments>http://www.cnitblog.com/cqrandy/archive/2006/09/02/16310.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cqrandy/comments/commentRss/16310.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cqrandy/services/trackbacks/16310.html</trackback:ping><description><![CDATA[
		<p>方案1：<br />/// &lt;summary&gt;<br />/// 传入URL返回网页的html代码<br />/// &lt;/summary&gt;<br />/// &lt;param name="Url"&gt;URL&lt;/param&gt;<br />/// &lt;returns&gt;&lt;/returns&gt;<br />public static  string getUrltoHtml(string Url)<br />{<br />errorMsg = "";<br />try<br />{<br />System.Net.WebRequest wReq = System.Net.WebRequest.Create(Url);<br />// Get the response instance.<br />System.Net.WebResponse wResp =wReq.GetResponse();<br />// Read an HTTP-specific property<br />//if (wResp.GetType() ==HttpWebResponse)<br />//{<br />//DateTime updated  =((System.Net.HttpWebResponse)wResp).LastModified;<br />//}<br />// Get the response stream.<br />System.IO.Stream respStream  = wResp.GetResponseStream();<br />// Dim reader As StreamReader = New StreamReader(respStream)<br />System.IO.StreamReader reader = new System.IO.StreamReader(respStream, System.Text.Encoding.GetEncoding("gb2312"));<br />return  reader.ReadToEnd();</p>
		<p>}<br />catch(System.Exception ex)<br />{<br />errorMsg = ex.Message ;<br />}<br />return "";<br />}</p>
		<p>你可以用这个函数获取网页的客户端的html代码，然后保存到.html文件里就可以了。</p>
		<p>方案2：<br />生成单个的静态页面不是难点，难的是各个静态页面间的关联和链接如何保持完整；<br />特别是在页面频繁更新、修改、或删除的情况下；</p>
		<p>像阿里巴巴的页面也全部是html的，估计用的是地址映射的功能<br />关于地址映射可参考：<a href="http://www.easewe.com/Article/ShowArticle.aspx?article=131"><font color="#000080">http://www.easewe.com/Article/ShowArticle.aspx?article=131</font></a></p>
		<p>可以看看这个页面，分析一下他的“竞价倒计时”功能<br /><a href="http://info.china.alibaba.com/news/subject/v1-s5011580.html?head=top4&amp;Bidding=home5"><font color="#000080">http://info.china.alibaba.com/news/subject/v1-s5011580.html?head=top4&amp;Bidding=home5</font></a><br /><br />ASP.Net生成静态HTML页<br />在Asp中实现的生成静态页用到的FileSystemObject对象!<br />在.Net中涉及此类操作的是System.IO <br />以下是程序代码 注:此代码非原创!参考别人代码<br /><br />  CODE:   <br />//生成HTML页<br />  public static bool WriteFile(string strText,string strContent,string strAuthor) <br />  {<br />   string path = HttpContext.Current.Server.MapPath("/news/");<br />   Encoding code = Encoding.GetEncoding("gb2312");<br />   // 读取模板文件<br />   string temp = HttpContext.Current.Server.MapPath("/news/text.html");<br />   StreamReader sr=null;<br />   StreamWriter sw=null;<br />   string str="";  <br />   try<br />   {<br />    sr = new StreamReader(temp, code);<br />    str = sr.ReadToEnd(); // 读取文件<br />   }<br />   catch(Exception exp)<br />   {<br />    HttpContext.Current.Response.Write(exp.Message);<br />    HttpContext.Current.Response.End();<br />    sr.Close();<br />   }<br />  <br />   <br />   string htmlfilename=DateTime.Now.ToString("yyyyMMddHHmmss")+".html";<br />   // 替换内容<br />   // 这时,模板文件已经读入到名称为str的变量中了<br />   str =str.Replace("ShowArticle",strText); //模板页中的ShowArticle<br />   str = str.Replace("biaoti",strText);<br />   str = str.Replace("content",strContent);<br />   str = str.Replace("author",strAuthor);<br />   // 写文件<br />   try<br />   {<br />    sw = new StreamWriter(path + htmlfilename , false, code);<br />    sw.Write(str);<br />    sw.Flush();<br />   }<br />   catch(Exception ex)<br />   {<br />    HttpContext.Current.Response.Write(ex.Message);<br />    HttpContext.Current.Response.End();<br />   }<br />   finally<br />   {<br />    sw.Close();<br />   }<br />   return true;</p>
		<p>此函数放在Conn.CS基类中了<br />在添加新闻的代码中引用 注：工程名为Hover</p>
		<p>    if(Hover.Conn.WriteFilethis.Title.Text.ToString),this.Content.Text.ToString),this.Author.Text.ToString)))<br />    {<br />     Response.Write("添加成功");<br />    }<br />    else<br />    {<br />     Response.Write("生成HTML出错!");<br />    } <br /> </p>
		<p>
				<br />模板页Text.html代码</p>
		<p>
				<br />  CODE:   <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;ShowArticle&lt;/title&gt;<br />   &lt;body&gt;<br />biaoti<br />&lt;br&gt;<br />content&lt;br&gt;<br />author<br />&lt;/body&gt;<br />&lt;/HTML&gt;<br />biaoti<br />&lt;br&gt;<br />content&lt;br&gt;<br />author<br />&lt;/body&gt;<br />&lt;/HTML&gt; <br /> <br />提示添加成功后会出以当前时间为文件名的html文件!上面只是把传递过来的几个参数直接写入了HTML文件中,在实际应用中需要先添加数据库，然后再写入HTML文件<br /><br />方案3：<br />给一个客户端参考的例子（SJ）<br />它的作用在于以客户端的方式获取某个页面的代码，然后可以做为其他用途，本例是直接输出<br />&lt;script&gt;<br />    var oXmlHttp = new ActiveXObject("Microsoft.XMLHTTP");<br />    oXmlHttp.open("GET","<a href="http://www.163.com/"><font color="#000080">http://www.163.com</font></a>", false);<br />    oXmlHttp.send()<br />    var oStream = new ActiveXObject("ADODB.Stream");<br />    if(oStream == null)<br />        alert("您的机器不支持ADODB.Stream.")<br />    else<br />    {<br />        oStream.Type=1;<br />        oStream.Mode=3;<br />        oStream.Open() ;<br />        oStream.Write(oXmlHttp.responseBody);<br />        oStream.Position= 0;<br />        oStream.Type= 2;<br />        oStream.Charset="gb2312";<br />        var result= oStream.ReadText();<br />        oStream.Close();<br />        oStream = null;<br />  var aa = window.open("","")<br />  document.write(result);<br />        aa.document.write(result);<br />    }<br />&lt;/script&gt;</p>
		<p>方案4：学csdn一样。用xml保存数据，模版XSL也只有一个文件。<br />使用xml来保存数据，使用xsl来定义模板并且生称数据。可以通过xsl来很方便的在客户端或者服务段显示数据。如果要生成静态叶面那更简单了。去查一下.net的xml类包问题解决。<br />            优点：可以方便快速转换成你想要的格式和内容。<br />            缺点：需要学习更多的内容，不好入门。</p>
		<p>方案5：<br /><strong>思路 </strong></p>
		<p>　　1. 利用如Dw-Mx这样的工具生成html格式的模板，在需要添加格式的地方加入特殊标记(如$htmlformat$),动态生成文件时利用代码读取此模板，然后获得前台输入的内容，添加到此模板的标记位置中，生成新文件名后写入磁盘，写入后再向数据库中写入相关数据。<br />       2. 使用后台代码硬编码Html文件，可以使用HtmlTextWriter类来写html文件。 <br /><strong>优点 </strong></p>
		<p>　　1. 可以建立非常复杂的页面，利用包含js文件的方法，在js文件内加入document.write()方法可以在所有页面内加入如页面头，广告等内容。 </p>
		<p>　　2. 静态html文件利用MS Windows2000的Index Server可以建立全文搜索引擎，利用asp.net可以以DataTable的方式得到搜索结果。而Win2000的Index服务无法查找xml文件的内容。如果包括了数据库搜索与Index索引双重查找，那么此搜索功能将非常强大。 </p>
		<p>　　3. 节省服务器的负荷，请求一个静态的html文件比一个aspx文件服务器资源节省许多。 </p>
		<p>　　<strong>缺点 </strong></p>
		<p>　　思路二： 如果用硬编码的方式，工作量非常大，需要非常多的html代码。调试困难。而且使用硬编码生成的html样式无法修改，如果网站更换样式，那么必须得重新编码，给后期带来巨大的工作量。 </p>
		<p>　　因此这里采用的是第一种思路 </p>
		<p>　　示列代码 </p>
		<p>　　1.定义(template.htm)html模板页面 </p>
		<p>　　＜html＞ </p>
		<p>　　＜head＞ </p>
		<p>　　＜title＞＜/title＞ </p>
		<p>　　＜meta http-equiv="Content-Type" content="text/html; charset=gb2312"＞ </p>
		<p>　　＜/head＞ </p>
		<p>　　＜body ＞ </p>
		<p>　　＜table $htmlformat[0] height="100%" border="0" width="100%" cellpadding="10" cellspacing="0" bgcolor="#eeeeee" style="border:1px solid #000000"＞ </p>
		<p>　　＜tr＞ </p>
		<p>　　＜td width="100%" valign="middle" align="left"＞ </p>
		<p>　　＜span style="color: $htmlformat[1];font-size: $htmlformat[2]"＞$htmlformat[3]＜/span＞ </p>
		<p>　　＜/td＞ </p>
		<p>　　＜/tr＞ </p>
		<p>　　＜/table＞ </p>
		<p>　　＜/body＞ </p>
		<p>　　＜/html＞ </p>
		<p>　　2.asp.net代码： </p>
		<p>　　//---------------------读html模板页面到stringbuilder对象里---- </p>
		<p>　　string[] format=new string[4];//定义和htmlyem标记数目一致的数组 </p>
		<p>　　StringBuilder htmltext=new StringBuilder(); </p>
		<p>　　try </p>
		<p>　　{ </p>
		<p>　　　using (StreamReader sr = new StreamReader("存放模板页面的路径和页面名")) </p>
		<p>　　　{ </p>
		<p>　　String line; </p>
		<p>　　while ((line = sr.ReadLine()) != null) </p>
		<p>　　{ </p>
		<p>　　　htmltext.Append(line); </p>
		<p>　　} </p>
		<p>　　sr.Close(); </p>
		<p>　　　} </p>
		<p>　　} </p>
		<p>　　catch </p>
		<p>　　{ </p>
		<p>　　　Response.Write("＜Script＞alert('读取文件错误')＜/Script＞"); </p>
		<p>　　} </p>
		<p>　　//---------------------给标记数组赋值------------ </p>
		<p>　　format[0]="background="bg.jpg"";//背景图片 </p>
		<p>　　format[1]= "#990099";//字体颜色 </p>
		<p>　　format[2]="150px";//字体大小 </p>
		<p>　　format[3]= "＜marquee＞生成的模板html页面＜/marquee＞";//文字说明 </p>
		<p>　　//----------替换htm里的标记为你想加的内容 </p>
		<p>　　for(int i=0;i＜4;i++) </p>
		<p>　　{ </p>
		<p>　　　htmltext.Replace("$htmlformat["+i+"]",format[i]); </p>
		<p>　　} </p>
		<p>　　//----------生成htm文件------------------―― </p>
		<p>　　try </p>
		<p>　　{ </p>
		<p>　　　using(StreamWriter sw=new StreamWriter("存放路径和页面名",false,System.Text.Encoding.GetEncoding("GB2312"))) </p>
		<p>　　{ </p>
		<p>　　　sw.WriteLine(htmltext); </p>
		<p>　　　sw.Flush(); </p>
		<p>　　　sw.Close(); </p>
		<p>　　} </p>
		<p>　　} </p>
		<p>　　catch </p>
		<p>　　{ </p>
		<p>　　Response.Write ("The file could not be wirte:"); </p>
		<p>　　} </p>
		<p>　　<strong>小结 <br /></strong>　　用此方法可以方便的生成html文件。程序使用了是循环替换，因此对需替换大量元素的模板速度非常快。</p>
<img src ="http://www.cnitblog.com/cqrandy/aggbug/16310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cqrandy/" target="_blank">CqRandy</a> 2006-09-02 21:45 <a href="http://www.cnitblog.com/cqrandy/archive/2006/09/02/16310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]禁止保存网页的方法</title><link>http://www.cnitblog.com/cqrandy/archive/2006/06/02/11450.html</link><dc:creator>CqRandy</dc:creator><author>CqRandy</author><pubDate>Fri, 02 Jun 2006 01:41:00 GMT</pubDate><guid>http://www.cnitblog.com/cqrandy/archive/2006/06/02/11450.html</guid><wfw:comment>http://www.cnitblog.com/cqrandy/comments/11450.html</wfw:comment><comments>http://www.cnitblog.com/cqrandy/archive/2006/06/02/11450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cqrandy/comments/commentRss/11450.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cqrandy/services/trackbacks/11450.html</trackback:ping><description><![CDATA[1. oncontextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键<br />&lt;table border oncontextmenu=return(false)&gt;&lt;td&gt;no&lt;/table&gt; 可用于Table 
<p>2. &lt;body onselectstart="return false"&gt; 取消选取、防止复制</p><p>3. onpaste="return false" 不准粘贴</p><p>4. oncopy="return false;" oncut="return false;" 防止复制</p><p>5. &lt;link rel="Shortcut Icon" href="favicon.ico"&gt; IE地址栏前换成自己的图标</p><p>6. &lt;link rel="Bookmark" href="favicon.ico"&gt; 可以在收藏夹中显示出你的图标</p><p>7. &lt;input style="ime-mode:disabled"&gt; 关闭输入法</p><p>8. 永远都会带着框架<br />&lt;script language="javascript"&gt;&lt;!--<br />if (window == top)top.location.href = "frames.htm"; //frames.htm为框架网页<br />// --&gt;&lt;/script&gt;</p><p>9. 防止被人frame<br />&lt;SCRIPT LANGUAGE=javascript&gt;&lt;!-- <br />if (top.location != self.location)top.location=self.location;<br />// --&gt;&lt;/SCRIPT&gt;</p><p>10. &lt;noscript&gt;&lt;iframe src=*.html&gt;&lt;/iframe&gt;&lt;/noscript&gt; 网页将不能被另存为</p><p><br />11. &lt;input type=button value=查看网页源代码 <br />onclick="window.location = 'view-source:'+ 'http://www.csdn.net/'"&gt;</p><p>12. 怎样通过asp的手段来检查来访者是否用了代理<br />&lt;% if Request.ServerVariables("HTTP_X_FORWARDED_FOR")&lt;&gt;"" then<br />response.write "&lt;font color=#FF0000&gt;您通过了代理服务器，"&amp; _<br />"真实的IP为"&amp;Request.ServerVariables("HTTP_X_FORWARDED_FOR")<br />end if<br />%&gt;</p><p>13. 取得控件的绝对位置</p><p>//javascript<br />&lt;script language="javascript"&gt;<br />function getIE(e){<br />var t=e.offsetTop;<br />var l=e.offsetLeft;<br />while(e=e.offsetParent){<br />t+=e.offsetTop;<br />l+=e.offsetLeft;<br />}<br />alert("top="+t+"\nleft="+l);<br />}<br />&lt;/script&gt;</p><p>//VBScript<br />&lt;script language="VBScript"&gt;&lt;!--<br />function getIE()<br />dim t,l,a,b<br />set a=document.all.img1<br />t=document.all.img1.offsetTop<br />l=document.all.img1.offsetLeft<br />while a.tagName&lt;&gt;"BODY"<br />set a = a.offsetParent<br />t=t+a.offsetTop<br />l=l+a.offsetLeft<br />wend<br />msgbox "top="&amp;t&amp;chr(13)&amp;"left="&amp;l,64,"得到控件的位置"<br />end function<br />--&gt;&lt;/script&gt;</p><p>14. 光标是停在文本框文字的最后<br />&lt;script language="javascript"&gt;<br />function cc()<br />{<br />var e = event.srcElement;<br />var r =e.createTextRange();<br />r.moveStart('character',e.value.length);<br />r.collapse(true);<br />r.select();<br />}<br />&lt;/script&gt;<br />&lt;input type=text name=text1 value="123" onfocus="cc()"&gt;</p><p>15. 判断上一页的来源<br />asp:<br />request.servervariables("HTTP_REFERER")</p><p>javascript:<br />document.referrer</p><p>16. 最小化、最大化、关闭窗口<br />&lt;object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"&gt; <br />&lt;param name="Command" value="Minimize"&gt;&lt;/object&gt;<br />&lt;object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"&gt; <br />&lt;param name="Command" value="Maximize"&gt;&lt;/object&gt;<br />&lt;OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"&gt;<br />&lt;PARAM NAME="Command" value="Close"&gt;&lt;/OBJECT&gt;</p><p>&lt;input type=button value=最小化 onclick=hh1.Click()&gt;<br />&lt;input type=button value=最大化 onclick=hh2.Click()&gt;<br />&lt;input type=button value=关闭 onclick=hh3.Click()&gt;<br />本例适用于IE</p><p>17. <br />&lt;%<br />'定义数据库连接的一些常量<br />Const adOpenForwardOnly = 0 '游标只向前浏览记录，不支持分页、Recordset、BookMark<br />Const adOpenKeyset = 1 '键集游标，其他用户对记录说做的修改将反映到记录集中，但其他用户增加或删除记录不会反映到记录集中。支持分页、Recordset、BookMark<br />Const adOpenDynamic = 2 '动态游标功能最强，但耗资源也最多。用户对记录说做的修改，增加或删除记录都将反映到记录集中。支持全功能浏览(ACCESS不支持)。<br />Const adOpenStatic = 3 '静态游标，只是数据的一个快照，用户对记录说做的修改，增加或删除记录都不会反映到记录集中。支持向前或向后移动</p><p>Const adLockReadOnly = 1 '锁定类型，默认的，只读，不能作任何修改<br />Const adLockPessimistic = 2 '当编辑时立即锁定记录，最安全的方式<br />Const adLockOptimistic = 3 '只有在调用Update方法时才锁定记录集，而在此前的其他*作仍可对当前记录进行更改、插入和删除等<br />Const adLockBatchOptimistic = 4 '当编辑时记录不会被锁定，而更改、插入和删除是在批处理方式下完成的</p><p>Const adCmdText = &amp;H0001<br />Const adCmdTable = &amp;H0002<br />%&gt;</p><p>18. 网页不会被缓存<br />HTM网页<br />&lt;META HTTP-EQUIV="pragma" CONTENT="no-cache"&gt;<br />&lt;META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"&gt;<br />&lt;META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT"&gt;<br />或者&lt;META HTTP-EQUIV="expires" CONTENT="0"&gt;<br />ASP网页<br />Response.Expires = -1<br />Response.ExpiresAbsolute = Now() - 1<br />Response.cachecontrol = "no-cache"<br />PHP网页<br />header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");<br />header("Cache-Control: no-cache, must-revalidate");<br />header("Pragma: no-cache");</p><p><br />19. 检查一段字符串是否全由数字组成<br />&lt;script language="javascript"&gt;&lt;!--<br />function checkNum(str){return str.match(/\D/)==null}<br />alert(checkNum("1232142141"))<br />alert(checkNum("123214214a1"))<br />// --&gt;&lt;/script&gt;</p><p>20. 获得一个窗口的大小<br />document.body.clientWidth,document.body.clientHeight</p><p>21. 怎么判断是否是字符<br />if (/[^\x00-\xff]/g.test(s)) alert("含有汉字");<br />else alert("全是字符");</p><p>22.TEXTAREA自适应文字行数的多少<br />&lt;textarea rows=1 name=s1 cols=27 onpropertychange="this.style.posHeight=this.scrollHeight"&gt; </p><img src ="http://www.cnitblog.com/cqrandy/aggbug/11450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cqrandy/" target="_blank">CqRandy</a> 2006-06-02 09:41 <a href="http://www.cnitblog.com/cqrandy/archive/2006/06/02/11450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]取CPU号、取第一块硬盘号、取第一块网卡号、取串口</title><link>http://www.cnitblog.com/cqrandy/archive/2006/05/30/11214.html</link><dc:creator>CqRandy</dc:creator><author>CqRandy</author><pubDate>Tue, 30 May 2006 00:46:00 GMT</pubDate><guid>http://www.cnitblog.com/cqrandy/archive/2006/05/30/11214.html</guid><wfw:comment>http://www.cnitblog.com/cqrandy/comments/11214.html</wfw:comment><comments>http://www.cnitblog.com/cqrandy/archive/2006/05/30/11214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cqrandy/comments/commentRss/11214.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cqrandy/services/trackbacks/11214.html</trackback:ping><description><![CDATA[
		<p>//取CPU号<br />public string GetCpuID() <br />{<br />try<br />{<br />ManagementClass mc = new ManagementClass("Win32_Processor");<br />ManagementObjectCollection moc = mc.GetInstances();</p>
		<p>string strCpuID = null ;<br />foreach( ManagementObject mo in moc ) <br />{<br />strCpuID = mo.Properties["ProcessorId"].Value.ToString();<br />break; <br />}<br />return strCpuID;<br />}<br />catch<br />{<br />return "";<br />}<br />}</p>
		<p>//取第一块硬盘号<br />public string GetHardDiskID() <br />{<br />try<br />{<br />ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");<br />string strHardDiskID = null ;<br />foreach(ManagementObject mo in searcher.Get()) <br />{    <br />strHardDiskID = mo["ModuleNumber"].ToString().Trim();<br />if(strHardDiskID != "")<br />{<br />break;<br />}<br />}<br />return strHardDiskID ;<br />}<br />catch<br />{<br />return "";<br />}<br />}//end </p>
		<p>//取第一块网卡号<br />public string GetNetworkID() <br />{<br />try<br />{<br />ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration");<br />string strNetworkID = null ;<br />foreach(ManagementObject mo in searcher.Get()) <br />{    <br />strNetworkID = mo["MACAddress"].ToString().Trim();<br />if(strNetworkID != "")<br />{<br />break;          <br />}<br />}<br />return strNetworkID ;<br />}<br />catch<br />{<br />return "";<br />}<br />}//end </p>
		<p>//取串口<br />public int getport(int portnum)<br />{<br />//链接服务器<br />DirectoryEntry root = new DirectoryEntry("IIS://localhost/W3SVC");<br />//检测是否已存在相同串口的站点,并获取PORT值<br />foreach(DirectoryEntry e in root.Children)<br />{<br />if(e.SchemaClassName == "IIsWebServer")<br />{<br />if(e.Properties["ServerBindings"].Value != null)<br />{<br />int strstart = e.Properties["ServerBindings"].Value.ToString().IndexOf(":",0);<br />int strend = e.Properties["ServerBindings"].Value.ToString().IndexOf(":",strstart+1);<br />string thisport = e.Properties["ServerBindings"].Value.ToString().Substring((strstart+1),(strend-strstart-1));<br />if(thisport == portnum.ToString())<br />{<br />portnum++;<br />portnum = getport(portnum);<br />break;<br />}<br />}<br />}<br />}<br />return portnum;<br />}</p>
<img src ="http://www.cnitblog.com/cqrandy/aggbug/11214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cqrandy/" target="_blank">CqRandy</a> 2006-05-30 08:46 <a href="http://www.cnitblog.com/cqrandy/archive/2006/05/30/11214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]利用ASP.NET DataGrid显示主次关系的数据</title><link>http://www.cnitblog.com/cqrandy/archive/2006/05/29/11166.html</link><dc:creator>CqRandy</dc:creator><author>CqRandy</author><pubDate>Mon, 29 May 2006 01:19:00 GMT</pubDate><guid>http://www.cnitblog.com/cqrandy/archive/2006/05/29/11166.html</guid><wfw:comment>http://www.cnitblog.com/cqrandy/comments/11166.html</wfw:comment><comments>http://www.cnitblog.com/cqrandy/archive/2006/05/29/11166.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cqrandy/comments/commentRss/11166.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cqrandy/services/trackbacks/11166.html</trackback:ping><description><![CDATA[大家在实际工作中有没有遇到要在DataGrid中显示带有主次结构的数据呢？如果你对ADO.NET和SQL Server2000熟悉的话，我们下面就举一个利用VS.NET自带的示例数据库Northwind和VB.NET来说明如何实现这一目标。<br />    首先，我们先准备要显示的带有主次结构的数据。
<p>    下面就是要绑定到HierarchicalDataGrid.aspx的VB.NET代码文件HierarchicalDataGrid.aspx.vb的内容：</p><p style="BORDER-RIGHT: #ff9801 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #ff9801 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #ff9801 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #ff9801 1px solid; BACKGROUND-COLOR: #ffd780">Imports System.Data.SqlClient<br /><br />Public Class HierarchicalDataGrid<br />Inherits System.Web.UI.Page<br />Protected WithEvents DataGrid1 As System.Web.UI.WebControls.DataGrid<br /><br />#Region " Web Form Designer Generated Code "<br /><br />'下面的调用对Web Form设计器来说是必须的<br />&lt;System.Diagnostics.DebuggerStepThrough()&gt; Private Sub InitializeComponent()<br /><br />End Sub<br /><br />Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init<br />'CODEGEN: 这个方法是为Web Form设计器调用的<br />'不要用代码编辑器改变这里.<br />InitializeComponent()<br />End Sub<br /><br />#End Region<br /><br />Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load<br /><br />'打开数据库连接<br />Dim OrdersConnection As New SqlConnection("Server=(local)\NetSDK;Database=northwind;Trusted_Connection=yes")<br /><br />'得到订单和订单详细信息<br />Dim OrderAdapter As New SqlDataAdapter("Select * from Orders; select OrderID ,Products.ProductName,[order Details].Unitprice,[order Details].Quantity,[order Details].discount from [order Details],Products where [Order Details].ProductId=Products.ProductID", OrdersConnection)<br /><br />'创建并填充DataSet对象<br />Dim OrderDataSet As New DataSet()<br /><br />OrderAdapter.Fill(OrderDataSet)<br /><br />'设定表名字<br />OrderDataSet.Tables(0).TableName = "Orders"<br />OrderDataSet.Tables(1).TableName = "Order Details"<br /><br />'在基于OrderID字段的两个表之间建立父子关系<br />Dim Parent As DataColumn = OrderDataSet.Tables("Orders").Columns("OrderID")<br />Dim Child As DataColumn = OrderDataSet.Tables("Order Details").Columns("OrderID")<br /><br />Dim OrderRelation As DataRelation = New DataRelation("OrderRelation", Parent, Child, False)<br /><br />'为DataSet添加关系<br />OrderDataSet.Relations.Add(OrderRelation)<br /><br />'把DataGrid绑定到Orders表<br />DataGrid1.DataSource = OrderDataSet.Tables("Orders").DefaultView<br />DataBind()<br /><br />End Sub<br /><br />Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles DataGrid1.ItemDataBound<br />e.Item.Cells(0).BackColor = System.Drawing.Color.Ivory<br />End Sub<br />End Class </p><p>    在HierarchicalDataGrid.aspx中，我们为DataGrid1建立模板列，并把另外一个DataGrid嵌入到这个模板列，父一级的DataGrid用来显示主记录，比如：订单。子一级DataGrid用来显示详细信息，比如：订单的详细信息。我们这样为子DataGrid动态指定数据源：</p><p style="BORDER-RIGHT: #ff9801 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #ff9801 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #ff9801 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #ff9801 1px solid; BACKGROUND-COLOR: #ffd780" align="center">DataSource='&lt;%# Ctype(Container.DataItem,DataRowView).CreateChildView("OrderRelation") %&gt;'&gt;</p><p>    上面这句就是实现显示主次关系数据的关键。根据当前父一级记录，DataRowView.CreateChildView利用前面创建的关系的名字作为参数获得子记录，并把它绑定到子DataGrid上。</p><p>    下面就是我们要显示的ASPX页面的代码，HierarchicalDataGrid.aspx：</p><p style="BORDER-RIGHT: #ff9801 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #ff9801 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #ff9801 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #ff9801 1px solid; BACKGROUND-COLOR: #ffd780">&lt;%@ Page Language="vb" AutoEventWireup="false" Codebehind="HierarchicalDataGrid.aspx.vb" Inherits="HierarchicalDataGrid.HierarchicalDataGrid" %&gt;<br />&lt;%@ Import namespace="System.Data"%&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 name="GENERATOR" content="Microsoft Visual Studio.NET 7.0"&gt;<br />&lt;meta name="CODE_LANGUAGE" content="Visual Basic 7.0"&gt;<br />&lt;meta name="vs_defaultClientScript" content="JavaScript"&gt;<br />&lt;meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"&gt;<br />&lt;/HEAD&gt;<br />&lt;body&gt;<br />&lt;form id="FrmDataGrid" method="post" runat="server"&gt;<br />&lt;P align="center"&gt;<br />&lt;asp:DataGrid id="DataGrid1" BorderColor="#0099FF" runat="server" ShowHeader="False" Width="470px" CellPadding="0" CellSpacing="0" AutoGenerateColumns="False" BorderWidth="2px"&gt;<br />&lt;Columns&gt;<br />&lt;asp:TemplateColumn&gt;<br />&lt;ItemTemplate&gt;<br />&lt;TABLE cellSpacing="0" cellPadding="0" width="100%" border="0"&gt;<br />&lt;TR&gt;<br />&lt;TD bgColor="#FF6600"&gt;&lt;B&gt;订单号：<br />&lt;%# DataBinder.Eval(Container.DataItem, "OrderID") %&gt;<br />&lt;/B&gt;<br />&lt;/TD&gt;<br />&lt;/TR&gt;<br />&lt;TR&gt;<br />&lt;TD align="right"&gt;<br />&lt;asp:DataGrid id=DataGrid2 runat="server" AutoGenerateColumns="False" BorderColor="#33FF33" DataKeyField="OrderID" DataSource='&lt;%# Ctype(Container.DataItem,DataRowView).CreateChildView("OrderRelation") %&gt;'&gt;<br />&lt;HeaderStyle Font-Bold="True" ForeColor="#CC0066" BackColor="#FFCCFF"&gt;&lt;/HeaderStyle&gt;<br />&lt;Columns&gt;<br />&lt;asp:BoundColumn Visible="False" DataField="OrderID" ReadOnly="True"&gt;&lt;/asp:BoundColumn&gt;<br />&lt;asp:TemplateColumn HeaderText="产品名称"&gt;<br />&lt;HeaderStyle Width="300px"&gt;&lt;/HeaderStyle&gt;<br />&lt;ItemTemplate&gt;<br />&lt;%# DataBinder.Eval(Container.DataItem, "ProductName") %&gt;<br />&lt;/ItemTemplate&gt;<br />&lt;/asp:TemplateColumn&gt;<br />&lt;asp:BoundColumn DataField="UnitPrice" HeaderText="单价"&gt;&lt;/asp:BoundColumn&gt;<br />&lt;asp:BoundColumn DataField="Quantity" HeaderText="数量"&gt;&lt;/asp:BoundColumn&gt;<br />&lt;asp:BoundColumn DataField="Discount" HeaderText="折扣"&gt;&lt;/asp:BoundColumn&gt;<br />&lt;/Columns&gt;<br />&lt;/asp:DataGrid&gt;&lt;/TD&gt;<br />&lt;/TR&gt;<br />&lt;/TABLE&gt;<br />&lt;/ItemTemplate&gt;<br />&lt;/asp:TemplateColumn&gt;<br />&lt;/Columns&gt;<br />&lt;/asp:DataGrid&gt;&lt;/P&gt;<br />&lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/HTML&gt;</p><img src ="http://www.cnitblog.com/cqrandy/aggbug/11166.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cqrandy/" target="_blank">CqRandy</a> 2006-05-29 09:19 <a href="http://www.cnitblog.com/cqrandy/archive/2006/05/29/11166.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]XP 风格的可拖动列、可排序、可改变宽度的DataGrid的例子</title><link>http://www.cnitblog.com/cqrandy/archive/2006/05/29/11165.html</link><dc:creator>CqRandy</dc:creator><author>CqRandy</author><pubDate>Mon, 29 May 2006 01:13:00 GMT</pubDate><guid>http://www.cnitblog.com/cqrandy/archive/2006/05/29/11165.html</guid><wfw:comment>http://www.cnitblog.com/cqrandy/comments/11165.html</wfw:comment><comments>http://www.cnitblog.com/cqrandy/archive/2006/05/29/11165.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cqrandy/comments/commentRss/11165.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cqrandy/services/trackbacks/11165.html</trackback:ping><description><![CDATA[
		<p>结合客户端脚本，我们可以创建出可以拖动列，可以拖动改变列宽度，显示、隐藏列、编辑列的XP风格的 DataGrid，下面就是所有的代码。自己调试时请注意修改eMeng.Exam.UltraGrid路径。</p>
		<p>
				<b>
						<a href="http://dotnet.aspx.cc/Exam/UltraGrid/UltraGrid.aspx" target="_blank">查看例子</a>
				</b>
		</p>
		<p>
				<b>UltraGrid.aspx</b>
		</p>
		<xmp><![CDATA[<%@ Page language="c#" Codebehind="UltraGrid.aspx.cs" AutoEventWireup="false"
 Inherits="eMeng.Exam.UltraGrid.UltraGrid" %>]]&gt;<head><title>XP 风格的可拖动列、可排序、可改变宽度的DataGrid的例子</title><meta http-equiv="content-type" content="text/html; charset=gb2312" /><meta name="GENERATOR" content="Microsoft Visual Studio 7.0" /><meta name="CODE_LANGUAGE" content="C#" /><link rel="stylesheet" type="text/css" href="UltraGrid.css" /><meta name="vs_defaultClientScript" content="JavaScript" /><meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5" /></head><body ms_positioning="GridLayout"><form id="DragableXpStyleTable" method="post" runat="server"><div align="center" style="PADDING:5px"><b> XP 风格的可拖动列、可排序、可改变宽度的DataGrid的例子。</b></div><div id="coolUltraGrid1" runat="server"><div class="gridHead"><div class="gridRow" id="gridRow" runat="server"></div></div><asp:literal id="RowItem" runat="server"></asp:literal></div></form></body></xmp>
</html>
<html>
		<p>
				<b>UltraGrid.aspx.cs</b>
		</p>
		<xmp>using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace eMeng.Exam.UltraGrid
{
 /// <summary>
 /// UltraGrid 的摘要说明。本例子演示了如何创建可排序、可拖放、可调整宽度的XP风格的DataGrid。
 /// 出自：【孟宪会之精彩世界】
 /// </summary>
 public class UltraGrid : System.Web.UI.Page
 {
  protected System.Web.UI.HtmlControls.HtmlGenericControl gridRow;
  protected System.Web.UI.WebControls.Literal RowItem;
  protected System.Web.UI.HtmlControls.HtmlGenericControl coolUltraGrid1;
  private void Page_Load(object sender, System.EventArgs e)
  {
   // 在此处放置用户代码以初始化页面
   coolUltraGrid1.Attributes.Add("class","coolUltraGrid");
   coolUltraGrid1.Attributes.Add("style","WIDTH: 100%; HEIGHT: 400");
   coolUltraGrid1.Attributes.Add("borderStyle","2");
   coolUltraGrid1.Attributes.Add("altRowColor","oldLace");
   coolUltraGrid1.Attributes.Add("selectionStyle","1");

   /// 请根据你的数据库的设置，修改这里的数据库连接字符串和查询语句。其它不要修改。
   OleDbConnection cn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\xxx.mdb");
   cn.Open();
   string sqlstring = "SELECT TOP 30 D.Title As 文档标题,D.CreateDate as 发布时间,S.Title AS 所属栏目 ";
   sqlstring += "FROM Document D,Subject S WHERE D.pid=S.id ORDER BY D.CreateDate DESC";
   OleDbCommand cmd = new OleDbCommand(sqlstring,cn);
   OleDbDataReader dr;
   dr=cmd.ExecuteReader(CommandBehavior.CloseConnection);
   ///
   ///组合表头
   ///
   int FieldNumber = dr.FieldCount;
   int ColWidth,Tmp = 0;
   if(FieldNumber == 0)
    Response.End();
   ColWidth = (int)100/FieldNumber;
   string TableHeader = "";
   for(int i=0;i<fieldnumber;i++) {="" if(dr.read())="" if(i="=FieldNumber-1)" tableheader="" +="&lt;span width='" +(100-tmp).tostring()+"%'="">"+dr.GetName(i).ToString()+"";
     else
      TableHeader +="<span width="&quot;+ColWidth.ToString()+&quot;%">"+dr.GetName(i).ToString()+"</span>";
     Tmp+=ColWidth;
    }
   }
   gridRow.InnerHtml=TableHeader;
   int RowNumber = 1;
   TableHeader = "<div class="gridBody">";
   while(dr.Read())
   {
    TableHeader += "<div class="gridRow" id="row&quot;+RowNumber.ToString()+&quot;">";
    for(int i=0;i";
    }
    TableHeader += "</div>";
    RowNumber++;
   }
   TableHeader += "</div>";
   RowItem.Text=TableHeader;
   cn.Close();
  }
#region Web Form Designer generated code
  override protected void OnInit(EventArgs e)
  {
   //
   // CODEGEN：该调用是 ASP.NET Web 窗体设计器所必需的。
   //
   InitializeComponent();
   base.OnInit(e);
  }

  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {
   this.Load += new System.EventHandler(this.Page_Load);

  }
#endregion
 }
}
</fieldnumber;i++)></xmp>
<img src ="http://www.cnitblog.com/cqrandy/aggbug/11165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cqrandy/" target="_blank">CqRandy</a> 2006-05-29 09:13 <a href="http://www.cnitblog.com/cqrandy/archive/2006/05/29/11165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]如何点击按钮弹出新窗口，输入数据后返回并刷新页面？</title><link>http://www.cnitblog.com/cqrandy/archive/2006/05/29/11163.html</link><dc:creator>CqRandy</dc:creator><author>CqRandy</author><pubDate>Mon, 29 May 2006 01:08:00 GMT</pubDate><guid>http://www.cnitblog.com/cqrandy/archive/2006/05/29/11163.html</guid><wfw:comment>http://www.cnitblog.com/cqrandy/comments/11163.html</wfw:comment><comments>http://www.cnitblog.com/cqrandy/archive/2006/05/29/11163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cqrandy/comments/commentRss/11163.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cqrandy/services/trackbacks/11163.html</trackback:ping><description><![CDATA[
		<p>WebForm2.aspx:<br /><br />&lt;%@ Page language="c#" Codebehind="WebForm2.aspx.cs" AutoEventWireup="false" Inherits="ChenFeng.WebForm2" %&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;WebForm2&lt;/title&gt;<br />  &lt;meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"&gt;<br />  &lt;meta name="CODE_LANGUAGE" Content="C#"&gt;<br />  &lt;meta name="vs_defaultClientScript" content="JavaScript"&gt;<br />  &lt;meta name="vs_targetSchema" content="<a href="http://schemas.microsoft.com/intellisense/ie5">http://schemas.microsoft.com/intellisense/ie5</a>"&gt;<br /> &lt;/HEAD&gt;<br /> &lt;body MS_POSITIONING="GridLayout"&gt;<br />  &lt;div align="center"&gt;&lt;form id="Form1" method="post" runat="server"&gt;<br />    &lt;asp:label id="Label1" runat="server" font-bold="true"&gt;<br />    从当前页面打开新窗口，并把变量传递到新窗口的例子，可以多次打开提交。<br />    &lt;/asp:label&gt;&lt;br&gt;<br />    &lt;br&gt;<br />    &lt;asp:textbox id="TextBox1" runat="server" width="600px"&gt;&lt;/asp:textbox&gt;&lt;br&gt;<br />    &lt;br&gt;<br />    &lt;asp:button id="Button1" runat="server" text="打开窗口" width="96px"&gt;&lt;/asp:button&gt;&lt;/form&gt;<br />  &lt;/div&gt;<br /> &lt;/body&gt;<br />&lt;/HTML&gt;<br /><br /><br />WebForm2.aspx.cs<br /><br /><br />using System;<br />using System.Web.UI;<br />using System.Web.UI.HtmlControls;<br />using System.Web.UI.WebControls;</p>
		<p>namespace ChenFeng<br />{<br /> /// &lt;summary&gt;<br /> /// WebForm2 的摘要说明。<br /> /// &lt;/summary&gt;<br /> public class WebForm2 : Page<br /> {<br />  protected Label Label1;<br />  protected TextBox TextBox1;<br />  protected Button Button1;<br />  protected HtmlForm Form1;</p>
		<p>  private void Page_Load(object sender, EventArgs e)<br />  {<br />   // 在此处放置用户代码以初始化页面<br />   if (!IsClientScriptBlockRegistered("clientScript"))<br />   {<br />    string strScript = "&lt;script&gt;{"+"\r\n";<br />    strScript += "function OpenWin(){" + "\r\n";<br />    strScript += "var str=window.showModalDialog('WebForm3.aspx',document.Form1.TextBox1.value)" + "\r\n";<br />    strScript += "if(str!=null)  document.Form1.TextBox1.value=str" + "\r\n";<br />    strScript += "}" + "\r\n";<br />    strScript += "}&lt;/script&gt;" + "\r\n";<br />    RegisterClientScriptBlock("clientScript", strScript);<br />   }<br />   Button1.Attributes.Add("onclick", "OpenWin()");</p>
		<p>  }</p>
		<p>  #region Web 窗体设计器生成的代码</p>
		<p>  override protected void OnInit(EventArgs e)<br />  {<br />   //<br />   // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。<br />   //<br />   InitializeComponent();<br />   base.OnInit(e);<br />  }</p>
		<p>  /// &lt;summary&gt;<br />  /// 设计器支持所需的方法 - 不要使用代码编辑器修改<br />  /// 此方法的内容。<br />  /// &lt;/summary&gt;<br />  private void InitializeComponent()<br />  {<br />   this.Load += new EventHandler(this.Page_Load);</p>
		<p>  }</p>
		<p>  #endregion<br /> }<br />}<br /><br /><br />WebForm3.axpx<br /><br />&lt;%@ Page language="c#" Codebehind="WebForm3.aspx.cs" AutoEventWireup="false" Inherits="ChenFeng.WebForm3" %&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;WebForm3&lt;/title&gt;<br />  &lt;meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"&gt;<br />  &lt;meta name="CODE_LANGUAGE" Content="C#"&gt;<br />  &lt;meta name="vs_defaultClientScript" content="JavaScript"&gt;<br />  &lt;meta name="vs_targetSchema" content="<a href="http://schemas.microsoft.com/intellisense/ie5">http://schemas.microsoft.com/intellisense/ie5</a>"&gt;<br /> &lt;/HEAD&gt;<br /> &lt;body MS_POSITIONING="GridLayout" id="MyBody" runat="server"&gt;<br />  &lt;form id="Form1" method="post" runat="server"&gt;<br />   &lt;asp:label id="Label1" runat="server"&gt;请输入您的大名：&lt;/asp:label&gt;&lt;br&gt;<br />   &lt;br&gt;<br />   &lt;asp:textbox id="TextBox1" runat="server" width="558"&gt;&lt;/asp:textbox&gt;&lt;br&gt;<br />   &lt;br&gt;<br />   &lt;asp:button id="Button1" runat="server" text=" 提  交 "&gt;&lt;/asp:button&gt;&lt;/form&gt;<br /> &lt;/body&gt;<br />&lt;/HTML&gt;<br /><br />WebForm3.aspx.cs<br /><br />using System;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;</p>
		<p>namespace ChenFeng<br />{<br /> /// &lt;summary&gt;<br /> /// WebForm3 的摘要说明。<br /> /// &lt;/summary&gt;<br /> public class WebForm3 : Page<br /> {<br />  protected Label Label1;<br />  protected TextBox TextBox1;<br />  protected Button Button1;<br />  protected System.Web.UI.HtmlControls.HtmlControl MyBody;</p>
		<p>  private void Page_Load(object sender, EventArgs e)<br />  {<br />   // 在此处放置用户代码以初始化页面<br />   if (IsPostBack)<br />   {<br />    string strScript = "&lt;script&gt;{" + "\r\n";<br />    strScript += "window.parent.returnValue='" + TextBox1.Text.Replace("'", "\'") + "'" + "\r\n";<br />    strScript += "window.parent.close()" + "\r\n";<br />    strScript += "}&lt;/script&gt;" + "\r\n";<br />    if (! IsClientScriptBlockRegistered("clientScript"))<br />    {<br />     RegisterClientScriptBlock("clientScript", strScript);<br />    }<br />   }<br />   if (! IsPostBack)<br />   {<br />    MyBody.Attributes.Add("onload", "document.Form1.TextBox1.value=window.parent.dialogArguments");<br />   }</p>
		<p>  }</p>
		<p>  #region Web 窗体设计器生成的代码</p>
		<p>  override protected void OnInit(EventArgs e)<br />  {<br />   //<br />   // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。<br />   //<br />   InitializeComponent();<br />   base.OnInit(e);<br />  }</p>
		<p>  /// &lt;summary&gt;<br />  /// 设计器支持所需的方法 - 不要使用代码编辑器修改<br />  /// 此方法的内容。<br />  /// &lt;/summary&gt;<br />  private void InitializeComponent()<br />  {<br />   this.Load += new EventHandler(this.Page_Load);</p>
		<p>  }</p>
		<p>  #endregion<br /> }<br />}</p>
<img src ="http://www.cnitblog.com/cqrandy/aggbug/11163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cqrandy/" target="_blank">CqRandy</a> 2006-05-29 09:08 <a href="http://www.cnitblog.com/cqrandy/archive/2006/05/29/11163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转贴]利用WebService实现简单的在线升级</title><link>http://www.cnitblog.com/cqrandy/archive/2006/05/16/10586.html</link><dc:creator>CqRandy</dc:creator><author>CqRandy</author><pubDate>Tue, 16 May 2006 03:17:00 GMT</pubDate><guid>http://www.cnitblog.com/cqrandy/archive/2006/05/16/10586.html</guid><wfw:comment>http://www.cnitblog.com/cqrandy/comments/10586.html</wfw:comment><comments>http://www.cnitblog.com/cqrandy/archive/2006/05/16/10586.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cqrandy/comments/commentRss/10586.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cqrandy/services/trackbacks/10586.html</trackback:ping><description><![CDATA[
		<p>//这是一个webservice</p>
		<p>private AppUpdate.UpdateServ  UpdateSvr;</p>
		<p>
				<br />  private void button1_Click(object sender, System.EventArgs e)<br />  {<br />    <br />   if(LinkWebServices()==true)<br />   {<br />    this.label1.Text="连接服务器....... PASS";<br />    <br />    if(CheckVer()==true)<br />    {<br />     this.label2.Text="检查最新版本并下载.......PASS";<br />                   <br />    }<br />    else<br />    {<br />     this.label2.Text="检查最新版本并下载.......FAIL";<br />    }<br />   }<br />   else<br />   {<br />    this.label1.Text="连接服务器.......FAIL";<br />   }<br />  }</p>
		<p>//这是用来与升级服务器建立连接<br />  private bool LinkWebServices()<br />  {<br />   try<br />   {<br />    UpdateSvr=new UpdateServ();<br />    return true;<br />   }<br />   catch<br />   {<br />    return false;<br />   }<br />  }</p>
		<p>//调用webservice用来检查是不是有最新的版本<br />  private bool CheckVer()<br />  {<br />   string path =Application.StartupPath;<br />   try<br />   {<br />    VersionCheck(path);<br />    return true;<br />   }<br />   catch(Exception ex)<br />   {<br />    MessageBox.Show(ex.ToString());<br />    return false;<br />   }<br />  }</p>
		<p>  private void VersionCheck(string desPath)<br />  {<br />   try<br />   {<br />    #region 查看文件和目录<br />    if(!desPath.EndsWith(@"\"))<br />     desPath += @"\";</p>
		<p>    if(!System.IO.Directory.Exists(desPath))<br />    {<br />     System.IO.Directory.CreateDirectory(desPath);<br />    }</p>
		<p>    string tempPath = desPath + @"tempDesPathCache\";</p>
		<p>    if(System.IO.Directory.Exists(tempPath))<br />    {<br />     System.IO.Directory.Delete(tempPath,true);<br />     System.IO.Directory.CreateDirectory(tempPath);<br />    }<br />    else<br />     System.IO.Directory.CreateDirectory(tempPath);</p>
		<p>    if(!System.IO.File.Exists(desPath + "UpdateConfig.xml"))<br />    {<br />     System.Xml.XmlDocument updateConfig = new System.Xml.XmlDocument();<br />     updateConfig.LoadXml(@"&lt;root&gt;&lt;/root&gt;");<br />     updateConfig.Save(desPath + "UpdateConfig.xml");<br />    }<br />    #endregion</p>
		<p>   <br />    System.Xml.XmlDocument serverXmlDoc = UpdateSvr.AppUpdateVertion();<br />    System.Xml.XmlDocument localXmlDoc = new System.Xml.XmlDocument();<br />    localXmlDoc.Load(desPath + "UpdateConfig.xml");<br />    bool newVersionExist = false;<br />    bool moduleExist = false;<br />    System.Xml.XmlNode serverNode0 = serverXmlDoc.ChildNodes[0];<br />    System.Xml.XmlNode localNode0 = localXmlDoc.ChildNodes[0];<br />    foreach(System.Xml.XmlNode serverNode in serverNode0)<br />    {<br />     moduleExist = false;<br />     foreach(System.Xml.XmlNode localNode in localNode0)<br />     {<br />      //找到对应模块<br />      if(localNode.ChildNodes[0].InnerText == serverNode.ChildNodes[0].InnerText)<br />      {<br />       moduleExist = true;<br />       //版本号判断<br />       if(localNode.ChildNodes[1].InnerText.CompareTo(serverNode.ChildNodes[1].InnerText) &lt; 0)<br />       {<br />        newVersionExist = true;<br />        if(System.Configuration.ConfigurationSettings.AppSettings["NetStyle"].ToString()=="internet")<br />        {<br />         DownloadFile(serverNode.ChildNodes[2].InnerText,tempPath + serverNode.ChildNodes[0].InnerText);<br />        }<br />        else<br />        {<br />         DownloadFile(serverNode.ChildNodes[3].InnerText,tempPath + serverNode.ChildNodes[0].InnerText);<br />        }<br />       }<br />       break;<br />      }<br />     }<br />     //没找到对应模块<br />     if(false == moduleExist)<br />     {<br />      <br />      if(System.Configuration.ConfigurationSettings.AppSettings["NetStyle"].ToString()=="internet")<br />      {<br />       DownloadFile(serverNode.ChildNodes[2].InnerText,tempPath + serverNode.ChildNodes[0].InnerText);<br />      }<br />      else<br />      {<br />       DownloadFile(serverNode.ChildNodes[3].InnerText,tempPath + serverNode.ChildNodes[0].InnerText);<br />      }<br />     }<br />    }<br />    //写入新UpdateConfig.xml升级完毕后替换<br />    if(newVersionExist)<br />    {<br />     serverXmlDoc.Save(tempPath + "UpdateConfig.xml");<br />     if(DialogResult.Yes == MessageBox.Show("有新版本，是否更新?","提示",MessageBoxButtons.YesNo))<br />     {<br />      string[] dirs = System.IO.Directory.GetFiles(tempPath, "*.*");<br />      string fileName;<br />      foreach (string dir in dirs)<br />      {<br />       fileName = ((dir.Split(Convert.ToChar(@"\")))[dir.Split(Convert.ToChar(@"\")).Length - 1]);<br />       if(System.IO.File.Exists(desPath + fileName))<br />       {<br />        //TODO:可以支持备份以前版本<br />        System.IO.File.Delete(desPath + fileName);<br />       }<br />       //TODO:如果系统正在运行，您得停止系统，至于如何停止，也许可以使用System.Diagnostics.Process<br />       System.IO.File.Move(dir,desPath + fileName);<br />      }<br />      MessageBox.Show("升级完毕");<br />     }<br />     else<br />     {<br />      //TODO:可以支持重新提示升级<br />     }<br />    }<br />   }<br />   catch(Exception ex)<br />   {<br />    throw new Exception("升级失败，原因是：" + ex.Message,ex);<br />   }<br />  }</p>
		<p>//下载最新的文件</p>
		<p>  private void DownloadFile(string source,string fileName)<br />  {<br />   try<br />   {<br />    System.Net.WebClient myWebClient = new System.Net.WebClient();<br />    myWebClient.DownloadFile(source,fileName);<br />   }<br />   catch(Exception ex)<br />   {<br />    throw new Exception("下载失败，原因是：" + ex.Message,ex);<br />   }<br />  }<br /><br />webservices如下:</p>
		<p>[WebMethod(Description = "取得更新版本")]<br />    public string GetVer()<br />    {<br />        XmlDocument doc = new XmlDocument();<br />        doc.Load(Server.MapPath("update/update.xml"));<br />        XmlElement root = doc.DocumentElement;<br />        return root.SelectSingleNode("version").InnerText;<br />    }</p>
		<p>    [WebMethod(Description = "在线更新软件")]<br />    public System.Xml.XmlDocument GetUpdateData()<br />    {<br />        //取得更新的xml模板内容 <br />        XmlDocument doc = new XmlDocument();<br />        doc.Load(Server.MapPath("update/update.xml"));<br />        XmlElement root = doc.DocumentElement;<br />        //看看有几个文件需要更新 <br />        XmlNode updateNode = root.SelectSingleNode("filelist");<br />        string path = updateNode.Attributes["sourcepath"].Value;<br />        int count = int.Parse(updateNode.Attributes["count"].Value);<br />        //将xml中的value用实际内容替换 <br />        for (int i = 0; i &lt; count; i++)<br />        {<br />            XmlNode itemNode = updateNode.ChildNodes[i];<br />            string fileName = path + itemNode.Attributes["name"].Value;<br />            FileStream fs = File.OpenRead(Server.MapPath(fileName));<br />            itemNode.Attributes["size"].Value = fs.Length.ToString();<br />            BinaryReader br = new BinaryReader(fs);<br />            //这里是文件的实际内容，使用了Base64String编码 <br />            itemNode.SelectSingleNode("value").InnerText = Convert.ToBase64String(br.ReadBytes((int)fs.Length), 0, (int)fs.Length);<br />            br.Close();<br />            fs.Close();<br />        }<br />        return doc;<br />    }<br /><br />再建一个xml<br />&lt;?xml version="1.0" encoding="utf-8" ?&gt;<br />&lt;product&gt;<br />  &lt;version&gt;1.0.1818.42821&lt;/version&gt;<br />  &lt;description&gt;修正一些Bug&lt;/description&gt;<br />  &lt;filelist count="7" sourcepath="./update/"&gt;<br />    &lt;item name="WinQp.exe" size=""&gt;<br />      &lt;value /&gt;<br />    &lt;/item&gt;<br />    &lt;item name="AccessDAL.dll" size=""&gt;<br />      &lt;value /&gt;<br />    &lt;/item&gt;<br />    &lt;item name="LocalBLL.dll" size=""&gt;<br />      &lt;value /&gt;<br />    &lt;/item&gt;<br />    &lt;item name="Model.dll" size=""&gt;<br />      &lt;value /&gt;<br />    &lt;/item&gt;<br />    &lt;item name="MyADO.dll" size=""&gt;<br />      &lt;value /&gt;<br />    &lt;/item&gt;<br />    &lt;item name="Common.dll" size=""&gt;<br />      &lt;value /&gt;<br />    &lt;/item&gt;<br />    &lt;item name="Excel.dll" size=""&gt;<br />      &lt;value /&gt;<br />    &lt;/item&gt;<br />  &lt;/filelist&gt;<br />&lt;/product&gt;<br />放在服务器上<br /><br />再新建 一个升级程序,在主程序下调用这个程序,升级程序内容为<br />            if (!File.Exists(Application.StartupPath+"<a href="file://\\update.xml">\\update.xml</a>"))<br />            {<br />                MessageBox.Show("升级程序不能单独运行！");<br />                Application.Exit();<br />            }<br />            System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcesses();<br />            foreach (System.Diagnostics.Process p in ps)<br />            {<br />                //MessageBox.Show(p.ProcessName.ToLower());<br />                if (p.ProcessName.ToLower() == "qpwin")<br />                {<br />                    if (!p.HasExited)<br />                    {<br />                        p.Kill();<br />                        p.WaitForExit();<br />                    }<br />                    break;<br />                }<br />            }<br />            XmlDocument doc = new XmlDocument();<br />            doc.Load(Application.StartupPath + @"\update.xml");<br />            XmlElement root = doc.DocumentElement;<br />            XmlNode updateNode = root.SelectSingleNode("filelist");<br />            string path = updateNode.Attributes["sourcepath"].Value;<br />            int count = int.Parse(updateNode.Attributes["count"].Value);<br />            for (int i = 0; i &lt; count; i++)<br />            {<br />                XmlNode itemNode = updateNode.ChildNodes[i];<br />                string fileName = itemNode.Attributes["name"].Value;<br />                FileInfo fi = new FileInfo(fileName);<br />                fi.Delete();<br />                //File.Delete(Application.StartupPath + @"\" + fileName); <br />                this.label1.Text = "正在更新： " + fileName + " (" + itemNode.Attributes["size"].Value + ") ...";<br />                FileStream fs = File.Open(fileName, FileMode.Create, FileAccess.Write);<br />                fs.Write(System.Convert.FromBase64String(itemNode.SelectSingleNode("value").InnerText), 0, int.Parse(itemNode.Attributes["size"].Value));<br />                fs.Close();<br />            }<br />            label1.Text = "更新完成";<br />            File.Delete(Application.StartupPath + @"\update.xml");<br />            label1.Text = "正在重新启动应用程序...";<br />            System.Diagnostics.Process.Start("qpwin.exe");<br />            Close();<br />            Application.Exit();<br /></p>
<img src ="http://www.cnitblog.com/cqrandy/aggbug/10586.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cqrandy/" target="_blank">CqRandy</a> 2006-05-16 11:17 <a href="http://www.cnitblog.com/cqrandy/archive/2006/05/16/10586.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转载)asp.net生成高质量缩略图通用函数(c#代码),支持多种生成方式</title><link>http://www.cnitblog.com/cqrandy/archive/2006/04/25/9633.html</link><dc:creator>CqRandy</dc:creator><author>CqRandy</author><pubDate>Tue, 25 Apr 2006 00:56:00 GMT</pubDate><guid>http://www.cnitblog.com/cqrandy/archive/2006/04/25/9633.html</guid><wfw:comment>http://www.cnitblog.com/cqrandy/comments/9633.html</wfw:comment><comments>http://www.cnitblog.com/cqrandy/archive/2006/04/25/9633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cqrandy/comments/commentRss/9633.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cqrandy/services/trackbacks/9633.html</trackback:ping><description><![CDATA[在网站开发时,生成缩略图是一个非常常见和实用的功能.以前在asp里只能借助com组件实现,现在在.net里可以利用框架的强大的类库轻松实现.下面帖出完整的代码(带详细注释),参考了网上的一些文章及.net sdk相关内容.QQROOM网络家园的图片上传用到了所有的4种生成方式.
<p><font color="#808080">        ///</font><span style="COLOR: #008000"></span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br />        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> 生成缩略图<br />        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"></span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #008000"><br />        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"></span><span style="COLOR: #808080">&lt;param name="originalImagePath"&gt;</span><span style="COLOR: #008000">源图路径（物理路径）</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #008000"><br />        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"></span><span style="COLOR: #808080">&lt;param name="thumbnailPath"&gt;</span><span style="COLOR: #008000">缩略图路径（物理路径）</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #008000"><br />        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"></span><span style="COLOR: #808080">&lt;param name="width"&gt;</span><span style="COLOR: #008000">缩略图宽度</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #008000"><br />        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"></span><span style="COLOR: #808080">&lt;param name="height"&gt;</span><span style="COLOR: #008000">缩略图高度</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #008000"><br />        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"></span><span style="COLOR: #808080">&lt;param name="mode"&gt;</span><span style="COLOR: #008000">生成缩略图的方式</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #008000">    </span><span style="COLOR: #808080"><br /></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> MakeThumbnail(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> originalImagePath, </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> thumbnailPath, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> width, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> height, </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> mode)<br />        {<br />            Image originalImage </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Image.FromFile(originalImagePath);<br />            <br />            </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> towidth </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> width;<br />            </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> toheight </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> height;<br />        <br />            </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"></span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br />            </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> y </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"></span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br />            </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> ow </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> originalImage.Width;<br />            </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> oh </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> originalImage.Height;        <br /><br />            </span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000"> (mode)<br />            {        <br />                </span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000"></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">HW</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">:</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">指定高宽缩放（可能变形）                </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">                    </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br />                </span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000"></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">W</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">:</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">指定宽，高按比例                    </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">                    toheight </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> originalImage.Height </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> width</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">originalImage.Width;<br />                    </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br />                </span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000"></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">H</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">:</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">指定高，宽按比例</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">                    towidth </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> originalImage.Width </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> height</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">originalImage.Height;                    <br />                    </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;        <br />                </span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000"></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Cut</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">:</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">指定高宽裁减（不变形）                </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">                    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">((</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">)originalImage.Width</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">)originalImage.Height </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">)towidth</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">)toheight)<br />                    {<br />                        oh </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> originalImage.Height;<br />                        ow </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> originalImage.Height</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">towidth</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">toheight;<br />                        y </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"></span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br />                        x </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (originalImage.Width </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> ow)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br />                    }<br />                    </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br />                    {<br />                        ow </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> originalImage.Width;<br />                        oh </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> originalImage.Width</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">height</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">towidth;<br />                        x </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"></span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br />                        y </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (originalImage.Height </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> oh)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br />                    }<br />                    </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;                    <br />                </span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000"> :<br />                    </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br />            }    <br />            <br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">新建一个bmp图片</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            Image bitmap </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> System.Drawing.Bitmap(towidth,toheight);<br /><br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">新建一个画板</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            Graphics g </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> System.Drawing.Graphics.FromImage(bitmap);<br /><br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置高质量插值法</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            g.InterpolationMode </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> System.Drawing.Drawing2D.InterpolationMode.High;<br /><br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置高质量,低速度呈现平滑程度</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            g.SmoothingMode </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> System.Drawing.Drawing2D.SmoothingMode.HighQuality;<br /><br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">清空画布并以透明背景色填充</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            g.Clear(Color.Transparent);        <br /><br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在指定位置并且按指定大小绘制原图片的指定部分</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            g.DrawImage(originalImage, </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Rectangle(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, towidth, toheight), <br />                </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Rectangle(x, y, ow,oh),<br />                GraphicsUnit.Pixel);<br /><br />            </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br />            {            <br />                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">以jpg格式保存缩略图</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">                bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);<br />            }<br />            </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(System.Exception e)<br />            {<br />                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> e;<br />            }<br />            </span><span style="COLOR: #0000ff">finally</span><span style="COLOR: #000000"><br />            {<br />                originalImage.Dispose();<br />                bitmap.Dispose();                        <br />                g.Dispose();<br />            }<br />        }</span></p><p><span style="COLOR: #000000">关键方法Graphics.DrawImage见ms-help://MS.NETFrameworkSDKv1.1.CHS/cpref/html/frlrfsystemdrawinggraphicsclassdrawimagetopic11.htm</span></p><img src ="http://www.cnitblog.com/cqrandy/aggbug/9633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cqrandy/" target="_blank">CqRandy</a> 2006-04-25 08:56 <a href="http://www.cnitblog.com/cqrandy/archive/2006/04/25/9633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>