ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美一区二区三区四区视频,伊人开心综合网,在线精品观看国产http://www.aygfsteel.com/wangxinsh55/category/19400.htmlzh-cnThu, 10 Jan 2008 02:23:04 GMTThu, 10 Jan 2008 02:23:04 GMT60如何¾ŸŽåŒ–ä½ çš„.net 应用½E‹åºhttp://www.aygfsteel.com/wangxinsh55/archive/2008/01/09/173975.htmlSIMONESIMONEWed, 09 Jan 2008 05:08:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2008/01/09/173975.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/173975.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2008/01/09/173975.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/173975.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/173975.html利用.net技术能够快速开发出应用½E‹åºåQŒä½†æ˜¯å¦‚果应用微软的那一套技术,做出来的½E‹åºå¤§å¤šæ•°ç¨‹åºå‘˜ææ€•都会有一¿Uåƒ½‹‡ä¸€å¾‹çš„æ„Ÿè§‰åQšæŒ‰é’®è¿˜æ˜¯é‚£ä¸ªæŒ‰é’®ï¼ˆåªæ˜¯æ–‡å­—ä¸åŒåQ‰ï¼Œæ–‡æœ¬æ¡†è¿˜æ˜¯é‚£ä¸ªæ–‡æœ¬æ¡†åQ?nbsp;下拉列表˜q˜æ˜¯é‚£ä¸ªä¸‹æ‹‰åˆ—表........è·Ÿç³»¾lŸé‡Œçš„æ²¡æœ‰ä»€ä¹ˆä¸¤æ øP¼Œä¸ç®¡½E‹åºæ€Žä¹ˆæ øP¼Œè‡›_°‘˜q™ä¸ªç•Œé¢æ²¡ä»€ä¹ˆæ–°æ„ã€?/p>

诚然åQŒç›®å‰ä¹Ÿæœ‰ä¸ž®‘第三方的控ä»Óž¼Œå¦‚Xceed Ultimate Suite、ComponentOne.Studio、Infragistics.NetAdvantage½{‰ç­‰åQŒä‹É用这些控件大多需要再èŠ×ƒ¸€å®šæ—¶é—´åŽ»æŽŒæ¡˜q™äº›æŽ§äšg的用法,而且有些做得不是很好åQŒæˆ‘曄¡»è§è¿‡ä¸€ä¸ªå•†ä¸šæŽ§ä»‰™‡Œé¢å¾ˆå¤šæ˜¯ç”Õd‡ºæ¥çš„åQŒä¸èƒ½åƒVS.net自带的控仉™‚£æ ·åœ¨IDE上灵‹zÀLާåˆÓž¼ŒçŽ°åœ¨¾l™å¤§å®¶å±•½CÞZ¸€ä¸ªå¾ˆ½Ž€å•的换皮肤控ä»Óž¼Œå…ˆä¸è¯´åˆ«çš„,让大家看看效果:

看到上面的界面心动了吗?告诉大家åQŒæˆ‘用的都是VS2005的标准控ä»Óž¼Œå®žçŽ°æ¢çš®è‚¤çš„åŠŸèƒ½ä¹Ÿä»…ä»…æ˜¯æ•°è¡Œä»£ç è€Œå·²åQŒä¹Ÿž®±æ˜¯è¯´ä»¥å‰ç†Ÿæ‚‰çš„æŽ§äšg˜q˜ç…§å¸æ€‹É用ã€?/p>

先介¾lä¸€ä¸‹è¿™å¥—控件吧åQŒè¿™å¥—控件仅有一个dllåQˆIrisSkin2.dllåQ‰æ–‡ä»¶å’Œä¸€ä¸ªskinæ–‡äšg夹,skinæ–‡äšg夹下共有22个子文äšg夹,每个子文件夹其实ž®±æ˜¯ä¸€å¥—界面风æ û|¼Œä¹Ÿå°±æ˜¯è¯´æˆ‘们可以使用22¿Uä¸åŒé£Žæ ¹{€?/p>

实现¾l™ç•Œé¢æ¢çš®è‚¤æœ‰ä¸¤¿Uåšæ³•:åQˆä¸€åQ‰æ‹·è´æ³•åQŒå³ä½¿å°†ç•Œé¢èµ„源夹下所有的文äšg拯‚´åˆ?exeæ–‡äšg所在的位置åQŒç„¶åŽåœ¨½E‹åº¿Ué€šè¿‡skinEngine1.SkinFile=fileName(fileName是皮肤文ä»?sskæ–‡äšg的位¾|?来设定界面皮肤,˜q™ç§åšæ³•通常是我们需要在Debugæ–‡äšg夹和Releaseæ–‡äšg各保存一套皮肤文ä»Óž¼Œå‘布½E‹åºçš„æ—¶å€™ä¹Ÿéœ€è¦é™„带这些文件。(二)嵌入资源法,本文ž®±æ˜¯é‡‡ç”¨˜q™ç§åŠžæ³•å®žçŽ°çš„ï¼Œ˜q™æ ·åšçš„好处是发布程序时åQˆä¸½Ž¡æ˜¯Debug版本或Release版本åQ‰æ—¶vs自动ž®†çš®è‚¤æ–‡ä»¶ç¼–译进exeæ–‡äšg中,减少½E‹åºå‘布时文件的个数åQŒè€Œä¸”也不用管½E‹åºä¸Žçš®è‚¤æ–‡ä»¶çš„相对位置ã€?/p>

首先打开VS工具½Ž±ï¼Œæ·ÕdŠ çš®è‚¤æŽ§äšg¾l„äšgåQŒå¦‚下图åQ?br />

然后在出现的“选择工具½Ž±é¡¹”中点å‡?#8220;‹¹è§ˆ”按钮åQŒç„¶åŽæ‰¾åˆ°IrisSkin2.dllæ–‡äšgåQŒç„¶å?#8220;¼‹®å®š”åQŒå…³é—­å¯¹è¯çª—口之后,皮肤控äšg¾l„äšgž®×ƒ¼šå‡ºçŽ°åœ¨ä½ çš„å·¥å…ïL®±ä¸Šäº†åQˆå…·ä½“出现在哪个分组跟你æ·ÕdŠ æ—¶æ·»åŠ å“ªä¸ªç»„æœ‰å…³åQ‰ï¼Œå¦‚下图:

åQˆæˆ‘不小心加到打印分¾l„去了,大家不要骂我åQšPåQ?/p>

好了åQŒçŽ°åœ¨å¯ä»¥ç¼–å†™ç¨‹åºæµ‹è¯•äº†åQŒåšä¸€ä¸ªç®€å•çš„½H—体吧,界面上的控äšg如上图所½Cºï¼Œç„¶åŽž®†çš®è‚¤ç»„件拖拽到界面上,之后需要把½E‹åºæ‰€éœ€è¦çš„皮肤资源文äšgæ·ÕdŠ ˜q›æ¥åQŒè¿™é‡Œæˆ‘是采用添加资源的办法ã€?/p>

步骤如下åQ?br /> åQˆä¸€åQ‰åœ¨WinForm工程上右键单å‡?#8220;属æ€?#8221;åQŒåœ¨å‡ºçŽ°çš„ç•Œé¢ä¸­ç‚?#8220;资源”选项卡,把所需的皮肤资源文件添加进来(通过“æ·ÕdŠ çŽ°æœ‰æ–‡äšg”命ä×oæ·ÕdŠ çš®è‚¤æ–‡äšgåQ‰ï¼Œå¦‚下图:

注意如果该皮肤文件夹下除äº?.sskæ–‡äšg之外åQŒè¿˜åŒ…含有其它图片文ä»Óž¼Œå»ø™®®ž®†å®ƒä»¬ä¹Ÿä½œäؓ资源æ·ÕdŠ åˆ°é¡¹ç›®ä¸­ã€‚æ·»åŠ å®Œæˆä¹‹åŽï¼Œæˆ‘ä»¬ž®±å¯ä»¥åœ¨ä»£ç ä¸­é€šè¿‡Properties.Resources.æ–‡äšg名来获取˜q™äº›æ–‡äšg的内容了åQŒé€šè¿‡˜q™ä¸ªæ–ÒŽ³•˜q”回的是文äšg内容的二˜q›åˆ¶æ•°æ®(byte[]),而skinEngine1.SkinStream需要的是一个Stream对象åQŒé€šè¿‡msdn我们可以以这个二˜q›åˆ¶æ•°æ®æž„徏一个Stream对象åQˆnew MemoryStream(byte[] bytes)åQ‰ï¼Œç„¶åŽèµ‹å€¼ç»™çš®è‚¤¾l„äšgçš„SkinStream属性,如果需要换皮肤åQŒé‡æ–°æž„å»ÞZ¸€ä¸ªçš®è‚¤èµ„源文件的Stream对象åQŒç„¶åŽé‡æ–°èµ‹å€¼å°±è¡Œäº†ã€?/p>

界面控äšg布局代码很简单,ž®×ƒ¸¾_˜è„“了,主要把后åîC»£ç æ”¾åœ¨è¿™é‡Œå§åQˆå…¶å®žä¹Ÿå¾ˆç®€å•ï¼Œä¸è¿‡éœ€è¦æ³¨æ„ï¼Œå› äØ“ä½¿ç”¨äº†MemoryStream对象åQŒå°±éœ€è¦åœ¨½E‹åºå¼•用½E‹åºé›†éƒ¨åˆ†æ·»åР坹IOæ–šw¢çš„引用:using System.IO;åQ?/p>

代码如下åQ?br />

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.IO;
using System.Windows.Forms;

namespace SkinForm
{
    
/// <summary>
    
/// è¯´æ˜ŽåQšè¿™æ˜¯ä¸€ä¸ªç®€å•çš„WinForm应用½E‹åºåQŒç”¨æ¥å±•½Cºå¦‚何ä‹É用换皮肤控äšg来实现我们需要的漂亮界面åQŒä»£ç å¾ˆ½Ž€å•ã€?br />     /// ä½œè€…:周公
    
/// æ—‰™—´åQ?008-1-8
    
/// é¦–发地址åQ?/span>http://blog.csdn.net/zhoufoxcn
    
/// </summary>
    public partial class MainForm : Form
    {
        
private MemoryStream memoryStream;
        
public MainForm()
        {
            InitializeComponent();
            SetSkinFile(Properties.Resources.MacOS);
        }

        
private void btnOK_Click(object sender, EventArgs e)
        {
            
if (rbMacOS.Checked)
            {
                SetSkinFile(Properties.Resources.MacOS);
            }
            
else if (rbMP10.Checked)
            {
                SetSkinFile(Properties.Resources.MP101);
            }
            
else if (rbMSN.Checked)
            {
                SetSkinFile(Properties.Resources.MSN1);
            }
            
else if (rbPage.Checked)
            {
                SetSkinFile(Properties.Resources.Page);
            }
            
else if (rbRealOne.Checked)
            {
                SetSkinFile(Properties.Resources.RealOne1);
            }
            
else if (rbVista1.Checked)
            {
                SetSkinFile(Properties.Resources.vista1_green1);
            }
            
else if (rbVista2.Checked)
            {
                SetSkinFile(Properties.Resources.Vista2_color11);
            }
            
else
            {
                SetSkinFile(Properties.Resources.XPBlue1);
            }
        }

        
private void SetSkinFile(byte[] bytes)
        {
            memoryStream
=new MemoryStream(bytes);
            
//讄¡½®çš®è‚¤å¯ä»¥é€šè¿‡ä¸¤ç§æ–¹å¼åQŒä¸€¿Uæ˜¯æŒ‡å®šçš®è‚¤æ–‡äšg的位¾|?
            
//如skinEngine1.SkinFile=fileName(fileName是皮肤文ä»?sskæ–‡äšg的位¾|?
            
//一¿Uæ˜¯æŒ‡å®šçš®è‚¤æ–‡äšg的文件流åQŒå¦‚本程序所½C?/span>
            skinEngine1.SkinStream = memoryStream;
            
        }
    }
}

½E‹åºç•Œé¢æ•ˆæžœå¦‚上面所½Cºã€?/p>

本文提到的皮肤组件可以到åQ?a >http://download.csdn.net/user/zhoufoxcn/下蝲ã€?/p>

]]>
C#.net模拟提交表单POSThttp://www.aygfsteel.com/wangxinsh55/archive/2007/06/22/125847.htmlSIMONESIMONEFri, 22 Jun 2007 07:18:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2007/06/22/125847.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/125847.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2007/06/22/125847.html#Feedback2http://www.aygfsteel.com/wangxinsh55/comments/commentRss/125847.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/125847.htmlSystem.Net.WebClient WebClientObj        = new System.Net.WebClient();
   System.Collections.Specialized.NameValueCollection PostVars  = new System.Collections.Specialized.NameValueCollection();
   PostVars.Add("A1","0");
   PostVars.Add("A2","0");
   PostVars.Add("A3","000");

   try
   {
    byte[] byRemoteInfo   = WebClientObj.UploadValues("http://www.lovezhao.com/vote.asp","POST",PostVars);
    //下面都没用啦åQŒå°±ä¸Šé¢ä¸€å¥è¯ž®±å¯ä»¥äº†
    string sRemoteInfo   = System.Text.Encoding.Default.GetString(byRemoteInfo); 
    //˜q™æ˜¯èŽ·å–˜q”回信息
    richTextBox_instr.Text  += sRemoteInfo;
   }
   catch
   {}



æ–ÒŽ³•二ã€?br>string url = "¾|‘址";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
string s = "要提交的数据";
byte[] requestBytes = System.Text.Encoding.ASCII.GetBytes (LoginInfo);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = requestBytes.Length;
Stream requestStream = req.GetRequestStream();
requestStream.Write(requestBytes,0,requestBytes.Length);
requestStream.Close();
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
StreamReader sr = new StreamReader(res.GetResponseStream(), System.Text.Encoding.Default);
string backstr = sr.ReadToEnd(); Response.Write(line); sr.Close(); res.Close();


]]>
C#¾~–写的生成羃略图½E‹åº http://www.aygfsteel.com/wangxinsh55/archive/2007/04/02/107995.htmlSIMONESIMONEMon, 02 Apr 2007 07:51:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2007/04/02/107995.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/107995.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2007/04/02/107995.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/107995.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/107995.html C#¾~–写的生成羃略图½E‹åº

if(fileupload.PostedFile!=null)
     {    
      //addto䏸™¦æ·ÕdŠ çš„å±žæ€§ï¼Œaboutfile为文件说æ˜?br>      string nam = fileupload.PostedFile.FileName ;
      //取得文äšgå?抱括路径)里最后一ä¸?."的烦å¼?br>      int i= nam.LastIndexOf(".");
      //取得文äšg扩展å?br>      string newext =nam.Substring(i);
      //˜q™é‡Œæˆ‘自动根据日期和文äšg大小不同为文件命å?¼‹®ä¿æ–‡äšg名不重复
      DateTime now = DateTime.Now;
      string newname=now.DayOfYear.ToString()+fileupload.PostedFile.ContentLength.ToString();
      //保存文äšgåˆîC½ æ‰€è¦çš„目录,˜q™é‡Œæ˜¯IIS根目录下的upload目录.你可以改å?
      //注意: 我这里用Server.MapPath()取当前文件的相对目录.在asp.neté‡?\"å¿…é¡»ç”?\\"代替åQŒæŠŠ"upload\\"æ”ÒŽˆ"\\upload\\"ž®±æˆäº†å–当前文äšg的绝对目录了
      fileupload.PostedFile.SaveAs(Server.MapPath("upload\\"+newname+newext));
      //得到˜q™ä¸ªæ–‡äšg的相兛_±žæ€?æ–‡äšgå?æ–‡äšg¾cÕdž‹,æ–‡äšg大小
      //fname.Text=myFile.PostedFile.FileName;
      //fenc.Text=myFile.PostedFile.ContentType ;
      //fsize.Text=myFile.PostedFile.ContentLength.ToString();
      //下面是生成羃略图
      System.Drawing.Image image,aNewImage;
      int width,height,newwidth,newheight;      
      image=System.Drawing.Image.FromFile(Server.MapPath("upload/"+newname.ToString()+newext.ToString()));
      System.Drawing.Image.GetThumbnailImageAbort callb =new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);    
      width=image.Width;
      height=image.Height;
      if(firstpageshow.SelectedValue.ToString()=="1"&&fenlei.SelectedValue.ToString()=="5")
      {
       newwidth=203;newheight=86;       
       newheight=height*newwidth/width;
      }
      else if(isweekman.SelectedValue.ToString()=="1")
      {
       newwidth=171;newheight=111;
       newheight=height*newwidth/width;
      }
      else if(firstpageshow.SelectedValue.ToString()=="1"&&fenlei.SelectedValue.ToString()=="3")
      {
       newwidth=171;newheight=111;
       newheight=height*newwidth/width;
      }
      else
      {
       newwidth=62;newheight=80;
       newheight=height*newwidth/width;
      }
      aNewImage=image.GetThumbnailImage(newwidth,newheight,callb,new System.IntPtr());
      aNewImage.Save(Server.MapPath("upload\\"+"small_"+newname+newext));
      image.Dispose();
      //生成¾~©ç•¥å›?生成òq¶ä¿å­˜å®Œæ¯•,保存名是在原囑֐å‰åŠ äº†ä¸€ä¸ªsmall_ã€?br>      pic="upload/"+newname.ToString()+newext.ToString();
      smallpic="upload/small_"+newname.ToString()+newext.ToString();
     }


 

]]>
ASP.NET2.0打通文件图片处理ä“Q督二è„?/title><link>http://www.aygfsteel.com/wangxinsh55/archive/2007/04/02/107994.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Mon, 02 Apr 2007 07:49:00 GMT</pubDate><guid>http://www.aygfsteel.com/wangxinsh55/archive/2007/04/02/107994.html</guid><wfw:comment>http://www.aygfsteel.com/wangxinsh55/comments/107994.html</wfw:comment><comments>http://www.aygfsteel.com/wangxinsh55/archive/2007/04/02/107994.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wangxinsh55/comments/commentRss/107994.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wangxinsh55/services/trackbacks/107994.html</trackback:ping><description><![CDATA[     摘要: ASP.NET2.0打通文件图片处理ä“Q督二è„?作者:清清月儿 主页åQšhttp://blog.csdn.net/21aspnet/           æ—‰™—´åQ?007.4.1 1.最½Ž€å•的单文件上ä¼?没花å¤?2.多文件上ä¼?.客户端检查上传文件类åž?ä»¥ä¸Šä¼ å›¾ç‰‡äØ“ä¾?4.服务器端‹‚€æŸ¥ä¸Šä¼ æ–‡ä»¶ç±»åž?..  <a href='http://www.aygfsteel.com/wangxinsh55/archive/2007/04/02/107994.html'>阅读全文</a><img src ="http://www.aygfsteel.com/wangxinsh55/aggbug/107994.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wangxinsh55/" target="_blank">SIMONE</a> 2007-04-02 15:49 <a href="http://www.aygfsteel.com/wangxinsh55/archive/2007/04/02/107994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Enterprise Library¾pÕdˆ—文章回顾与æ€È»“ http://www.aygfsteel.com/wangxinsh55/archive/2007/03/29/107228.htmlSIMONESIMONEThu, 29 Mar 2007 06:46:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2007/03/29/107228.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/107228.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2007/03/29/107228.html#Feedback1http://www.aygfsteel.com/wangxinsh55/comments/commentRss/107228.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/107228.htmlEnterprise Library 1.1 推出以来åQ?span lang="EN-US">Terry写了一¾pÕdˆ—的关äº?span lang="EN-US">Enterprise Library的文章,其中得到了很多朋友的支持åQŒåœ¨˜q™é‡Œä¸€òq¶è¡¨½Cºæ„Ÿè°¢ã€‚äØ“äº†æ–¹ä¾¿å¤§å®¶çš„é˜…è¯»åQŒè¿™é‡Œæˆ‘做了一下整理与分类ã€?br />

½W¬â… éƒ¨åˆ†åQ??XML:NAMESPACE PREFIX = ST1 /?>Enterprise Library 1.1 Step By Step

1åQ?span lang="EN-US">Enterprise Library Step By Step¾pÕdˆ—åQˆä¸€åQ‰ï¼šé…ç½®åº”用½E‹åºå——â€?/span>入门½‹?/span>

2åQ?span lang="EN-US">Enterprise Library Step By Step¾pÕdˆ—åQˆäºŒåQ‰ï¼šé…ç½®åº”用½E‹åºå——â€?/span>˜q›é˜¶½‹?/span>

3åQ?span lang="EN-US">Enterprise Library Step By Step¾pÕdˆ—åQˆä¸‰åQ‰ï¼šæ•°æ®è®‰K—®½E‹åºå——â€?/span>入门½‹?/span>

4åQ?span lang="EN-US">Enterprise Library Step By Step¾pÕdˆ—åQˆå››åQ‰ï¼šæ•°æ®è®‰K—®½E‹åºå——â€?/span>˜q›é˜¶½‹?/span>

5åQ?span lang="EN-US">Enterprise Library Step By Step¾pÕdˆ—åQˆäº”åQ‰ï¼šå®‰å…¨åº”用½E‹åºå——â€?/span>入门½‹?/span>

6åQ?span lang="EN-US">Enterprise Library Step By Step¾pÕdˆ—åQˆå…­åQ‰ï¼šå®‰å…¨åº”用½E‹åºå——â€?/span>˜q›é˜¶½‹?/span>

7åQ?span lang="EN-US">Enterprise Library Step By Step¾pÕdˆ—åQˆä¸ƒåQ‰ï¼šæ—¥å¿—和监‹¹‹åº”用程序块—â€?/span>入门½‹?/span>

8åQ?span lang="EN-US">Enterprise Library Step By Step¾pÕdˆ—åQˆå…«åQ‰ï¼šæ—¥å¿—和监‹¹‹åº”用程序块—â€?/span>˜q›é˜¶½‹?/span>

