??xml version="1.0" encoding="utf-8" standalone="yes"?> 诚然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现在可以编写程序测试了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 />
E序界面效果如上面所C?/p>
本文提到的皮肤组件可以到Q?a >http://download.csdn.net/user/zhoufoxcn/下蝲?/p>
try if(fileupload.PostedFile!=null) WⅠ部分Q??XML:NAMESPACE PREFIX = ST1 /?> 1Q?span lang="EN-US">Enterprise Library Step By SteppdQ一Q:配置应用E序块—?/span>入门?/span>
Q我不小心加到打印分l去了,大家不要骂我QPQ?/p>
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;
}
}
}
System.Collections.Specialized.NameValueCollection PostVars = new System.Collections.Specialized.NameValueCollection();
PostVars.Add("A1","0");
PostVars.Add("A2","0");
PostVars.Add("A3","000");
{
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();
]]>
{
//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();
}
]]>
]]>
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>
安装提示输入序列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
文字背景
二、如果在两个面间需要大量的参数要传传递,如数据查询等面Ӟ? Q?6的方法传值及其不便,而第 7 U方法确有一独特的优势!但用该Ҏ旉要一定的讄Q现单介l一下该Ҏ的用方式:
以查询数据页面ؓ例:
在查询页面中讄如下公有属?QueryPage.aspx)Q?br /> public class QueryPage : System.Web.UI.Page
{
protected System.Web.UI.WebControls.TextBox txtStaDate;
protected System.Web.UI.WebControls.TextBox txtEndDate;
...
/// <summary>
/// 开始时?br />/// </summary>
public string StaDate
{
get{ return this.txtStaDate.Text;}
set{this.txtStaDate.Text = value;}
}
/// <summary>
/// l束旉
/// </summary>
public string EndDate
{
get{ return this.txtEndDate.Text;}
set{this.txtEndDate.Text = value;}
}
....
private void btnEnter_Click(object sender, System.EventArgs e)
{
Server.Transfer("ResultPage.aspx");
}
}
在显C查询结果页?ResultPage.aspx)Q?br /> public class ResultPage : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
//转换一下即可获得前一面中输入的数据
QueryPage queryPage = ( QueryPage )Context.Handler;
Response.Write( "StaDateQ? );
Response.Write( queryPage.StaDate );
Response.Write( "<br/>EndDateQ? );
Response.Write( queryPage.EndDate );
}
}
三、如果有许多查询面q一个结果页面的讄ҎQ?br /> 在这U方式中关键在于?QueryPage queryPage = ( QueryPage )Context.Handler; ”的转换Q只有{换不依赖于特定的面时即可实现?br />如果让所有的查询面都承一个接口,在该接口中定义一个方法,该方法的唯一作用是让结果页面获得构建结果时所需的参?可实现多页面共享一个结果页面操作!
1、先定义一个类Q用该类攄所有查询参敎ͼ
/// <summary>
/// l果面中要用到的?br />/// </summary>
public class QueryParams
{
private string staDate;
private string endDate;
/// <summary>
/// 开始时?br />/// </summary>
public string StaDate
{
get{ return this.staDate;}
set{this.staDate = value;}
}
/// <summary>
/// l束旉
/// </summary>
public string EndDate
{
get{ return this.endDate;}
set{this.endDate = value;}
}
}
2、接口定义:
/// <summary>
/// 定义查询接口?br />/// </summary>
public interface IQueryParams
{
/// <summary>
/// 参数
/// </summary>
QueryParams Parameters{get;}
}
3、查询页面承IQueryParams接口(QueryPage.aspx)Q?br />
/// <summary>
///查询面Q承接?br />/// </summary>
public class QueryPage : System.Web.UI.Page, IQueryParams
{
protected System.Web.UI.WebControls.TextBox txtStaDate;
protected System.Web.UI.WebControls.TextBox txtEndDate;
private QueryParams queryParams;
...
/// <summary>
/// l果面用到的参?br />/// </summary>
public QueryParams Parameters
{
get
{
return queryParams;
}
}
....
private void btnEnter_Click(object sender, System.EventArgs e)
{
//赋?br />queryParams = new QueryParams();
queryParams.StaDate = this.txtStaDate.Text;
queryParams.EndDate = this.txtEndDate.Text
Server.Transfer("ResultPage.aspx");
}
}
4、别外的面也如此设|?br />5、接攉?ResultPage.aspx)Q?br />
public class ResultPage : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
QueryParams queryParams = new QueryParams();
IQueryParams queryInterface;
//实现该接口的面
if( Context.Handler is IQueryParams)
{
queryInterface = ( IQueryParams )Context.Handler;
queryParams = queryInterface.Parameters;
}
Response.Write( "StaDateQ? );
Response.Write( queryParams.StaDate );
Response.Write( "<br/>EndDateQ? );
Response.Write( queryParams.EndDate );
}
}
三、本文v?
因在工作中要作一个数据查询,参数烦多Q原先是用Session传递,用完该Session传来的参数后Q还需清理SessionQ在用Session之前q得判断该Session是否存在Q极其烦琐,我想应该q有更简便的Ҏ来实现页面间的参C递,故上|查找,l于扑ֈq样一U方式来实现面间的参数传递?br /> 有不C处,请大家指正!
我说详细一点,现在有这样一UWeb开发模式:
Page - H体容器Q从.net framework接受客户端请求,q最l向客户端输出htmlQ承载UserControl容器q组装之
UserControl - 功能模块Q对一个特定功能进行封装,承蝲WebControl的容?br />WebControl - 装了单一的业务逻辑Q和与之对应对应的HTML输出、客L交互UI
所有的h参数由Page得到Q最l传递至UserControl容纳的WebControl?br />在这个过E中QPageQ甚xUserControlQ不提供M逻辑q行q预QUserControl/WebControl的可变特性完全由持久化的HTML代码l出
——也是_所有的Page都没有代码,如何在一个系l中做到Transfer所需要的参数便于l护、调_
面1:
public class Page1 : System.Web.UI.Page
{
public UserControl1 userControl1;
public UserControl2 userControl2;
}
用户控g1Q?br />public class UserControl2 :System.Web.UI.UserControl
{
private void btnEnter_Click(object sender, System.EventArgs e)
{
Server.Transfer("Page2.aspx");
}
}
//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
{
public UserControl3 userControl3;
public UserControl4 userControl4;
}
用户控g3Q?br />public class UserControl3 :System.Web.UI.UserControl
{
private void Page_Load(object sender, System.EventArgs e)
{
Page1 page1 = (Page1)Context.Handler;
Response.Write( "属?" );
Response.Write( page1.userControl1.属? );
Response.Write( "<br/>属?" );
Response.Write( page1.userControl2.属? );
}
}
//如果在页?中没有声明用h?Q在面2中将引用不到面1中用h?中的公共Ҏ
另一U方法是
SourcePage讄一?br /> public string Name
{
get { return txtName.Text; }
}
目标面首先声明Q?br /><%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %>
然后在后C码直接?/p>
Response.Write(PreviousPage.Name);
{都不一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;
}
}
}
}
传送参敎ͼ
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");
}
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 源代码以及综合文档?
您是否正在从?.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在引用?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
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 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 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>