??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上灵zLӞ现在l大家展CZ个很单的换皮肤控Ӟ先不说别的,让大家看看效果:

看到上面的界面心动了吗?告诉大家Q我用的都是VS2005的标准控Ӟ实现换皮肤的功能也仅仅是数行代码而已Q也是说以前熟悉的控gq照怋用?/p>

先介l一下这套控件吧Q这套控件仅有一个dllQIrisSkin2.dllQ文件和一个skin文g夹,skin文g夹下共有22个子文g夹,每个子文件夹其实是一套界面风|也就是说我们可以使用22U不同风根{?/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皮肤控glgQ如下图Q?br />

然后在出现的“选择工具项”中点?#8220;览”按钮Q然后找到IrisSkin2.dll文gQ然?#8220;定”Q关闭对话窗口之后,皮肤控glg׃出现在你的工L上了Q具体出现在哪个分组跟你d时添加哪个组有关Q,如下图:

Q我不小心加到打印分l去了,大家不要骂我QPQ?/p>

好了Q现在可以编写程序测试了Q做一个简单的H体吧,界面上的控g如上图所C,然后皮肤组件拖拽到界面上,之后需要把E序所需要的皮肤资源文gdq来Q这里我是采用添加资源的办法?/p>

步骤如下Q?br /> Q一Q在WinForm工程上右键单?#8220;属?#8221;Q在出现的界面中?#8220;资源”选项卡,把所需的皮肤资源文件添加进来(通过“d现有文g”命od皮肤文gQ,如下图:

注意如果该皮肤文件夹下除?.ssk文g之外Q还包含有其它图片文Ӟ它们也作ؓ资源d到项目中。添加完成之后,我们可以在代码中通过Properties.Resources.文g名来获取q些文g的内容了Q通过q个Ҏq回的是文g内容的二q制数据(byte[]),而skinEngine1.SkinStream需要的是一个Stream对象Q通过msdn我们可以以这个二q制数据构徏一个Stream对象Qnew MemoryStream(byte[] bytes)Q,然后赋值给皮肤lg的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>

SIMONE 2008-01-09 13:08 发表评论
]]>
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();


SIMONE 2007-06-22 15:18 发表评论
]]>
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)
     {    
      //addtod的属性,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();
      //保存文gC所要的目录,q里是IIS根目录下的upload目录.你可以改?
      //注意: 我这里用Server.MapPath()取当前文件的相对目录.在asp.net?\"必须?\\"代替Q把"upload\\"Ҏ"\\upload\\"成了取当前文g的绝对目录了
      fileupload.PostedFile.SaveAs(Server.MapPath("upload\\"+newname+newext));
      //得到q个文g的相兛_?文g?文gcd,文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();
     }


 

SIMONE 2007-04-02 15:51 发表评论
]]>
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督二?作者:清清月儿 主页Qhttp://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 Librarypd文章回顾与ȝ 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写了一pd的关?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

1Q?span lang="EN-US">Enterprise Library Step By SteppdQ一Q:配置应用E序块—?/span>入门?/span>

2Q?span lang="EN-US">Enterprise Library Step By SteppdQ二Q:配置应用E序块—?/span>q阶?/span>

3Q?span lang="EN-US">Enterprise Library Step By SteppdQ三Q:数据讉KE序块—?/span>入门?/span>

4Q?span lang="EN-US">Enterprise Library Step By SteppdQ四Q:数据讉KE序块—?/span>q阶?/span>

5Q?span lang="EN-US">Enterprise Library Step By SteppdQ五Q:安全应用E序块—?/span>入门?/span>

6Q?span lang="EN-US">Enterprise Library Step By SteppdQ六Q:安全应用E序块—?/span>q阶?/span>

7Q?span lang="EN-US">Enterprise Library Step By SteppdQ七Q:日志和监应用程序块—?/span>入门?/span>

8Q?span lang="EN-US">Enterprise Library Step By SteppdQ八Q:日志和监应用程序块—?/span>q阶?/span>

9Q?span lang="EN-US">Enterprise Library Step By SteppdQ九Q:~冲应用E序块—?/span>入门?/span>

10Q?span lang="EN-US">Enterprise Library Step By SteppdQ十Q:~冲应用E序块—?/span>q阶?/span>

11Q?span lang="EN-US">Enterprise Library Step By SteppdQ十一Q:异常处理应用E序块—?/span>入门?/span>

12Q?span lang="EN-US">Enterprise Library Step By SteppdQ十二)Q异常处理应用程序块—?/span>q阶?/span>

13Q?span lang="EN-US">Enterprise Library Step By SteppdQ十三)Q加密应用程序块—?/span>入门?/span>

14Q?span lang="EN-US">Enterprise Library Step By SteppdQ十四)Q创建基于消息队列(MSMQQ的异步日志

15Q?span lang="EN-US">Enterprise Library Step By SteppdQ十五)Q配|应用程序块—?/span>设计?/span>