9åQ?span lang="EN-US">Enterprise Library Step By Step¾pÕdˆ—åQˆä¹åQ‰ï¼š¾~“冲应用½E‹åºå——â€?/span>入门½‹?/span>

10åQ?span lang="EN-US">Enterprise Library Step By Step¾pÕdˆ—åQˆååQ‰ï¼š¾~“冲应用½E‹åºå——â€?/span>˜q›é˜¶½‹?/span>

11åQ?span lang="EN-US">Enterprise Library Step By Step¾pÕdˆ—åQˆåä¸€åQ‰ï¼šå¼‚常处理应用½E‹åºå——â€?/span>入门½‹?/span>

12åQ?span lang="EN-US">Enterprise Library Step By Step¾pÕdˆ—åQˆåäºŒï¼‰åQšå¼‚常处理应用程序块—â€?/span>˜q›é˜¶½‹?/span>

13åQ?span lang="EN-US">Enterprise Library Step By Step¾pÕdˆ—åQˆåä¸‰ï¼‰åQšåŠ å¯†åº”ç”¨ç¨‹åºå—â€”â€?/span>入门½‹?/span>

14åQ?span lang="EN-US">Enterprise Library Step By Step¾pÕdˆ—åQˆåå››ï¼‰åQšåˆ›å»ºåŸºäºŽæ¶ˆæ¯é˜Ÿåˆ—(MSMQåQ‰çš„异步日志

15åQ?span lang="EN-US">Enterprise Library Step By Step¾pÕdˆ—åQˆåäº”)åQšé…¾|®åº”用程序块—â€?/span>设计½‹?/span>

16åQ?span lang="EN-US">Enterprise Library Step By Step¾pÕdˆ—åQˆåå…­ï¼‰åQšä‹É用AppSetting Application Block

½W¬â…¡éƒ¨åˆ†åQ?span lang="EN-US">Enterprise Library 2.0 学习

1åQ?span lang="EN-US">Enterprise Library 2.0åQ?åQ‰ï¼šData Access Application Block学习

2åQ?span lang="EN-US">Enterprise Library 2.0åQ?åQ‰ï¼šLogging Application Block学习

3åQ?span lang="EN-US">Enterprise Library 2.0中加密数据库˜qžæŽ¥å­—符ä¸?/span>

½W¬â…¢éƒ¨åˆ†åQ?span lang="EN-US">Enterprise Library 2.0 技å·?span lang="EN-US">

