cs c#中 gridview 换页的换页不刷新问题

Bullion技术交流BLOG 17
Post ::
4 Stories
51 Comments
1 Trackbacks
欢迎来到我的blog, 本blog专注于 .NET , Ajax, SQLServer, MySQL 学习 和 探讨, 希望能与大家一起进步!!!
昵称:
园龄:
粉丝:
关注:
搜索 常用链接
我的标签
随笔分类
随笔档案
文章分类
收藏夹
ASP.NET常用网址
http://ajax.a .net
http://code.google.com
http://www.joyistar.com/
http://www.c logs.com/kwklover/
www.mysql.cn
www.mysql.com
http://www.wubingstudy.com/
酷炫 DHTML 及 AJAX 大收集
其它友情联接
http://jeffreyzhao.c logs.com/
http://je ezhao.c logs.com
最新随笔
最新评论
写个windows services
--德仔
我也遇到这个问题,解决不了。连本地不会出错,远程服务器则出现错误。只记得我***Enterprise Library,就出现这个问题。之前都是好好的。。Enterprise Library也被我卸载了,...
--草样绿想
你好,我现在也遇到这样的问题了,请问你最后的解决方案是怎样的。求教了师兄,谢谢!
--Joseph zheng
@Allen Zhang
正解!!
--路人饼
我也遇到这个问题,所以才发现了你的帖子。
但很快就解决了。
1、确认你的sql server 2000的服务器开启;
2、string strCon=@" erver=(local);Int...
阅读排行榜
评论排行榜
2010年10月18日
Stream s = null;
WebClient wc = new WebClient();
string uriString = "Flash地址";
s = wc.OpenRead(uriString); 怎么把这个流保存成Flas***件呢?? StreamReader reader = new StreamReader(s);
FileStream fs = new FileStream("保存地址", FileMode.OpenOrCreate, FileAcce .Write);
StreamWriter writer = new StreamWriter(fs);
writer.Write(reader.ReadToEnd());
这么写保存下来的Flash打不开,怎么才能把这个流保存成Flas***件呢?? 解决方案: WebClient wc = new WebClient() wc.DownloadFile("http://xx.swff",Server.MapPath("~/xx.swf")) posted @ 2010-10-18 12:57 bullion 阅读(100) | 评论(0) |
2009年10月9日
下面就把具体的操作步骤描述一下,以备参与:
0、在两台机上创建相同用户名和密码的账号 1、在IMG下新建虚拟目录,暂时随便选择一个本地路径(因为向导不能选择远程路径) 2、右键创建的虚拟目录– gt;属性– gt;主目录– gt;另一台计算机上的共享– gt;输入远程地址 3、点击“链接为” #8211 gt;取消“在验证到网络目录的访问时总是使用已经过身份验证的用户凭据” 4、输入在第0步创建的用户名和密码 5、确定
6、重启IIS
posted @ 2009-10-09 14:13 bullion 阅读(203) | 评论(0) |
2009年9月11日
我现在有服务A, 服务B, 服务C
我想用服务A定时去检测 服务B 和 服务C, 发现服务停止即重新开启服务。
不知道有没有办法可以做到?
posted @ 2009-09-11 15:32 bullion 阅读(258) | 评论(1) |
2009年4月16日
private void DataTable2Excel(System.Data.DataTable dtData)
{ System.Web.UI.WebControls.DataGrid dgExport = null; System.Web.HttpContext curContext = System.Web.HttpContext.Current; System.IO.StringWriter strWriter = null; System.Web.UI.HtmlTextWriter htmlWriter = null; if (dtData != null) { curContext.Re o e.ContentType = "a lication/vnd.ms-excel"; curContext.Re o e.ContentEncoding = System.Text.Encoding.UTF8; curContext.Re o e.Charset = ""; strWriter = new System.IO.StringWriter(); htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter); dgExport = new System.Web.UI.WebControls.DataGrid(); dgExport.DataSource = dtData.DefaultView; dgExport.AllowPaging = false; dgExport.DataBind(); dgExport.RenderControl(htmlWriter); curContext.Re o e.Write(strWriter.ToString()); curContext.Re o e.End(); } }
posted @ 2009-04-16 12:01 bullion 阅读(706) | 评论(0) |
2008年6月10日
public static string GetString(string str, int length ) { int i = 0, j = 0; foreach (char chr in str) { if ((int)chr 30) { i += 2; } else { i++; } if (i length) { str = str.Su tring(0, j) + "..."; break; } j++; } return str; } #endregion
posted @
风语战士 阅读(11) |
| public static bool IsValidUsername(string strName, string acsii) { return (Regex.IsMatch(strName, acsii)); }
posted @
风语战士 阅读(7) |
| int CurrentPage;//
当前页数 int PageSize //
每页条数 int PageCount //
总页数 int RecordCount;//
总条数 private void Page_Load(object sender, System.EventArgs e) { PageSize=16; //每页为16条记录 if(!IsPostBack) { if(Se ion["ji"]==null||Se ion["ji"].ToString()=="") { Re o e.Write("< cript language = javascriptwindow.open('Login.a x','_top')/script"); } else { DataListBind(); Page.DataBind(); CalculateRecord(); } } } ublic void LinkButton_Click(Object sender, CommandEventArgs e)//
自己编写的按钮点击事件 { CurrentPage =(int)ViewState["PageIndex"];//
获得当前页索引 PageCount = (int)ViewState["PageCount"];//
获得总页数 int i age=0; tring cmd = e.CommandName; //判断cmd,以判定翻页方向 switch (cmd) { case "prev"://
上一页 if (CurrentPage 0)CurrentPage--; reak; case "next": if (CurrentPage (PageCount - 1)) CurrentPage++;//
下一页 reak; case "first"://
第一页 CurrentPage = 0; reak; case "end"://
最后一页 CurrentPage = PageCount - 1; reak; case "jump"://
跳转到第几页 try { i age=int.Parse(TextBox2.Text.Trim()); } catch { Re o e.Write("< criptalert('只能输入数字!!!')/script"); retur } if (this.TextBox2.Text.Trim()== "" || Int32.Parse(this.TextBox2.Text.Trim()) PageCount ||Int32.Parse(this.TextBox2.Text.Trim())0)//如果输入数字为空或超出范围则返回 { retur } else { CurrentPage = Int32.Parse(this.TextBox2.Text.ToString()) - 1; reak; } } ViewState["PageIndex"] = CurrentPage;//
获得当前页 //重新将DataList绑定到数据库
//CalculateRecord(); DataListBind() } ublic void CalculateRecord() { //不可以放在初始化条件之前就绑定,那样的话,如果仅有一页的数据,“下一页”页仍然显示 CurrentPage = 0;//
当前页习惯设为0 ViewState["PageIndex"] = 0;//
页索引也设为0 //计算总共有多少记录 RecordCount =com.kecount(); //计算总共有多少页 if (RecordCount % PageSize == 0) { PageCount = RecordCount / PageSize; } else { PageCount = RecordCount / PageSize + 1; } this.TotalLbl.Text = PageCount.ToString();//
显示总页数 ViewState["PageCount"] = PageCount;//
会话se ion 对整个 a lication 有效 ,而视图状态 viewstate相当于某个页面的 se ion this.DataListBind(); } ublic void DataListBind() { tring zhuang="zhuang"; int StartIndex = CurrentPage * PageSize; if(StartIndex0) { StartIndex=0; } DataSet ds=com.kehu1(StartIndex,PageSize,zhuang); DataList1.DataSource=ds.Tables["zhuang"].DefaultView; DataList1.DataBind(); this.PreviousLB.Enabled = true; this.NextLB.Enabled = true; if (CurrentPage == (PageCount - 1)) this.NextLB.Enabled = false;//
当为最后一页时,下一页链接按钮不可用 if (CurrentPage == 0) this.PreviousLB.Enabled = false;//
当为第一页时,上一页按钮不可用 this.CurrentLbl.Text = (CurrentPage + 1).ToString();//
当前页数 } rivate void DataList1_UpdateCommand_1(object source, System.Web.UI.WebControls.DataListCommandEventArgs e) { Re o e.Redirect("addkefu.a x?type=2"+"&am id="+DataList1.DataKeys[e.Item.ItemIndex].ToString()); } rivate void DataList1_DeleteCommand_1(object source, System.Web.UI.WebControls.DataListCommandEventArgs e) { DataTable url=com.kehusele(int.Parse(DataList1.DataKeys[e.Item.ItemIndex].ToString())).Tables[0]; ViewState["name"]=Server.MapPath("..\\kehu\\"+url.Rows[0]["name"].ToString()); ool dele=com.delekehu(int.Parse(DataList1.DataKeys[e.Item.ItemIndex].ToString())); if(dele==true) { Re o e.Write("< criptalert('删除成功!!!')/script"); FileInfo finfo = new FileInfo(ViewState["name"].ToString()); if(finfo.Exists) { finfo.Delete(); } } else { Re o e.Write("< criptalert('删除失败!!!')/script"); } CalculateRecord(); DataListBind(); } rivate void DataList1_ItemDataBound_1(object sender, System.Web.UI.WebControls.DataListItemEventArgs e) { if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem) { //判断删除按扭 Button Button2=(Button)e.Item.FindControl("Button2"); Button2.Attributes.Add("onclick","return confirm('确定要删除吗??')"); } } ublic String Imger1 { get {return _imger1;} et {_imger1=value;}
tdFONT face="宋体" size="2"a :linkbutton id="FirstLB" runat="server" OnCommand="LinkButton_Click" CommandName="first"第一页/a :linkbutto gt lt;a :linkbutton id="PreviousLB" runat="server" OnCommand="LinkButton_Click" CommandName="prev"上一页/a :linkbutto gt lt;a :linkbutton id="NextLB" runat="server" OnCommand="LinkButton_Click" CommandName="next"下一页/a :linkbutto gt lt;a :linkbutton id="EndLB" runat="server" OnCommand="LinkButton_Click" CommandName="end"最后一页/a :linkbutto gt;共 lt;a :label id="TotalLbl" runat="server" ForeColor="#FF8000"/a :label页 当前第 lt;a :label id="CurrentLbl" runat="server" ForeColor="#FF8000"/a :label页 lt;a :linkbutton id="JumpLB" runat="server" OnCommand="LinkButton_Click" CommandName="jump"跳到/a :linkbutto gt;第 lt;a :TextBox id="TextBox2" runat="server" Width="63px"/a :TextBox页/FONT/td
posted @
风语战士 阅读(73) |
| 输入时
public string Tra String(string str) { hort temp=13; tr=str.Replace("'","’"); tr=str.Replace("&am ","&am am "); tr=str.Replace("",""); tr=str.Replace("",""); tr=str.Replace(" ","&am "); tr=str.Replace(((char)temp).ToString(),"< r"); return str; }
读取时. ublic string BackTra String(string str) { hort temp=13; tr=str.Replace("’","'"); tr=str.Replace("&am am ","&am "); tr=str.Replace("",""); tr=str.Replace("",""); tr=str.Replace("&am "," "); tr=str.Replace("< r",((char)temp).ToString()); return str; }
posted @
风语战士 阅读(14) |
| lt;PARAM NAME="WMode" VALUE="Tra arent"> 加入这个属性就可以显示出来了.
posted @
风语战士 阅读(9) |
| DataGrid1_DeleteCommand
写在这里
if(this.DataGrid1.PageCount==1) { DataGrid1.CurrentPageIndex=0; } else if(this.DataGrid1.Items.Count%
==1) { DataGrid1.CurrentPageIndex--; }
25 为变量,每一页的条数.
PageCount
总页数
CurrentPageIndex
显示当前页的索引
DataGrid1.Items.Count
获取总条数
DataGrid1_ItemDataBound 写在这里 在删除前判断是否删除
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType==ListItemType.AlternatingItem) { LinkButton link=(LinkButton)e.Item.FindControl("LinkButton1"); link.Attributes.Add("onclick","return confirm('您是否要删除此条记录!!!');"); }
FindControl
获取引用控件的ID
LinkButton 变量,也可以是Button
Button2.Attributes.Add("onclick","return confirm('确定要修改您信息吗???');");
posted @
风语战士 阅读(10) |
| Re o e.Write("< cript language = javascriptwindow.open('Login.a x','_top')/script");
posted @
风语战士 阅读(7) |
| 1.检测到有潜在危险的 Request.Form 值
原因:
(1)在提交数据的页面或webconfig中没有对validateRequest的属性进行正确的设置
(2)HTML里面写了两个form引起
解决:
方案一: 在.a x文件头中加入这句: %@ Page validateRequest="false" %
方案二: 修改web.config文件: lt;configuratio gt; < ystem.we gt; < ages validateRequest="false" / /system.we gt; /configuratio gt;
因为validateRequest默认值为true。只要设为false即可。
2.“在没有任何数据时进行无效的读取尝试”
解决办法
原因:
所返回的sqldatareader无数据记录,但没有作记录判断力处理。返回的是空值
加上判断即可: if (reader.read()) { TextName.Text =
reader["FieldName"].ToString(); }
3.数据为空。不能对空值调用此方法或属性。
原因:
若对象是null,那么调用对象的方法例如ToString()肯定出错一般是数据库字段的值为空
在grideview等数据控件常出现
解决:因此建议作NULL处理
4.阅读器关闭时 FieldCount 的尝试无效
原因:
使用了SqlDataReader来绑定数据后,将co ection对象作了Close()处理
public SqlDataReader GetSomething()
{ co .open() SqlDataReader reader =
sqlcmd.ExcecutReader(CommandBehavior.CloseCo ection)) co .close();// occur error here retur reader }
在绑定的时候调用了这个方法来指定数据源。如果使用这个方法则需要在调用函数中关闭Re
ader这样co 就可以自动关闭。
如果是使用的是SqlDataAdapter和DataSet那么请去掉显式关闭co 的调用。或者在finally
中调用之。
5.未能映射路径
原因:可能是在webconfig中的路径配置不正确所致
add key="FCKeditor:BasePath" value="~/admin/fckeditor/"/
add key="FCKeditor:UserFilesPath" value="/UserFiles/" /
6.Unreachable code detected 原因: 一般是在异常处理理或返回值时使用了 throw 或return ,可能是其位置放在前面,造成后面的代码执行到了。
解决: 把相关的异常抛出处理的语句(throw)或return 的语句放到代理执行的最后一行。 7.索引超出范围。必须为非负值并小于集合大小 原因: (1).没有设置DATAKEYFIELD设为数据库中相对应的唯一字段(一般是主键) (2).DataGrid1.Colum e.Item.Cells
解决:
(1).设置datakeyfield
(2).加入判断语句datagrid1.item.count (datagrid可以是其它相类似的服务器控件)
8数据为空。
不能对空值调用此方法或属性
9数据源不支持服务器端的数据分页。
解决方法:
不要使用DataReader,改成使用DataSet:或使用自定义分页形式,不采用vs.net提供的分页功能 OleDbDataAdapter da = new OleDbDataAdapter(sql, co ection); DataSet ds2 = new DataSet(); da.Fill(ds2, "News"); GridView1.DataSource = ds2; GridView1.DataBind();
10.对象名'***** '无效
原因:当前使用的数据库中没有*****这张表
解决: 查看是否程序中是否写错了所调用的表的名称或看一下SQL数据库中是否存在你所调用的表
11.在建立与服务器的连接时出错。
在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)
solution: 主机上需要用固定的IP地址或服务器地址
12.SqlDateTime 溢出。
必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM
之间。
出现这种问题``多半是因为你更新数据库时``datetime字段值为空``默认插入0001年01月01
日``造成datetime类型溢出
13.出现-------表示“属性”,此处应为“方法”
原因: 1.VB与c#的方法,属性的格式有所不一样导致。
2.可能是在design中绑定数据的语法出现错误 解决: 1.记住属性用[] 方法用()
2.记住绑定数据的正确语法(有以下几种方式::%Container.DataItem(“字段名”)% %
#Eval(“字段名”)% %Bind(“字段名”)%等) 14.未能从程序集
“DAL, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null”中加载类型“DAL.SqlHelper”。
原因:修改了其他层后未能重新编译成dll
解决:编译一下(Rebuild)
15.为过程或函数 指定的参数太多,
solution:调用存储过程与定义的存储过程所用的参数数量或所执行的SQL语句中所传入的参
数个数不一致(这是个SQL的错误)
解决方案:仔细检查在存储过程中所设定的参数变量,与实际输入的参数值是否一一对应
16.无法启动调试,绑定句柄无效
原因:系统的Terminal Services没有开启
17.Unable to debugging on the web server.Debug failed because integrated windows authentication is not enable
解决方法:
打开vs2005-工具(Tools)-选项(Option)-调试(debugging)-编辑并继续(Edit and Continue)-全部打勾
18.Automation 操作中文件名或类名未找到: 'RegExp'
解决方法:regsvr32 v cript.dll
19.System.NullReferenceException: 未将对象引用设置到对象的实例。
原因:
(1)所设置的变量为空值或没有取到值,一般出现在传递参数的时候出现这个问题,也会在使用datagrid或gridview或datalist等数据控件时出现.
(2)控件名称与codebehind里面的没有对应
(3)未用new初始化对象
(4)在程序中所引用的控件不存在
解决方法:
(1)使用try..catch...finally捕捉错误,或直接用re o e.write()输出所取的变量值
(2)查看代码中是否存在未初始化的变量
20.错误 1718。文件被数字签名策略拒绝(***vs2005 1时)
解决方法:
(1). 单击“开始”,单击“运行”,键入 control admintools,然后单击“确定”。
(2). 双击“本地安全策略”。
(3). 单击“软件限制策略”。(注意:如果未列出软件限制,请右击“软件限制策略”,然后单击“新建策略”。 )
(4). 在“对象类型”下,双击“强制”。
(5). 单击“除本地管理员以外的所有用户”,然后单击“确定”。
(6). 重新启动计算机。
微软说明:
21.vs2005不能从源文件模式切换到视图模式
解决方法:dos下运行下 devenv /resetski kgs (win+r cmd)
22.Validation of viewstate MAC failed
解决办法:页面的顶部page加 EnableViewState="False" EnableViewStateMac = "False" 来解决这个问题
23.Automation server can't create object"(Automation 服务器不能创建对)
解决办法:运行: Regsvr32 scrrun.dll 即可。
24.包加载失败
未能正确加载包"Visual Web Developer Trident Designer Package"(GUID =
{30AE7E28-6C02-496D-8E43-85F7A90AEFF1}。
解决方法:
1、设置系统变量 VsLogActivity=1
2、在%APPDATA%\Microsoft\VisualStudio\8.0\文件夹下创建文件ActivityLog.xml
Microsoft Visual Studio
LoadLibrary failed for package [Visual Web Developer Trident Designer Package]
{30AE7E2B-6C02-496D-8E43-85F7A90AEFF1}
--------------------------------------------------------------------------------
8007007e
c:\Program Files\Microsoft Visual Studio 8\Common7\Packages\trid .dll 3、从 WINNT\MicroSoft.NET\Framework\v2.0.xxx 复制文件gdiplus.dll 到 Program Files\Visual Studio 8\Common7\Packages文件夹下
4、在命令行下运行命令 :devenv /resetski kgs
25.Error awning 'cmd.exe'.
解决方案:把cmd.exe 拷贝到VS***目录下的VC/BIN目录里,可以解决问题。
26.尝试读取或写入受保护的内存
解决:硬件有问题,一般内存有问题
27.无法在***存储区中找到清单签名***
解决方法:用记事本打开项目的.c roj文件,删除类似
28.该项目中不存在目标“ResolveKeySource”。
Project DefaultTargets="Build" xml ="
PropertyGrou gt; TargetCo ectionStringData Source=.\sql2005%3BUser /PropertyGrou gt; ItemGrou gt; DatabaseProject Include="Database1\Database1.d roj"/ DatabaseProject Include="Database2\Database2.d roj"/ /ItemGrou gt; Target MSBuild Properties="TargetCo ectionString=$(TargetCo ectionString)" Projects="@(DatabaseProject)" Targets="Build;Deploy" /MSBuild /Target (2)在命令提示中运行:m uild /t:BuildAllDatabaseProjects TestBuild.xml /Project
29.不能将值 NULL 插入列 '**'
原因:这是数据库表设计的错误,所涉及的表的字段中设置了不能为空的属性,但是传入的值为null,所以报错
解决方法:查看是否所传入的值是否为Null,或修改数据库中表的所对应的列的属性
30.未能加载类型"命名空间.类"...
原因:
(1)项目修改后没有进行编译
(2)项目中原有的命名空间可能被修改了
(3)项目中所需要的ascx或其他页面不存在,或不包含在项目中
解决方法:
(1)在修改完成之后,请重新生成或编译整个项目或解决方案
(2)手工修改所改动的命名空间,注意名称的大小写,再重新编译
(3)将相关的文件包含在项目中
31.不能访问只读文件“****.***"
解决方案:
给虚拟目录所对应的文件加上“Everyone/写入”权限即可
32.请求因 HTTP 状态 401 失败:Acce Denied
解决方法:在iis信息服务器上把匿名访问和允许iis控制密码给勾上 posted @
风语战士 阅读(122) |
| 在坛子里经常看到一些关于Se ion的问题,下面做一个总结,希望对大家有所帮助:
问:为什么Se ion在有些机器上偶尔会丢失?
答:可能和机器的环境有关系,比如:防火墙或者杀毒软件等,尝试关闭防火墙。
问:为什么当调用Se ion.Abandon时并没有激发Se ion_End方法?
答:首先Se ion_End方法只支持InProc(进程内的)类型的Se ion。其次要激发Se ion_End方法,必须存在Se ion(即系统中已经使用Se ion了),并且至少要完成一次请求(在这次请求中会调用该方法)。
问:为什么当我在InProc模式下使用Se ion会经常丢失?
答:该问题通常是由于应用程序被回收导致的,因为当使用进程内Se ion时,Se ion是保存在a et_wp进程中,当该进程被回收Se ion自然也就没有了,确定该进程是否被回收可以通过查看系统的事件查看器获得信息。 具体信息请参考: Se ion variables are lost intermittently in ASP.NET a licatio 在1.0的时候也有一个bug会导致工作进程被回收并重启,该bug已经在1.1和 2中修复。 关于该bug的详细信息请参考: ASP.NET Worker Proce (A et_wp.exe) Is Recycled Unexpectedly. 问:为什么当Se ion超时或者Abandoned后,新Se ion的ID和原来的相同?
答:因为Se ionID是保存在客户端浏览器的实例里,当Se ion超时在服务器重新建立Se ion时,将使用浏览器传来的Se ionID,所以当Se ion超时后,再重新建立后Se ionID并不变。
问:为什么每次请求的Se ionID都不相同?
答:该问题可能是没有在Se ion里面保存任何信息引起的,即程序中任何地方都没有使用Se ion。当Se ion中保存信息之后Se ionID将一直和浏览器相关,此时的Se ionID将不会在变化。
问:ASP和ASP.NET之间是否可以共享Se ion?
答:可以。但是这是一个比较复杂的过程,微软提供了官方的解决方案,请参考:
问:什么类型的对象可以保存在Se ion里?
答:这依赖使用的Se ion的模式,当使用的是进程内(InProc)的Se ion那么可以轻松的保存任何对象。如果你使用了非InProc的模式,则只能保存可以序列化和反序列化的对象,如果此时保存的对象不支持序列化,则不能保存到这种模式(非InProc)的Se ion里。
问:为什么在Se ion_End中不能使用Re o e.Redirect和Server.Tra fer方法跳转页面?
答:Se ion_End是一个在服务器内部激发的事件处理函数。它是基于一个服务器内部的计时器的,在激发该事件时服务器上并没有相关的HttpRequest对象,因此此时并不能使用Re o e.Redirect和Server.Tra fer方法。
问:在Se ion_End中是否可以获得HttpContext对象?
答:不行,因为这个事件并没有和任何的请求(Request)相关联,没有基于请求的上下文。
问:在Web Service中该如何使用Se ion?
答:为了在Web Service中使用Se ion,需要在Web Service的调用方做一些额外的工作,必须保存和存储调用Web Service时使用的Cookie。详细信息请参考MSDN文档的HttpWebClientProtocol.CookieContainer属性。然而,如果你使用代理服务器访问Web Service由于框架的限制,两者不能共享Se ion。
问:在自定义自己的HttpHandler的时候,为什么不能使用Se ion?
答:在实现自己的HttpHandler的时候,如果希望使用Se ion必须实现下面的两个标记接口中的一个:IRequiresSe ionState和IReadOnlySe ionState,这些接口没有任何方法需要实现,只是一个标记接口和使用INamingContainer接口的方法一样。
问:当我使用webfarm时,当我重定向到其他的Web服务器时Se ion为什么会丢失?
答:详细信息请参考: PRB: Se ion State Is Lost in Web Farm If You Use SqlServer or StateServer Se ion Mode 问:为什么我的Se ion在A lication_OnAcquireRequestState方法中无效?
答:Se ion只有在HttpA lication.AcquireRequestState事件调用以后才会有效。 详细信息请参考: 问:如果使用了cookiele ,我该如何从HTTP页面定向到HTTPS?
答:请尝试下面的方法: String originalUrl = "/fxtest3/sub/foo2.a x"; String modifiedUrl = "
" + Re o e.A lyA PathModifier(originalUrl); Re o e.Redirect(modifiedUrl);
问:Se ion在global.asax中的那些事件中有效?
答:Se ion只有在AcquireRequestState事件之后有效,该事件之后的事件都可以使用Se ion。
问:如何获得当前Se ion中保存的所有对象?
答:可以通过遍历所有的Se ion.Keys来获得。代码如下:
ArrayList se ionCollection = new ArrayList();
foreach (string strKey in Se ion.Keys){ e ionCollection.Add(Se ion[strKey]);
} 问:是否可以在不同的应用程序***享Se ion?
答:不能直接共享。可以参考如何在ASP和ASP.NET之间共享Se ion。
问:Se ion.Abandon和Se ion.Clear有何不同?
答:主要的不同之处在于当使用Se ion.Abandon时,会调用Se ion_End方法(InProc模式下)。当下一个请求到来时将激发Se ion_Start方法。而Se ion.Clear只是清除Se ion中的所有数据并不会中止该Se ion,因此也不会调用那些方法。 问:为了可以顺序访问Se ion的状态值,Se ion是否提供了锁定机制?
答:Se ion实现了Reader/Writer的锁机制: 当页面对Se ion具有可写功能(即页面有%@ Page EnableSe ionState="True" %标记),此时直到请求完成该页面的Se ion持有一个写锁定。 当页面对Se ion具有只读功能(即页面有%@ Page EnableSe ionState="ReadOnly" %标记),此时知道请求完成该页面的Se ion持有一个读锁定。 读锁定将阻塞一个写锁定;读锁定不会阻塞读锁定;写锁定将阻塞所有的读写锁定。这就是为什么两个框架中的同一个页面都去写同一个Se ion时,其中一个要等待另一个(稍快的那个)完成后,才开始写。
问:Se ion平滑超时意味着什么?
答:Se ion平滑超时意味着只要你的页面访问(使用)了Se ion,超时时间将被刷新(可以理解为重新计时),即从该页面请求开始,将重新计算超时时间。但是,该页面不能禁用Se ion。它会自动的访问当前页面的Se ion,刷新超时时间。 问:在global.asax中的事件处理函数中Se ion为什么无效?
答:依赖于在哪个事件处理函数中使用Se ion,Se ion在AcquireRequestState事件之后才有效,该事件之后的所有事件处理函数都可以使用Se ion,之前的则不能。
问:当我写一个依赖于当前应用的Se ion的组件时,为什么不能直接使用Se ion["Key"]获得其值?
答:Se ion["Key"]实际上是this.Se ion["Key"],它是作为Page的一个属性提供的,所以在你的组件中不能直接使用这个属性。你可以通过下面的方式使用Se ion: HttpContext.Current.Se ion["Key"] = "My Seesion Value";
问:当我使用InProc模式保存Se ion时,此时的Se ion是保存在哪里?
答:不同的IIS的处理方式不同, 当使用的是IIS5的时候Se ion是保存在a et_wp.exe的进程空间里的。 当使用的是IIS6时,默认情况下所有的应用程序共享应用程序池,Se ion保存在w3wp.exe的进程空间中。
问:Se ion的超时设置是分钟还是秒?
答:是分钟,默认为20分钟。
问:当页面出现错误后我的Se ion是否将被保存?我需要在Se ion_End中处理一些清理工作,但是失败了,为什么?
答:Se ion_End只有在Se ion运行在InProc模式下才会被执行。Se ion_End使用的帐号是运行a et_wp工作进程的帐号(这个可以在machine.config中设置)。因此,如果在Se ion_End方法里,使用集成安全性链接到SQL,它将使用a et_wp进程的帐号打开链接,此时成功与否则依赖于你的SQL的安全性设置。 问:为什么当我设置cookiele 为true是我在重定向的时候会丢失Se ion?
答:当使用cookiele 时,你必须使用相对路径替换程序中的绝对路径,如果使用绝对路径ASP.NET将无法在URL中保存Se ionID。 例如:将\myDir\mySubdir\default.a x换成..\default.a x即可。
问:如何将SortedList存储到Se ion或者Cache里?
答:请参考下面的方法: SortedList x = new SortedList(); x.Add("Key1", "ValueA"); x.Add("Key2", "ValueB"); 保存到Se ion中: Se ion["SortedList1"] = x; 使用下面方法获得之: SortedList y = (SortedList) Se ion["SortedList1"]; Chahe则同理。 问:我为什么会获得这样的错误信息“Se ion state can only be used when enableSe ionState is set to true, either in a configuration file or in the Page directive”?
答:这个问题可能在一个已经***了Microsoft Visual Studio .NET开发环境的机器上,再***Window Sharepoint Server(WSS)后出现。 WSS ISAPI过滤器会处理所有的请求。当你通过虚拟目录浏览一个ASP.NET的应用程序时,ISAPI过滤器不会给文件夹目录分配URL。 解决方法是:不要再***了WSS的机器上使用Se ion。 详细信息请参考: Se ion state ca ot be used in ASP.NET with Windows SharePoint Services 问:如何删除Se ion变量?
答:想要删除Se ion变量可以使用HttpSe ionState.Remove()方法。 问:是否有办法知道应用程序的Se ion在运行时占用了多少内存?
答:没有。目前这个值时无法考证的,至少我现在还没有看到这方面的资料。但是可以通过性能监视器以及程序代码大概估算出来一个值。 问:当页面中是否了frameset,发现在每个frame中显示页面的Se ionID在第一次请求时都不相同,为什么?
答:原因是你的frameset是放在一个htm页面上而不是ASPX页面。 在一般情况下,如果frameset是a x页面,当你请求页面时,它首先将请求发送到Web服务器,此时已经获得了Se ionID,接着浏览器会分别请求Frame中的其他页面,这样所有页面的Se ionID就是一样的,就是FrameSet页面的Se ionID。 然而如果你使用Html页面做FrameSet页面,第一个请求将是HTML页面,当该页面从服务器上返回是并没有任何Se ion产生,接着浏览器会请求Frame里面的页面,这样这些页面都会产生自己的Se ionID,所以在这种情况下就会出现这种问题。当你重新刷新页面时,Se ionID就会一样,并且是最后一个请求页面的Se ionID。 问:是否可以将不同应用程序的Se ion保存在相同的SQL Server服务器的不同数据库上。
答:可以,请参考: FIX: Using one SQL database for all a licatio for SQL Server se ion state may cause a bottleneck 问:在Se ion_End是我是否可以获得有效的HttpSe ionState和HttpContext对象?
答:你可以在这个方法中获得HttpSe ionState对象,可以直接使用Se ion来访问即可。但是不能获得HttpContext对象,因为该事件并没有和任何请求相关联,因此不存在上下文对象。
问:在SQLServer模式下使用Se ion,为什么我的Se ion不过期?
答:在SqlServer模式下,Se ion的过期是通过SQL Agent的注册工作完成的,请检查你的SQL Agent是否运行? 问:当我设置EnableSe ionState为“ReadOnly”后,但是我在InProc模式下依然可以修改Se ion的值,这是为什么?
答:即使EnableSe ionState标示为ReadOnly,但是在InProc模式下用户依然可以编辑Se ion。唯一不同的是,在请求过程中Se ion将不会被锁住。
问:我如何才能避免在链接SQL时指定密码?
答:使用信任链接或者使用加密的链接串。有关这方面的详细信息请参考: How To Use the ASP.NET Utility to Encrypt Credentials and Se ion State Co ection Strings 问:我在我自己的类中该如何使用Se ion呢?
答:可以使用HttpContext.Current.Se ion方式使用,具体方法如下: HttpContext.Current.Se ion["Se ionKey"] = "Se ionValue"; 类似的你还可以使用这种方式使用A lication对象。 问:为什么在切换成SQLServer模式后我的请求被挂起了?
答:检查在Se ion里面是否都保存的是可以保存在SQLServer模式下的对象,即这些对象必须支持序列化。 问:当Se ion设置成cookiele 后会有什么影响?
答:当把cookiele 设置成true时,主要会有下面的约束: 1、在页面中不能使用绝对链接 2、在应用程序中在除了Http和Htt 之间的切换时需要完成一些其他的步骤。 如果发送一个链接给其他人,此时的URL里面将包含Se ion ID的信息,所以两个人将公用一个Se ion。
问:是否可以将Se ion保存在数据库中?
答:当然可以,详细信息请参考:
posted @
风语战士 阅读(44) |
| 正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:(\S*?)[^]*.*?/\1|.*? /
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内***号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字
匹配***:\d{15}|\d{18}
评注:中国的***为15位或18位
匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用
匹配特定数字:
^[1-9]\d*$    //匹配正整数
^-[1-9]\d*$   //匹配负整数
^-?[1-9]\d*$   //匹配整数
^[1-9]\d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正
匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串
评注:最基本也是最常用的一些表达式
原载地址:http://lifesinger.3322.org/myblog/?p=185
posted @
风语战士 阅读(20) |
| posted @ 2008-06-10 18:17 bullion 阅读(461) | 评论(0) |
2008年6月1日
摘要: 其实网络上这类文章很多,我大致从头说说我自己的经验。1、加入引用  在控件栏按右键,选择“添加/移除项”,选COM组件,选中“Microsoft Web Browser”。然后就可以往窗体上拖出一个该控件(下面把该控件一个对象称为webBrowser)。控件属性中可以调整的不多,从一些资料中得知WebBrowser中的MenuBar、StatusBar等其实都没实现。2、控件的函数  由于是COM...
posted @ 2008-06-01 13:08 bullion 阅读(2906) | 评论(0) |
2008年5月22日
摘要: ASP 0104 : 80004005 问题:WIN2003无法上传较大的文件“Request 对象 错误 \’ASP 0104 : 80004005\’解决方案:1.先打开IIS管理器:2.关闭iis admin service服务 找到windows\\system32\\inesrv\\下的metabase.xml, 打开,找到ASPMaxRequestEntityAllowed 把他修改为...
posted @ 2008-05-22 10:15 bullion 阅读(349) | 评论(0) |
2008年4月17日
摘要: Function GBtoUTF8(szI ut) Dim wch, uch, szRet Dim x Dim nAsc, nAsc2, nAsc3 '如果输入参数为空,则退出函数 If szI ut = "" Then GBtoUTF8= szI ut Exit Function End If '开始转换 For x = 1 To Len(szI ut) wch = Mid(szI u...
posted @ 2008-04-17 16:55 bullion 阅读(81) | 评论(0) |
摘要: < cript type="text/javascript"function EncodeUtf8(s1) { var s = escape(s1); var sa = s. lit("%"); var retV =""; if(sa[0] != "") { retV = sa[0]; } for(var i = 1; i sa.length; i ++) { if(sa...
posted @ 2008-04-17 16:53 bullion 阅读(113) | 评论(0) |
摘要: INSERT 失败,因为下列 SET 选项的设置不正确: 'ARITHABORT'当你在SQL Server上试图更新一个索引视图引用的表时,你可能回收到如下有错误INSERT 失败,因为下列 SET 选项的设置不正确: 'ARITHABORT'你必须在TSQL前Set ARITHABORT ON,代码如下Set ARITHABORT ONGOINSERT INTO ta ..在ADO中,你可以这...
posted @ 2008-04-17 16:52 bullion 阅读(264) | 评论(0) | Powered by:
Copyright bullionecho 该批处理文件:
echo 所在完整路径:%~dp0
echo 文件名为:%~n0.bat
pause > ul
/ 浏览 (0 / 75)
分类:
博客分类:
异常详细信息: System.ArgumentException: 回发或回调参数无效。在配置中使用 < ages enableEventValidation="true"/ 或在页面中使用 %@ Page EnableEventValidation="true" % 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
%@ Page Language="C#" MasterPageFile="~/public/XTWHIndexContainer.master" AutoEventWireup="true" CodeFile="BJBM.a x.cs" Inherits="private_dzjc_YHGL_BNCZ_BJBM" Title="Untitled Page" %
EnableEventValidation ="false"
/ 浏览 (0 / 292)
分类:
博客分类:
以后写
/ 浏览 (0 / 61)
分类:
博客分类:
如何运用 Form 表单认证
ASP.NET 的安全认证,共有“Windows”“Form”“Pa ort”“None”四种验证模式。“Windows”与“None”没有起到保护的作用,不推荐使用;“Pa ort”我又没用过,唉……所以我只好讲讲“Form”认证了。我打算分三部分:
第一部分 —— 怎样实现From 认证;
第二部分 —— Form 认证的实战运用;
第三部分 —— 实现单点登录(Single Sign On)
第一部分 如何运用 Form 表单认证
一、 新建一个测试项目
为了更好说明,有必要新建一个测试项目(暂且为“FormTest”吧),包含三张页面足矣(Default.a x、Login.a x、UserInfo.a x)。啥?有人不会新建项目,不会新增页面?你问我咋办?我看这么办好了:拖出去,打回原藉,从幼儿园学起……
二、 修改 Web.config
1、 双击项目中的Web.config(不会的、找不到的打 PP)
2、 找到下列文字 authentication mode="Windows" / 把它改成:
authentication mode="Forms"
forms loginUrl="Login.a x" name=".ASPXAUTH"/form gt;
/authenticatio gt;
3、 找到authorizatio gt; allow users="*" //authorizatio gt;换成
authorizatio gt lt;deny users="?"/deny/authorizatio gt;
这里没什么好说的,只要拷贝过去就行。虽说如此,但还是有人会弄错,如下:
authentication mode="Forms"
forms loginUrl="Login.a x" name=".APSX"/form gt;
deny users="?"/deny
/authenticatio gt;
若要问是谁把 deny users="?"/deny 放入 authenticatio gt; 中的,我会很荣幸地告诉你,那是 N 年前的我:authenticatio gt; 与 authorizatio gt; 都是以 auth 字母开头又都是以 ation 结尾,何其相似;英文单词背不下来的我以为他们是一伙的……
三、 编写 .cs 代码——登录与退出
1、 登录代码:
a、 书本上介绍的
private void Btn_Login_Click(object sender, System.EventArgs e)
{
if(this.Txt_UserName.Text=="Admin" &am am this.Txt_Pa word.Text=="123456")
{
System.Web.Security.FormsAuthentication.RedirectFromLoginPage(this.Txt_UserName.Text,false);
b、 偶找了 N 久才找到的
private void Btn_Login_Click(object sender, System.EventArgs e)
{
if(this.Txt_UserName.Text=="Admin" &am am this.Txt_Pa word.Text=="123456")
{
System.Web.Security.FormsAuthentication.SetAuthCookie(this.Txt_UserName.Text,false);
Re o e.Redirect("Default.a x");
以上两种都可发放验证后的 Cookie ,即通过验证,区别:
方法 a) 指验证后返回请求页面,俗称“从哪来就打哪去”。比如:用户没登录前直接在 IE 地址栏输入
,那么该用户将看到的是 Login.a x?ReturnUrl=UserInfo.a x ,输入用户名与密码登录成功后,系统将根据“ReturnUrl”的值,返回相应的页面
方法 b) 则是分两步走:通过验证后就直接发放 Cookie ,跳转页面将由程序员自行指定,此方法多用于 Default.a x 使用框架结构的系统。
2、 退出代码:
private void Btn_LogOut_Click(object sender, System.EventArgs e)
System.Web.Security.FormsAuthentication.SignOut();
四、 如何判断验证与否及获取验证后的用户信息
有的时候,在同一张页面需要判断用户是否已经登录,然后再呈现不同的布局。有人喜欢用 Se ion 来判断,我不反对此类做法,在此我只是想告诉大家还有一种方法,且看下面代码:
if(User.Identity.IsAuthenticated)
//你已通过验证,知道该怎么做了吧?
User.Identity 还有两个属性AuthenticationType(验证类型)与 Name(用户名称) ,大家要注意的是 Name 属性,此处的User.Identity.Name将得到,验证通过(RedirectFromLoginPage 或SetAuthCookie)时,我们带入的第一个参数 this.Txt_UserName.Text 。这个参数很重要,关系到种种……种种的情况,何出此言,且听下回***……
灵活运用 Form 表单认证中的 deny 与 allow 及保护 .htm 等文件
第二部分 Form 认证的实战运用
Web.config 的作用范围
新建项目时, VS.Net 会在项目根目录建立一个内容固定的 Web.config。除了在项目根目录,你还可以在任一目录下建立 Web.config ,条件就是应用程序级别的节点只能在根目录的 Web.config 中出现。至于哪些是应用程序级别节点呢,这个问题嘛,其实我也不太清楚,呵呵。电脑不是我发明的,微软不是我创建的,C# 更不是我说了算的,神仙也有不知道的,所以我不晓得是正常的。话虽如此,只要它不报错,那就是对的。
关于 Web.config 设置的作用范围,记住以下两点:
1、 Web.config 的设置将作用于所在目录的所有文件及其子目录下的所有东东(继承:子随父姓)
2、 子目录下的 Web.config 设置将覆盖由父目录继承下来的设置(覆盖:县官不如现管)
给大家提个问题:有没有比根目录Web.config 的作用范围还大的配置文件呢?看完第三部分便知分晓。
六、 学会拒绝与巧用允许
回到我们在第一回合新建的测试项目“FormTest” ,既然要进行验证,按国际惯例,就得有用户名与密码。那,这些用户是管理员自己在数据库建好呢,还是用户注册、管理员审核好呢。只要不是一般的笨蛋,都知道选择后者。你们还别说,我公司还真有个别项目是管理员连到数据库去建帐号的,属于比较特殊的笨蛋,咱们不学他也罢,还是老老实实添加两个页面吧——注册页面(Register.a x)与审核页面(Auditing.a x)。
问题终于就要浮出水面啦,当你做好 Register.a x 时,想访问它的时候突然觉得不对劲,怎么又回到了登录页面?你仔细瞧瞧网址,是不是成了:Login.a x?ReturnUrl=Register.a x 。怎么办,用户就是因为没有帐号才去访问注册页面的呀?(这句纯属废话,有帐号谁还跑去注册。)我时常对我的同事说:“办法是人想出来滴!!”
1、 新建一个目录 Public ,用于存放一些公用的文件,如万年历、脚本呀……
2、 在“解决方案资源管理器”中右击点击目录 Public ,新增一个 Web.config
3、 把上述 Web.config 的内容统统删除,仅留以下即可:
?xml version="1.0" encoding="utf-8"?
configuratio gt;
< ystem.we gt;
authorizatio gt lt;allow users="*"//authorizatio gt;
/system.we gt;
/configuratio gt;
终于切入正题了,不容易呀。根据“覆盖”原则,我们知道上述 Web.config 将替代根目录 Web.config 中的 authorizatio gt; 节点设置,即:
allow users="*"/ 替换 deny users="?"/deny
注解:“allow”允许的意思;“*”表示所有用户;
“deny” 拒绝的意思;“?”表示匿名用户;
因此,处于 Public 目录下的文件,允许所有人浏览,包括未验证的用户。把 Register.a x 拖进来吧,再也不会有人阻止你浏览啦。
除了注册页面,我们还提到一个审核页面(Auditing.a x),审核权限一般都在管理员或主管手里,并不想让其他人浏览此页面(真理往往掌握在少数人的手里,这也是没法子的事),怎么办?“办法是人想出来滴”呵呵……新建一个管理员的目录 ManageSys ,在此目录下再新增一个 Web.config。内容如下:
?xml version="1.0" encoding="utf-8"?
configuratio gt;
< ystem.we gt;
authorizatio gt;
allow users="Admin"/
deny users="*"/
/authorizatio gt;
/system.we gt;
/configuratio gt;
System.Web.Security.FormsAuthentication.SetAuthCookie(this.Txt_UserName.Text,false); //通过验证,发放 Cookie
之前我曾强调,要注意,第一个参数很重要,重要到什么程度?说到这,恐怕地球人都知道了——它就是allow与deny的依据。假如此处用户填写的是“Admin”即 this.Txt_UserName.Text = "Admin"; 那么进入系统后,他就能访问 ManageSys 目录下的网页了,其它闲杂人等一律拒之门外。
以上 from
1: 在web.config中,加入form认证;
authentication mode="Forms"
forms name="auth" loginUrl="index.a x" timeout="30"/form gt;
/authenticatio gt;
authorizatio gt;
deny users="?" /
/authorizatio gt;
2: 如果有注册页面时还应该允许匿名用户调用注册页面进行注册;
以下代码应该在configuratio gt lt ystem.we gt;之间,而不应该包含到< ystem.we gt;../system.we gt;之间;
----------------表示允许 匿名用户对 userReg.a x页面进行访问.
location path="userReg.a x"
< ystem.we gt;
authorizatio gt;
allow users="?" /
/authorizatio gt;
/system.we gt;
/locatio gt;
3 在登录成功后要 创建身份验证票, 表明已经通过认证的合法用户;
if(登陆成功)
System.Web.Security.FormsAuthentication.SetAuthCookie(用户名称, false);
1.使用Forms验证存储用户自定义信息
Forms验证在内部的机制为把用户数据加密后保存在一个基于cookie的票据FormsAuthenticationTicket中,因为是经过特殊加密的,所以应该来说是比较安全的。而.net除了用这个票据存放自己的信息外,还留了一个地给用户自由支配,这就是现在要说的UserData。
UserData可以用来存储string类型的信息,并且也享受Forms验证提供的加密保护,当我们需要这些信息时,也可以通过简单的get方法得到,兼顾了安全性和易用性,用来保存一些必须的敏感信息还是很有用的。
下面来看怎么使用UserData,然后会给出一个实际使用的例子。
//创建一个新的票据,将客户ip记入ticket的userdata
FormsAuthenticationTicket ticket=new FormsAuthenticationTicket(
1,userName.Text,DateTime.Now,DateTime.Now.AddMinutes(30),
false,Request.UserHostAddre );
//将票据加密
string authTicket=FormsAuthentication.Encrypt(ticket);
//将加密后的票据保存为cookie
HttpCookie coo=new HttpCookie(FormsAuthentication.FormsCookieName,authTicket);
//使用加入了userdata的新cookie
Re o e.Cookies.Add(coo);
下面是FormsAuthenticationTicket构造函数的重载之一的方法签名
public FormsAuthenticationTicket(
int version,
string name,
DateTime i ueDate,
DateTime expiration,
bool isPersistent,
string userData
version
版本号。
与身份验证票关联的用户名。
i ueDate
Cookie 的发出时间。
expiration
Cookie 的到期日期。
isPersistent
如果 Cookie 是持久的,为 true;否则为 false。
userData
将存储在 Cookie 中的用户定义数据
使用userdata也很简单,FormsIdentity的Ticket属性就提供了对当前票据的访问,获得票据后就可以用UserData属性访问保存的信息,当然是经过解密的。
((System.Web.Security.FormsIdentity)this.Context.User.Identity).Ticket.UserData
下面是一个具体的应用。
由于Forms验证是通过cookie来进行的,它需要传递一个票据来进行工作。虽然票据是加密的,里面的内容不可见,但这并不能阻止别人用一个假冒的身份使用票据(就像我们可以拿别人的钥匙去开别人的锁),比较常见的就是不同ip的用户在不安全通道截获了这个票据,然后使用它进行一些安全范围外的活动。
解决这个问题的办法之一就是使用SSL来传递信息。
但是如果不能使用SSL呢?我们可以判断ip和票据是否匹配,如果发出请求的ip是初次产生票据的ip,则没有问题,否则就销毁这个票据。
为此,我们需要在一开始处理登录时将用户的ip保存起来,这样就可以在以后的请求中随时验证后继请求的ip是否和初始ip相同。保存这个敏感ip的最佳场所当然是UserData啦,而验证的时机则是在AuthenticateRequest事件发生时,即Global.a x.cs中定义的处理此事件的A lication_AuthenticateRequest方法中。
上面的示例实际上已经是把用户ip保存到了UserData中,下面是验证的过程。
if(this.Request.IsAuthenticated)
if(((System.Web.Security.FormsIdentity)this.Context.User.Identity).Ticket.UserData !=this.Request.UserHostAddre )
System.Security.Principal.GenericIdentity gi=new System.Security.Principal.GenericIdentity("","");
string[] rolesi={};
System.Security.Principal.GenericPrincipal gpi=new System.Security.Principal.GenericPrincipal(gi,rolesi);
this.Context.User=gpi;
通过给GenericPrincipal空的GenericIdentity和roles使票据失效,这样将强迫用户重新登录。为了测试这个方法,可以先把条件改为相等,看效果如何 :)
这个方法也有不足之处,具体为:
1.使用同一代理的用户将拥有同一个ip,这样就不能防范此类假冒攻击了
2.如果用户使用动态ip,则可能造成正常用户被我们强行销毁票据。不过总的来说,这个办法还是比较可行的。
2.使用安全特性配合Forms验证进行安全操作。
PrincipalPermi ionAttribute可以配合Forms验证进行基于角色或用户的安全验证,该特性不能用于程序集级别。它的作用范围可以是类或具体的方法。来看一个简单的示例。
[PrincipalPermi ion(SecurityAction.Demand,User="Notus")]
public cla Test : BasePage
private void Page_Load(object sender, System.EventArgs e)
this.s随笔- 5 文章- 0 评论- 5 匹配中文字符的正则表达式: [u4e00-u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^x00-xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式: *r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:(S*?)[^]*.*?|.*? /
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^s*|s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内***号码:d{3}-d{8}|d{4}-d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]d{5}(?!d)
评注:中国邮政编码为6位数字
匹配***:d{15}|d{18}
评注:中国的***为15位或18位
匹配ip地址:d+.d+.d+.d+
评注:提取ip地址时有用
匹配特定数字:
^[1-9]d*$    //匹配正整数
^-[1-9]d*$   //匹配负整数
^-?[1-9]d*$   //匹配整数
^[1-9]d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]d*.d*|0.d*[1-9]d*$   //匹配正浮点数
^-([1-9]d*.d*|0.d*[1-9]d*)$  //匹配负浮点数
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$  //匹配浮点数
^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正
匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^w+$  //匹配由数字、26个英文字母或者下划线组成的字符串
在使用RegularExpre ionValidator验证控件时的验证功能及其验证表达式介绍如下:
只能输入数字:“^[0-9]*$”
只能输入n位的数字:“^d{n}$”
只能输入至少n位数字:“^d{n,}$”
只能输入m-n位的数字:“^d{m,n}$”
只能输入零和非零开头的数字:“^(0|[1-9][0-9]*)$”
只能输入有两位小数的正实数:“^[0-9]+(.[0-9]{2})?$”
只能输入有1-3位小数的正实数:“^[0-9]+(.[0-9]{1,3})?$”
只能输入非零的正整数:“^+?[1-9][0-9]*$”
只能输入非零的负整数:“^-[1-9][0-9]*$”
只能输入长度为3的字符:“^.{3}$”
只能输入由26个英文字母组成的字符串:“^[A-Za-z]+$”
只能输入由26个大写英文字母组成的字符串:“^[A-Z]+$”
只能输入由26个小写英文字母组成的字符串:“^[a-z]+$”
只能输入由数字和26个英文字母组成的字符串:“^[A-Za-z0-9]+$”
只能输入由数字、26个英文字母或者下划线组成的字符串:“^w+$”
验证用户密码:“^[a-zA-Z]w{5,17}$”正确格式为:以字母开头,长度在6-18之间,
只能包含字符、数字和下划线。
验证是否含有^%&am ',;=?$"等字符:“[^%&am ',;=?$x22]+”
只能输入汉字:“^[u4e00-u9fa5],{0,}$”
验证Email地址:“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$”
验证InternetURL:“^http://([w-]+.)+[w-]+(/[w-./?%&am =]*)?$”
验证***号码:“^((d{3,4})|d{3,4}-)?d{7,8}$”
正确格式为:“XXXX-XXXXXXX”,“XXXX-XXXXXXXX”,“XXX-XXXXXXX”,
“XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”。
验证***号(15位或18位数字):“^d{15}|d{}18$”
验证一年的12个月:“^(0?[1-9]|1[0-2])$”正确格式为:“01”-“09”和“1” #8220;12”
验证一个月的31天:“^((0?[1-9])|((1|2)[0-9])|30|31)$”
正确格式为:“01” #8220;09”和“1” #8220;31”。
匹配中文字符的正则表达式: [u4e00-u9fa5]
匹配双字节字符(包括汉字在内):[^x00-xff]
匹配空行的正则表达式:n[s| ]*r
匹配HTML标记的正则表达式:/(.*).*/1|(.*) //
匹配首尾空格的正则表达式:(^s*)|(s*$)
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&am =]*)?
(1)应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").length;}
(2)应用:javascript中没有像v cript那样的trim函数,我们就可以利用这个表达式来实现
String.prototype.trim = function()
return this.replace(/(^s*)|(s*$)/g, "");
(3)应用:利用正则表达式***和转换IP地址
function IP2V(ip) //IP地址转换成对应数值
re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正则表达式
if(re.test(ip))
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
throw new Error("Not a valid IP addre !")
(4)应用:从URL地址中提取文件名的javascript程序
s="http://www.9499.net/page1.htm";
s=s.replace(/(.*/){0,}([^.]+).*/ig,"$2") ; //Page1.htm
(5)应用:利用正则表达式限制网页表单里的文本框输入内容
用 正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^u4E00-u9FA5] /g,'') " o eforepaste="cli oardData.setData('text',cli oardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))"
用 正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^uFF00-uFFFF] /g,'') " o eforepaste="cli oardData.setData('text',cli oardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))"
用 正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^d] /g,'') "o eforepaste= "cli oardData.setData('text',cli oardData.getData('text').replace(/[^d]/g,''))"
用 正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[W] /g,'') "o eforepaste="cli oardData.setData('text',cli oardData.getData('text').replace(/[^d]/g,''
posted @ 2008-11-24 14:30 葱葱 阅读(37) | 评论(0) |
using System;
using System.Data;
using System.Configuratio using System.Collectio using System.We using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControl using System.Web.UI.WebControls.WebPart using System.Web.UI.HtmlControl using CrystalDecisio .CrystalReports.Engine;
using CrystalDecisio .Shared;
using System.Data.SqlClient;
using TB06030E.BEM;
using System.Drawing;
using System.Reflectio using System.Web.Se ionState;
public partial cla jdwl_SelectAdmin_PrintTables_PrintStuInfo : System.Web.UI.Page
{ BEM_tbOpenCla bem = new BEM_tbOpenCla (); protected void Page_Load(object sender, EventArgs e) { GridView1.DataSource = Bind(); GridView1.DataBind(); } private DataTable Bind() { string sql = ""; sql = "Select * from Customers"; string DBConfig_sql = "server=10.0.12.98; database=ndwuli;uid=sa wd=sa"; DataSet ds = new DataSet(); SqlCo ection sqlCon = new SqlCo ection(DBConfig_sql); SqlCommand sqlCmd = new SqlCommand(sql, sqlCon); SqlDataAdapter sqlAd = new SqlDataAdapter(); sqlAd.SelectCommand = sqlCmd; sqlAd.Fill(ds); DataTable dt = new DataTable(); dt.Colum .Add(new DataColumn(" o", typeof(string))) //数据库中列次序为准 dt.Colum .Add(new DataColumn("cla kind", typeof(string))); dt.Colum .Add(new DataColumn("11", typeof(int))); dt.Colum .Add(new DataColumn("12", typeof(int))); dt.Colum .Add(new DataColumn("13", typeof(int))); dt.Colum .Add(new DataColumn("14", typeof(int))); dt.Colum .Add(new DataColumn("15", typeof(int))); DataRow dr; int k = 0; for (int i = 0; i ds.Tables[0].Rows.Count; i++) { dr = dt.NewRow(); for (int j = 0; j 7; j++) dr[j] = ds.Tables[0].Rows[i][j].ToString(); dr[1] = " "; if (i % 8 == 0) { k++; dr[1] = "物理系" + k + "组"; //数据库中1为准 } dt.Rows.Add(dr); } return dt; } public override void VerifyRenderingInServerForm( Control control ) { } protected void GridView1_RowDataBound( object sender, GridViewRowEventArgs e ) { if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.Cells[1].Attributes.Add("style", "vnd.ms-excel.numberformat:@;"); } } protected void Button1_Click(object sender, EventArgs e) { Re o e.Clear(); Re o e.Buffer = true; Re o e.Charset = "GB2312"; Re o e.A endHeader("Content-Di osition", "attachment;filename=FileName.xls"); // 如果设置为 GetEncoding("GB2312");导出的文件将会出现乱码!!! Re o e.ContentEncoding = System.Text.Encoding.UTF7; Re o e.ContentType = "a lication/ms-excel";//设置输出文件类型为excel文件。 System.IO.StringWriter oStringWriter = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter); this.GridView1.RenderControl(oHtmlTextWriter); Re o e.Output.Write(oStringWriter.ToString()); Re o e.Flush(); Re o e.End(); }
posted @ 2008-11-12 20:18 葱葱 阅读(79) | 评论(0) |
一、GridView的基本功能
将GridView控件由“工具箱”拖至a x页面合适位置,由会自动生成一个GridView的控件编辑视图,默认控件ID是GridView1。在a x.cs文件中写入下面的程序代码即可以显示DataTable或DataReader中数据。
GridView1.DataSource=dt //或是=reader;之类的
GridView1.DataBind() //执行此方法后,数据才会真正绑定并显示出来
在浏览器中查看页面,会发现所有字段全部显示在页面上,如下图所示:
图中用红色标出的部分是每一更的"HeaderText"属性,默认是采用的该列的字段名称。
二、设置列属性
在基本用法中,是自动将DataTable中所有的字段全部显示出来,但在实际中,往往只需要显示所需要的字段,这就需要设置GridView中列的属性。
GridView是由许多“列”对象组成,可以在GridView对象中看到有一个Colum 的属性。可以通过设置列的属性达到我们所需要的显示效果。
如上两图所示,进行编辑列的界面,先选中GridView控件,然后即可以通过a x页面控件上的右向箭头点击菜单进入,也可通过属性的"Colum "编辑按钮进入。
列编辑界面如下:
上图就是列编辑的对话框,红色框标识出基本的属性界面功能。除了“DataField”和“HeaderText”两个属性外,还有一个定义列宽的属性也经常用,在“样式”分类中的“ItemStyle”属性群里有一个“Width”属性,既可定义固定的宽度(如100px),也可定义为百分比(如:50%)。
在上图所示的对话框中,演示了“BoundField”类型的字段,此类型的字段是将数据表中的字段值以文本的方式进行显示,相对来说功能较为简单。除了图中演示的“BoundField”,还有其它类型的字段,下面就分别介绍其它常规列的使用。
三、常规列属性
1.BoundField
此类型的列是将数据表中的字段内容用文本的方式显示出来。
2.CheckBoxField(不常用)
常用来显示数据库中的布尔类型字段的值
3.HyperLinkField
显示一个链接,此类型字段常用,其主要属性是:
DataNavigateUrlFields、DataNavigateUrlFormatString、DataTextField、DataTextFormatString
如:要在此列中形成一个链接,链接的文字是“公司名称”,链接到查看公司详细信息的页面:ViewCompany.a x,并且页面后要跟一个参数ID=xxxx。第一条记录ID=ALFKI,CompanyName=Alfreds Futterkiste,其生成的链接应该是ViewCompany.a x?ID=ALFKI,其链接文本为“Alfreds Futterkiste”,以上四个属性定义的值如下:
DataNavigateUrlFields 的值为 "CustomerID"
DataNavigateUrlFormatString 的值为 "ViewCompany.a x?id={0}",在生成时,{0}就会用DataNavigateUrlFields属性所定义的字段的值进行替换。
DataTextField的值为"CompanyName"
DataTextFormatString的值为"{0}",也就是只显示其公司的名称,无其它多余文字。显示效果如下图所示:
4.ImageField(不常用)
用于显示存储图片的二进制类型字段的数据,直接将二进制字段存储的图片数据显示为图片,但此字段在VS2005之后去掉了DataField属性,加入了DataImageUrlField字段,其意思是不再支持直接显示二进制内容为图片,而是需要自己再写一个显示页面,在这个页面去读取二进制字段内容,并将其输出为图片内容。此字段不常用。
5.ButtonField
此列显示为“按钮”,注意:按钮并不只是HTML语言中的i ut type="button"...这一种类型,在a .net中,能够完成将表单(页面)提交(PostBack)到服务器动作的控件都可以称之为“按钮”,因此,此类型的字段有一个属性:ButtonType有三个选项,Link、Image、Button,表示了“按钮”的三种表现形式,分别对应着“工具箱”中的LinkButton、ImageButton、Button三种控件。
当按钮被Click之后,会触发GridView的“RowCommand”事件,按钮被点击后执行什么样的程序,要在RowCommand事件中去写。
有这样一个问题:如果一个GridView中有多个Button列,但只有一个RowCommand事件,那么如何知道当前是哪一列的Button被Click了呢?这就需要通过ButtonField列的CommandName属性来指定。
如:有两个ButtonField列,将第一列的CommandName属性设置为“这是第一列”,将第二列的CommandName属性设置为“这是第二列”。
选中GridView控件,在“属性面板”的“事件”页中双击RowCommand事件后的空格。
再在a x.cs文件中的GridView的RowCommand事件中程序如下书写: protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) { switch (e.CommandName) { case "这是第一列": //此处请写被点击后需要处理的事务 Re o e.Write("第一列被点击"); break; case "这是第二列": //此处请写被点击后需要处理的事务 Re o e.Write("第二列被点击"); break; } }
6.CommandField
此列的实质与ButtonField列没有任何区别,唯有的区别就是不需要再设置CommandName属性,而是每一种按钮对应了GridView的一种事件,而不是RowCommand事件,如:编辑按钮对应着RowEditing事件,删除按钮对应着RowDeleting(删除之时)和RowDeleted(删除之后)两个事件,以此类推,这里就不一一列举。也不再举例。
四、模板列
前面几个类型的列,把它们统称为“常规列”,模板列(Template)与之前的几个列的区别在于:之前的列都相当于一个单个的控件,而此列相当于一个容器,在容器中又可以拖入多个控件,构成更复杂的单元格内容。GridView之所以灵活就灵活在这个模板列。在列定义的对话框中加入一个模板列,只设置HeadText和ItemStyle.Width等属性,再点击确定关闭对话框。在a x页面中选中GridView控件并点击右向箭头,如下图所示:
点击“编辑模板”进入下面界面:
可以看到,右方的下拉列表中列出了模板列的名称,如果有多个模板列,则会列出多个模板列的名称,每个模板下有多个Template,我们一般只需要编辑ItemTemplate,其它的Template大家可以根据其名称推测其作用。
ItemTemplate就是“容器”,可以将“工具箱”中的控件拖入其中。上图中就拖入一个Image控件,一个Button控件和一个CheckBox控件。
选中这些控件,并在属性面板中将其ID改为有意义的名称。其具体的用法在后面再讲。
模板列编辑结束后,点击右向箭头选择“结束模板编辑”。
五、RowDataBound事件
上面只是定义了模板列,如果要其显示出每条记录的相应信息,还需要将模板列中的控件属性赋值,这个动作一般放在GridView的RowDataBound事件中去完成。双击属性面板的动作页,定义一个RowDataBound事件。假定刚才定义的三个控件其ID分别为:imgTemp,btnTemp,cbTemp,则a x.cs文件示范程序如下: protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if(e.Row.RowIndex 0) //如果正在生成表头 retur DataRowView drv = (DataRowView)e.Row.DataItem //将绑定当前行的数据行视图取出 Image img = (Image)e.Row.FindControl("imgTemp"); img.ImageUrl = drv["ImageUrl"].ToString() //假定数据表中有一个ImageUrl的字段 Button btn = (Button)e.Row.FindControl("btnTemp"); btn.Text = drv["CompanyName"].ToString(); CheckBox cb = (CheckBox)e.Row.FindControl("cbTemp"); cb.Checked = (drv["IsSelect"].ToString() == "1" ? true : false) //假定数据表中有一个IsSelect字段,1表示选中,0表示未选中。 }
上面这段程序是一个示范,并不是完全按照示范表Customer表中的字段进行设置。其过程为:
1.将e.Row.DataItem强制转换为DataRowView对象,这个对象就是绑定到此行的数据表DataTable中的一条DataRow的视图,其用法与DataRow类似。
2.通过e.Row.FindControl方法找到指定ID的那个模板中的控件
3.通过一定的计算,将DataRowView中的值转换为控件的属性。
不仅模板列可以在RowDataBound事件中进行操作,常规列也可以,但不是用FindControl方法,以下例为示范,要获取第2列公司名称这个HyperLinkField类型的常规列中的HyperLink对象,在RowDataBound事件中写下面这行程序:
HyperLink hl = (HyperLink)e.Row.Cells[1].Controls[0];
因为此列位于该表的第二列,因此Cells[1]表示该单元格,此单元格中只有一个控件,因此为Controls[0]。
再如:在删除动作列中的删除按钮上加一个JavaScript动作,每次点击删除按钮时,先在页面通过JavaScript弹出一个确认对话框,可以按如下步骤操作:
1.在列编辑对话框中添加一个“删除”按钮列,按钮类型为Button,假定是在表格的第4列
2.在RowDataBound中如此写:
Button btDel = (Button)e.Row.Cells[3].Controls[0];
bt.Attributes.Add("OnClick", "return confirm('您是否确认删除此条记录?')");
在浏览器中查看此表格的HTML源码时,就会发现每一个删除按钮都有如此一段HTML属性:
OnClick="return confirm('您是否确认删除此条记录?')"
return confirm('.....')是一句JavaScript语句,根据用户在弹出的对话框中选择的项来决定返回的值,如果选择“是”,则返回true,则此按钮所触发的提交表单继续进行;反之,返回false,则此按钮所触发的提交表单事情停止,删除动作就不会完成。
六、DataKeys属性
GridView有一个DataKeys属性会经常用到,这里单独讲一下。比如:有一个删除按钮列,点击删除后,要删除当前行,但是你怎么从后台程序中获取到当前行的关键字段的值呢?方法有多种,但最可靠的方法还是通过GridView的DataKeys属性。下面程序是示范:
1.在进行数据绑定之时,设置DataKeyNames属性的值: this.GridView1.DataSource = ds.Tables[0]; this.GridView1.DataKeyNames = new string[] { "CustomerID", "CompanyName" }; this.GridView1.DataBind();
此行程序的作用是将CustomerID和CompanyName两个字段的值放入到DataKeys数组中。
2.在GridView1_RowDeleting事件中写如下程序: string id = this.GridView1.DataKeys[e.RowIndex]["CustomerID"].ToString(); string name = this.GridView1.DataKeys[e.RowIndex]["CompanyName"].ToString();
这样就获取到了当前行记录在DataKeys数组中的值。
七、事件
DataBinding 当服务器控件绑定到数据源时发生。(从 Control 继承。)
DataBound 在服务器控件绑定到数据源后发生。(从 BaseDataBoundControl 继承。)
Di osed 当从内存释放服务器控件时发生,这是请求 ASP.NET 页时服务器控件生存期的最后阶段。(从 Control 继承。)
Init 当服务器控件初始化时发生;初始化是控件生存期的第一步。(从 Control 继承。)
Load 当服务器控件加载到 Page 对象中时发生。(从 Control 继承。)
PageIndexChanged 在单击某一页导航按钮时,但在 GridView 控件处理分页操作之后发生。
PageIndexChanging 在单击某一页导航按钮时,但在 GridView 控件处理分页操作之前发生。
PreRender 在加载 Control 对象之后、呈现之前发生。(从 Control 继承。)
RowCancelingEdit 单击编辑模式中某一行的“取消”按钮以后,在该行退出编辑模式之前发生。
RowCommand 当单击 GridView 控件中的按钮时发生。
RowCreated 在 GridView 控件中创建行时发生。
RowDataBound 在 GridView 控件中将数据行绑定到数据时发生。
RowDeleted 在单击某一行的“删除”按钮时,但在 GridView 控件删除该行之后发生。
RowDeleting 在单击某一行的“删除”按钮时,但在 GridView 控件删除该行之前发生。
RowEditing 发生在单击某一行的“编辑”按钮以后,GridView 控件进入编辑模式之前。
RowUpdated 发生在单击某一行的“更新”按钮,并且 GridView 控件对该行进行更新之后。
RowUpdating 发生在单击某一行的“更新”按钮以后,GridView 控件对该行进行更新之前。
SelectedIndexChanged 发生在单击某一行的“选择”按钮,GridView 控件对相应的选择操作进行处理之后。
SelectedIndexChanging 发生在单击某一行的“选择”按钮以后,GridView 控件对相应的选择操作进行处理之前。
Sorted 在单击用于列排序的超链接时,但在 GridView 控件对相应的排序操作进行处理之后发生。
Sorting 在单击用于列排序的超链接时,但在 GridView 控件对相应的排序操作进行处理之前发生。
Unload 当服务器控件从内存中卸载时发生。(从 Control 继承。) posted @ 2008-11-12 20:16 葱葱 阅读(1340) | 评论(5) |
一、基础
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database d ame
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC _addumpdevice 'disk', 'testBack', 'c:\m ql7backup\MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pu TO testBack
4、说明:创建新表
create table ta ame(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、说明:删除新表
drop table ta ame
6、说明:增加一个列
Alter table ta ame add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table ta ame add primary key(col)
说明:删除主键: Alter table ta ame drop primary key(col)
8、说明:创建索引:create [unique] index idxname on ta ame(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:i ert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、left outer join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
二、提升
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Acce 可用)
法一:select * into b from a where 11
法二:select top 0 * into b from a
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Acce 可用)
i ert into b(a, b, c) select d,e,f from 3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Acce 可用)
i ert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:..from b in '"&am Server.MapPath(".")&am "\data.mdb" &am "' where..
4、说明:子查询(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
6、说明:外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
7、说明:在线视图查询(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a 1;
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2
9、说明:in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
10、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
11、说明:四表联查问题:
select * from a left i er join b on a.a=b.b right i er join c on a.a=c.c i er join d on a.a=d.d where .....
12、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())5
13、说明:一条sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
14、说明:前10条记录
select top 10 * form table1 where 范围
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
17、说明:随机取出10条数据
select top 10 * from tablename order by newid()
18、说明:随机选择记录
select newid()
19、说明:删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
20、说明:列出

参考资料

 

随机推荐