16Q?span lang="EN-US">Enterprise Library Step By SteppdQ十六)Q用AppSetting Application Block

WⅡ部分Q?span lang="EN-US">Enterprise Library 2.0 学习

1Q?span lang="EN-US">Enterprise Library 2.0Q?Q:Data Access Application Block学习

2Q?span lang="EN-US">Enterprise Library 2.0Q?Q:Logging Application Block学习

3Q?span lang="EN-US">Enterprise Library 2.0中加密数据库q接字符?/span>

WⅢ部分Q?span lang="EN-US">Enterprise Library 2.0 技?span lang="EN-US">

1Q?span lang="EN-US">Enterprise Library 2.0 技巧(1Q:如何使用外部配置文g

2Q?span lang="EN-US">Enterprise Library 2.0 技?span lang="EN-US">Q?Q:如何配|信息保存到数据库中

3Q?span lang="EN-US">Enterprise Library 2.0 技巧(3Q:记录ASP.NET站点中未处理的异?/span>

4Q?span lang="EN-US">Enterprise Library 2.0 技巧(4Q:如何用编E的Ҏ来配|Logging Application Block

WⅣ部分 Enterprise Library 2.0 Hands On Lab译pd

1Q?span lang="EN-US">Enterprise Library 2.0 Hands On Lab 译Q?Q:数据讉KE序块(一Q?/span>

2Q?span lang="EN-US">Enterprise Library 2.0 Hands On Lab 译Q?Q:数据讉KE序块(二)

3Q?span lang="EN-US">Enterprise Library 2.0 Hands On Lab 译Q?Q:数据讉KE序块(三)

4Q?span lang="EN-US">Enterprise Library 2.0 Hands On Lab 译Q?Q:日志应用E序块(一Q?/span>

5Q?span lang="EN-US">Enterprise Library 2.0 Hands On Lab 译Q?Q:日志应用E序块(二)

6Q?span lang="EN-US">Enterprise Library 2.0 Hands On Lab 译Q?Q:日志应用E序块(三)

7Q?span lang="EN-US">Enterprise Library 2.0 Hands On Lab 译Q?Q:异常应用E序块(一Q?/span>

8Q?span lang="EN-US">Enterprise Library 2.0 Hands On Lab 译Q?Q:异常应用E序块(二)

9Q?span lang="EN-US">Enterprise Library 2.0 Hands On Lab 译Q?Q:~存应用E序块(一Q?/span>

10Q?span lang="EN-US">Enterprise Library 2.0 Hands On Lab 译Q?0Q:~存应用E序块(二)

11Q?span lang="EN-US">Enterprise Library 2.0 Hands On Lab 译Q?1Q:~存应用E序块(三)

12Q?span lang="EN-US">Enterprise Library 2.0 Hands On Lab 译Q?2Q:安全应用E序块(一Q?/span>

13Q?span lang="EN-US">Enterprise Library 2.0 Hands On Lab 译Q?3Q:安全应用E序块(二)

14Q?span lang="EN-US">Enterprise Library 2.0 Hands On Lab 译Q?4Q:?span lang="EN-US">密应用程序块Q一Q?/span>

15Q?span lang="EN-US">Enterprise Library 2.0 Hands On Lab 译Q?5Q:加密应用E序块(二)

 

WⅤ部分 Enterprise Library 3.0 体验pd

    1Q?span lang="EN-US">Enterprise Library 3.0 体验Q?Q:集成VS2005的配|工具和配置区加密支?/span>NewQ?/span>

    2Q?span lang="EN-US">Enterprise Library 3.0 体验Q?Q:使用Validation Application BlockNewQ?/span>

    3Q?span lang="EN-US">Enterprise Library 3.0 ?span lang="EN-US">验(3Q:使用配置文g的Validation Application BlockNewQ?/span>



SIMONE 2007-03-29 14:46 发表评论
]]>
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 PetShopE序中的购物车和订单处理模块QProfile技术,异步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>
BinaryImageQ直接显CZ二进制Ş式存储在数据库中的图?/a>
ASP.NET2.0中themes、SkinsL实现|站换肤Q?/a>
ASP.NET 2.0 正式版中无刷新页面的开?/a>
Asp.net 2.0 关于Header/title/Meta tages/Style操作的一点小技?/a>
今天拿到一个TFS Workgroup EditionQ想从B3R升Q结果开始了一天的艰难之\。?/a>
asp.net2.0Q扩展ImageButton控g定制自己需要的功能
.net 2.0 讉KOracle 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 Qdownmoon原创Q?
博客园E序从Visual Studio 2003q移到Visual Studio 2005的尝?/a>
VS2005中GridView單應用
VS2005中通过code snippet定制cL?/a>
创徏自定义的Visual StudioҎ?/a>
VS2005中通过code snippet定制cL?/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处理cd?/a>
革新Q?NET 2.0的自定义配置文g体系初探
Asp.net|站的ClickOnce自动部vQ?Q-虚拟目录的配|?/a>
C#2.0介绍之Iterators(q代?
ASP.NET 2.0ZSQLSERVER 2005的aspnetdb.mdf部v
DataTable中数据记录的l计
.NET配置文g解析q程详解
C# 2.0——匿名方法、P代程序和局部类
在自定义Server Control中捆lJS文g Step by Step
正式发布表达式计引擎WfcExp V0.9(附源?
关于无aspx文g部vQ我的一些探索心?/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#QVB.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.0q行文g压羃和解?/a>
在C#中用Nullablecd
net2.0自定义注册控?/a>
Net Framework 2.0 事务处理
体验.net2.0的优雅(3Q?-- 为您?SiteMap d 控制转发功能
Composite UI Application Block学习W记之Smart Part
为ASP.NET 2.0配置数据?/a>
体验 .net2.0 的优雅(2Q?-- ASP.net 主题和皮?
InternalsVisibleToAttributeQ友元程序集讉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中用SqlBulkCopyc迁UL?/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中相册薄的一处BUGQ?/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 属?
发布一个原创的ZAjax的通用(l合)查询
试用VS2005中的Performance Tools
中文转换为完整拼音算法原理分?/a>


SIMONE 2007-03-16 09:09 发表评论
]]>
aspjpeglg安装使用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-12345Q先看一下他的dll能不能像aspjpeg1.3那样直接使用。安装提C重起iis服务Q选否Q注册组件一般不需要重?/p>

如果以前装过其他版本的aspjpegQ需要先停止iis(net stop iisadmin /y)Q卸载原来的lg(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\RegKeyQ?/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-9q个l果:)操作pȝ旉昄方式有所不同?/p>

以下是aspjpeg1.5的安装文Ӟdll文g和序列号

直接安装只要在aspjpeg1.5.exe安装q程中输入序列号卛_Q但是可能会出现ntfs目录讉K权限的问题,需要手动设|安装目录对Everyone有访问权限?/p>

如果用aspjpeg.dllQ请按照上面的方法安装以及添加注册表V?/p>


aspjpeg高使用Ҏ介绍

aspjpeg是一N常强大的囄处理lgQ纯英文版本。不q早已经有免费版和破解版Q但是对其进行详l与深入介绍的文章却是不多,即有也只牵涉到囄~略和图片水印。可能是因ؓU英文的~故?/p>


q里我就是针对这些问题谈谈aspjpeg的高U用法。这里的技术主要包括:
囄~略
囄水印
安全码技?
囄切割
囄合ƈ
数据库支?
更多不常用的Ҏ介绍
以及相关的一些实用技?


aspjpeg唯一点不的是输出方式比较单一。在q里Q我们主要谈图片处理保存后再调用的q种输出Ҏ。另外,本h比较懒,所以有些代码仍然引用于原文档,不懂的地方偶会加以解释!


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


一、图片羃?

<%
Set Jpeg = Server.CreateObject("Persits.Jpeg") 调用lg
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 生成长度Qw_nQ? 可能包含字母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么调用sessionQ没有session的安全码是完全没有意义的。呵?

Set Jpeg = Server.CreateObject("Persits.Jpeg") 调用lg
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坐标Qy坐标 右下角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.jpgQ再输入也可以。我个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
文字背景




SIMONE 2007-02-26 15:47 发表评论
]]>
一个大家不常用刎ͼ却很有用的页面间传值方?/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在一个应用程序域范围׃nQ所有用户可以改变及讄其|故只应用计数器等需要全局变量的地斏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( "StaDateQ? );<br />Response.Write( queryPage.StaDate );<br />Response.Write( "<br/>EndDateQ? );<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( "StaDateQ? );<br />Response.Write( queryParams.StaDate );<br />Response.Write( "<br/>EndDateQ? );<br />Response.Write( queryParams.EndDate );<br />  }<br />}</p> <p>三、本文v?<br />      因在工作中要作一个数据查询,参数烦多Q原先是用Session传递,用完该Session传来的参数后Q还需清理SessionQ在用Session之前q得判断该Session是否存在Q极其烦琐,我想应该q有更简便的Ҏ来实现页面间的参C递,故上|查找,l于扑ֈq样一U方式来实现面间的参数传递?br />  有不C处,请大家指正!<br /><br /><br />我说详细一点,现在有这样一UWeb开发模式:</p> <p>Page - H体容器Q从.net framework接受客户端请求,q最l向客户端输出htmlQ承载UserControl容器q组装之<br />UserControl - 功能模块Q对一个特定功能进行封装,承蝲WebControl的容?br />WebControl - 装了单一的业务逻辑Q和与之对应对应的HTML输出、客L交互UI</p> <p>所有的h参数由Page得到Q最l传递至UserControl容纳的WebControl?br />在这个过E中QPageQ甚xUserControlQ不提供M逻辑q行q预QUserControl/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 />用户控g1Q?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 />面2Q?br />public class Page2 : System.Web.UI.Page<br />{<br />public UserControl3 userControl3;<br />public UserControl4 userControl4;<br />}</p> <p>用户控g3Q?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>

中差异较大的特点之一QAsp.net除了可以用Include以外Q还提供

了比较有特点的Web控gQ包括: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,做好一个WebH体,在Studio.net 2003开发界面上,直接把控件拖到WebForm?OKQ?/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("选择生成校验图文件的cd(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>
  /// 清除旉过20U的临时囄记录
  /// </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;
   }
  }
  
 }
}




SIMONE 2007-02-01 10:43 发表评论
]]>
ajaxcd的?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依靠代理QbrokerQ指z֒处理往q服务器的请求。对此,.NET包装器依靠客LXmlHttpRequest对象。多数浏览器都支持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函数。用JavaScriptQ在客户ZQ调用该函数Ӟh传递给服务器ƈ把结果返回给客户机?/div>
 