1åQ?span lang="EN-US">Enterprise Library 2.0 技巧(1åQ‰ï¼šå¦‚何使用外部配置文äšg

2åQ?span lang="EN-US">Enterprise Library 2.0 技å·?span lang="EN-US">åQ?åQ‰ï¼šå¦‚何ž®†é…¾|®ä¿¡æ¯ä¿å­˜åˆ°æ•°æ®åº“中

3åQ?span lang="EN-US">Enterprise Library 2.0 技巧(3åQ‰ï¼šè®°å½•ASP.NET站点中未处理的异å¸?/span>

4åQ?span lang="EN-US">Enterprise Library 2.0 技巧(4åQ‰ï¼šå¦‚何用编½E‹çš„æ–ÒŽ³•来配¾|®Logging Application Block

½W¬â…£éƒ¨åˆ† Enterprise Library 2.0 Hands On Lab¾˜»è¯‘¾pÕdˆ—

1åQ?span lang="EN-US">Enterprise Library 2.0 Hands On Lab ¾˜»è¯‘åQ?åQ‰ï¼šæ•°æ®è®‰K—®½E‹åºå—(一åQ?/span>

2åQ?span lang="EN-US">Enterprise Library 2.0 Hands On Lab ¾˜»è¯‘åQ?åQ‰ï¼šæ•°æ®è®‰K—®½E‹åºå—(二)

3åQ?span lang="EN-US">Enterprise Library 2.0 Hands On Lab ¾˜»è¯‘åQ?åQ‰ï¼šæ•°æ®è®‰K—®½E‹åºå—(三)

4åQ?span lang="EN-US">Enterprise Library 2.0 Hands On Lab ¾˜»è¯‘åQ?åQ‰ï¼šæ—¥å¿—应用½E‹åºå—(一åQ?/span>

5åQ?span lang="EN-US">Enterprise Library 2.0 Hands On Lab ¾˜»è¯‘åQ?åQ‰ï¼šæ—¥å¿—应用½E‹åºå—(二)

6åQ?span lang="EN-US">Enterprise Library 2.0 Hands On Lab ¾˜»è¯‘åQ?åQ‰ï¼šæ—¥å¿—应用½E‹åºå—(三)

7åQ?span lang="EN-US">Enterprise Library 2.0 Hands On Lab ¾˜»è¯‘åQ?åQ‰ï¼šå¼‚常应用½E‹åºå—(一åQ?/span>

8åQ?span lang="EN-US">Enterprise Library 2.0 Hands On Lab ¾˜»è¯‘åQ?åQ‰ï¼šå¼‚常应用½E‹åºå—(二)

9åQ?span lang="EN-US">Enterprise Library 2.0 Hands On Lab ¾˜»è¯‘åQ?åQ‰ï¼š¾~“存应用½E‹åºå—(一åQ?/span>

10åQ?span lang="EN-US">Enterprise Library 2.0 Hands On Lab ¾˜»è¯‘åQ?0åQ‰ï¼š¾~“存应用½E‹åºå—(二)

11åQ?span lang="EN-US">Enterprise Library 2.0 Hands On Lab ¾˜»è¯‘åQ?1åQ‰ï¼š¾~“存应用½E‹åºå—(三)

12åQ?span lang="EN-US">Enterprise Library 2.0 Hands On Lab ¾˜»è¯‘åQ?2åQ‰ï¼šå®‰å…¨åº”用½E‹åºå—(一åQ?/span>

13åQ?span lang="EN-US">Enterprise Library 2.0 Hands On Lab ¾˜»è¯‘åQ?3åQ‰ï¼šå®‰å…¨åº”用½E‹åºå—(二)

14åQ?span lang="EN-US">Enterprise Library 2.0 Hands On Lab ¾˜»è¯‘åQ?4åQ‰ï¼šåŠ?span lang="EN-US">密应用程序块åQˆä¸€åQ?/span>

15åQ?span lang="EN-US">Enterprise Library 2.0 Hands On Lab ¾˜»è¯‘åQ?5åQ‰ï¼šåŠ å¯†åº”ç”¨½E‹åºå—(二)

 

½W¬â…¤éƒ¨åˆ† Enterprise Library 3.0 体验¾pÕdˆ—

    1åQ?span lang="EN-US">Enterprise Library 3.0 体验åQ?åQ‰ï¼šé›†æˆVS2005的配¾|®å·¥å…·å’Œé…ç½®åŒºåŠ å¯†æ”¯æŒ?/span>NewåQ?/span>

    2åQ?span lang="EN-US">Enterprise Library 3.0 体验åQ?åQ‰ï¼šä½¿ç”¨Validation Application BlockNewåQ?/span>

    3åQ?span lang="EN-US">Enterprise Library 3.0 ä½?span lang="EN-US">验(3åQ‰ï¼šä½¿ç”¨é…ç½®æ–‡äšgçš„Validation Application BlockNewåQ?/span>



]]>
ASP.net 2.0资料吐血收藏 http://www.aygfsteel.com/wangxinsh55/archive/2007/03/16/104138.htmlSIMONESIMONEFri, 16 Mar 2007 01:09:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2007/03/16/104138.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/104138.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2007/03/16/104138.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/104138.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/104138.html
asp.net控äšg开发基¼‹€(1)
GridView模版列嵌套GirdView昄¡¤ºä¸ÖM»Žè¡¨æ•°æ?/a>
GridView中添加一个CheckBox�/a>
域环境中安装部çÖvVSTS全过½E?/a>
讄¡½®VSS使支持通过Internet讉K—®
‹¹…析Microsoft .net PetShop½E‹åºä¸­çš„购物车和订单处理模块åQˆProfile技术,异步MSMQ消息åQ?/a>
ASP.NET 2.0 正式版中无刷新页面的开�/a>
ASP.NET 2.0中实现客æˆïL«¯å›žè°ƒçš„简化版
ASP.NET 2.0 Treeview Checkboxes - Check All - Javascript
ASP.NET 2.0 Language Swithcer and Theme Swicher 多语­a€è½¬æ¢å’Œå¤šæ ·å¼ä¸»é¢˜è½¬æ¢
Microsoft .NET Pet Shop 4 架构与技术分�/a>
BinaryImageåQšç›´æŽ¥æ˜¾½CÞZ»¥äºŒè¿›åˆ¶åŞ式存储在数据库中的图ç‰?/a>
ASP.NET2.0中themes、Skinsè½ÀL¾å®žçް¾|‘站换肤åQ?/a>
ASP.NET 2.0 正式版中无刷新页面的开�/a>
Asp.net 2.0 关于Header/title/Meta tages/Style操作的一点小技�/a>
今天拿到一个TFS Workgroup EditionåQŒæƒ³ä»ŽB3R升çñ”åQŒç»“果开始了一天的艰难之èµ\。ã€?/a>
asp.net2.0åQ𿉩展ImageButton控äšg定制自己需要的功能
.net 2.0 讉K—®Oracle åQï¼ä¸ŽSql Server的差异,注意事项åQŒå¸¸è§å¼‚å¸?/a>
ASP.NET 2.0中的跨页面提�/a>
ASP.NET 2.0中ä‹É用multiview控äšg
Asp.net 2.0的异常处理需要考虑的问�/a>
ASP.NET 2.0 Personal Web Site Starter Kit 主题的动态切换(增加八种主题åQ?/a>
如何在DotNet 2的登录组件中‹‚€ç´¢ç”¨æˆïLš„锁定状态及解锁åQ?/a>
IISå’ŒASP.NET2.0
ASP.NET2.0 HiddenField控äšg
asp.net 2.0中新增的web.config的默认namespace功能
在asp.net 2.0中ä‹É用CuteEditor 5.0的一个注意事™å?/a>
ASP.NET: Custom AutoCompleteTextBox WebControl [With Source Code]
使用 IIS ˜q›è¡Œ Microsoft ASP.NET 2.0 成员/角色½Ž¡ç†
Visual Studio 2005 �101 个示�--MSDN
vs2003 å’Œvs2005下的发送SMTPé‚®äšg åQˆdownmoon原创åQ?
ž®†åšå®¢å›­½E‹åºä»ŽVisual Studio 2003˜qç§»åˆ°Visual Studio 2005的尝è¯?/a>
VS2005中GridView½¡å–®æ‡‰ç”¨
VS2005中通过code snippet定制¾cÀL¨¡æ?/a>
创徏自定义的Visual Studio™åÒŽ¨¡æ?/a>
VS2005中通过code snippet定制¾cÀL¨¡æ?/a>
配置VSS2005çš„Internet讉K—®
VS.NET2005中的WEBPART初步(�
ASP.NET 2.0 异步™åµé¢åŽŸç†‹¹…析 [1]
自动填写版权信息
关于Web Part 通讯
Net Framework 2.0 事务处理
Asp.net 2.0 WebPart使用¾léªŒç‚ÒŽ»´
GridView控äšg使用¾léªŒ
在MastPage中引用脚本资�/a>
提供一¿Uç®€å•、直观、简单、可扩展的MasterPageæ–ÒŽ¡ˆ
Enterprise Library2.0研究åQˆäºŒåQ‰æ—¥å¿—组件的开发说æ˜?/a>
åQˆç¿»è¯‘)怎么在ASP.NET 2.0中ä‹É用Membership
Enterprise Library2.0研究åQˆä¸€åQ‰æ—¥å¿—组件的使用场景
VC# 2005 Screen Starter kit里的Rss处理¾cÕdˆ†æž?/a>
革新åQ?NET 2.0的自定义配置文äšg体系初探
Asp.net¾|‘站的ClickOnce自动部çÖvåQ?åQ‰ï¼è™šæ‹Ÿç›®å½•的配¾|?/a>
C#2.0介绍之Iterators(˜q­ä»£å™?
ASP.NET 2.0åŸÞZºŽSQLSERVER 2005çš„aspnetdb.mdf部çÖv
DataTable中数据记录的¾lŸè®¡
.NET配置文äšg解析˜q‡ç¨‹è¯¦è§£
C# 2.0——匿名方法、è„P代程序和局部类
在自定义Server Control中捆¾l‘JSæ–‡äšg Step by Step
正式发布表达式计½Ž—引擎WfcExp V0.9(附源ç ?
关于无aspxæ–‡äšg部çÖvåQŒæˆ‘的一些探索心å¾?/a>
深度解析Asp.Net2.0中的Callback机制
Server Side ViewState 在服务器端存贮ViewState (ASP.NET 2.0)
解读System.Web.UI.Page中关键方法ProcessRequestMain()
使用ASP.NET 2.0提供的WebResource½Ž¡ç†èµ„源
ASP.NET 2.0中ä‹É用自定义provider åQ?åQ?/a>
转全角半è§?C#åQŒVB.NET)
ž®è®®æ•°æ®åº“主键选取½{–ç•¥åQˆåŽŸåˆ›ï¼‰
让äh哭笑不得的“Unable to load one or more of the types in the assembly”问题的解决åQ?/a>
¾l§ä¸Š‹Æ¡çš„GDI+做报表设计器å?............
Visual Studio 2005中编译调试新功能
Transaction in ADO.net 2.0
.NET v2.0 下的高精度计数器 —�Stopwatch [.NET v2.0, C#]
.Net2.0 的新¾U¿ç¨‹ ParameterizedThreadStart &BackgroundWorker
使用C#2.0˜q›è¡Œæ–‡äšg压羃和解åŽ?/a>
在C#中ä‹É用Nullable¾cÕdž‹
net2.0自定义注册控�/a>
Net Framework 2.0 事务处理
体验.net2.0的优雅(3åQ?-- 为您çš?SiteMap æ·ÕdŠ  控制转发功能
Composite UI Application Block学习½W”记之Smart Part
为ASP.NET 2.0配置数据�/a>
体验 .net2.0 的优雅(2åQ?-- ASP.net 主题和皮è‚?
InternalsVisibleToAttributeåQŒå‹å…ƒç¨‹åºé›†è®‰K—®å±žæ€?/a>
NUnit实践的之�/a>
.NET20 一¿Uç®€å•çš„½H—口控äšgUI状态控制方æ³?/a>
Asp.Net2.0无刷新客æˆïL«¯å›žè°ƒ
ASP.NET2.0 新增控äšg(1)——ImageMap
在asp.net 2.0中ä‹É用自定义的provider
ASP.NET 2.0中ä‹É用自定义provider åQ?åQ?/a>
在asp.net 2.0中ä‹É用SqlBulkCopy¾c»è¿¿UÀL•°æ?/a>
使用asp.net 2.0和SQL SERVER 2005构徏多层应用
asp.net 2.0中利用app_offline.htm功能
Visual Studio 2005中编译调试新功能
asp.net 2.0中扩展login控äšg
Composite UI Application Block学习½W”记之Event Broker
ASP.NET 2.0 QuickStart Tutorial--asp.net 2.0的速成教程
VS2005 Web工程模版ClubSite中相册薄的一处BUGåQ?/a>
Visual Studio 2005中编译调试新功能
使用ASP.NET 2.0 的一些问题!
使用 .net 2.0 ä¸?linkLabel 控äšg要注意的一ç‚?/a>
Asp.Net2.0无刷新客æˆïL«¯å›žè°ƒ
�asp.net 2.0 的菜单控件增�target 属�/a>
ASP.Net 2.0 MasterPage中èµ\径的处理
SQL Server 2005中设¾|®Reporting Services发布web报表的匿名访é—?/a>
让你的控件属性注释支持多语言
�asp.net 2.0 的菜单控件增�target 属�
发布一个原创的åŸÞZºŽAjax的通用(¾l„合)查询
试用VS2005中的Performance Tools
中文转换为完整拼音算法原理分�/a>


]]>
aspjpeg¾l„äšg安装使用http://www.aygfsteel.com/wangxinsh55/archive/2007/02/26/100751.htmlSIMONESIMONEMon, 26 Feb 2007 07:47:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2007/02/26/100751.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/100751.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2007/02/26/100751.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/100751.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/100751.html

å®‰è£…æç¤ºè¾“å…¥åºåˆ—åøP¼Œæ²¡æœ‰åˆ™ä¿ç•™ç©ºåQŒæˆ‘暂时随便输入12345-67890-12345åQŒå…ˆçœ‹ä¸€ä¸‹ä»–çš„dll能不能像aspjpeg1.3那样直接使用。安装提½Cºé‡èµ·iis服务åQŒé€‰å¦åQŒæ³¨å†Œç»„件一般不需要重èµ?/p>

如果以前装过其他版本的aspjpegåQŒéœ€è¦å…ˆåœæ­¢iis(net stop iisadmin /y)åQŒå¸è½½åŽŸæ¥çš„¾l„äšg(regsvr32 /u c:/windows/system32/aspjpeg.dll)åQŒç„¶åŽé‡èµ·iis(net start w3svc)

//By xlxcn 从这里开�

从aspjpeg1.5的安装目录复制aspjpeg.dll到系¾lŸæ–‡ä»¶åŠ çš„system32目录

˜qè¡Œregsvr32 c:/windows/system32/aspjpeg.dll åQˆæ ¹æ®ä½ çš„ç³»¾lŸæ”¹ä½ çš„目录åQ?/p>

aspjpeg的文档中说需要官æ–ÒŽä¾›çš„序列åäh‰èƒ½æ­£å¸æ€‹É用,如果安装˜q‡ç¨‹ä¸­æœ‰è¾“入序列å?/p>

在asp中运行下面的命ä×oæ›´æ”¹åºåˆ—åøP¼ˆå¦‚果没有输入˜q‡ï¼Œéœ€è¦åœ¨æ³¨å†Œè¡¨ä¸­æ·ÕdР如䏋™å¹ï¼šHKEY_LOCAL_MACHINE\Software\Persits Software\AspJpeg\RegKeyåQ?/p>

Set Jpeg = Server.CreateObject("Persits.Jpeg")
Jpeg.RegKey = "你的序列�
可以用下面的方式查看是否注册成功åQ?/p>

Set Jpeg = Server.CreateObject("Persits.Jpeg")
Response.Write Jpeg.Expires
我没有注册,˜qè¡Œäº†è¿™åˆ™ä»£ç ï¼Œå¾—到的结果是2005-1-19 19:15:49。意思好像是可以使用åˆ?æœ?9æ—¥ã€?/p>

如果注册成功得到的应该是9/9/9999。我ç”?8958-77556-02411注册以后得到äº?999-9-9˜q™ä¸ª¾l“æžœ:)操作¾pȝ»Ÿæ—‰™—´æ˜„¡¤ºæ–¹å¼æœ‰æ‰€ä¸åŒã€?/p>

以下是aspjpeg1.5的安装文ä»Óž¼Œdllæ–‡äšg和序列号

直接安装只要在aspjpeg1.5.exe安装˜q‡ç¨‹ä¸­è¾“入序列号卛_¯åQŒä½†æ˜¯å¯èƒ½ä¼šå‡ºçްntfs目录讉K—®æƒé™çš„问题,需要手动设¾|®å®‰è£…目录对Everyone有访问权限ã€?/p>

如果用aspjpeg.dllåQŒè¯·æŒ‰ç…§ä¸Šé¢çš„æ–¹æ³•安装以及添加注册表™åV€?/p>


aspjpeg高çñ”使用æ–ÒŽ³•介绍

aspjpeg是一‹ÆùNžå¸¸å¼ºå¤§çš„囄¡‰‡å¤„理¾l„äšgåQŒçº¯è‹±æ–‡ç‰ˆæœ¬ã€‚不˜q‡æ—©å·²ç»æœ‰å…è´¹ç‰ˆå’Œç ´è§£ç‰ˆåQŒä½†æ˜¯å¯¹å…¶è¿›è¡Œè¯¦¾l†ä¸Žæ·±å…¥ä»‹ç»çš„æ–‡ç« å´æ˜¯ä¸å¤šï¼Œå³ä‹É有也只牵涉到囄¡‰‡¾~©ç•¥å’Œå›¾ç‰‡æ°´å°ã€‚å¯èƒ½æ˜¯å› äØ“¾U¯è‹±æ–‡çš„¾~˜æ•…ã€?/p>


˜q™é‡Œæˆ‘就是针对这些问题谈谈aspjpeg的高¾U§ç”¨æ³•。这里的技术主要包括:
囄¡‰‡¾~©ç•¥
囄¡‰‡æ°´å°
安全码技�
囄¡‰‡åˆ‡å‰²
囄¡‰‡åˆåƈ
数据库支�
更多不常用的æ–ÒŽ³•介绍
以及相关的一些实用技�


aspjpeg唯一点不­‘³çš„ž®±æ˜¯è¾“出方式比较单一。在˜q™é‡ŒåQŒæˆ‘们主要谈ž®†å›¾ç‰‡å¤„理保存后再调用的˜q™ç§è¾“出æ–ÒŽ³•。另外,本äh比较懒,所以有些代码仍然引用于原文档,不懂的地方偶会加以解释!


学过vb或è€?net的同志肯定一看就明白了。刷子来着。呵å‘üc€?


一、图片羃�

<%
Set Jpeg = Server.CreateObject("Persits.Jpeg") 调用¾l„äšg
Path = Server.MapPath("images") & "\clock.jpg" 待处理图片èµ\å¾?
Jpeg.Open Path 打开囄¡‰‡
é«˜ä¸Žå®½äØ“åŽŸå›¾ç‰‡çš„1/2
Jpeg.Width = Jpeg.OriginalWidth / 2
Jpeg.Height = Jpeg.OriginalHeight / 2
保存囄¡‰‡
Jpeg.Save Server.MapPath("images") & "\clock_small.jpg"
%>
<IMG src="http://www.aygfsteel.com/images/clock_small.jpg"> 查看处理的图�

 

二、图片水�

<%
Set Jpeg = Server.CreateObject("Persits.Jpeg")
Jpeg.Open Server.MapPath("images/dodge_viper.jpg")
开始写文字
Jpeg.Canvas.Font.Color = &000000' red 颜色
Jpeg.Canvas.Font.Family = "Courier New" 字体
Jpeg.Canvas.Font.Bold = True 是否加粗
Jpeg.Canvas.Print 10, 10, "Copyright (c) XYZ, Inc."
打印坐标x 打印坐标y 需要打印的字符
以下是对囄¡‰‡˜q›è¡Œè¾ÒŽ¡†å¤„理
Jpeg.Canvas.Pen.Color = &H000000' black 颜色
Jpeg.Canvas.Pen.Width = 2 ç”ȝ¬”宽度
Jpeg.Canvas.Brush.Solid = False 是否加粗处理
Jpeg.Canvas.Bar 1, 1, Jpeg.Width, Jpeg.Height
起始X坐标 起始Y坐标 输入长度 输入高度
Jpeg.Save Server.MapPath("images/dodge_viper_framed.jpg") 保存
%>

 

三、安全码

安全玛的道理和加水印差不多,很多朋友问我要具体的代码技术,在这里我ž®±å†™å‡ºæ¥å’Œå¤§å®¶åˆ†äº«ï¼Œä¸€èˆ¬äh我还不告诉他。呵å‘üc€?
<%
生成安全码的函数
function make_randomize(max_len,w_n) max_len 生成长度åQŒw_nåQ? 可能包含字母åQ?åQšåªä¸ºæ•°å­?
randomize
for intcounter=1 to max_len
whatnext=int((1-0+1)*rnd+w_n)
if whatnext=0 then
upper=122
lower=97
else
upper=57
lower=48
end if
strnewpass=strnewpass & chr(int((upper-lower+1)*rnd)+lower)
next
make_randomize=strnewpass
end function
%>

生成安全码的囄¡‰‡ã€‚当然你要预先准备一张背景图å“?

<%random_num=make_randomize(4,1) 生成4位数字的安全�
session("random_num")=random_num ä¸ÞZ»€ä¹ˆè°ƒç”¨sessionåQŒæ²¡æœ‰session的安全码是完全没有意义的。呵å‘?

Set Jpeg = Server.CreateObject("Persits.Jpeg") 调用¾l„äšg
Jpeg.Open Server.MapPath("infos/random_pic/random_index.gif") 打开准备的图�
Jpeg.Canvas.Font.Color = &H006699
Jpeg.Canvas.Font.Family = "Arial Black"
Jpeg.Canvas.Font.Bold = false
Jpeg.Canvas.PrintText 0, -2, random_num
jpeg.save Server.MapPath("infos/random_pic/random_index.bmp") 保存
%> <img src="/infos/random_pic/random_index.bmp" border="0" align="absmiddle">
自己做做看。呵å‘üc€?

 


四、图片切�

一直以来,对aspjpeg不了解的äºÞZ»¥ä¸ºæ˜¯æ— æ³•用它来进行切割的ã€?
其实有这æ ïLš„一个方法的
crop x1,y1,x2,y2
切割长方型左上角x坐标åQŒy坐标 右下角x坐标 y坐标
下面我就做一个演½Cºå“ˆ
Set Jpeg = Server.CreateObject("Persits.Jpeg")
jpeg.open server.MapPath("/pic/1.gif")
jpeg.width=70
Jpeg.Height = Jpeg.OriginalHeight*70 / jpeg.Originawidth
jpeg.crop 0,0,70,52 开始切割其实是把超˜q?2象素的下部分åŽÀLމ
jpeg.save server.MapPath("/temp_pic/small_1.gif") 保存
æ€Žä¹ˆæ øP¼Œå¾ˆç®€å•吧

 

五、图片合òq?

我们˜q™é‡Œæ˜¯è¦æŠŠlogo囄¡‰‡åŠ åˆ°dodge_viper.jpg囄¡‰‡ä¸ŠåŽ»
其实åQŒå›¾ç‰‡åˆòq¶çš„æ–ÒŽ³•也可以用来动态打水印å“?
Set Photo = Server.CreateObject("Persits.Jpeg")
PhotoPath = Server.MapPath("images") & "\dodge_viper.jpg"
Photo.Open PhotoPath
Set Logo = Server.CreateObject("Persits.Jpeg")
LogoPath = Server.MapPath("images") & "\clock.jpg"
Logo.Open LogoPath

Logo.Width = 70
Logo.Height = Logo.Width * Logo.OriginalHeight / Logo.OriginalWidth

Photo.DrawImage 0, 0, Logo

Photo.SendBinary ˜q™é‡Œç”¨äº†sendBinary的输出方法。当ç„Óž¼Œä½ ä¹Ÿå¯ä»¥å…ˆä¿å­˜æ›´æ”¹åŽçš„dodge_viper.jpgåQŒå†è¾“入也可以。我个äh不大喜欢用sendBinaryæ–ÒŽ³•åQŒåœ¨¾|‘速慢的时候容易出错。在速度斚w¢ä¹Ÿä¸æ€Žæ ·ã€‚呵å‘üc€?

 

六、数据库支持

˜q™é‡Œä¸å¤šè¯´äº†ã€‚其实就是Binaryæ–ÒŽ³•åQŒå¤§å®¶çŸ¥é“图片存˜q›æ•°æ®åº“åªèƒ½å­˜äØ“äºŒè¿›åˆ¶çš„æ–‡äšg的。所以代码就懒的写了ã€?

 

七、更多方法介¾l?

Canvas.Line(Left, Top, Right, Bottom)
ç”ÖM¸€æ¡ç›´¾U?
Canvas.Ellipse(Left, Top, Right, Bottom)
ç”Õd‡ºä¸€ä¸ªæ¤­åœ?
Canvas.Circle(X, Y, Radius)
ç”Õd‡ºä¸€ä¸ªåœ†
Canvas.Bar(Left, Top, Right, Bottom)
ç”Õd‡ºä¸€ä¸ªé•¿æ–¹åÅžåQŒä¸Šé¢æœ‰ä»£ç ä»‹ç»äº?
Canvas.Font.ShadowColor
文字阴媄颜色
Canvas.Font.ShadowXOffset As Long
阴媄X坐标讑֮š
Canvas.Font.ShadowYOffset As Long
Y坐标讑֮š
Canvas.Font.BkMode As String
文字背景




]]>
一个大家不常用刎ͼŒå´å¾ˆæœ‰ç”¨çš„页面间传值方æ³?/title><link>http://www.aygfsteel.com/wangxinsh55/archive/2007/02/09/98898.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 09 Feb 2007 00:58:00 GMT</pubDate><guid>http://www.aygfsteel.com/wangxinsh55/archive/2007/02/09/98898.html</guid><wfw:comment>http://www.aygfsteel.com/wangxinsh55/comments/98898.html</wfw:comment><comments>http://www.aygfsteel.com/wangxinsh55/archive/2007/02/09/98898.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wangxinsh55/comments/commentRss/98898.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wangxinsh55/services/trackbacks/98898.html</trackback:ping><description><![CDATA[ <p>一、目前在ASP.NET中页面传值共有这么几¿Uæ–¹å¼ï¼š<br />1、表单提交,<br />   <form action= "target.aspx" method = "post" name = "form1"><br /> <input name = "param1" value = "1111"/><br /> <input name = "param2" value = "2222"/> <br />   </form><br />   ....<br />   form1.submit();<br />   ....<br />   此种方在ASP。NETä¸­æ— æ•ˆï¼Œå› äØ“ASP。NET的表单æ€ÀL˜¯æäº¤åˆ°è‡ªíw«é¡µé¢ï¼Œå¦‚果要提交到别一™åµé¢åQŒéœ€è¦ç‰¹ŒDŠå¤„理ã€?br />2ã€?lt;A href="target.aspx?param1=1111&param2=2222">链接地址传é€?lt;/A><br />接收™åµé¢åQ?string str = Request["param1"]<br />3、Sessionå…׃ín<br />发送页面:Session("param1") = "1111";  <br />按收™åµé¢Â  string str = Session("param1").ToString();  <br />4、Applicationå…׃ín<br />发送页面: Application("param1") = "1111";   <br />按收™åµé¢åQ?string str = Application("param1").ToString();  <br />此种æ–ÒŽ³•不常使用åQŒå› ä¸ºApplication在一个应用程序域范围å…׃ínåQŒæ‰€æœ‰ç”¨æˆ·å¯ä»¥æ”¹å˜åŠè®„¡½®å…¶å€û|¼Œæ•…只应用计数器等需要全局变量的地斏V€?br />5、Cookie<br />6、Response.Redirect()方式<br />   Response.Redirect("target.aspx?param1=1111&param2=2222")<br />   接收™åµé¢åQ?string str = Request["param1"]<br />7、Server.Transfer()方式ã€?br />   Server.Transfer("target.aspx?param1=1111&param2=2222")<br />   接收™åµé¢åQ?string str = Request["param1"]</p> <p>二、如果在两个™åµé¢é—´éœ€è¦å¤§é‡çš„参数要传传递,如数据查询等™åµé¢æ—Óž¼Œç”? åQ?6的方法传值及其不便,而第 7 ¿Uæ–¹æ³•确有一独特的优势!但ä‹É用该æ–ÒŽ³•æ—‰™œ€è¦ä¸€å®šçš„讄¡½®åQŒçް½Ž€å•介¾lä¸€ä¸‹è¯¥æ–ÒŽ³•çš„ä‹É用方式:<br />   ä»¥æŸ¥è¯¢æ•°æ®é¡µé¢äØ“ä¾‹ï¼š<br />   在查询页面中讄¡½®å¦‚下公有属æ€?QueryPage.aspx)åQ?br />    public class QueryPage : System.Web.UI.Page<br />{<br />protected System.Web.UI.WebControls.TextBox txtStaDate;<br />protected System.Web.UI.WebControls.TextBox txtEndDate;<br />   ...<br />/// <summary><br />/// 开始时é—?br />/// </summary><br />public string StaDate<br />{<br />get{ return this.txtStaDate.Text;}<br />set{this.txtStaDate.Text = value;}<br />}<br />/// <summary><br />/// ¾l“束旉™—´<br />/// </summary><br />public string EndDate<br />{<br />get{ return this.txtEndDate.Text;}<br />set{this.txtEndDate.Text = value;}<br />}<br />....<br />private void btnEnter_Click(object sender, System.EventArgs e)<br />{<br />Server.Transfer("ResultPage.aspx");<br />}<br />}<br />   <br />   在显½CºæŸ¥è¯¢ç»“果页é?ResultPage.aspx)åQ?br />    public class ResultPage : System.Web.UI.Page<br />{<br />   private void Page_Load(object sender, System.EventArgs e)<br />   {</p> <p>//转换一下即可获得前一™åµé¢ä¸­è¾“入的数据<br />QueryPage queryPage = ( QueryPage )Context.Handler;</p> <p>Response.Write( "StaDateåQ? );<br />Response.Write( queryPage.StaDate );<br />Response.Write( "<br/>EndDateåQ? );<br />Response.Write( queryPage.EndDate );<br />  }<br />}</p> <p>三、如果有许多查询™åµé¢å…Þq”¨ä¸€ä¸ªç»“果页面的讄¡½®æ–ÒŽ³•åQ?br />    在这¿Uæ–¹å¼ä¸­å…³é”®åœ¨äºŽâ€?QueryPage queryPage = ( QueryPage )Context.Handler; ”的转换åQŒåªæœ‰è{换不依赖于特定的™åµé¢æ—¶å³å¯å®žçްã€?br />如果让所有的查询™åµé¢éƒ½ç‘ô承一个接口,在该接口中定义一个方法,该方法的唯一作用ž®±æ˜¯è®©ç»“果页面获得构建结果时所需的参æ•?ž®±å¯å®žçŽ°å¤šé¡µé¢å…±äº«ä¸€ä¸ªç»“æžœé¡µé¢æ“ä½œï¼</p> <p>1、先定义一个类åQŒç”¨è¯¥ç±»æ”„¡½®æ‰€æœ‰æŸ¥è¯¢å‚敎ͼš<br />/// <summary><br />/// ¾l“æžœ™åµé¢ä¸­è¦ç”¨åˆ°çš„å€?br />/// </summary><br />public class QueryParams<br />{<br />private string staDate;<br />private string endDate;</p> <p>/// <summary><br />/// 开始时é—?br />/// </summary><br />public string StaDate<br />{<br />get{ return this.staDate;}<br />set{this.staDate = value;}<br />}<br />/// <summary><br />/// ¾l“束旉™—´<br />/// </summary><br />public string EndDate<br />{<br />get{ return this.endDate;}<br />set{this.endDate = value;}<br />}<br />}</p> <p>2、接口定义:<br />/// <summary><br />/// 定义查询接口ã€?br />/// </summary><br />public interface IQueryParams<br />{<br />/// <summary><br />/// 参数<br />/// </summary><br />QueryParams Parameters{get;}<br />}</p> <p>3、查询页面ç‘ô承IQueryParams接口(QueryPage.aspx)åQ?br />    <br />/// <summary><br />///查询™åµé¢åQŒç‘ô承接å?br />/// </summary><br />public class QueryPage : System.Web.UI.Page, IQueryParams<br />{<br />protected System.Web.UI.WebControls.TextBox txtStaDate;<br />protected System.Web.UI.WebControls.TextBox txtEndDate;</p> <p>private QueryParams queryParams;<br />   ...<br />/// <summary><br />/// ¾l“æžœ™åµé¢ç”¨åˆ°çš„参æ•?br />/// </summary><br />   public QueryParams Parameters<br />{<br />get<br />{<br />return queryParams;<br />}<br />}<br />....<br />private void btnEnter_Click(object sender, System.EventArgs e)<br />{<br />//赋å€?br />queryParams = new QueryParams();<br />queryParams.StaDate = this.txtStaDate.Text;<br />queryParams.EndDate = this.txtEndDate.Text</p> <p>Server.Transfer("ResultPage.aspx");<br />}<br />}<br />4、别外的™åµé¢ä¹Ÿå¦‚此设¾|?br />5、接攉™¡µé?ResultPage.aspx)åQ?br />   <br />public class ResultPage : System.Web.UI.Page<br />{<br />   private void Page_Load(object sender, System.EventArgs e)<br />   {</p> <p>QueryParams queryParams = new QueryParams();<br />IQueryParams queryInterface;<br />//实现该接口的™åµé¢<br />if( Context.Handler is IQueryParams)<br />{<br />queryInterface = ( IQueryParams )Context.Handler;<br />queryParams = queryInterface.Parameters;<br />}</p> <p>Response.Write( "StaDateåQ? );<br />Response.Write( queryParams.StaDate );<br />Response.Write( "<br/>EndDateåQ? );<br />Response.Write( queryParams.EndDate );<br />  }<br />}</p> <p>三、本文è“vå›?<br />      因在工作中要作一个数据查询,参数烦多åQŒåŽŸå…ˆæ˜¯ç”¨Session传递,用完该Session传来的参数后åQŒè¿˜éœ€æ¸…理SessionåQŒåœ¨ç”¨Session之前˜q˜å¾—判断该Session是否存在åQŒæžå…¶çƒ¦çï¼Œæˆ‘想应该˜q˜æœ‰æ›´ç®€ä¾¿çš„æ–ÒŽ³•来实现页面间的参æ•îC¼ é€’,故上¾|‘查找,¾lˆäºŽæ‰‘Öˆ°˜q™æ ·ä¸€¿Uæ–¹å¼æ¥å®žçް™åµé¢é—´çš„参数传递ã€?br />  有不åˆîC¹‹å¤„,请大家指正!<br /><br /><br />我说详细一点,现在有这样一¿UWeb开发模式:</p> <p>Page - ½H—体容器åQŒä»Ž.net framework接受客户端请求,òq¶æœ€¾lˆå‘客户端输出htmlåQŒæ‰¿è½½UserControl容器òq¶ç»„装之<br />UserControl - 功能模块åQŒå¯¹ä¸€ä¸ªç‰¹å®šåŠŸèƒ½è¿›è¡Œå°è£…ï¼Œæ‰¿è²WebControl的容å™?br />WebControl - ž®è£…了单一的业务逻辑åQŒå’Œä¸Žä¹‹å¯¹åº”对应的HTML输出、客æˆïL«¯äº¤äº’UI</p> <p>所有的è¯äh±‚参数由Page得到åQŒæœ€¾lˆä¼ é€’至UserControl容纳的WebControlå†?br />在这个过½E‹ä¸­åQŒPageåQˆç”šè‡Ïx˜¯UserControlåQ‰ä¸æä¾›ä»ÖM½•逻辑˜q›è¡Œòq²é¢„åQŒUserControl/WebControl的可变特性完全由持久化的HTML代码¾l™å‡º<br />——也ž®±æ˜¯è¯ß_¼Œæ‰€æœ‰çš„Page都没有代码,如何在一个系¾lŸä¸­åšåˆ°Transfer所需要的参数便于¾l´æŠ¤ã€è°ƒæ•ß_¼Ÿ</p> <p>™åµé¢1:<br />public class Page1 : System.Web.UI.Page<br />{<br />public UserControl1 userControl1;<br />public UserControl2 userControl2;<br />}<br />用户控äšg1åQ?br />public class UserControl2 :System.Web.UI.UserControl<br />{<br />private void btnEnter_Click(object sender, System.EventArgs e)<br />{<br />Server.Transfer("Page2.aspx");<br />}<br />}<br />//åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQ?br />™åµé¢2åQ?br />public class Page2 : System.Web.UI.Page<br />{<br />public UserControl3 userControl3;<br />public UserControl4 userControl4;<br />}</p> <p>用户控äšg3åQ?br />public class UserControl3 :System.Web.UI.UserControl<br />{<br />private void Page_Load(object sender, System.EventArgs e)<br />{<br />Page1 page1 = (Page1)Context.Handler;<br />Response.Write( "属æ€?" );<br />Response.Write( page1.userControl1.属æ€? );<br />Response.Write( "<br/>属æ€?" );<br />Response.Write( page1.userControl2.属æ€? );<br />}<br />}<br />//如果在页é?中没有声明用æˆähާä»?åQŒåœ¨™åµé¢2中将引用不到™åµé¢1中用æˆähާä»?中的公共æ–ÒŽ³•<br /><br /><br /><br /><br />另一¿Uæ–¹æ³•是<br />SourcePage讄¡½®ä¸€ä¸?br />    public string Name<br />    {<br />        get { return txtName.Text; }<br />    }</p> <p>目标™åµé¢é¦–先声明åQ?br /><%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %> </p> <p>然后在后åîC»£ç ç›´æŽ¥ä‹Éç”?/p> <p>Response.Write(PreviousPage.Name);<br /></p> <img src ="http://www.aygfsteel.com/wangxinsh55/aggbug/98898.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wangxinsh55/" target="_blank">SIMONE</a> 2007-02-09 08:58 <a href="http://www.aygfsteel.com/wangxinsh55/archive/2007/02/09/98898.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Asp.net 实现验证码功能的Web控äšghttp://www.aygfsteel.com/wangxinsh55/archive/2007/02/01/97162.htmlSIMONESIMONEThu, 01 Feb 2007 02:43:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2007/02/01/97162.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/97162.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2007/02/01/97162.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/97162.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/97162.html      Asp.net的设计方式和设计理念和其他的如Asp,Jsp,Php,Perl

½{‰éƒ½ä¸ä¸€æ øP¼Œå‡ ä¹Žæ˜¯å®Œå…¨çš„面向对象设计åQä»£ç çš„复用ž®±æ˜¯å…?/font>

中差异较大的特点之一åQŒAsp.net除了可以用Include以外åQŒè¿˜æä¾›

了比较有特点的Web控äšgåQŒåŒ…括:Ascx形式和带设计时支持的æŽ?/font>

ä»¶[本文属于后者],ä¸ÞZº†ç†Ÿæ‚‰˜q™äº›æ–°æ¦‚念,我自己写了个Web控äšgã€?/font>

在实际项目中˜qè¡Œä½¿ç”¨è‰¯å¥½åQŒä»¥åŽï¼Œè¦æœ‰æ—‰™—´åQŒæˆ‘˜q˜å°†ä¸æ–­æ”¹è¿›ã€?/font>

ValidateCode控äšgçš„ä‹É用方æ³?

½W¬ä¸€æ­¥ï¼š

¾~–译我提供的原代ç ? 然后,在Studio.net 2003工具栏上, 选择"æ·ÕdŠ /¿U»é™¤™å?, 选中¾~–译好的dllæ–‡äšgã€?/font>

½W¬äºŒæ­¥ï¼š

工具栏上ž®×ƒ¼šå¤šä¸€ä¸ªWeb控äšgValidateCode,做好一个Web½H—体,在Studio.net 2003开发界面上,直接把控件拖到WebFormä¸?ž®±OKåQ?/font>

½W¬ä¸‰æ­¥ï¼š

在该控äšgçš„GraphicOK事äšg中获取,验证码的字符信息åQŒç”¨äºŽå’Œç”¨æˆ·å½•入做比较!

最后一步:

在网站的根目录下åQŒå¾ä¸€ä¸ªtemp目录åQˆä¹Ÿå¯ä»¥è‡ªå·±æŒ‡å®šç›®å½•åQ‰ï¼Œç”¨äºŽå­˜æ”¾éªŒè¯ç ?/font>

囄¡‰‡åQŒä¸ç”¨æ‹…心,代码会自动删除无用的囄¡‰‡åQ?/font>

原代码如下:

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.IO;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

namespace WebValidateCode
{
 /// <summary>
 /// ValidateCode 的摘要说明ã€?br /> /// 设计è€?王æ“væ³?2004-11-20
 /// </summary>
 ///
 public enum GraphicType
 {
  Jpg = 0,
  Gif = 1,
  Png = 2,
  Bmp = 3,
 }


 //[ToolboxBitmap(@"D:\DotnetApp\ValidateCode\ValidateCode.bmp") ] //讄¡½®æŽ§äšg在工å…ïL®±ä¸Šçš„图标
 public class ValidateCode : System.Web.UI.WebControls.WebControl ,INamingContainer
 {
  private int pCodelen=5;
  private int pChartWidth=100;
  private int pChartHeight=20;

  private GraphicType pChartType;
  
  private string pAuthenCode;

  private string pTempImageURLPath="/temp";
  private string pAuthenImageFullname;
  private string pAuthenImageFullURL;
  
  //生成校验码的变量 start
  private Bitmap validateImage;
  private Graphics g;
  //生成校验码的变量 End

  private TextBox txt=new TextBox();
  private System.Web.UI.WebControls.Image img= new System.Web.UI.WebControls.Image();

  #region 定义控äšg事äšg
  
  public delegate void GraphicCreated(object sender, EventArgs e);
  public event EventHandler GraphicOK;   //在校验图片生成结束以后触�/p>

  protected virtual void OnGraphicOK(object sender, EventArgs e)
  {   
   if (GraphicOK != null)
   {
    //Invokes the delegates.
    GraphicOK(sender, e);
   }  
  }
 
  #endregion
    
  #region 控äšg属æ€?br />  
  //生成校验码的长度
  [Bindable(true),Browsable(true),Category("Appearance"),DefaultValue(true),Description("需要验证码的长åº?廸™®®åœ?~8位之é—?")]
  public int CodeLength
  {
   get
   {
    return pCodelen;
   }

   set
   {
    pCodelen = value;
   }
  }

  //生成校验码的长度
  [Bindable(true),Browsable(true),Category("Appearance"),DefaultValue(true),Description("生成验证码图片的临时存放路径,要求必须是网站下的虚拟目�")]
  public string TempImageURLPath
  {
   get
   {
    return pTempImageURLPath;
   }

   set
   {
    pTempImageURLPath = value;
   }
  }

  [Bindable(true),Browsable(true),Category("Appearance"),DefaultValue(GraphicType.Jpg),Description("选择生成校验图文件的¾cÕdž‹(Jpg;Gif;Png;Bmp)!")]
  public GraphicType ChartType
  {
   get
   {
    return pChartType;
   }

   set
   {
    pChartType = value;
   }  
  }


  //生成校验码图片的宽度
  public int ChartWidth
  {
   get
   {
    return pChartWidth;
   }

   set
   {
    pChartWidth = value;
   }
  }

  //生成校验码图片的高度
  public int ChartHeight
  {
   get
   {
    return pChartHeight;
   }

   set
   {
    pChartHeight = value;
   }
  }

  //需要生成的校验�br />  public string AuthenCode
  {
   get
   {
    return pAuthenCode;
   }

   set
   {
    pAuthenCode = value;
   }
  }

  #endregion

  /// <summary>
  /// ž®†æ­¤æŽ§äšg呈现¾l™æŒ‡å®šçš„输出参数ã€?br />  /// </summary>
  /// <param name="output"> 要写出到çš?HTML ¾~–写å™?</param>
  protected override void Render(HtmlTextWriter output)
  {
        
   System.Web.UI.WebControls.Image objImage;
         //TextBox objTxt;
    
    
   //¾l˜åˆ¶åŒ…含的控件  Â?br />   objImage  = (System.Web.UI.WebControls.Image) Controls[0]; 
   //objTxt  = (TextBox) Controls[1];     
   
   if(pAuthenCode==null)
      pAuthenCode=GetValidateCode();
             
   OnGraphicOK(this,EventArgs.Empty );
   
   GetRandomImage(pAuthenCode);
   objImage.ImageUrl=pAuthenImageFullURL;

   objImage.RenderControl(output); 
                
  }

  /// <summary>
  /// ¾l™æŽ§ä»¶æ·»åŠ å­æŽ§äšg
  /// </summary>
  protected  override  void  CreateChildControls(    )
  {
   
   //Controls.Add(btn);
   Controls.Add(img);
   //Controls.Add(txt);
  }

  /// <summary>
  /// 控äšgLoad时候属性的初始åŒ?br />  /// </summary>
  /// <param name="e"></param>
  protected  override  void OnLoad(System.EventArgs e)
  {
      EraseOldGraphic();   //删除˜q‡æœŸçš„图ç‰?br />  }

  /// <summary>
  /// 生成随机�br />  /// </summary>
  private void MakeRandomFileName()
  {
   string strRandName=DateTime.Now.Ticks.ToString()+".jpg";  
   pAuthenImageFullname=this.Page.MapPath(TempImageURLPath)+@"\"+strRandName;
   pAuthenImageFullURL=TempImageURLPath+"/"+strRandName;
  }


  private void GetRandomImage(string strValidateCode)
  {   
   //生成随即囄¡‰‡çš„å…¨å?和全URL
   MakeRandomFileName();

   validateImage = new Bitmap(pChartWidth, pChartHeight, PixelFormat.Format24bppRgb); // .Format24bppRgb);
   g = Graphics.FromImage(validateImage);
 
   g.Clear(Color.LightGray) ;

   //g.DrawString(strValidateCode , new Font("宋体",16,FontStyle.Bold),new SolidBrush(Color.DarkRed),new PointF(2,2));

   for(int i=0;i<strValidateCode.Length;i++)
   {     
    Random r = new Random();
    PointF startPos=new PointF(r.Next(3,6)+(r.Next(12,14)*i ),r.Next(-1,2) );
       
    g.DrawString(strValidateCode.Substring(i,1) , new Font("宋体",14,FontStyle.Italic),new SolidBrush(Color.Blue),startPos);
   }

   
   //g.FillRectangle(new LinearGradientBrush(new Point(0,0), new Point(120,30), Color.FromArgb(0,0,0,0),Color.FromArgb(255,255,255,255)),0,0,120,30);
   switch(pChartType)
   {
    case GraphicType.Jpg:
    
     validateImage.Save(pAuthenImageFullname, ImageFormat.Jpeg);
     break;
 
    case GraphicType.Gif:

     validateImage.Save(pAuthenImageFullname, ImageFormat.Gif);
     break;

    case GraphicType.Png:

     validateImage.Save(pAuthenImageFullname, ImageFormat.Png);
     break;
 
    case GraphicType.Bmp:

     validateImage.Save(pAuthenImageFullname, ImageFormat.Bmp);
     break;
 
    default:
     validateImage.Save(pAuthenImageFullname, ImageFormat.Jpeg);
     break;
   
   }
       
   validateImage.Dispose();

   g.Dispose();
   
   
  
  }

  /// <summary>
  /// 动态从数字和字母组成的元素中动态选择生成校验�br />  /// </summary>
  private string GetValidateCode()
  {
   char[] s = new char[]{'0','1', '2','3','4','5','6','7','8','9','a'
          ,'b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q'
          ,'r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G'
          ,'H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W'
          ,'X','Y','Z'};
   string num = "";
   Random r = new Random();

   //æ ÒŽ®ç”¨æˆ·éœ€è¦çš„长度来定义验证码的位æ•?br />   for(int i = 0; i < CodeLength; i++)
   {
    num += s[r.Next(0, s.Length)].ToString();
   }
   
   return num;
  }

  /// <summary>
  /// 清除旉™—´­‘…过20¿U’的临时囄¡‰‡è®°å½•
  /// </summary>
  /// <returns>成功˜q”回true,å¤ÞpÓ|˜q”回false</returns>
  public bool EraseOldGraphic()
  {

   try
   {
    DirectoryInfo Dinfo=new DirectoryInfo(this.Page.MapPath(pTempImageURLPath));
    FileInfo[] FileSet;
 
    if(Dinfo.Exists)
    {    
     switch(pChartType)
     {
      case GraphicType.Jpg:
    
       FileSet=Dinfo.GetFiles("*.jpg");
       break;
 
      case GraphicType.Gif:

       FileSet=Dinfo.GetFiles("*.gif");
       break;

      case GraphicType.Png:

       FileSet=Dinfo.GetFiles("*.png");
       break;
 
      case GraphicType.Bmp:

       FileSet=Dinfo.GetFiles("*.bmp");
       break;
 
      default:
       FileSet=Dinfo.GetFiles("*.jpg");
       break;
   
     }

     foreach(FileInfo fileInfo in FileSet)
     {
      if(fileInfo.Exists)
      {
       DateTime dts=DateTime.Now;
       DateTime dtc=fileInfo.CreationTime;

       TimeSpan ts=dts-dtc;
 
       if(ts.Seconds>20)
       {        
        fileInfo.Delete();
       }
      }
     }
    }

    return true;
   }
   catch(IOException ioe)
   {
       return false;
   }
  }
  
 }
}




]]>
ajax¾cÕdº“çš„ä‹Éç”?http://www.aygfsteel.com/wangxinsh55/archive/2007/01/25/96000.htmlSIMONESIMONEThu, 25 Jan 2007 09:05:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2007/01/25/96000.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/96000.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2007/01/25/96000.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/96000.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/96000.html转自msdn
AJAX依靠代理åQˆbrokeråQ‰æŒ‡‹z‘Ö’Œå¤„理往˜q”服务器的请求。对此,.NET包装器依靠客æˆïL«¯XmlHttpRequest对象。多数浏览器都支持XmlHttpRequest对象åQŒè¿™ž®±æ˜¯é€‰æ‹©å®ƒçš„原因。因为包装器的目的是隐藏XmlHttpRequest的实玎ͼŒæˆ‘们ž®×ƒ¸å†è¯¦¾l†è®¨è®ºå®ƒäº†ã€?/div>
包装器本íw«é€šè¿‡ž®?NET函数标记为AJAXæ–ÒŽ³•来工作。标è®îC¹‹åŽï¼ŒAJAXž®±åˆ›å»ºå¯¹åº”çš„JavaScript函数åQŒè¿™äº›å‡½æ•ŽÍ¼ˆå’Œä“Q何JavaScriptå‡½æ•°ä¸€æ øP¼‰ä½œäؓ代理可以在客æˆïL«¯ä½¿ç”¨XmlHttpRequest调用。这些代理再映射回服务器端函数ã€?/div>
复杂吗?òq¶ä¸å¤æ‚。我们来看一个例子。假设有一ä¸?NET函数åQ?/div>
ublic int Add(int firstNumber, int secondNumber)
{
return firstNumber + secondNumber;
}
AJAX .NETåŒ…è£…å™¨å°†è‡ªåŠ¨åˆ›å¾åäØ“â€œAdd”、带有两个参数的JavaScript函数。ä‹É用JavaScriptåQˆåœ¨å®¢æˆ·æœÞZ¸ŠåQ‰è°ƒç”¨è¯¥å‡½æ•°æ—Óž¼Œè¯äh±‚ž®†ä¼ é€’ç»™æœåŠ¡å™¨åÆˆæŠŠç»“æžœè¿”å›žç»™å®¢æˆ·æœºã€?/div>
 
初始讄¡½®
我们首先介绍“安装”项目中使用çš?dll的步骤。如果您很清楚如何添åŠ?dllæ–‡äšg引用åQŒå¯ä»¥èŸ©˜q‡è¿™ä¸€èŠ‚ã€?/div>
首先åQŒå¦‚果还没有的话åQŒè¯·ä¸‹è²æœ€æ–°çš„AJAX版本。解压下载的文äšgòq¶æŠŠajax.dll攑ֈ°™å¹ç›®çš„引用文件夹中。在Visual Studio.NET中有机Solution Explorer的“ReferencesåQˆå¼•ç”¨ï¼‰â€èŠ‚ç‚¹åÆˆé€‰æ‹©Add ReferenceåQˆæ·»åŠ å¼•ç”¨ï¼‰ã€‚åœ¨æ‰“å¼€çš„å¯¹è¯æ¡†ä¸­ï¼Œå•å‡»BrowseåQˆæµè§ˆï¼‰òq¶æ‰¾åˆ°ref/ajax.dllæ–‡äšg。依‹Æ¡å•击OpenåQˆæ‰“å¼€åQ‰å’ŒOkåQˆç¡®è®¤ï¼‰ã€‚这样就可以用AJAX .NET包装器编½E‹äº†ã€?/div>
建立HttpHandler
ä¸ÞZº†ä¿è¯æ­£å¸¸å·¥ä½œåQŒç¬¬ä¸€æ­¥æ˜¯åœ¨web.config中设¾|®åŒ…装器的HttpHandler。不需要详¾l†è§£é‡ŠHttpHandlers是什么及其如何工作,只要知道它们用于处理ASP.NETè¯äh±‚ž®Þpƒö够了。比如,所æœ?.aspx™åµé¢è¯äh±‚都由System.Web.UI.PageHandlerFactory¾cÕd¤„理。类似的åQŒæˆ‘们让所有对ajax/*.ashx的请求由Ajax.PageHandlerFactory处理åQ?/div>
<configuration>
  <system.web>
    <httpHandlers>
      <add verb="POST,GET" path="ajax/*.ashx"
          type="Ajax.PageHandlerFactory, Ajax" />
    </httpHandlers> 
    ...
  <system.web>
</configuration>
½Ž€­a€ä¹‹ï¼Œä¸Šé¢çš„代码告诉ASP.NETåQŒå’ŒæŒ‡å®šè·¯å¾„åQˆajax/*.ashxåQ‰åŒ¹é…çš„ä»ÖM½•è¯äh±‚都由Ajax.PageHandlerFactory而不是默认处理程序工厂来处理。不需要创建ajax子目录,使用˜q™ä¸ª¼œžç§˜çš„ç›®å½•åªæ˜¯äØ“äº†è®©å…¶ä»–HttpHandlers能够在自己徏立的子目录中使用.ashx扩展ã€?/div>
 
建立™åµé¢
现在我们可以开始编码了。创å»ÞZ¸€ä¸ªæ–°™åµé¢æˆ–者打开已有的页面,在file后的代码中,为Page_Load事äšgæ·ÕdŠ ä»¥ä¸‹ä»£ç åQ?/div>
public class Index : System.Web.UI.Page{
  private void Page_Load(object sender, EventArgs e){
      Ajax.Utility.RegisterTypeForAjax(typeof(Index));     
      //...   
  }
  //... 
}
调用RegisterTypeForAjaxž®†åœ¨™åµé¢ä¸Šå¼•发后面的JavaScriptåQˆæˆ–者在™åµé¢ä¸­æ‰‹å·¥åŠ å…¥ä»¥ä¸‹ä¸¤è¡Œä»£ç ï¼‰åQ?/div>
<script language="javascript" src="ajax/common.ashx"></script>
<script language="javascript"
src="ajax/Namespace.PageClass,AssemblyName.ashx"></script>
其中最后一行的含义是:
  • Namespace.PageClass——当前页面的名称½Iºé—´å’Œç±»åQ?a href="mailto:通常是@Page指ä×o中Inherits属性的å€?>通常是@Page指ä×o中Inherits属性的å€?/a>åQ?
  • AssemblyName——当前页面所属程序集的名¿UŽÍ¼ˆé€šå¸¸ž®±æ˜¯™å¹ç›®åï¼‰
下面是AjaxPlay™å¹ç›®ä¸­sample.aspx™åµé¢çš„结果例子:
<%@ Page Inherits="AjaxPlay.Sample" Codebehind="sample.aspx.cs" ... %>
<html>
<head>
  <script language="javascript" src="ajax/common.ashx"></script>
  <script language="javascript"
          src="ajax/AjaxPlay.Sample,AjaxPlay.ashx"></script>
</head>
  <body>   
    <form id="Form1" method="post" runat="server">
      ...
    </form>   
  </body>
</html>
可以在浏览器中手工导航到src路径åQˆæŸ¥çœ‹æºä»£ç åQŒå¤åˆ¶ç²˜è´´èµ\径)‹‚€æŸ¥æ˜¯å¦ä¸€åˆ‡æ­£å¸¸ã€‚如果两个èµ\径都输出一些(ä¼ég¹ŽåQ‰æ¯«æ— æ„ä¹‰çš„æ–‡æœ¬åQŒå°±ä¸‡äº‹å¤§å‰äº†ã€‚如果什么也没输出或者出现ASP.NET错误åQŒåˆ™è¡¨æ˜Žæœ‰äº›åœ°æ–¹å‡ºçŽ°é—®é¢˜ã€?/div>
即便不知道HttpHandlers如何工作åQŒä¸Šé¢çš„例子也很å®ÒŽ˜“理解。通过web.configåQŒæˆ‘们已¾lä¿è¯æ‰€æœ‰å¯¹ajax/*.ashx的请求都ç”Þp‡ªå®šä¹‰çš„处理程序处理。显ç„Óž¼Œ˜q™é‡Œçš„两个脚本标½{‘Ö°†ç”Þp‡ªå®šä¹‰çš„处理程序处理ã€?/div>
 
创徏服务器端函数
现在来创建可从客æˆïL«¯è°ƒç”¨ä¸­å¼‚步访问的服务器端函数。因为目前还不支持所有的˜q”回¾cÕdž‹åQˆä¸ç”¨æ‹…心,ž®†åœ¨ç›®å‰çš„基¼‹€ä¸Šå¼€å‘新的版本)åQŒæˆ‘们ç‘ô¾l­ä‹É用简单的ServerSideAdd函数吧。在file后的代码中,向页面添加下列代码:
[Ajax.AjaxMethod()]
public int ServerSideAdd(int firstNumber, int secondNumber)
{
  return firstNumber + secondNumber;
}
要注意,˜q™äº›å‡½æ•°å…ähœ‰Ajax.AjaxMethod属性集。该属性告诉包装器˜q™äº›æ–ÒŽ³•创徏javaScript代理åQŒä»¥ä¾¿åœ¨å®¢æˆ·ç«¯è°ƒç”¨ã€?/div>
 
客户端调�/strong>
最后一步是用JavaScript调用该函数。AJAX包装器负责创建带有两个参数的JavaScript函数Sample.ServerSideAdd。对˜q™ç§æœ€½Ž€å•的函数åQŒåªéœ€è¦è°ƒç”¨è¯¥æ–ÒŽ³•òq¶ä¼ é€’两个数字:
<%@ Page Inherits="AjaxPlay.Sample" Codebehind="sample.aspx.cs" ... %>
<html>
<head>
  <script language="javascript" src="ajax/common.ashx"></script>
  <script language="javascript"
          src="ajax/AjaxPlay.Sample,AjaxPlay.ashx"></script>
</head>
  <body>   
    <form id="Form1" method="post" runat="server">
      <script language="javascript">
        var response = Sample.ServerSideAdd(100,99);
        alert(response.value);
      </script>
    </form>   
  </body>
</html>
当然åQŒæˆ‘们不希望仅仅用这¿Uå¼ºå¤§çš„能力来警告用戗÷€‚è¿™ž®±æ˜¯æ‰€æœ‰å®¢æˆïL«¯ä»£ç†åQˆå¦‚JavaScript Sample.ServerSideAd函数åQ‰è¿˜æŽ¥å—å…¶ä»–ç‰ÒŽ€§çš„原因。这¿Uç‰¹æ€§å°±æ˜¯äؓ了处理响应而调用的回调函数åQ?/div>
Sample.ServerSideAdd(100,99, ServerSideAdd_CallBack);

function ServerSideAdd_CallBack(response){
 if (response.error != null){
  alert(response.error);
  return;
 }
 alert(response.value);
}
从上˜qîC»£ç ä¸­å¯ä»¥çœ‹åˆ°æˆ‘们指定了另外一个参数。ServerSideAdd_CallBackåQˆåŒæ ·å‚见上˜qîC»£ç ï¼‰æ˜¯ç”¨äºŽå¤„理服务器响应的客æˆïL«¯å‡½æ•°ã€‚这个回调函数接收一个响应对象,该对象公开了三个主要性质
  • Value——服务器端函数实际返回的å€û|¼ˆæ— è®ºæ˜¯å­—½W¦ä¸²ã€è‡ªå®šä¹‰å¯¹è±¡˜q˜æ˜¯æ•°æ®é›†ï¼‰ã€?
  • Error——错误消息,如果有的话ã€?
  • Request——xml httpè¯äh±‚的原始响应ã€?
  • Context——上下文对象ã€?
首先我们‹‚€æŸ¥error只看看是否出çŽîCº†é”™è¯¯ã€‚通过在服务器端函æ•îC¸­æŠ›å‡ºå¼‚常åQŒå¯ä»¥å¾ˆå®ÒŽ˜“处理errorç‰ÒŽ€§ã€‚在˜q™ä¸ª½Ž€åŒ–çš„ä¾‹å­ä¸­ï¼Œç„¶åŽç”¨è¿™ä¸ªå€ÆD­¦å‘Šç”¨æˆ—÷€‚Requestç‰ÒŽ€§å¯ç”¨äºŽèŽ·å¾—æ›´å¤šä¿¡æ¯åQˆå‚见下一节)ã€?/div>
 
处理¾cÕdž‹
 
˜q”回复杂¾cÕdž‹
Ajax包装器不仅能处理ServerSideAdd函数所˜q”回的整数。它目前˜q˜æ”¯æŒintegers、strings、double、booleans、DateTime、DataSetså’ŒDataTablesåQŒä»¥åŠè‡ªå®šä¹‰¾cÕd’Œæ•°ç»„½{‰åŸºæœ¬ç±»åž‹ã€‚其他所有类型都˜q”回它们的ToString倹{€?/div>
˜q”回的DataSets和真正的.NET DataSet差不多。假设一个服务器端函数返回DataSetåQŒæˆ‘们可以通过下面的代码在客户端显½Cºå…¶ä¸­çš„内容åQ?/div>
<script language="JavaScript">
//Asynchronous call to the mythical "GetDataSet" server-side function
function getDataSet(){
  AjaxFunctions.GetDataSet(GetDataSet_callback);   
}
function GetDataSet_callback(response){
  var ds = response.value;
  if(ds != null && typeof(ds) == "object" && ds.Tables != null){
    var s = new Array();
    s[s.length] = "<table border=1>";
    for(var i=0; i<ds.Tables[0].Rows.length; i++){
      s[s.length] = "<tr>";
      s[s.length] = "<td>" + ds.Tables[0].Rows[i].FirstName + "</td>";
      s[s.length] = "<td>" + ds.Tables[0].Rows[i].Birthday + "</td>";
      s[s.length] = "</tr>";
    }
    s[s.length] = "</table>";
    tableDisplay.innerHTML = s.join("");
  }
  else {
    alert("Error. [3001] " + response.request.responseText);
  }
}
</script>
Ajax˜q˜å¯ä»¥è¿”回自定义¾c»ï¼Œå”¯ä¸€çš„要求是必须用Serializable属性标记。假设有如下的类åQ?/div>
[Serializable()]
public class User{
  private int _userId;
  private string _firstName;
  private string _lastName;

  public int userId{
    get { return _userId; }
  }
  public string FirstName{
    get { return _firstName; }
  }
  public string LastName{
    get { return _lastName; }
  }
  public User(int _userId, string _firstName, string _lastName){
    this._userId = _userId;
    this._firstName = _firstName;
    this._lastName = _lastName;
  }
  public User(){}
  [AjaxMethod()]
  public static User GetUser(int userId){
    //Replace this with a DB hit or something :)
    return new User(userId,"Michael", "Schwarz");
  }
}
我们可以通过调用RegisterTypeForAjax注册GetUser代理åQ?/div>
private void Page_Load(object sender, EventArgs e){
  Utility.RegisterTypeForAjax(typeof(User));
}
˜q™æ ·ž®±å¯ä»¥åœ¨å®¢æˆ·ç«¯å¼‚步调用GetUseråQ?/div>
<script language="javascript">
function getUser(userId){
  User.GetUser(GetUser_callback);
}
function GetUser_callback(response){
  if (response != null && response.value != null){
    var user = response.value;
    if (typeof(user) == "object"){         
      alert(user.FirstName + " " + user.LastName);
    }
  }
}
getUser(1);
</script>
响应中返回的值实际上是一个对象,公开了和服务器端对象相同的属性(FirstName、LastNameå’ŒUserIdåQ‰ã€?/div>
 
自定义è{换器
我们已经看到åQŒAjax .NET包装器能够处理很多不同的.NET¾cÕdž‹ã€‚但是除了大é‡?NET¾cÕd’Œå†…徏¾cÕdž‹ä»¥å¤–åQŒåŒ…装器对不能正¼‹®è¿”回的其他¾cÕdž‹ä»…仅调用ToString()ã€‚äØ“äº†é¿å…è¿™¿Uæƒ…况,Ajax .NET包装器允许开发äh员创建对象è{换器åQŒç”¨äºŽåœ¨æœåŠ¡å™¨å’Œå®¢æˆ·æœÞZ¹‹é—´åã^滑传递复杂对象ã€?/div>
 
其他事项
 
在其他类中注册函�/strong>
 
上面的例子中åQŒæˆ‘们的服务器端函数都放在执行页面背后的代码中。但是,没有理由不能把这些函数放在单独的¾cÀL–‡ä»¶ä¸­ã€‚要è®îC½åQŒåŒ…装器的工作方式是在指定类中发现所有带Ajax.AjaxMethod的方法。需要的¾c»é€šè¿‡½W¬äºŒä¸ªè„šæœ¬æ ‡½{¾æŒ‡å®šã€‚ä‹É用Ajax.Utility.RegisterTypeForAjaxåQŒæˆ‘们可以指定需要的ä»ÖM½•¾c…R€‚比如,ž®†æˆ‘ä»¬çš„æœåŠ¡å™¨ç«¯å‡½æ•°ä½œäØ“å•ç‹¬çš„ç±»æ˜¯åˆæƒ…åˆç†çš„åQ?/div>
Public Class AjaxFunctions
  <Ajax.AjaxMethod()> _
  Public Function Validate(username As String, password As String) As Boolean
    'do something
    'Return something
  End Function
End Class
通过指定¾cȝš„¾cÕdž‹è€Œä¸æ˜¯é¡µé¢å°±å¯ä»¥è®©Ajax包装器创å»ÞZ»£ç†ï¼š
private void Page_Load(object sender, EventArgs e){
  Ajax.Utility.RegisterTypeForAjax(typeof(AjaxFunctions));
  //...
}
要记住,客户端代理的名称æ˜?lt;ClassName>.<ServerSideFunctionName>。因此,如果ServerSideAdd函数攑֜¨ä¸Šé¢è™šæž„çš„AjaxFunctions¾cÖM¸­åQŒå®¢æˆïL«¯è°ƒç”¨ž®±åº”该是åQ?AjaxFunctions.ServerSideAdd(1,2)ã€?/div>
 
代理到底是如何工作的
 
Ajax工具生成的第二个脚本标签åQˆä¹Ÿå¯ä»¥æ‰‹å·¥æ’å…¥åQ‰ä¼ é€’了™åµé¢çš„名¿U°ç©ºé—´ã€ç±»åå’Œ½E‹åºé›†ã€‚根据这些信息,Ajax.PageHandlerFactoryž®Þpƒ½å¤Ÿä‹É用反ž®„得到具有特定属性的ä»ÖM½•函数的详¾l†ä¿¡æ¯ã€‚显ç„Óž¼Œå¤„理函数查找å…ähœ‰AjaxMethod属性的函数òq¶å¾—到它们的½{‘֐åQˆè¿”回类型、名¿U°å’Œå‚æ•°åQ‰ï¼Œä»Žèƒ½å¤Ÿåˆ›å»ºå¿…要的客户端代理。具体而言åQŒåŒ…装器创徏一个和¾cÕdŒåçš„JavaScript对象åQŒè¯¥å¯¹è±¡æä¾›ä»£ç†ã€‚换句话è¯ß_¼Œ¾l™å®šä¸€ä¸ªå¸¦æœ‰Ajax ServerSideAddæ–ÒŽ³•的服务器端类AjaxFunctionsåQŒæˆ‘们就会得到公开ServerSideAdd函数的AjaxFunction JavaScript对象。如果将‹¹è§ˆå™¨æŒ‡å‘第二个脚本标签的èµ\径就会看到这¿UåŠ¨ä½œã€?/div>
 
˜q”回Unicode字符
 
Ajax .NETåŒ…è£…å™¨èƒ½å¤Ÿä»ŽæœåŠ¡å™¨å‘å®¢æˆ·æœø™¿”回Unicodeå­—ç¬¦ã€‚äØ“æ­¤ï¼Œæ•°æ®åœ¨è¿”å›žä¹‹å‰å¿…™åÕdœ¨æœåŠ¡å™¨ä¸Šç”¨html¾~–码。比如:
[Ajax.AjaxMethod]
public string Test1(string name, string email, string comment){
  string html = "";
  html += "Hello " + name + "<br>";
  html += "Thank you for your comment <b>";
  html += System.Web.HttpUtility.HtmlEncode(comment);
  html += "</b>.";
  return html;
}
SessionState
 
æœåŠ¡å™¨ç«¯å‡½æ•°ä¸­å¾ˆå¯èƒ½éœ€è¦è®¿é—®ä¼šè¯ä¿¡æ¯ã€‚äØ“æ­¤ï¼Œåªéœ€è¦é€šè¿‡ä¼ é€’ç»™Ajax.AjaxMethod属性的一个参数告诉Ajax启用˜q™ç§åŠŸèƒ½ã€?/div>
在考察包装器会话能力的同时åQŒæˆ‘们来看看其他几个ç‰ÒŽ€§ã€‚这个例子中我们有一个文档管理系¾lŸï¼Œç”¨æˆ·¾~–辑的时候会å¯ÒŽ–‡æ¡£åŠ é”ã€‚å…¶ä»–ç”¨æˆ·å¯ä»¥è¯·æ±‚åœ¨æ–‡æ¡£å¯ç”¨çš„æ—¶å€™å¾—åˆ°é€šçŸ¥ã€‚å¦‚æžœæ²¡æœ‰AJAXåQŒæˆ‘们就只能½{‰å¾…该用户再‹Æ¡è¿”回来‹‚€æŸ¥è¯·æ±‚的文档是否可用。显然不够理惟뀂ä‹É用支持会话状态的Ajaxž®±éžå¸¸ç®€å•了ã€?/div>
首先来编写服务器端函敎ͼŒç›®æ ‡æ˜¯åó@环遍历用户希望编辑的documentIdåQˆä¿å­˜åœ¨ä¼šè¯ä¸­ï¼‰òq¶è¿”回所有已释放的文æ¡£ã€?/div>
[Ajax.AjaxMethod(HttpSessionStateRequirement.Read)]
public ArrayList DocumentReleased(){
  if (HttpContext.Current.Session["DocumentsWaiting"] == null){
    return null;
  }
  ArrayList readyDocuments = new ArrayList();
  int[] documents = (int[])HttpContext.Current.Session["DocumentsWaiting"];
  for (int i = 0; i < documents.Length; ++i){
    Document document = Document.GetDocumentById(documents[i]);
    if (document != null && document.Status == DocumentStatus.Ready){
      readyDocuments.Add(document);
    }       
  }
  return readyDocuments;
  }
}
要注意,我们指定了HttpSessionStateRequirement.Readå€û|¼ˆ˜q˜å¯ä»¥ç”¨Writeå’ŒReadWriteåQ‰ã€?/div>
现在¾~–写使用该方法的JavaScriptåQ?/div>
<script language="javascript">
function DocumentsReady_CallBack(response){
  if (response.error != null){
    alert(response.error);
    return;
  }
  if (response.value != null && response.value.length > 0){
    var div = document.getElementById("status");
    div.innerHTML = "The following documents are ready!<br />";
    for (var i = 0; i < response.value.length; ++i){
      div.innerHTML += "<a href=\"edit.aspx?documentId=" + response.value[i].DocumentId + "\">" + response.value[i].Name + "</a><br />";
    }     
  }
  setTimeout('page.DocumentReleased(DocumentsReady_CallBack)', 10000);
}
</script> 
<body onload="setTimeout('Document.DocumentReleased(DocumentsReady_CallBack)', 10000);">
我们的服务器端函数在™åµé¢åŠ è²æ—¶è°ƒç”¨ä¸€‹Æ¡ï¼Œç„¶åŽæ¯éš”10¿U’钟调用一‹Æ¡ã€‚回调函数检查响应看看是否有˜q”回å€û|¼Œæœ‰çš„话则在div标签中显½Cø™¯¥ç”¨æˆ·å¯ä‹É用的新文档ã€?/div>
¾l“束è¯?/div>
AJAX技术已¾lå‚¬ç”Ÿäº†åŽŸæ¥åªæœ‰æ¡Œé¢å¼€å‘æ‰å…·å¤‡çš„å¥å£®è€Œä¸°å¯Œçš„Web界面。Ajax .NET包装器让您很å®ÒŽ˜“ž®Þpƒ½åˆ©ç”¨˜q™ç§æ–°çš„强大技术。请注意åQŒAjax .NET包装器和文档仍在开发之中ã€?/div>



]]>使DataList控äšg有翻™åµåŠŸèƒ?/title><link>http://www.aygfsteel.com/wangxinsh55/archive/2007/01/25/95902.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Thu, 25 Jan 2007 05:10:00 GMT</pubDate><guid>http://www.aygfsteel.com/wangxinsh55/archive/2007/01/25/95902.html</guid><wfw:comment>http://www.aygfsteel.com/wangxinsh55/comments/95902.html</wfw:comment><comments>http://www.aygfsteel.com/wangxinsh55/archive/2007/01/25/95902.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wangxinsh55/comments/commentRss/95902.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wangxinsh55/services/trackbacks/95902.html</trackback:ping><description><![CDATA[Asp.net提供了三个功能强大的列表控äšgåQšDataGrid、DataListå’ŒRepeater控äšgåQŒä½†å…¶ä¸­åªæœ‰DataGrid控äšg提供分页功能。相对DataGridåQŒDataListå’ŒRepeater控äšgå…ähœ‰æ›´é«˜çš„æ ·å¼è‡ªå®šä¹‰æ€§ï¼Œæ‰€ä»¥å¾ˆå¤šæ—¶å€™æˆ‘们喜‹Æ¢ä‹É用DataList或Repeater控äšg来显½Cºæ•°æ®ã€?br /><br /><br /> 实现DataList或Repeater控äšg的分™å‰|˜¾½Cºæœ‰å‡ ç§æ–ÒŽ³•åQ?br /> 1、写一个方法或存储˜q‡ç¨‹åQŒæ ¹æ®ä¼ å…¥çš„™å‰|•°˜q”回需要显½Cºçš„æ•°æ®è¡¨ï¼ˆDataTableåQ?br /> 2、ä‹É用PagedDataSource¾c?br /><br />     本篇文章主要说怎么使用PagedDataSource¾cÕd®žçްDataListå’ŒRepeater控äšg的分™å‰|˜¾½Cºã€‚DataGrid控äšg内部也ä‹É用了PagedDataSource¾c»ï¼ŒPagedDataSource ¾cÕd°è£… DataGrid 控äšg的属性,˜q™äº›å±žæ€§ä‹É DataGrid 可以执行分页ã€?br /><br /> PagedDataSource ¾cȝš„部分公共属性:<br /> AllowCustomPaging  获取或设¾|®æŒ‡½Cºæ˜¯å¦å¯ç”¨è‡ªå®šä¹‰åˆ†é¡µçš„倹{€‚Â?br /> AllowPaging   获取或设¾|®æŒ‡½Cºæ˜¯å¦å¯ç”¨åˆ†™å늚„倹{€‚Â?br /> Count    获取要从数据源ä‹É用的™åÒŽ•°ã€‚Â?br /> CurrentPageIndex   获取或设¾|®å½“前页的烦引。Â?br /> DataSource   获取或设¾|®æ•°æ®æºã€‚Â?br /> DataSourceCount   获取数据源中的项数。Â?br /> FirstIndexInPage   获取™åµä¸­çš„第一个烦引。Â?br /> IsCustomPagingEnabled  获取一个å€û|¼Œè¯¥å€¼æŒ‡½Cºæ˜¯å¦å¯ç”¨è‡ªå®šä¹‰åˆ†é¡µã€‚Â?br /> IsFirstPage   获取一个å€û|¼Œè¯¥å€¼æŒ‡½Cºå½“前页是否是首™åüc€‚Â?br /> IsLastPage   获取一个å€û|¼Œè¯¥å€¼æŒ‡½Cºå½“前页是否是最后一™åüc€‚Â?br /> IsPagingEnabled   获取一个å€û|¼Œè¯¥å€¼æŒ‡½Cºæ˜¯å¦å¯ç”¨åˆ†™åüc€‚Â?br /> IsReadOnly   获取一个å€û|¼Œè¯¥å€¼æŒ‡½Cºæ•°æ®æºæ˜¯å¦æ˜¯åªè¯Èš„。Â?br /> IsSynchronized   获取一个å€û|¼Œè¯¥å€¼æŒ‡½Cºæ˜¯å¦åŒæ­¥å¯¹æ•°æ®æºçš„讉K—®åQˆçº¿½E‹å®‰å…¨ï¼‰ã€‚Â?br /> PageCount   获取昄¡¤ºæ•°æ®æºä¸­çš„æ‰€æœ‰é¡¹æ‰€éœ€è¦çš„æ€»é¡µæ•°ã€‚Â?br /> PageSize   获取或设¾|®è¦åœ¨å•™åµä¸Šæ˜„¡¤ºçš„项数。Â?br /> VirtualCount   获取或设¾|®åœ¨ä½¿ç”¨è‡ªå®šä¹‰åˆ†™å‰|—¶æ•°æ®æºä¸­çš„实际项数。Â?br /><br />      ˜q™äº›å±žæ€§æ˜¯å¦å’ŒDataGridçš„å±žæ€§å¾ˆç›æ€¼¼åQŸæ²¡é”™ï¼ŒDataGrid控äšgž®±æ˜¯ä½¿ç”¨PagedDataSource¾cÀL¥å®žçŽ°æ•°æ®åˆ†é¡µæ˜„¡¤ºçš„ 。下面ä‹D个ä‹É用PagedDataSource¾cÕd®žçްDataListå’ŒRepeater控äšg的分™å‰|˜¾½Cºçš„例子åQ?br /><div id="wmqeeuq" class="UBBPanel"><div id="wmqeeuq" class="UBBTitle"><img style="MARGIN: 0px 2px -3px 0px" alt="½E‹åºä»£ç " src="http://a.5dm.cn/blog/images/code.gif" /> ½E‹åºä»£ç </div><div id="wmqeeuq" class="UBBContent"><br />public void Page_Load(Object src,EventArgs e) <br />{<br />OleDbConnection objConn=new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\test.mdb");<br />OleDbDataAdapter objCommand=new OleDbDataAdapter("select * from Users",objConn);<br />DataSet ds=new DataSet();<br />objCommand.Fill(ds);<br /><br />//对PagedDataSource 对象的相兛_±žæ€§èµ‹å€?br />PagedDataSource objPds = new PagedDataSource();<br />objPds.DataSource = ds.Tables[0].DefaultView;<br />objPds.AllowPaging = true;<br />objPds.PageSize = 5;<br />int CurPage;<br /><br />//当前™åµé¢ä»ŽPage查询参数获取<br />if (Request.QueryString["Page"] != null)<br />  CurPage=Convert.ToInt32(Request.QueryString["Page"]);<br />else<br />  CurPage=1;<br /><br />objPds.CurrentPageIndex = CurPage-1; <br />lblCurrentPage.Text = "Page: " + CurPage.ToString();<br /><br />if (!objPds.IsFirstPage)<br />  lnkPrev.NavigateUrl=Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage-1);<br /><br />if (!objPds.IsLastPage)<br />  lnkNext.NavigateUrl=Request.CurrentExecutionFilePath+ "?Page=" + Convert.ToString(CurPage+1);<br /><br />//把PagedDataSource 对象赋给Repeater控äšg<br />Repeater1.DataSource=objPds;<br />Repeater1.DataBind();<br />}<br /></div></div><br />˜q™æ ·ž®±å¯ä»¥å¾ˆ½Ž€å•的实现DataListå’ŒRepeater控äšg的分™å‰|˜¾½Cºã€‚但˜q™æ ·åšæœ‰ä¸ªç¼ºç‚¹ï¼Œž®±æ˜¯æ¯æ¬¡éƒ½è¦æŠŠæ‰€æœ‰é¡µçš„æ•°æ®Select出来åQŒDataGrid也是˜q™æ ·åQŒè¿™æ ·ä¼šé™ä½Žä¸€ç‚ÒŽ•ˆçŽ‡ï¼ˆå¤§å¤šæ—¶å€™ä½“ä¼šä¸å‡ºæ¥å·®åˆ«åQ‰ï¼›å¦‚果使用½W¬ä¸€¿Uæ–¹æ³•就可以只Select出当前页的数据(实现æ–ÒŽ³•è¯ähŸ¥çœ‹æœ‰å…Ïx–‡ç« ï¼‰<img src ="http://www.aygfsteel.com/wangxinsh55/aggbug/95902.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wangxinsh55/" target="_blank">SIMONE</a> 2007-01-25 13:10 <a href="http://www.aygfsteel.com/wangxinsh55/archive/2007/01/25/95902.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP.NET½E‹åºä¸­å¸¸ç”¨çš„三十三种代码http://www.aygfsteel.com/wangxinsh55/archive/2007/01/25/95901.htmlSIMONESIMONEThu, 25 Jan 2007 05:02:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2007/01/25/95901.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/95901.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2007/01/25/95901.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/95901.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/95901.html 1. 打开新的½H—口òq¶ä¼ é€å‚敎ͼš

  传送参敎ͼš

response.write("åQœscriptåQžwindow.open(â€?.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"â€?åQ?scriptåQ?)
  接收参数åQ?o:p>

string a = Request.QueryString("id");
string b = Request.QueryString("id1");
  2.为按钮添加对话框

Button1.Attributes.Add("onclick","return confirm(’确��");
button.attributes.add("onclick","if(confirm(’are you sure...?�){return true;}else{return false;}")
  3.删除表格选定记录

int intEmpID = (int)MyDataGrid.DataKeys[e.Item.ItemIndex];
string deleteCmd = "DELETE from Employee where emp_id = " + intEmpID.ToString()
  4.删除表格记录警告

private void DataGrid_ItemCreated(Object sender,DataGridItemEventArgs e)
{
 switch(e.Item.ItemType)
 {
  case ListItemType.Item :
  case ListItemType.AlternatingItem :
  case ListItemType.EditItem:
   TableCell myTableCell;
   myTableCell = e.Item.Cells[14];
   LinkButton myDeleteButton ;
   myDeleteButton = (LinkButton)myTableCell.Controls[0];
   myDeleteButton.Attributes.Add("onclick","return confirm(’您是否¼‹®å®šè¦åˆ é™¤è¿™æ¡ä¿¡æ¯â€?;");
   break;
  default:
   break;
 }

}
  5.点击表格行链接另一™å?o:p>

private void grdCustomer_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
 //点击表格打开
 if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
  e.Item.Attributes.Add("onclick","window.open(’Default.aspx?id=" + e.Item.Cells[0].Text + "�;");
}
  双击表格˜qžæŽ¥åˆ°å¦ä¸€™å?o:p>

  åœ?span lang="EN-US">itemDataBind事äšgä¸?o:p>

if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
 string OrderItemID =e.item.cells[1].Text;
 ...
 e.item.Attributes.Add("ondblclick", "location.href=�./ShippedGrid.aspx?id=" + OrderItemID + "�);
}
  双击表格打开æ–îC¸€™å?o:p>

if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
 string OrderItemID =e.item.cells[1].Text;
 ...
 e.item.Attributes.Add("ondblclick", "open(�./ShippedGrid.aspx?id=" + OrderItemID + "�");
}

6.表格­‘…连接列传递参æ•?o:p>

åQ?span lang="EN-US">asp:HyperLinkColumn Target="_blank" headertext="IDå? DataTextField="id" NavigateUrl="aaa.aspx?id=â€?br /> åQ?# DataBinder.Eval(Container.DataItem, "数据字段1")%åQžâ€?& name=’<%# DataBinder.Eval(Container.DataItem, "数据字段2")%åQžâ€?/åQ?br />  7.表格点击改变颜色

if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)
{
 e.Item.Attributes.Add("onclick","this.style.backgroundColor=�99cc00�
    this.style.color=’buttontext�this.style.cursor=’default�");
}
  写在DataGrid的_ItemDataBound�o:p>

if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)
{
e.Item.Attributes.Add("onmouseover","this.style.backgroundColor=�99cc00�
   this.style.color=’buttontext�this.style.cursor=’default�");
e.Item.Attributes.Add("onmouseout","this.style.backgroundColor=’�this.style.color=’�");
}

  8.关于日期格式

  日期格式讑֮š

DataFormatString="{0:yyyy-MM-dd}"
  我觉得应该在itembound事äšgä¸?o:p>

e.items.cell["你的�].text=DateTime.Parse(e.items.cell["你的�].text.ToString("yyyy-MM-dd"))
  9.获取错误信息òq¶åˆ°æŒ‡å®š™åµé¢

  不要使用Response.Redirect,而应该ä‹É用Server.Transfer

  e.g

// in global.asax
protected void Application_Error(Object sender, EventArgs e) {
if (Server.GetLastError() is HttpUnhandledException)
Server.Transfer("MyErrorPage.aspx");

//其余的非HttpUnhandledException异常交给ASP.NET自己处理ž®±okayäº?:)
}
  Redirect会导致poståQbackçš„äñ”生从而丢å¤×ƒº†é”™è¯¯ä¿¡æ¯åQŒæ‰€ä»¥é¡µé¢å¯¼å‘应该直接在服务器端执行åQŒè¿™æ ·å°±å¯ä»¥åœ¨é”™è¯¯å¤„ç†é¡µé¢å¾—åˆ°å‡ºé”™ä¿¡æ¯åÆˆ˜q›è¡Œç›¸åº”的处ç?

  10.清空Cookie

Cookie.Expires=[DateTime];
Response.Cookies("UserName").Expires = 0
  11.自定义异常处�o:p>

//自定义异常处理类
using System;
using System.Diagnostics;

namespace MyAppException
{
 /// åQœsummaryåQ?br /> /// 从系¾lŸå¼‚常类ApplicationException¾l§æ‰¿çš„应用程序异常处理类ã€?br /> /// 自动ž®†å¼‚常内容记录到Windows NT/2000的应用程序日å¿?br /> /// åQ?summaryåQ?br /> public class AppException:System.ApplicationException
 {
  public AppException()
  {
   if (ApplicationConfiguration.EventLogEnabled)LogEvent("出现一个未知错误�);
  }

 public AppException(string message)
 {
  LogEvent(message);
 }

 public AppException(string message,Exception innerException)
 {
  LogEvent(message);
  if (innerException != null)
  {
   LogEvent(innerException.Message);
  }
 }

 //日志记录¾c?br /> using System;
 using System.Configuration;
 using System.Diagnostics;
 using System.IO;
 using System.Text;
 using System.Threading;

 namespace MyEventLog
 {
  /// åQœsummaryåQ?br />  /// 事äšg日志记录¾c»ï¼Œæä¾›äº‹äšg日志记录支持
  /// åQœremarksåQ?br />  /// 定义äº?个日志记录方æ³?(error, warning, info, trace)
  /// åQ?remarksåQ?br />  /// åQ?summaryåQ?br />  public class ApplicationLog
  {
   /// åQœsummaryåQ?br />   /// ž®†é”™è¯¯ä¿¡æ¯è®°å½•到Win2000/NT事äšg日志ä¸?br />   /// åQœparam name="message"åQžéœ€è¦è®°å½•的文本信息åQ?paramåQ?br />   /// åQ?summaryåQ?br />   public static void WriteError(String message)
   {
    WriteLog(TraceLevel.Error, message);
   }

   /// åQœsummaryåQ?br />   /// ž®†è­¦å‘Šä¿¡æ¯è®°å½•到Win2000/NT事äšg日志ä¸?br />   /// åQœparam name="message"åQžéœ€è¦è®°å½•的文本信息åQ?paramåQ?br />   /// åQ?summaryåQ?br />   public static void WriteWarning(String message)
   {
    WriteLog(TraceLevel.Warning, message);  
   }

   /// åQœsummaryåQ?br />   /// ž®†æ½CÞZ¿¡æ¯è®°å½•到Win2000/NT事äšg日志ä¸?br />   /// åQœparam name="message"åQžéœ€è¦è®°å½•的文本信息åQ?paramåQ?br />   /// åQ?summaryåQ?br />   public static void WriteInfo(String message)
   {
    WriteLog(TraceLevel.Info, message);
   }
   /// åQœsummaryåQ?br />   /// ž®†è·Ÿítªä¿¡æ¯è®°å½•到Win2000/NT事äšg日志ä¸?br />   /// åQœparam name="message"åQžéœ€è¦è®°å½•的文本信息åQ?paramåQ?br />   /// åQ?summaryåQ?br />   public static void WriteTrace(String message)
   {
    WriteLog(TraceLevel.Verbose, message);
   }

   /// åQœsummaryåQ?br />   /// 格式化记录到事äšg日志的文本信息格å¼?br />   /// åQœparam name="ex"åQžéœ€è¦æ ¼å¼åŒ–的异常对象</paramåQ?br />   /// åQœparam name="catchInfo"åQžå¼‚叿€¿¡æ¯æ ‡é¢˜å­—½W¦ä¸².åQ?paramåQ?br />   /// åQœretvalueåQ?br />   /// åQœparaåQžæ ¼å¼åŽçš„异叿€¿¡æ¯å­—½W¦ä¸²åQŒåŒ…括异常内容和跟踪堆栈.åQ?paraåQ?br />   /// åQ?retvalueåQ?br />   /// åQ?summaryåQ?br />   public static String FormatException(Exception ex, String catchInfo)
   {
    StringBuilder strBuilder = new StringBuilder();
    if (catchInfo != String.Empty)
    {
     strBuilder.Append(catchInfo).Append("\r\n");
    }
    strBuilder.Append(ex.Message).Append("\r\n").Append(ex.StackTrace);
    return strBuilder.ToString();
   }

   /// åQœsummaryåQ?br />   /// 实际事äšg日志写入æ–ÒŽ³•
   /// åQœparam name="level"åQžè¦è®°å½•信息的çñ”别(error,warning,info,trace).åQ?paramåQ?br />   /// åQœparam name="messageText"åQžè¦è®°å½•的文æœ?åQ?paramåQ?br />   /// åQ?summaryåQ?br />   private static void WriteLog(TraceLevel level, String messageText)
   {
    try
    {
     EventLogEntryType LogEntryType;
     switch (level)
     {
      case TraceLevel.Error:
       LogEntryType = EventLogEntryType.Error;
       break;
      case TraceLevel.Warning:
       LogEntryType = EventLogEntryType.Warning;
       break;
      case TraceLevel.Info:
       LogEntryType = EventLogEntryType.Information;
       break;
      case TraceLevel.Verbose:
       LogEntryType = EventLogEntryType.SuccessAudit;
       break;
      default:
       LogEntryType = EventLogEntryType.SuccessAudit;
       break;
     }

     EventLog eventLog = new EventLog("Application", ApplicationConfiguration.EventLogMachineName, ApplicationConfiguration.EventLogSourceName );
     //写入事äšg日志
     eventLog.WriteEntry(messageText, LogEntryType);

    }
   catch {} //忽略ä»ÖM½•异常
  }
 } //class ApplicationLog
}
12.Panel 横向滚动åQŒçºµå‘自动扩å±?o:p>

åQ?span lang="EN-US">asp:panel style="overflow-x:scroll;overflow-y:auto;"åQžï¼œ/asp:panelåQ?br />  13.回èžR转换成Tab

åQ?span lang="EN-US">script language="javascript" for="document" event="onkeydown"åQ?br /> if(event.keyCode==13 && event.srcElement.type!=’buttonâ€?&& event.srcElement.type!=’submitâ€?&&     event.srcElement.type!=’resetâ€?&& event.srcElement.type!=’â€?amp;& event.srcElement.type!=’textareaâ€?;
   event.keyCode=9;
åQ?scriptåQ?o:p>

onkeydown="if(event.keyCode==13) event.keyCode=9"

  14.DataGrid­‘…çñ”˜qžæŽ¥åˆ?o:p>

DataNavigateUrlField="字段� DataNavigateUrlFormatString="http://xx/inc/delete.aspx?ID={0}"
  15.DataGrid行随鼠标变色

private void DGzf_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
 if (e.Item.ItemType!=ListItemType.Header)
 {
  e.Item.Attributes.Add( "onmouseout","this.style.backgroundColor=\""+e.Item.Style["BACKGROUND-COLOR"]+"\"");
  e.Item.Attributes.Add( "onmouseover","this.style.backgroundColor=\""+ "#EFF3F7"+"\"");
 }
}
  16.模板�br />www.knowsky.com

åQ?span lang="EN-US">ASP:TEMPLATECOLUMN visible="False" sortexpression="demo" headertext="ID"åQ?br />åQœITEMTEMPLATEåQ?br />åQœASP:LABEL text=’<%# DataBinder.Eval(Container.DataItem, "ArticleID")%åQžâ€?runat="server" width="80%" id="lblColumn" /åQ?br />åQ?ITEMTEMPLATEåQ?br />åQ?ASP:TEMPLATECOLUMNåQ?o:p>

åQ?span lang="EN-US">ASP:TEMPLATECOLUMN headertext="选中"åQ?br />åQœHEADERSTYLE wrap="False" horizontalalign="Center"åQžï¼œ/HEADERSTYLEåQ?br />åQœITEMTEMPLATEåQ?br />åQœASP:CHECKBOX id="chkExport" runat="server" /åQ?br />åQ?ITEMTEMPLATEåQ?br />åQœEDITITEMTEMPLATEåQ?br />åQœASP:CHECKBOX id="chkExportON" runat="server" enabled="true" /åQ?br />åQ?EDITITEMTEMPLATEåQ?br />åQ?ASP:TEMPLATECOLUMNåQ?br />  后台代码

protected void CheckAll_CheckedChanged(object sender, System.EventArgs e)
{
 //改变列的选定åQŒå®žçŽ°å…¨é€‰æˆ–å…¨ä¸é€‰ã€?br /> CheckBox chkExport ;
 if( CheckAll.Checked)
 {
  foreach(DataGridItem oDataGridItem in MyDataGrid.Items)
  {
   chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");
   chkExport.Checked = true;
  }
 }
 else
 {
  foreach(DataGridItem oDataGridItem in MyDataGrid.Items)
  {
   chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");
   chkExport.Checked = false;
  }
 }
}
  17.数字格式�o:p>

  【<%#Container.DataItem("price")%åQžçš„¾l“æžœæ˜?00.0000åQŒæ€Žæ ·æ ¼å¼åŒ–䨓500.00?ã€?o:p>

åQ?span lang="EN-US">%#Container.DataItem("price","{0:åK?,##0.00}")%åQ?o:p>

int i=123456;
string s=i.ToString("###,###.00");
18.日期格式�o:p>

  ã€?span lang="EN-US">aspx™åµé¢å†…:åQ?# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date")%åQ?o:p>

  昄¡¤ºä¸ºï¼š 2004-8-11 19:44:28

  我只惌™¦åQ?span lang="EN-US">2004-8-11 ã€?o:p>

åQ?span lang="EN-US">%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date","{0:yyyy-M-d}")%åQ?br />  应该如何改?

  【格式化日期�span lang="EN-US">

  取出�span lang="EN-US">,一般是object((DateTime)objectFromDB).ToString("yyyy-MM-dd");

  【日期的验证表达式�span lang="EN-US">

  A.以下正确的输入格式: [2004-2-29], [2004-02-29 10:29:39 pm], [2004/12/31]

^((\d{2}(([02468][048])|([13579][26]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|([1-2][0-9])))))|(\d{2}(([02468][1235679])|([13579][01345789]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\s(((0?[1-9])|(1[0-2]))\:([0-5][0-9])((\s)|(\:([0-5][0-9])\s))([AM|PM|am|pm]{2,2})))?$
  B.以下正确的输入格式:[0001-12-31], [9999 09 30], [2002/03/03]

^\d{4}[\-\/\s]?((((0[13578])|(1[02]))[\-\/\s]?(([0-2][0-9])|(3[01])))|(((0[469])|(11))[\-\/\s]?(([0-2][0-9])|(30)))|(02[\-\/\s]?[0-2][0-9]))$
  【大ž®å†™è½¬æ¢ã€?o:p>

HttpUtility.HtmlEncode(string);
HttpUtility.HtmlDecode(string)
  19.如何讑֮šå…¨å±€å˜é‡

  Global.asax�o:p>

  Application_Start()事äšgä¸?o:p>

  æ·ÕdŠ Application[属性名] åQ?xxx;

  ž®±æ˜¯ä½ çš„全局变量

  20.怎样作到HyperLinkColumn生成的连接后åQŒç‚¹å‡»è¿žæŽ¥ï¼Œæ‰“开新窗口?

  HyperLinkColumn有个属性Target,ž®†å™¨å€ÆD®¾¾|®æˆ"_blank"卛_¯.(Target="_blank")

  �span lang="EN-US">ASPNETMENU】点击菜单项弹出新窗�o:p>

  在你çš?span lang="EN-US">menuData.xmlæ–‡äšg的菜单项中加入URLTarget="_blank"åQŒå¦‚åQ?o:p>

åQ?span lang="EN-US">?xml version="1.0" encoding="GB2312"?åQ?br />åQœMenuData ImagesBaseURL="images/"åQ?
åQœMenuGroupåQ?br />åQœMenuItem Label="内参信息" URL="Infomation.aspx" åQ?br />åQœMenuGroup ID="BBC"åQ?br />åQœMenuItem Label="公告信息" URL="Infomation.aspx" URLTarget="_blank" LeftIcon="file.gif"/åQ?br />åQœMenuItem Label="¾~–制信息½Ž€æŠ? URL="NewInfo.aspx" LeftIcon="file.gif" /åQ?br />......
  最好将你的aspnetmenu升çñ”åˆ?.2ç‰?o:p>

  21.è¯Õd–DataGrid控äšgTextBoxå€?o:p>

foreach(DataGrid dgi in yourDataGrid.Items)
{
 TextBox tb = (TextBox)dgi.FindControl("yourTextBoxId");
 tb.Text....
}
  23.在DataGrid中有3个模板列包含Textbox分别ä¸?DG_ShuLiang (数量) DG_DanJian(单ä­h) DG_JinE(金额)分别åœ?.6.7列,要求在录入数量及单ä­h的时候自动算出金额即:数量*单ä­h=金额˜q˜è¦æ±‚录入时限制为数值型.我如何用客户端脚本实现这个功èƒ?

  〖思归�span lang="EN-US">

åQ?span lang="EN-US">asp:TemplateColumn HeaderText="数量"åQ?
åQœItemTemplateåQ?br />åQœasp:TextBox id="ShuLiang" runat=’serverâ€?Text=’<%# DataBinder.Eval(Container.DataItem,"DG_ShuLiang")%åQžâ€?
onkeyup="DoCal()"
/åQ?o:p>

åQ?span lang="EN-US">asp:RegularExpressionValidator id="revS" runat="server" ControlToValidate="ShuLiang" ErrorMessage="must be integer" ValidationExpression="^\d+$" /åQ?br />åQ?ItemTemplateåQ?br />åQ?asp:TemplateColumnåQ?o:p>

åQ?span lang="EN-US">asp:TemplateColumn HeaderText="单ä­h"åQ?
åQœItemTemplateåQ?br />åQœasp:TextBox id="DanJian" runat=’serverâ€?Text=’<%# DataBinder.Eval(Container.DataItem,"DG_DanJian")%åQžâ€?
onkeyup="DoCal()"
/åQ?o:p>

åQ?span lang="EN-US">asp:RegularExpressionValidator id="revS2" runat="server" ControlToValidate="DanJian" ErrorMessage="must be numeric" ValidationExpression="^\d+(\.\d*)?$" /åQ?o:p>

åQ?span lang="EN-US">/ItemTemplateåQ?br />åQ?asp:TemplateColumnåQ?o:p>

åQ?span lang="EN-US">asp:TemplateColumn HeaderText="金额"åQ?
åQœItemTemplateåQ?br />åQœasp:TextBox id="JinE" runat=’serverâ€?Text=’<%# DataBinder.Eval(Container.DataItem,"DG_JinE")%åQžâ€?/åQ?br />åQ?ItemTemplateåQ?br />åQ?asp:TemplateColumnåQžï¼œscript language="javascript"åQ?br />function DoCal()
{
 var e = event.srcElement;
 var row = e.parentNode.parentNode;
 var txts = row.all.tags("INPUT");
 if (!txts.length || txts.length åQ?3)
  return;

 var q = txts[txts.length-3].value;
 var p = txts[txts.length-2].value;

 if (isNaN(q) || isNaN(p))
  return;

 q = parseInt(q);
 p = parseFloat(p);

 txts[txts.length-1].value = (q * p).toFixed(2);
}
åQ?scriptåQ?o:p>

24.datagrid选定比较底下的行æ—Óž¼Œä¸ÞZ»€ä¹ˆæ€ÀL˜¯åˆäh–°ä¸€ä¸‹ï¼Œç„¶åŽž®±æ»šåŠ¨åˆ°äº†æœ€ä¸Šé¢åQŒåˆšæ‰é€‰å®šçš„行因屏òq•的关系ž®Þqœ‹ä¸åˆ°äº†ã€?o:p>

page_load
page.smartNavigation=true
  25.在Datagrid中修æ”ÒŽ•°æ®ï¼Œå½“点å‡È¼–辑键æ—Óž¼Œæ•°æ®å‡ºçŽ°åœ¨æ–‡æœ¬æ¡†ä¸­ï¼Œæ€Žä¹ˆæŽ§åˆ¶æ–‡æœ¬æ¡†çš„å¤§å° ?

private void DataGrid1_ItemDataBound(obj sender,DataGridItemEventArgs e)
{
 for(int i=0;iåQœe.Item.Cells.Count-1;i++)
  if(e.Item.ItemType==ListItemType.EditType)
  {
   e.Item.Cells[i].Attributes.Add("Width", "80px")
  }
}
  26.对话�o:p>

private static string ScriptBegin = "åQœscript language=\"JavaScript\"åQ?;
private static string ScriptEnd = "åQ?scriptåQ?;

public static void ConfirmMessageBox(string PageTarget,string Content)
{
 string ConfirmContent="var retValue=window.confirm(�+Content+"�;"+"if(retValue){window.location=�+PageTarget+"�}";

 ConfirmContent=ScriptBegin + ConfirmContent + ScriptEnd;

 Page ParameterPage = (Page)System.Web.HttpContext.Current.Handler;
 ParameterPage.RegisterStartupScript("confirm",ConfirmContent);
 //Response.Write(strScript);
}
  27. ž®†æ—¶é—´æ ¼å¼åŒ–åQšstring aa=DateTime.Now.ToString("yyyyòq´MM月ddæ—?);

  1.1 取当前年月日时分¿U?

currentTime=System.DateTime.Now;
  1.2 取当前年

int òq? DateTime.Now.Year;
  1.3 取当前月

int � DateTime.Now.Month;
  1.4 取当前日

int æ—? DateTime.Now.Day;
  1.5 取当前时

int æ—? DateTime.Now.Hour;
  1.6 取当前分

int � DateTime.Now.Minute;
  1.7 取当前秒

int ¿U? DateTime.Now.Second;
  1.8 取当前毫¿U?

int 毫秒= DateTime.Now.Millisecond;
  28åQŽè‡ªå®šä¹‰åˆ†é¡µä»£ç åQ?o:p>

  先定义变é‡?åQ?span lang="EN-US">

public static int pageCount; //总页面数
public static int curPageIndex=1; //当前™åµé¢
  下一™åµï¼š

if(DataGrid1.CurrentPageIndex åQ?(DataGrid1.PageCount - 1))
{
 DataGrid1.CurrentPageIndex += 1;
 curPageIndex+=1;
}

bind(); // DataGrid1数据¾l‘定函数
  上一™åµï¼š

if(DataGrid1.CurrentPageIndex åQ?)
{
 DataGrid1.CurrentPageIndex += 1;
 curPageIndex-=1;
}

bind(); // DataGrid1数据¾l‘定函数
  直接™åµé¢è·Œ™{åQ?

int a=int.Parse(JumpPage.Value.Trim());//JumpPage.Value.Trim()䏸™Ÿ©è½¬å€?

if(aåQœDataGrid1.PageCount)
{
 this.DataGrid1.CurrentPageIndex=a;
}

bind();
29åQŽDataGrid使用åQ?

  æ·ÕdŠ åˆ é™¤¼‹®è®¤åQ?span lang="EN-US">

private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
 foreach(DataGridItem di in this.DataGrid1.Items)
 {
  if(di.ItemType==ListItemType.Item||di.ItemType==ListItemType.AlternatingItem)
  {
   ((LinkButton)di.Cells[8].Controls[0]).Attributes.Add("onclick","return confirm(’确认删除此™å¹å—?â€?;");
  }
 }
}
  样式交替åQ?

ListItemType itemType = e.Item.ItemType;

if (itemType == ListItemType.Item )
{
 e.Item.Attributes["onmouseout"] = "this.style.backgroundColor=�FFFFFF�";
 e.Item.Attributes["onmouseover"] = "this.style.backgroundColor=�d9ece1�cursor=’hand�" ;
}
else if( itemType == ListItemType.AlternatingItem)
{
 e.Item.Attributes["onmouseout"] = "this.style.backgroundColor=�a0d7c4�";
 e.Item.Attributes["onmouseover"] = "this.style.backgroundColor=�d9ece1�cursor=’hand�" ;
}
  æ·ÕdŠ ä¸€ä¸ªç¼–å·åˆ—åQ?

DataTable dt= c.ExecuteRtnTableForAccess(sqltxt); //执行sql˜q”回的DataTable
DataColumn dc=dt.Columns.Add("number",System.Type.GetType("System.String"));

for(int i=0;iåQœdt.Rows.Count;i++)
{
 dt.Rows[i]["number"]=(i+1).ToString();
}

DataGrid1.DataSource=dt;
DataGrid1.DataBind();
  DataGrid1中添加一个CheckBoxåQŒé¡µé¢ä¸­æ·ÕdŠ ä¸€ä¸ªå…¨é€‰æ¡†

private void CheckBox2_CheckedChanged(object sender, System.EventArgs e)
{
 foreach(DataGridItem thisitem in DataGrid1.Items)
 {
  ((CheckBox)thisitem.Cells[0].Controls[1]).Checked=CheckBox2.Checked;
 }
}
  ž®†å½“前页面中DataGrid1昄¡¤ºçš„æ•°æ®å…¨éƒ¨åˆ é™?

foreach(DataGridItem thisitem in DataGrid1.Items)
{
 if(((CheckBox)thisitem.Cells[0].Controls[1]).Checked)
 {
  string strloginid= DataGrid1.DataKeys[thisitem.ItemIndex].ToString();
  Del (strloginid); //删除函数
 }
}
  30åQŽå½“æ–‡äšg在不同目录下åQŒéœ€è¦èŽ·å–æ•°æ®åº“˜qžæŽ¥å­—符ä¸ÔŒ¼ˆå¦‚æžœ˜qžæŽ¥å­—符串放在Web.configåQŒç„¶åŽåœ¨Global.asax中初始化åQ?

  �span lang="EN-US">Application_Start中添加以下代码:

Application["ConnStr"]=this.Context.Request.PhysicalApplicationPath+ConfigurationSettings.
   AppSettings["ConnStr"].ToString();
  31åQ?变量.ToString()

  字符型è{æ?è½¬äØ“å­—ç¬¦ä¸?span lang="EN-US">

12345.ToString("n"); //生成 12,345.00
12345.ToString("C"); //生成 åK?2,345.00
12345.ToString("e"); //生成 1.234500e+004
12345.ToString("f4"); //生成 12345.0000
12345.ToString("x"); //生成 3039 (16˜q›åˆ¶)
12345.ToString("p"); //生成 1,234,500.00%
  32、变�Substring(参数1,参数2);

  截取字串的一部分åQŒå‚æ•?span lang="EN-US">1为左起始位数åQŒå‚æ•?为截取几位ã€?如:string s1 = str.Substring(0,2);

  33åQŽåœ¨è‡ªå·±çš„网站上登陆其他¾|‘ç«™åQ?如果你的™åµé¢æ˜¯é€šè¿‡åµŒå¥—方式的话åQŒå› ä¸ÞZ¸€ä¸ªé¡µé¢åªèƒ½æœ‰ä¸€ä¸ªFORMåQŒè¿™æ—¶å¯ä»¥å¯¼å‘另外一个页面再提交登陆信息)

åQ?span lang="EN-US">SCRIPT language="javascript"åQ?
åQ?--
 function gook(pws)
 {
  frm.submit();
 }
//--åQ?

åQ?span lang="EN-US">/SCRIPTåQžï¼œbody leftMargin="0" topMargin="0" "gook()" marginwidth="0" marginheight="0"åQ?
åQœform name="frm" action=" http://220.194.55.68:6080/login.php?retid=7259 " method="post"åQ?
åQœtråQ?
åQœtdåQ?br />åQœinput id="f_user" type="hidden" size="1" name="f_user" runat="server"åQ?br />åQœinput id="f_domain" type="hidden" size="1" name="f_domain" runat="server"åQ?br />åQœinput class="box" id="f_pass" type="hidden" size="1" name="pwshow" runat="server"åQ?

åQ?span lang="EN-US">INPUT id="lng" type="hidden" maxLength="20" size="1" value="5" name="lng"åQ?br />åQœINPUT id="tem" type="hidden" size="1" value="2" name="tem"åQ?

åQ?span lang="EN-US">/tdåQ?

åQ?span lang="EN-US">/tråQ?

åQ?span lang="EN-US">/formåQ?
  文本框的名称必须是你要登陆的¾|‘页上的名称åQŒå¦‚果源码不行可以用vsniffer 看看ã€?

  下面是获取用戯‚¾“入的登陆信息的代码:

string name;
name=Request.QueryString["EmailName"];

try
{
 int a=name.IndexOf("@",0,name.Length);
 f_user.Value=name.Substring(0,a);
 f_domain.Value=name.Substring(a+1,name.Length-(a+1));
 f_pass.Value=Request.QueryString["Psw"];
}

catch
{
 Script.Alert("错误的邮½Ž?");
 Server.Transfer("index.aspx");
}



]]>
一个不错的asp.net教程¾|‘ç«™ http://chs.gotdotnet.com/quickstart/aspplus/doc/writingservices.aspxhttp://www.aygfsteel.com/wangxinsh55/archive/2007/01/24/95679.htmlSIMONESIMONEWed, 24 Jan 2007 02:34:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2007/01/24/95679.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/95679.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2007/01/24/95679.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/95679.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/95679.html¾|‘址如题http://chs.gotdotnet.com/quickstart/aspplus/doc/writingservices.aspx



]]>
Microsoft Application Blocks for .NEThttp://www.aygfsteel.com/wangxinsh55/archive/2007/01/22/95239.htmlSIMONESIMONEMon, 22 Jan 2007 03:06:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2007/01/22/95239.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/95239.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2007/01/22/95239.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/95239.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/95239.html

Microsoft Application Blocks for .NET

Data Access Application Block 概述

Chris Brooks、Graeme Malcolm、Alex Mackman、Edward Jezierski
Microsoft Corporation

2002 òq?4 æœ?/p>

摘要åQ?/strong>Data Access Application Block 是一ä¸?.NET ¾l„äšgåQŒåŒ…含优化的数据讉K—®ä»£ç åQŒå¯ä»¥å¸®åŠ©ç”¨æˆ¯‚°ƒç”¨å­˜å‚¨è¿‡½E‹ä»¥åŠå‘ SQL Server 数据库发å‡?SQL 文本命ä×o。它˜q”回 SqlDataReader、DataSet å’?XmlReader 对象。您可以在自å·Þqš„ .NET 应用½E‹åºä¸­å°†å…¶ä½œä¸ºæž„造块来ä‹É用,以减ž®‘需要创建、测试和¾l´æŠ¤çš„自定义代码的数量。您可以下蝲完整çš?C# å’?Visual Basic .NET 源代码以及综合文æ¡£ã€?

½Ž€ä»?/h2>

您是否正在从äº?.NET 应用½E‹åºæ•°æ®è®‰K—®ä»£ç çš„设计和开发?您是否觉得自己æ€ÀL˜¯åœ¨åå¤ç¼–写相同的数据讉K—®ä»£ç åQŸæ‚¨æ˜¯å¦æ›„¡»ž®†æ•°æ®è®¿é—®ä»£ç åŒ…装在 Helper 函数中,以便能够在一行中调用存储˜q‡ç¨‹åQŸå¦‚果是åQŒé‚£ä¹?Microsoft] Data Access Application Block for .NET 正是为您设计的ã€?/p>

Data Access Application Block ž®†è®¿é—?Microsoft SQL Serverâ„?数据库的性能和资源管理方面的最佳经验封装在一赗÷€‚您可以很方便地在自å·Þqš„ .NET 应用½E‹åºä¸­å°†å…¶ä½œä¸ºæž„造块使用åQŒä»Ž™åµå‡ž®‘了需要创建、测试和¾l´æŠ¤çš„自定义代码的数量ã€?/p>

ž®¤å…¶æ˜¯ï¼ŒData Access Application Block 可以帮助您:

  • 调用存储˜q‡ç¨‹æˆ?SQL 文本命ä×oã€?
  • 指定参数详细信息ã€?
  • ˜q”回 SqlDataReader、DataSet æˆ?XmlReader 对象ã€?

例如åQŒåœ¨å¼•用äº?Data Access Application Block 的应用程序中åQŒæ‚¨å¯ä»¥½Ž€å•地在一行代码中调用存储˜q‡ç¨‹òq¶ç”Ÿæˆ?DataSetåQŒå¦‚下所½Cºï¼š

[Visual Basic]
Dim ds As DataSet = SqlHelper.ExecuteDataset( _
      connectionString, _
      CommandType.StoredProcedure, _
      "getProductsByCategory", _
      new SqlParameter("@CategoryID", categoryID))
 
[C#]
DataSet ds = SqlHelper.ExecuteDataset( 
      connectionString,
      CommandType.StoredProcedure,
      "getProductsByCategory",
      new SqlParameter("@CategoryID", categoryID)); 
  
  
注意åQ?/strong> Application Block for .NETåQˆç”¨äº?.NET 的应用程序块åQ‰æ˜¯åŸÞZºŽå¯ÒŽˆåŠŸçš„ .NET 应用½E‹åº˜q›è¡Œè¯¦ç»†ç ”究而设计的。它以源代码的åŞ式提供,您可以原样ä‹É用,也可以针对自å·Þqš„应用½E‹åº˜q›è¡Œè‡ªå®šä¹‰ã€‚该应用½E‹åºå—åÆˆä¸ä»£è¡¨æœªæ?Microsoft ADO.NET ½E‹åºåº“的发展方向。Microsoft ADO.NET ½E‹åºåº“是为在各种使用情况下实现对数据讉K—®è¡Œäؓ的精¼‹®æŽ§åˆ¶è€Œå¾ç«‹çš„。将来的 ADO.NET 版本可能会ä‹É用不同的模型来实现这个方案ã€?/blockquote>

本概˜q°çš„其余部分包括以下内容åQ?/p>

Data Access Application Block 包括哪些内容åQ?/a>

下蝲和安�Data Access Application Block

使用 Data Access Application Block

内部设计

常见问题

反馈和支�/a>

合作�/a>

Data Access Application Block 包括哪些内容åQ?/h2>

提供äº?Data Access Application Block 的源代码以及快速入门示例应用程序,您可以ä‹É用这些应用程序测试其功能。Data Access Application Block ˜q˜åŒ…括综合文档,可以帮助您ä‹É用和了解所提供的代码ã€?/p>

Visual Studio .NET ™å¹ç›®

提供äº?Data Access Application Block çš?Microsoft Visual Basic] .NET å’?Microsoft Visual C#â„?源代码,以及每种语言的快速入门示例客æˆïL«¯åº”用½E‹åºåQŒæ‚¨å¯ä»¥ä½¿ç”¨˜q™äº›åº”用½E‹åº‹¹‹è¯•常见的方案。这有助于加深您å¯?Data Access Application Block 的工作原理的了解。您˜q˜å¯ä»¥è‡ªå®šä¹‰æºä»£ç ä»¥æ»¡èƒö自己的需要ã€?/p>

您可以编è¯?Visual Basic å’?C# Microsoft.ApplicationBlocks.Data ™å¹ç›®åQŒä»¥ç”Ÿæˆä¸€ä¸ªåä¸?Microsoft.ApplicationBlocks.Data.dll 的程序集。该½E‹åºé›†åŒ…括一ä¸?SqlHelper ¾c»ï¼ˆå…¶ä¸­åŒ…含用于执行数据库命令的核心功能åQ‰å’Œä¸€ä¸?SqlhelperParameterCache ¾c»ï¼ˆæä¾›å‚数发现和缓存功能)ã€?/p>

文档

Data Access Application Block 的文档主要包括以下内容:

  • 使用 Data Access Application Block 开发应用程åº?/strong>。本部分包括快速入门示例,其中包含多种常见的ä‹É用情况,可以帮助您快速轻村֜°æŽŒæ¡ Data Access Application BlockåQˆæ•°æ®è®¿é—®åº”用程序块åQ‰çš„使用ã€?
  • Data Access Application Block 的设计与实现。本部分包括背景设计原理信息åQŒä»¥ä¾¿ç”¨æˆäh·±å…¥äº†è§?Data Access Application Block 的设计与实现ã€?
  • 部çÖv和运è¡?/strong>。本部分包括安装信息åQŒå…¶ä¸­åŒ…含部¾|²å’Œæ›´æ–°é€‰é¡¹ä»¥åŠä¸Žå®‰å…¨æ€§æœ‰å…³çš„信息ã€?
  • 参è€?/strong>。本部分包含¾l¼åˆçš?API 参考,其中详细介绍了构æˆ?Data Access Application Block 的类和接口ã€?

¾pȝ»Ÿè¦æ±‚

要运è¡?Data Access Application BlockåQŒéœ€è¦æ»¡­‘³ä»¥ä¸‹è¦æ±‚:

  • Microsoft Windows] 2000、Windows XP Professional
  • .NET Framework SDKåQˆè‹±æ–‡ï¼‰çš?RTM 版本
  • Visual Studio] .NET çš?RTM 版本åQˆæŽ¨èï¼Œä½†ä¸å¿…需åQ?
  • SQL Server 7.0 或更高版本的数据库服务器

下蝲òq¶å®‰è£?Data Access Application Block

您可以获取一个包含已½{‘֐çš?Data Access Application Block ½E‹åºé›†å’Œ¾l¼åˆæ–‡æ¡£çš?Windows 安装½E‹åºæ–‡äšgã€?/p>

安装˜q›ç¨‹ž®†åœ¨æ‚¨çš„“程序”菜单中创徏一ä¸?Microsoft Application Blocks for .NETåQˆç”¨äº?.NET çš?Microsoft 应用½E‹åºå—)子菜单。该子菜单中有一ä¸?Data AccessåQˆæ•°æ®è®¿é—®ï¼‰å­èœå•,其中包括用于启动文档的选项和用于启åŠ?Data Access Application Block Visual Studio .NET 解决æ–ÒŽ¡ˆçš„选项ã€?/p>

误‚{åˆ?MSDN DownloadsåQˆè‹±æ–‡ï¼‰˜q›è¡Œä¸‹è²ã€?/p>

使用 Data Access Application Block

本节讨论如何使用 Data Access Application Block 来执行数据库命ä×o和管理参数。图 1 昄¡¤ºäº?Data Access Application Block 的主要元素ã€?/p>

å›?1åQšData Access Application Block

SqlHelper ¾cÀLä¾›äº†ä¸€¾l„静态方法,可以用来å?SQL Server æ•°æ®åº“å‘å‡ø™®¸å¤šå„¿Uä¸åŒç±»åž‹çš„命ä×oã€?/p>

SqlHelperParameterCache ¾cÀLä¾›å‘½ä»¤å‚数缓存功能,可以用来提高性能。该¾cȝ”±è®¸å¤š Execute æ–ÒŽ³•åQˆå°¤å…¶æ˜¯é‚£äº›åªè¿è¡Œå­˜å‚¨è¿‡½E‹çš„重写æ–ÒŽ³•åQ‰åœ¨å†…部使用。数据访问客æˆïL«¯ä¹Ÿå¯ä»¥ç›´æŽ¥ä‹É用它来缓存特定命令的特定参数集ã€?/p>

使用 SqlHelper ¾cÀL‰§è¡Œå‘½ä»?/h3>

SqlHelper ¾cÀLä¾›äº†äº”种 Shared (Visual Basic) æˆ?static (C#) æ–ÒŽ³•åQŒå®ƒä»¬æ˜¯åQ?strong>ExecuteNonQueryã€?strong>ExecuteDatasetã€?strong>ExecuteReaderã€?strong>ExecuteScalar å’?ExecuteXmlReader。实现的每种æ–ÒŽ³•都提供一¾l„一致的重蝲。这提供了一¿Uå¾ˆå¥½çš„使用 SqlHelper ¾cÀL¥æ‰§è¡Œå‘½ä×o的模式,同时为开发äh员选择讉K—®æ•°æ®çš„æ–¹å¼æä¾›äº†å¿…要的灵‹zÀL€§ã€‚每¿Uæ–¹æ³•的重蝲都支持不同的æ–ÒŽ³•参数åQŒå› æ­¤å¼€å‘äh员可以确定传递连接、事务和参数信息的方式。类中实现的所有方法都支持以下重蝲åQ?/p>

[Visual Basic]
Execute* (ByVal connection As SqlConnection, _
          ByVal commandType As CommandType, _
          ByVal CommandText As String)

Execute* (ByVal connection As SqlConnection, _
          ByVal commandType As CommandType, _
          ByVal commandText As String, _
          ByVal ParamArray commandParameters() As SqlParameter)

Execute* (ByVal connection As SqlConnection, _
          ByVal spName As String, _
          ByVal ParamArray parameterValues() As Object)

Execute* (ByVal transaction As SqlTransaction, _
          ByVal commandType As CommandType, _
          ByVal commandText As String)

Execute* (ByVal transaction As SqlTransaction, _
          ByVal commandType As CommandType, _
          ByVal commandText As String, _
          ByVal ParamArray commandParameters() As SqlParameter)

Execute* (ByVal transaction As SqlTransaction, _
          ByVal spName As String, _
          ByVal ParamArray parameterValues() As Object)

[C#]
Execute* (SqlConnection connection, CommandType commandType, 
          string commandText)

Execute* (SqlConnection connection, CommandType commandType,
          string commandText, params SqlParameter[] commandParameters)

Execute* (SqlConnection connection, string spName, 
          params object[] parameterValues)

Execute* (SqlConnection connection, 
          CommandType commandType, string commandText)

Execute* (SqlConnection connection,
          CommandType commandType, string commandText, 
          params SqlParameter[] commandParameters)

Execute* (SqlConnection connection,
          string spName, params object[] parameterValues)

除这些重载以外,é™?ExecuteXmlReader 之外的其他方法还提供了另一¿Ué‡è½½ï¼šå…è®¸ž®†è¿žæŽ¥ä¿¡æ¯ä½œä¸ø™¿žæŽ¥å­—½W¦ä¸²è€Œä¸æ˜¯è¿žæŽ¥å¯¹è±¡æ¥ä¼ é€’,如下面的æ–ÒŽ³•½{‘֐æ‰€½Cºï¼š

[Visual Basic]
Execute* (ByVal connectionString As String, _
          ByVal commandType As CommandType, _
          ByVal commandText As String)

Execute* (ByVal connectionString As String, _
          ByVal commandType As CommandType, _
          ByVal commandText As String, _
          ByVal ParamArray commandParameters() As SqlParameter)

Execute* (ByVal connectionString As String, _
          ByVal spName As String, _
          ByVal ParamArray parameterValues() As Object)

[C#]
Execute* (string connectionString, CommandType commandType, 
          string commandText)

Execute* (string connectionString, CommandType commandType, 
          string commandText, 
          params SqlParameter[] commandParameters)

Execute* (string connectionString, string spName, 
          params object[] parameterValues)
注意åQ?/strong> ExecuteXmlReader 不支持连接字½W¦ä¸²åQŒå› ä¸ºï¼šä¸?SqlDataReader 对象不同åQ?strong>XmlReader 对象åœ?XmlReader 关闭时没有提供自动关闭连接的æ–ÒŽ³•。如果客æˆïL«¯ä¼ é€’了˜qžæŽ¥å­—符ä¸ÔŒ¼Œé‚£ä¹ˆå½“客æˆïL«¯å®Œæˆå¯?XmlReader 的操作后åQŒå°†æ— æ³•关闭ä¸?XmlReader 相关联的˜qžæŽ¥å¯¹è±¡ã€?/blockquote>

通过参è€?Data Access Application Block ½E‹åºé›†åƈ导入 Microsoft.ApplicationBlocks.Data 命名½Iºé—´åQŒæ‚¨å¯ä»¥è½ÀL¾¾~–写使用ä»ÖM½•一¿U?SqlHelper ¾cÀL–¹æ³•的代码åQŒå¦‚下面的代码示例所½Cºï¼š

[Visual Basic]
Imports Microsoft.ApplicationBlocks.Data

[C#]
using Microsoft.ApplicationBlocks.Data;
  

导入命名½Iºé—´åŽï¼Œæ‚¨å¯ä»¥è°ƒç”¨ä“Qä½?Execute* æ–ÒŽ³•åQŒå¦‚下面的代码示例所½Cºï¼š

[Visual Basic]
Dim ds As DataSet = SqlHelper.ExecuteDataset( _
   "SERVER=(local);DATABASE=Northwind;INTEGRATED SECURITY=True;",
     _
   CommandType.Text, "SELECT * FROM Products")

[C#]
DataSet ds = SqlHelper.ExecuteDataset( 
   "SERVER=DataServer;DATABASE=Northwind;INTEGRATED
     SECURITY=sspi;", _
   CommandType.Text, "SELECT * FROM Products");

使用 SqlHelperParameterCache ¾cȝ®¡ç†å‚æ•?/h3>

SqlHelperParameterCache ¾cÀLä¾›äº†ä¸‰ç§å¯ä»¥ç”¨æ¥½Ž¡ç†å‚数的公共共享方法。它们是åQ?

  • CacheParameterSet。用于将 SqlParameters 数组存储到缓存中ã€?
  • GetCachedParameterSet。用于检索缓存的参数数组的副本ã€?
  • GetSpParameterSet。一¿Ué‡è½½æ–¹æ³•,用于‹‚€ç´¢æŒ‡å®šå­˜å‚¨è¿‡½E‹çš„相应参数åQˆé¦–先查询一‹Æ¡æ•°æ®åº“åQŒç„¶åŽç¼“存结果以便将来查询)ã€?

¾~“存和检索参æ•?/h4>

通过使用 CacheParameterSet æ–ÒŽ³•åQŒå¯ä»¥ç¼“å­?SqlParameter 对象数组。此æ–ÒŽ³•通过ž®†è¿žæŽ¥å­—½W¦ä¸²å’Œå‘½ä»¤æ–‡æœ¬è¿žæŽ¥è“v来创å»ÞZ¸€ä¸ªé”®åQŒç„¶åŽå°†å‚数数组存储åœ?Hashtable 中ã€?/p>

要从¾~“存中检索参敎ͼŒè¯·ä‹Éç”?GetCachedParameterSet æ–ÒŽ³•。此æ–ÒŽ³•ž®†è¿”回一ä¸?SqlParameter 对象数组åQŒè¿™äº›å¯¹è±¡å·²ä½¿ç”¨¾~“å­˜åQˆä¸Žä¼ é€’给该方法的˜qžæŽ¥å­—符串和命ä×o文本相对应)中的参数的名¿U°ã€å€¹{€æ–¹å‘和数据¾cÕdž‹½{‰è¿›è¡Œäº†åˆå§‹åŒ–ã€?/p>

注意åQ?/strong> 用作参数集的键的˜qžæŽ¥å­—符串通过½Ž€å•的字符串比较进行匹配。用于从 GetCachedParameterSet 中检索参数的˜qžæŽ¥å­—符串必™åÖM¸Žç”¨æ¥é€šè¿‡ CacheParameterSet 来存储这些参数的˜qžæŽ¥å­—符串完全相同。语法不同的˜qžæŽ¥å­—ç¬¦ä¸²å³ä½¿è¯­ä¹‰ç›¸åŒï¼Œä¹Ÿä¸ä¼šè¢«è®¤äØ“æ˜¯åŒ¹é…çš„ã€?/blockquote>

以下代码昄¡¤ºäº†å¦‚何ä‹Éç”?SqlHelperParameterCache ¾cÀL¥¾~“存和检ç´?Transact-SQL 语句的参数ã€?/p>

[Visual Basic]
' 初始化连接字½W¦ä¸²å’Œå‘½ä»¤æ–‡æœ?
' 它们ž®†æž„成用来存储和‹‚€ç´¢å‚æ•°çš„é”?
Const CONN_STRING As String = _
  "SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;"
Dim sql As String = _
       "SELECT ProductName FROM Products " + _
       "WHERE Category=@Cat AND SupplierID = @Sup"

' ¾~“存参数
Dim paramsToStore(1) As SqlParameter
paramsToStore(0) = New SqlParameter("@Cat", SqlDbType.Int)
paramsToStore(1) = New SqlParameter("@Sup", SqlDbType.Int)
SqlHelperParameterCache.CacheParameterSet(CONN_STRING, _
                                          sql, _
                                          paramsToStore)

' 从缓存中‹‚€ç´¢å‚æ•?
Dim storedParams(1) As SqlParameter
storedParams = SqlHelperParameterCache.GetCachedParameterSet( _
                                                 CONN_STRING, sql)
storedParams(0).Value = 2
storedParams(1).Value = 3

' 在命令中使用参数
Dim ds As DataSet
ds = SqlHelper.ExecuteDataset(CONN_STRING, _
                              CommandType.Text, _
                              sql, storedParams)

[C#]
// 初始化连接字½W¦ä¸²å’Œå‘½ä»¤æ–‡æœ?
// 它们ž®†æž„成用来存储和‹‚€ç´¢å‚æ•°çš„é”?
const string CONN_STRING =
  "SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;";
string spName = "SELECT ProductName FROM Products " + 
                "WHERE Category=@Cat AND SupplierID = @Sup";

// ¾~“存参数
SqlParameter[] paramsToStore = new SqlParameter[2];
paramsToStore[0] = New SqlParameter("@Cat", SqlDbType.Int);
paramsToStore[1] = New SqlParameter("@Sup", SqlDbType.Int);
SqlHelperParameterCache.CacheParameterSet(CONN_STRING, 
                                          sql, 
                                          paramsToStore);

// 从缓存中‹‚€ç´¢å‚æ•?
SqlParameter storedParams = new SqlParameter[2];
storedParams = SqlHelperParameterCache.GetCachedParameterSet(
                                              CONN_STRING, sql);
storedParams(0).Value = 2;
storedParams(1).Value = 3;

// 在命令中使用参数
DataSet ds;
ds = SqlHelper.ExecuteDataset(CONN_STRING, 
                              CommandType.StoredProcedure,
                              sql, storedParams);

‹‚€ç´¢å­˜å‚¨è¿‡½E‹å‚æ•?/h4>

SqlHelperParameterCache ˜q˜æä¾›äº†é’ˆå¯¹ç‰¹å®šå­˜å‚¨˜q‡ç¨‹‹‚€ç´¢å‚æ•°æ•°¾l„çš„æ–ÒŽ³•。一¿Uåä¸?GetSpParameterSet 的重载方法提供了此功能,它包含两¿Uå®žçŽ°ã€‚è¯¥æ–ÒŽ³•ž®è¯•从缓存中‹‚€ç´¢ç‰¹å®šå­˜å‚¨è¿‡½E‹çš„参数。如果这些参数尚未被¾~“å­˜åQŒåˆ™ä½¿ç”¨ .NET çš?SqlCommandBuilder ¾cÖM»Žå†…部‹‚€ç´¢ï¼Œòq¶å°†å®ƒä»¬æ·ÕdŠ åˆ°ç¼“å­˜ä¸­åQŒä»¥ä¾¿ç”¨äºŽåŽ¾l­çš„‹‚€ç´¢è¯·æ±‚。然后,为每个参数指定相应的参数讄¡½®åQŒæœ€åŽå°†˜q™äº›å‚数以数¾l„åŞ式返回给客户端。以下代码显½CÞZº†å¦‚何‹‚€ç´?Northwind 数据库中 SalesByCategory 存储˜q‡ç¨‹çš„参数ã€?/p>

[Visual Basic]
' 初始化连接字½W¦ä¸²å’Œå‘½ä»¤æ–‡æœ?
' 它们ž®†æž„成用来存储和‹‚€ç´¢å‚æ•°çš„é”?
Const CONN_STRING As String = _
  "SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;"
Dim spName As String = "SalesByCategory"

' ‹‚€ç´¢å‚æ•?
Dim storedParams(1) As SqlParameter
storedParams = SqlHelperParameterCache.GetSpParameterSet( _
                                          CONN_STRING, spName)
storedParams(0).Value = "Beverages"
storedParams(1).Value = "1997"

' 在命令中使用参数
Dim ds As DataSet
ds = SqlHelper.ExecuteDataset(CONN_STRING, _
                              CommandType.StoredProcedure, _
                              spName, storedParams)

[C#]
// 初始化连接字½W¦ä¸²å’Œå‘½ä»¤æ–‡æœ?
// 它们ž®†æž„成用来存储和‹‚€ç´¢å‚æ•°çš„é”?
const string CONN_STRING = 
  "SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;";
string spName = "SalesByCategory";

// ‹‚€ç´¢å‚æ•?
SqlParameter storedParams = new SqlParameter[2];
storedParams = SqlHelperParameterCache.GetSpParameterSet(
                                          CONN_STRING, spName);
storedParams[0].Value = "Beverages";
storedParams[1].Value = "1997";

// 在命令中使用参数
DataSet ds;
ds = SqlHelper.ExecuteDataset(CONN_STRING, 
                              CommandType.StoredProcedure,
                              spName, storedParams);

内部设计

Data Access Application Block 包含了完整的源代码和有关其设计的¾l¼åˆæŒ‡å—。本节介¾læœ‰å…³ä¸»è¦å®žçŽ°çš„è¯¦ç»†ä¿¡æ¯ã€?/p>

SqlHelper ¾cÕd®žçŽ°è¯¦¾l†ä¿¡æ?/h3>

SqlHelper ¾cȝ”¨äºŽé€šè¿‡ä¸€¾l„静态方法来ž®è£…数据讉K—®åŠŸèƒ½ã€‚è¯¥¾cÖM¸èƒ½è¢«¾l§æ‰¿æˆ–实例化åQŒå› æ­¤å°†å…¶å£°æ˜Žäؓ包含专用构造函数的不可¾l§æ‰¿¾c…R€?/p>

åœ?SqlHelper ¾cÖM¸­å®žçŽ°çš„æ¯¿Uæ–¹æ³•都提供了一¾l„一致的重蝲。这提供了一¿Uå¾ˆå¥½çš„使用 SqlHelper ¾cÀL¥æ‰§è¡Œå‘½ä×o的模式,同时为开发äh员选择讉K—®æ•°æ®çš„æ–¹å¼æä¾›äº†å¿…要的灵‹zÀL€§ã€‚每¿Uæ–¹æ³•的重蝲都支持不同的æ–ÒŽ³•参数åQŒå› æ­¤å¼€å‘äh员可以确定传递连接、事务和参数信息的方式。在 SqlHelper ¾cÖM¸­å®žçŽ°çš„æ–¹æ³•åŒ…æ‹¬ï¼š

  • ExecuteNonQuery。此æ–ÒŽ³•用于执行不返回ä“Q何行或值的命ä×o。这些命令通常用于执行数据库更斎ͼŒä½†ä¹Ÿå¯ç”¨äºŽè¿”回存储过½E‹çš„输出参数ã€?
  • ExecuteReader。此æ–ÒŽ³•用于˜q”回 SqlDataReader 对象åQŒè¯¥å¯¹è±¡åŒ…含由某一命ä×o˜q”回的结果集ã€?
  • ExecuteDataset。此æ–ÒŽ³•˜q”回 DataSet 对象åQŒè¯¥å¯¹è±¡åŒ…含由某一命ä×o˜q”回的结果集ã€?
  • ExecuteScalar。此æ–ÒŽ³•˜q”回一个倹{€‚该值始¾lˆæ˜¯è¯¥å‘½ä»¤è¿”回的½W¬ä¸€è¡Œçš„½W¬ä¸€åˆ—ã€?
  • ExecuteXmlReader。此æ–ÒŽ³•˜q”回 FOR XML 查询çš?XML 片段ã€?

除了˜q™äº›å…¬å…±æ–ÒŽ³•外,SqlHelper ¾c»è¿˜åŒ…含一些专用函敎ͼŒç”¨äºŽ½Ž¡ç†å‚数和准备要执行的命令。不½Ž¡å®¢æˆïL«¯è°ƒç”¨ä»€ä¹ˆæ ·çš„æ–¹æ³•实玎ͼŒæ‰€æœ‰å‘½ä»¤éƒ½é€šè¿‡ SqlCommand 对象来执行。在 SqlCommand 对象能够被执行之前,所有参数都必须æ·ÕdŠ åˆ?Parameters 集合中,òq¶ä¸”必须正确讄¡½® Connectionã€?strong>CommandTypeã€?strong>CommandText å’?Transaction 属性ã€?strong>SqlHelper ¾cÖM¸­çš„专用函æ•îC¸»è¦ç”¨äºŽæä¾›ä¸€¿Uä¸€è‡´çš„æ–¹å¼åQŒä»¥ä¾¿å‘ SQL Server 数据库发出命令,而不考虑客户端应用程序调用的重蝲æ–ÒŽ³•实现。SqlHelper ¾cÖM¸­çš„专用实用程序函数包括:

  • AttachParametersåQšè¯¥å‡½æ•°ç”¨äºŽž®†æ‰€æœ‰å¿…要的 SqlParameter 对象˜qžæŽ¥åˆ°æ­£åœ¨è¿è¡Œçš„ SqlCommandã€?
  • AssignParameterValuesåQšè¯¥å‡½æ•°ç”¨äºŽä¸?SqlParameter 对象赋倹{€?
  • PrepareCommandåQšè¯¥å‡½æ•°ç”¨äºŽå¯¹å‘½ä»¤çš„属性(如连接、事务环境等åQ‰è¿›è¡Œåˆå§‹åŒ–ã€?
  • ExecuteReaderåQšæ­¤ä¸“ç”¨ ExecuteReader 实现用于通过适当çš?CommandBehavior 打开 SqlDataReader 对象åQŒä»¥ä¾¿æœ€æœ‰æ•ˆåœ°ç®¡ç†ä¸Žé˜…读器关联的˜qžæŽ¥çš„æœ‰æ•ˆæœŸã€?

SqlHelperParameterCache ¾cÕd®žçŽ°è¯¦¾l†ä¿¡æ?/h3>

参数数组¾~“存在专ç”?Hashtable 中。从¾~“存中检索的参数˜q›è¡Œå†…部复制åQŒè¿™æ ·å®¢æˆïL«¯åº”用½E‹åºèƒ½å¤Ÿæ›´æ”¹å‚æ•°å€ég»¥åŠè¿›è¡Œå…¶ä»–操作,而不会媄响缓存的参数数组。专用共享函æ•?CloneParameters 可以实现此目的ã€?/p>

常见问题

此版本包含哪些新增功能?

ä¸?Data Access Application Block Beta 2.0 版本相比åQŒè¯¥ RTM 版本包含以下新增功能和变化:

  • SqlHelper ¾cÀL–¹æ³•的事务型重载不再需è¦?SqlConnection 参数。在此版本中åQŒè¿žæŽ¥ä¿¡æ¯ä»Ž SqlTransaction 对象中派生,因此不必在方法签名中包含 SqlConnection 对象参数ã€?
  • 现在åQ?strong>GetSpParameterSet æ–ÒŽ³•使用 ADO.NET CommandBuilder ¾cȝš„ DeriveParameters æ–ÒŽ³•来确定存储过½E‹æ‰€éœ€è¦çš„参数。这æ¯?Beta 2.0 版本中直接通过查询数据库来‹‚€ç´¢ä¿¡æ¯çš„æ•ˆçŽ‡æ›´é«˜ã€?

可以使用 XCOPY 部çÖvæ–ÒŽ³•来部¾|?Data Access Application Block ½E‹åºé›†å—åQ?/h3>

可以。Microsoft.ApplicationBlocks.Data.dll ½E‹åºé›†åœ¨¾~–译后可以ä‹Éç”?XCOPY ˜q›è¡Œéƒ¨çÖvã€?/p>

什么时候应该ä‹Éç”?ExecuteDataset æ–ÒŽ³•åQŒä»€ä¹ˆæ—¶å€™åº”该ä‹Éç”?ExecuteReader æ–ÒŽ³•åQ?/h3>

˜q™ä¸ªé—®é¢˜å®žé™…上是什么时候应该返å›?DataSet 对象中的多个数据行,什么时候应该ä‹Éç”?DataReader。答案取决于您的应用½E‹åºçš„特定需要,以及您在灉|´»æ€§å’ŒåŽŸå§‹æ€§èƒ½ä¹‹é—´çš„å–èˆã€‚DataSet 为您提供数据的灵‹zȝš„且断开˜qžæŽ¥çš„å…³¾p»è§†å›¾ï¼Œè€?DataReader 为您提供性能卓越的、只è¯Èš„、仅向前光标。有å…?DataSet å’?DataReader 的全面比较,请参é˜?Data Access Architecture GuideåQˆè‹±æ–‡ï¼‰ã€?/p>

如何使用 ExecuteDataset ˜q”回包含多个表的数据集?

通过创徏一个可以返回多个行集的存储˜q‡ç¨‹åQˆé€šè¿‡æ‰§è¡Œå¤šä¸ª SELECT 语句或者对其他存储˜q‡ç¨‹˜q›è¡ŒåµŒå¥—调用åQ‰ï¼Œòq¶ä‹Éç”?ExecuteDataset æ–ÒŽ³•执行该过½E‹ï¼Œæ‚¨å¯ä»¥æ£€ç´¢åŒ…含多个表的数据集ã€?/p>

例如åQŒå‡è®¾æ‚¨çš„æ•°æ®åº“包含以下存储˜q‡ç¨‹ã€?/p>

CREATE PROCEDURE GetCategories
AS
SELECT * FROM Categories
GO
CREATE PROCEDURE GetProducts
AS
SELECT * FROM Products
  

您可以创å»ÞZ¸€ä¸ªä¸»å­˜å‚¨˜q‡ç¨‹æ¥å¯¹˜q™äº›˜q‡ç¨‹˜q›è¡ŒåµŒå¥—调用åQŒå¦‚下面的代码示例所½Cºã€?/p>

CREATE PROCEDURE GetCategoriesAndProducts
AS
BEGIN
  EXEC GetCategories
  EXEC GetProducts
END
  

使用 ExecuteDataset æ–ÒŽ³•执行此主存储˜q‡ç¨‹ž®†è¿”回一ä¸?DateSetåQŒå…¶ä¸­åŒ…含两个表åQšä¸€ä¸ªè¡¨åŒ…含分类数据åQŒå¦ä¸€ä¸ªè¡¨åŒ…含产品数据ã€?/p>

注意åQ?/strong> ExecuteDataset æ–ÒŽ³•ä¸æä¾›äØ“˜q”回的表指定自定义名¿U°çš„æ–ÒŽ³•。第一个表的编号始¾lˆäØ“ 0åQŒå¿UîCØ“ TableåQŒç¬¬äºŒä¸ªè¡¨çš„¾~–号ä¸?1åQŒå¿UîCØ“ Table1åQŒä¾æ­¤ç±»æŽ¨ã€?/blockquote>

˜q˜æœ‰å…¶ä»–的应用程序块吗?

Data Access Application Block 是即ž®†å‘布的几个应用½E‹åºå—之一。这些应用程序块可以解决开发äh员在不同™å¹ç›®ä¸­é‡åˆ°çš„共同问题。它们可以快速方便地插入åˆ?.NET 应用½E‹åºä¸­ã€?/p>

反馈和支�/h2>

如果您对 Data Access Application Block 有ä“Qä½•é—®é¢˜ã€æ„è§å’Œå»ø™®®åQŒè¯·å?devfdbck@microsoft.com 发送电子邮ä»Óž¼Œæˆ‘们ž®†åŠæ—¶æä¾›åé¦ˆã€?/p>

Application Blocks for .NET 旨在协助开å?.NET 分布式应用程序。示例代码和文档都按原样提供。尽½Ž¡å·²¾lè¿‡‹¹‹è¯•òq¶è¢«è®¤äØ“æ˜¯ç¨³å®šçš„ä»£ç é›†ï¼Œä½†æˆ‘ä»¬åÆˆä¸è±¡ä¼ ç»Ÿçš?Microsoft 产品那样对其提供支持ã€?/p>

我们˜q˜åˆ›å»ÞZº†ä¸€ä¸ªæ–°é—ȝ»„åQŒå¯ä»¥å¸®åŠ©æ‚¨ä½¿ç”¨ Application Blocks for .NETåQ?NET 应用½E‹åºå—)。您可以通过新闻¾l„在联机的开放论坛中向同行、同事和 Microsoft 支持专家咨询ã€?/p>

å…¶ä»–äºÞZ¹Ÿå¯ä»¥ä»Žæ‚¨çš„问题和评论中获益,我们的开发小¾l„将每天查看新闻¾l„:
æ–°é—»¾l„:åŸÞZºŽ Web 的读è€?br />http://msdn.microsoft.com/newsgroups/loadframes.asp?icp=msdn&slcid=us&newsgroup=microsoft.public.dotnet.distributed_appsåQˆè‹±æ–‡ï¼‰

æ–°é—»¾l„:NNTP 读è€?br />news://msnews.microsoft.com/microsoft.public.dotnet.distributed_appsåQˆè‹±æ–‡ï¼‰

您想学习和利ç”?.NET 的功能吗åQŸæ¬¢˜qŽæ‚¨ä¸?Microsoft Technology Centers çš„æŠ€æœ¯ä¸“å®¶åÆˆè‚©å·¥ä½œï¼Œæ‚¨å°†å­¦åˆ°æœ€å¥½çš„å¼€å‘ç»éªŒã€‚æœ‰å…Œ™¯¦¾l†ä¿¡æ¯ï¼Œè¯¯‚®¿é—?http://www.microsoft.com/business/services/mtc.aspåQˆè‹±æ–‡ï¼‰ã€?/p>

您需要更多的帮助吗?误‚®¿é—®æ–°å¢žçš„客户支持服务 Advisory ServicesåQŒè¯¥è§£å†³æ–ÒŽ¡ˆå¯ä»¥æ»¡èƒö您小规模的咨询需要。有å…?Advisory Services 的详¾l†ä¿¡æ¯ï¼Œè¯¯‚®¿é—?http://support.microsoft.com/default.aspx?id=fh;EN-US;advisoryserviceåQˆè‹±æ–‡ï¼‰ã€?/p>

更多信息

Data Access Application Block 的设计和开发是建立åœ?Data Access in .NET Architecture GuideåQˆè‹±æ–‡ï¼‰ä¸­è®¨è®ºçš„æœ€ä½›_¼€å‘经验和通用设计原则基础之上的。请阅读该指南,以了解有å…Ïx•°æ®è®¿é—®çš„详细信息ã€?/p>



]]> Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÁÉÑôÏØ| Âí¹ØÏØ| µÂ²ýÏØ| ÃÚÑôÏØ| ·½³ÇÏØ| ΢²©| ÔªÑôÏØ| ÇúÑôÏØ| ·á³ÇÊÐ| ÔÓ¶àÏØ| ·±ÖÅÏØ| ³çÎÄÇø| ÄϰÄÏØ| À´±öÊÐ| ¹ȪÊÐ| ÜþÑôÊÐ| ÈêÑôÏØ| ѰÎÚÏØ| ÎäÆ½ÏØ| ͬ½­ÊÐ| ¼ÎÒåÊÐ| лÎ| Îñ´¨| µÂÇÕÏØ| Õò¿µÏØ| ¸ßÖÝÊÐ| ¶´Í·ÏØ| Ö¾µ¤ÏØ| Õý°²ÏØ| Ì«¿µÏØ| ÈݳÇÏØ| ÎäÚìÏØ| ¿µ±£ÏØ| ÇàÍ­Ï¿ÊÐ| ¼ÎºÌÏØ| ̫ԭÊÐ| ÌÆºÓÏØ| ãòÏªÏØ| ÒÁÎáÏØ| ºªµ¦ÊÐ| ·ÊÎ÷ÏØ|