初始讄
我们首先介绍“安装”项目中使用?dll的步骤。如果您很清楚如何添?dll文g引用Q可以蟩q这一节?/div>
首先Q如果还没有的话Q请下蝲最新的AJAX版本。解压下载的文gq把ajax.dll攑ֈ目的引用文件夹中。在Visual Studio.NET中有机Solution Explorer的“ReferencesQ引用)”节点ƈ选择Add ReferenceQ添加引用)。在打开的对话框中,单击BrowseQ浏览)q找到ref/ajax.dll文g。依ơ单击OpenQ打开Q和OkQ确认)。这样就可以用AJAX .NET包装器编E了?/div>
建立HttpHandler
Z保证正常工作Q第一步是在web.config中设|包装器的HttpHandler。不需要详l解释HttpHandlers是什么及其如何工作,只要知道它们用于处理ASP.NEThp够了。比如,所?.aspx面h都由System.Web.UI.PageHandlerFactorycd理。类似的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.NETQ和指定路径Qajax/*.ashxQ匹配的Mh都由Ajax.PageHandlerFactory而不是默认处理程序工厂来处理。不需要创建ajax子目录,使用q个秘的目录只是ؓ了让其他HttpHandlers能够在自己徏立的子目录中使用.ashx扩展?/div>
 
建立面
现在我们可以开始编码了。创Z个新面或者打开已有的页面,在file后的代码中,为Page_Load事gd以下代码Q?/div>
public class Index : System.Web.UI.Page{
  private void Page_Load(object sender, EventArgs e){
      Ajax.Utility.RegisterTypeForAjax(typeof(Index));     
      //...   
  }
  //... 
}
调用RegisterTypeForAjax在面上引发后面的JavaScriptQ或者在面中手工加入以下两行代码)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复制粘贴\径)查是否一切正常。如果两个\径都输出一些(gQ毫无意义的文本Q就万事大吉了。如果什么也没输出或者出现ASP.NET错误Q则表明有些地方出现问题?/div>
即便不知道HttpHandlers如何工作Q上面的例子也很Ҏ理解。通过web.configQ我们已l保证所有对ajax/*.ashx的请求都p定义的处理程序处理。显Ӟq里的两个脚本标{ְp定义的处理程序处理?/div>
 
创徏服务器端函数
现在来创建可从客L调用中异步访问的服务器端函数。因为目前还不支持所有的q回cdQ不用担心,在目前的基上开发新的版本)Q我们l用简单的ServerSideAdd函数吧。在file后的代码中,向页面添加下列代码:
[Ajax.AjaxMethod()]
public int ServerSideAdd(int firstNumber, int secondNumber)
{
  return firstNumber + secondNumber;
}
要注意,q些函数hAjax.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);
}
从上qC码中可以看到我们指定了另外一个参数。ServerSideAdd_CallBackQ同样参见上qC码)是用于处理服务器响应的客L函数。这个回调函数接收一个响应对象,该对象公开了三个主要性质
  • Value——服务器端函数实际返回的|无论是字W串、自定义对象q是数据集)?
  • Error——错误消息,如果有的话?
  • Request——xml httph的原始响应?
  • Context——上下文对象?
首先我们查error只看看是否出C错误。通过在服务器端函C抛出异常Q可以很Ҏ处理errorҎ。在q个化的例子中,然后用这个D告用戗RequestҎ可用于获得更多信息Q参见下一节)?/div>
 
处理cd
 
q回复杂cd
Ajax包装器不仅能处理ServerSideAdd函数所q回的整数。它目前q支持integers、strings、double、booleans、DateTime、DataSets和DataTablesQ以及自定义cd数组{基本类型。其他所有类型都q回它们的ToString倹{?/div>
q回的DataSets和真正的.NET DataSet差不多。假设一个服务器端函数返回DataSetQ我们可以通过下面的代码在客户端显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>
Ajaxq可以返回自定义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样可以在客户端异步调用GetUserQ?/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和UserIdQ?/div>
 
自定义{换器
我们已经看到QAjax .NET包装器能够处理很多不同的.NETcd。但是除了大?NETcd内徏cd以外Q包装器对不能正返回的其他cd仅仅调用ToString()。ؓ了避免这U情况,Ajax .NET包装器允许开发h员创建对象{换器Q用于在服务器和客户Z间^滑传递复杂对象?/div>
 
其他事项
 
在其他类中注册函?/strong>
 
上面的例子中Q我们的服务器端函数都放在执行页面背后的代码中。但是,没有理由不能把这些函数放在单独的cL件中。要CQ包装器的工作方式是在指定类中发现所有带Ajax.AjaxMethod的方法。需要的c通过W二个脚本标{指定。用Ajax.Utility.RegisterTypeForAjaxQ我们可以指定需要的McR比如,我们的服务器端函数作ؓ单独的类是合情合理的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ȝcd而不是页面就可以让Ajax包装器创Z理:
private void Page_Load(object sender, EventArgs e){
  Ajax.Utility.RegisterTypeForAjax(typeof(AjaxFunctions));
  //...
}
要记住,客户端代理的名称?lt;ClassName>.<ServerSideFunctionName>。因此,如果ServerSideAdd函数攑֜上面虚构的AjaxFunctionscMQ客L调用应该是Q?AjaxFunctions.ServerSideAdd(1,2)?/div>
 
代理到底是如何工作的
 
Ajax工具生成的第二个脚本标签Q也可以手工插入Q传递了面的名U空间、类名和E序集。根据这些信息,Ajax.PageHandlerFactoryp够用反得到具有特定属性的M函数的详l信息。显Ӟ处理函数查找hAjaxMethod属性的函数q得到它们的{֐Q返回类型、名U和参数Q,从能够创建必要的客户端代理。具体而言Q包装器创徏一个和cd名的JavaScript对象Q该对象提供代理。换句话_l定一个带有Ajax ServerSideAddҎ的服务器端类AjaxFunctionsQ我们就会得到公开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,用户~辑的时候会Ҏ档加锁。其他用户可以请求在文档可用的时候得到通知。如果没有AJAXQ我们就只能{待该用户再ơ返回来查请求的文档是否可用。显然不够理惟뀂用支持会话状态的Ajax非常简单了?/div>
首先来编写服务器端函敎ͼ目标是@环遍历用户希望编辑的documentIdQ保存在会话中)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和ReadWriteQ?/div>
现在~写使用该方法的JavaScriptQ?/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);">
我们的服务器端函数在面加蝲时调用一ơ,然后每隔10U钟调用一ơ。回调函数检查响应看看是否有q回|有的话则在div标签中显C用户可用的新文档?/div>
l束?/div>
AJAX技术已l催生了原来只有桌面开发才具备的健壮而丰富的Web界面。Ajax .NET包装器让您很Ҏp利用q种新的强大技术。请注意QAjax .NET包装器和文档仍在开发之中?/div>



SIMONE 2007-01-25 17:05 发表评论
]]>使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提供了三个功能强大的列表控gQDataGrid、DataList和Repeater控gQ但其中只有DataGrid控g提供分页功能。相对DataGridQDataList和Repeater控gh更高的样式自定义性,所以很多时候我们喜Ƣ用DataList或Repeater控g来显C数据?br /><br /><br /> 实现DataList或Repeater控g的分|C有几种ҎQ?br /> 1、写一个方法或存储q程Q根据传入的|q回需要显C的数据表(DataTableQ?br /> 2、用PagedDataSourcec?br /><br />     本篇文章主要说怎么使用PagedDataSourcecd现DataList和Repeater控g的分|C。DataGrid控g内部也用了PagedDataSourcec,PagedDataSource cd装 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是否同步对数据源的讉KQ线E安全)。?br /> PageCount   获取昄数据源中的所有项所需要的总页数。?br /> PageSize   获取或设|要在单上昄的项数。?br /> VirtualCount   获取或设|在使用自定义分|数据源中的实际项数。?br /><br />      q些属性是否和DataGrid的属性很怼Q没错,DataGrid控g是使用PagedDataSourcecL实现数据分页昄的 。下面D个用PagedDataSourcecd现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出来QDataGrid也是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.NETE序中常用的三十三种代码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("QscriptQwindow.open(?.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"?Q?scriptQ?)
  接收参数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会导致postQback的生从而丢׃错误信息Q所以页面导向应该直接在服务器端执行Q这样就可以在错误处理页面得到出错信息ƈq行相应的处?

  10.清空Cookie

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

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

namespace MyAppException
{
 /// QsummaryQ?br /> /// 从系l异常类ApplicationExceptionl承的应用程序异常处理类?br /> /// 自动异常内容记录到Windows NT/2000的应用程序日?br /> /// Q?summaryQ?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
 {
  /// QsummaryQ?br />  /// 事g日志记录c,提供事g日志记录支持
  /// QremarksQ?br />  /// 定义?个日志记录方?(error, warning, info, trace)
  /// Q?remarksQ?br />  /// Q?summaryQ?br />  public class ApplicationLog
  {
   /// QsummaryQ?br />   /// 错误信息记录到Win2000/NT事g日志?br />   /// Qparam name="message"Q需要记录的文本信息Q?paramQ?br />   /// Q?summaryQ?br />   public static void WriteError(String message)
   {
    WriteLog(TraceLevel.Error, message);
   }

   /// QsummaryQ?br />   /// 警告信息记录到Win2000/NT事g日志?br />   /// Qparam name="message"Q需要记录的文本信息Q?paramQ?br />   /// Q?summaryQ?br />   public static void WriteWarning(String message)
   {
    WriteLog(TraceLevel.Warning, message);  
   }

   /// QsummaryQ?br />   /// 提CZ息记录到Win2000/NT事g日志?br />   /// Qparam name="message"Q需要记录的文本信息Q?paramQ?br />   /// Q?summaryQ?br />   public static void WriteInfo(String message)
   {
    WriteLog(TraceLevel.Info, message);
   }
   /// QsummaryQ?br />   /// 跟t信息记录到Win2000/NT事g日志?br />   /// Qparam name="message"Q需要记录的文本信息Q?paramQ?br />   /// Q?summaryQ?br />   public static void WriteTrace(String message)
   {
    WriteLog(TraceLevel.Verbose, message);
   }

   /// QsummaryQ?br />   /// 格式化记录到事g日志的文本信息格?br />   /// Qparam name="ex"Q需要格式化的异常对象</paramQ?br />   /// Qparam name="catchInfo"Q异怿息标题字W串.Q?paramQ?br />   /// QretvalueQ?br />   /// QparaQ格式后的异怿息字W串Q包括异常内容和跟踪堆栈.Q?paraQ?br />   /// Q?retvalueQ?br />   /// Q?summaryQ?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();
   }

   /// QsummaryQ?br />   /// 实际事g日志写入Ҏ
   /// Qparam name="level"Q要记录信息的别(error,warning,info,trace).Q?paramQ?br />   /// Qparam name="messageText"Q要记录的文?Q?paramQ?br />   /// Q?summaryQ?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:panelQ?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?scriptQ?o:p>

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

  14.DataGridq接?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 />QITEMTEMPLATEQ?br />QASP:LABEL text=’<%# DataBinder.Eval(Container.DataItem, "ArticleID")%Q?runat="server" width="80%" id="lblColumn" /Q?br />Q?ITEMTEMPLATEQ?br />Q?ASP:TEMPLATECOLUMNQ?o:p>

Q?span lang="EN-US">ASP:TEMPLATECOLUMN headertext="选中"Q?br />QHEADERSTYLE wrap="False" horizontalalign="Center"Q</HEADERSTYLEQ?br />QITEMTEMPLATEQ?br />QASP:CHECKBOX id="chkExport" runat="server" /Q?br />Q?ITEMTEMPLATEQ?br />QEDITITEMTEMPLATEQ?br />QASP:CHECKBOX id="chkExportON" runat="server" enabled="true" /Q?br />Q?EDITITEMTEMPLATEQ?br />Q?ASP:TEMPLATECOLUMNQ?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.0000Q怎样格式化ؓ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>

  dApplication[属性名] 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 />QMenuData ImagesBaseURL="images/"Q?
QMenuGroupQ?br />QMenuItem Label="内参信息" URL="Infomation.aspx" Q?br />QMenuGroup ID="BBC"Q?br />QMenuItem Label="公告信息" URL="Infomation.aspx" URLTarget="_blank" LeftIcon="file.gif"/Q?br />QMenuItem Label="~制信息? URL="NewInfo.aspx" LeftIcon="file.gif" /Q?br />......
  最好将你的aspnetmenu升?.2?o:p>

  21.dDataGrid控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?
QItemTemplateQ?br />Qasp: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?ItemTemplateQ?br />Q?asp:TemplateColumnQ?o:p>

Q?span lang="EN-US">asp:TemplateColumn HeaderText="单h"Q?
QItemTemplateQ?br />Qasp: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">/ItemTemplateQ?br />Q?asp:TemplateColumnQ?o:p>

Q?span lang="EN-US">asp:TemplateColumn HeaderText="金额"Q?
QItemTemplateQ?br />Qasp:TextBox id="JinE" runat=’server?Text=’<%# DataBinder.Eval(Container.DataItem,"DG_JinE")%Q?/Q?br />Q?ItemTemplateQ?br />Q?asp:TemplateColumnQ<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?scriptQ?o:p>

24.datagrid选定比较底下的行ӞZ么Lh一下,然后滚动到了最上面Q刚才选定的行因屏q的关系q不到了?o:p>

page_load
page.smartNavigation=true
  25.在Datagrid中修Ҏ据,当点ȝ辑键Ӟ数据出现在文本框中,怎么控制文本框的大小 ?

private void DataGrid1_ItemDataBound(obj sender,DataGridItemEventArgs e)
{
 for(int i=0;iQe.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 = "Qscript language=\"JavaScript\"Q?;
private static string ScriptEnd = "Q?scriptQ?;

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. 时间格式化Qstring aa=DateTime.Now.ToString("yyyyqMM月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;
  28Q自定义分页代码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(aQDataGrid1.PageCount)
{
 this.DataGrid1.CurrentPageIndex=a;
}

bind();
29QDataGrid使用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); //执行sqlq回的DataTable
DataColumn dc=dt.Columns.Add("number",System.Type.GetType("System.String"));

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

DataGrid1.DataSource=dt;
DataGrid1.DataBind();
  DataGrid1中添加一个CheckBoxQ页面中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); //删除函数
 }
}
  30Q当文g在不同目录下Q需要获取数据库q接字符Ԍ如果q接字符串放在Web.configQ然后在Global.asax中初始化Q?

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

Application["ConnStr"]=this.Context.Request.PhysicalApplicationPath+ConfigurationSettings.
   AppSettings["ConnStr"].ToString();
  31Q?变量.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 (16q制)
12345.ToString("p"); //生成 1,234,500.00%
  32、变?Substring(参数1,参数2);

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

  33Q在自己的网站上登陆其他|站Q?如果你的面是通过嵌套方式的话Q因Z个页面只能有一个FORMQ这时可以导向另外一个页面再提交登陆信息)

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

Q?span lang="EN-US">/SCRIPTQ<body leftMargin="0" topMargin="0" "gook()" marginwidth="0" marginheight="0"Q?
Qform name="frm" action=" http://220.194.55.68:6080/login.php?retid=7259 " method="post"Q?
QtrQ?
QtdQ?br />Qinput id="f_user" type="hidden" size="1" name="f_user" runat="server"Q?br />Qinput id="f_domain" type="hidden" size="1" name="f_domain" runat="server"Q?br />Qinput 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 />QINPUT id="tem" type="hidden" size="1" value="2" name="tem"Q?

Q?span lang="EN-US">/tdQ?

Q?span lang="EN-US">/trQ?

Q?span lang="EN-US">/formQ?
  文本框的名称必须是你要登陆的|页上的名称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");
}



SIMONE 2007-01-25 13:02 发表评论
]]>
一个不错的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



SIMONE 2007-01-24 10:34 发表评论
]]>
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 lgQ包含优化的数据讉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生?DataSetQ如下所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 .NETQ用?.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 BlockQ数据访问应用程序块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 BlockQ需要满以下要求:

  • Microsoft Windows] 2000、Windows XP Professional
  • .NET Framework SDKQ英文)?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 .NETQ用?.NET ?Microsoft 应用E序块)子菜单。该子菜单中有一?Data AccessQ数据访问)子菜单,其中包括用于启动文档的选项和用于启?Data Access Application Block Visual Studio .NET 解决Ҏ的选项?/p>

误{?MSDN DownloadsQ英文)q行下蝲?/p>

使用 Data Access Application Block

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

?1QData Access Application Block

SqlHelper cL供了一l静态方法,可以用来?SQL Server 数据库发多各U不同类型的命o?/p>

SqlHelperParameterCache cL供命令参数缓存功能,可以用来提高性能。该cȝ许多 Execute ҎQ尤其是那些只运行存储过E的重写ҎQ在内部使用。数据访问客L也可以直接用它来缓存特定命令的特定参数集?/p>

使用 SqlHelper cL行命?/h3>

SqlHelper cL供了五种 Shared (Visual Basic) ?static (C#) ҎQ它们是Q?strong>ExecuteNonQuery?strong>ExecuteDataset?strong>ExecuteReader?strong>ExecuteScalar ?ExecuteXmlReader。实现的每种Ҏ都提供一l一致的重蝲。这提供了一U很好的使用 SqlHelper cL执行命o的模式,同时为开发h员选择讉K数据的方式提供了必要的灵zL。每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 cL法的代码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 cL供了三种可以用来理参数的公共共享方法。它们是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、倹{方向和数据cd{进行了初始化?/p>

注意Q?/strong> 用作参数集的键的q接字符串通过单的字符串比较进行匹配。用于从 GetCachedParameterSet 中检索参数的q接字符串必M用来通过 CacheParameterSet 来存储这些参数的q接字符串完全相同。语法不同的q接字符串即使语义相同,也不会被认ؓ是匹配的?/blockquote>

以下代码昄了如何?SqlHelperParameterCache cL~存和检?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 cM内部索,q将它们d到缓存中Q以便用于后l的索请求。然后,为每个参数指定相应的参数讄Q最后将q些参数以数lŞ式返回给客户端。以下代码显CZ如何?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 cd现详l信?/h3>

SqlHelper cȝ于通过一l静态方法来装数据讉K功能。该cM能被l承或实例化Q因此将其声明ؓ包含专用构造函数的不可l承cR?/p>

?SqlHelper cM实现的每U方法都提供了一l一致的重蝲。这提供了一U很好的使用 SqlHelper cL执行命o的模式,同时为开发h员选择讉K数据的方式提供了必要的灵zL。每U方法的重蝲都支持不同的Ҏ参数Q因此开发h员可以确定传递连接、事务和参数信息的方式。在 SqlHelper cM实现的方法包括:

  • ExecuteNonQuery。此Ҏ用于执行不返回Q何行或值的命o。这些命令通常用于执行数据库更斎ͼ但也可用于返回存储过E的输出参数?
  • ExecuteReader。此Ҏ用于q回 SqlDataReader 对象Q该对象包含由某一命oq回的结果集?
  • ExecuteDataset。此Ҏq回 DataSet 对象Q该对象包含由某一命oq回的结果集?
  • 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 cM的专用函C要用于提供一U一致的方式Q以便向 SQL Server 数据库发出命令,而不考虑客户端应用程序调用的重蝲Ҏ实现。SqlHelper cM的专用实用程序函数包括:

  • AttachParametersQ该函数用于所有必要的 SqlParameter 对象q接到正在运行的 SqlCommand?
  • AssignParameterValuesQ该函数用于?SqlParameter 对象赋倹{?
  • PrepareCommandQ该函数用于对命令的属性(如连接、事务环境等Q进行初始化?
  • ExecuteReaderQ此专用 ExecuteReader 实现用于通过适当?CommandBehavior 打开 SqlDataReader 对象Q以便最有效地管理与阅读器关联的q接的有效期?

SqlHelperParameterCache cd现详l信?/h3>

参数数组~存在专?Hashtable 中。从~存中检索的参数q行内部复制Q这样客L应用E序能够更改参数g及进行其他操作,而不会媄响缓存的参数数组。专用共享函?CloneParameters 可以实现此目的?/p>

常见问题

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

?Data Access Application Block Beta 2.0 版本相比Q该 RTM 版本包含以下新增功能和变化:

  • SqlHelper cL法的事务型重载不再需?SqlConnection 参数。在此版本中Q连接信息从 SqlTransaction 对象中派生,因此不必在方法签名中包含 SqlConnection 对象参数?
  • 现在Q?strong>GetSpParameterSet Ҏ使用 ADO.NET CommandBuilderDeriveParameters Ҏ来确定存储过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 GuideQ英文)?/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程返回一?DateSetQ其中包含两个表Q一个表包含分类数据Q另一个表包含产品数据?/p>

注意Q?/strong> ExecuteDataset Ҏ不提供ؓq回的表指定自定义名U的Ҏ。第一个表的编号始lؓ 0Q名UCؓ TableQ第二个表的~号?1Q名UCؓ Table1Q依此类推?/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 .NETQ?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_appsQ英文)

新闻l:NNTP 读?br />news://msnews.microsoft.com/microsoft.public.dotnet.distributed_appsQ英文)

您想学习和利?.NET 的功能吗Q欢q您?Microsoft Technology Centers 的技术专家ƈ肩工作,您将学到最好的开发经验。有兌l信息,误?http://www.microsoft.com/business/services/mtc.aspQ英文)?/p>

您需要更多的帮助吗?误问新增的客户支持服务 Advisory ServicesQ该解决Ҏ可以满您小规模的咨询需要。有?Advisory Services 的详l信息,误?http://support.microsoft.com/default.aspx?id=fh;EN-US;advisoryserviceQ英文)?/p>

更多信息

Data Access Application Block 的设计和开发是建立?Data Access in .NET Architecture GuideQ英文)中讨论的最佛_发经验和通用设计原则基础之上的。请阅读该指南,以了解有x据访问的详细信息?/p>



SIMONE 2007-01-22 11:06 发表评论
]]> վ֩ģ壺 گ| ʯ| | | ٤ʦ| | | ;| ޳| | կ| | ʲ| ̨| | | Դ| | | | ̨| ͩ| ̨| | »| | Ȫ| °Ͷ| ѷ| ޽| ʯ| ͨ| | Դ| | | | | ˮ| ɽ| |