|
|
2007年6月7日
数据分页一直以来是比较头疼的问题,不少的分页控件也随之产生。但是我用过的几个控件,本身都要执行SQL,对存储过程支持不好,为了方便,特别写了个通用分页类,利用PagedDataSource来实现DataGrid,DataList,Repeater的分页。完成上一页,下一页, 最后一页,最前一页,总页数,当前页数,跳转这些基本的功能。 using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; namespace aspnetpager { /// /// netpager-本类提供datagrid,datalist,repeater的通用分页---jierry 04-7-19 /// public class netpager: System.Web.UI.Page { private System.Web.UI.WebControls.DataGrid datagrid=null; private System.Web.UI.WebControls.DataList datalist=null; private System.Web.UI.WebControls.Repeater repeater=null; private System.Web.UI.WebControls.HyperLink lnknext; private System.Web.UI.WebControls.HyperLink lnkprev; private System.Web.UI.WebControls.HyperLink lnkfist; private System.Web.UI.WebControls.HyperLink lnklast; private System.Web.UI.WebControls.HyperLink lnkjump; private System.Web.UI.WebControls.Label pagenum; private System.Web.UI.WebControls.Label pagecount; private System.Web.UI.WebControls.DropDownList list; public netpager() { // // TODO: 在此处添加构造函数逻辑 // } public System.Web.UI.WebControls.DataGrid Datagrid { get { return this.datagrid; } set { this.datagrid=value; } } public System.Web.UI.WebControls.DataList Datalist { get { return this.datalist; } set { this.datalist=value; } } public System.Web.UI.WebControls.Repeater Repeater { get { return this.repeater; } set { this.repeater=value; } } public System.Web.UI.WebControls.HyperLink Lnkprev { get { return this.lnkprev; } set { this.lnkprev=value; } } public System.Web.UI.WebControls.HyperLink Lnknext { get { return this.lnknext; } set { this.lnknext=value; } } public System.Web.UI.WebControls.HyperLink Lnkfist { get { return this.lnkfist; } set { this.lnkfist=value; } } public System.Web.UI.WebControls.HyperLink Lnklast { get { return this.lnklast; } set { this.lnklast=value; } } public System.Web.UI.WebControls.HyperLink Lnkjump { get { return this.lnkjump; } set { this.lnkjump=value; } } public System.Web.UI.WebControls.Label Pagenum { get { return this.pagenum; } set { this.pagenum=value; } } public System.Web.UI.WebControls.Label Pagecount { get { return this.pagecount; } set { this.pagecount=value; } } public System.Web.UI.WebControls.DropDownList List { get { return this.list; } set { this.list=value; } } public void datapage(DataSet ds,int pagenum) { PagedDataSource objPds = new PagedDataSource(); objPds.AllowPaging =true; //每页显示数目 objPds.PageSize =pagenum; //指定数据源 objPds.DataSource = ds.Tables[0].DefaultView; int CurPage; //绑定dropdownlist数据 for(int i=1;i<=objPds.PageCount;i++) { this.list.Items.Add(i.ToString()); } this.list.Items.Insert(0,new ListItem("页数","")); //确定当前页数 if (System.Web.HttpContext.Current.Request.Params["Page"] != null) { CurPage=Convert.ToInt32(System.Web.HttpContext.Current.Request.Params["Page"]); } else { CurPage=1; } objPds.CurrentPageIndex = CurPage-1; //显示当前页数 this.pagenum.Text="页数:"+CurPage.ToString(); //显示总共页数 this.pagecount.Text="共有"+objPds.PageCount+"页"; //下一页 if (!objPds.IsLastPage) { lnknext.NavigateUrl=System.Web.HttpContext.Current.Request.CurrentExecutionFilePath+"?Page=" + Convert.ToString(CurPage+1); } //上一页 if(!objPds.IsFirstPage) { lnkprev.NavigateUrl=System.Web.HttpContext.Current.Request.CurrentExecutionFilePath+"?Page="+Convert.ToString(CurPage-1); } //第一页 if(CurPage!=1) { lnkfist.NavigateUrl=System.Web.HttpContext.Current.Request.CurrentExecutionFilePath+"?Page="+Convert.ToString(1); } //最后一页 if(CurPage!=objPds.PageCount) { lnklast.NavigateUrl=System.Web.HttpContext.Current.Request.CurrentExecutionFilePath+"?Page="+Convert.ToString(objPds.PageCount); } //绑定datagrid if(this.datagrid!=null) { datagrid.DataSource=objPds; datagrid.DataBind(); } //绑定datalist if(this.datalist!=null) { datalist.DataSource=objPds; datalist.DataBind(); } //绑定repeater if(this.repeater!=null) { repeater.DataSource=objPds; repeater.DataBind(); } } //dropdownlist选择改变 public void select() { this.lnkjump.NavigateUrl=System.Web.HttpContext.Current.Request.CurrentExecutionFilePath+"?Page="+Convert.ToString(this.list.SelectedItem.Value); } } } 使用方法: 1.在引用里添加aspnetpager.dll的引用 2.using aspnetpager; 3.private netpager pager; 4. page_load() if(!IsPostBack) { pager=new netpager(); pager.Datagrid=this.DataGrid1; pager.Datalist=this.DataList1; pager.Repeater=this.Repeater1; pager.Lnknext=this.HyperLink1; pager.Lnkprev=this.lnkprev; pager.Lnklast=this.lnklast; pager.Lnkfist=this.lnkfist; pager.Pagenum=this.Label1; pager.Pagecount=this.Label2; pager.List=this.DropDownList1; DataSet ds=new DataSet(); ds.ReadXml(Server.MapPath("test.xml")); pager.datapage(ds,5); } 5.private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e) { pager=new netpager(); pager.List=this.DropDownList1; pager.Lnkjump=this.HyperLink3; pager.select(); }
2007年5月27日
概述
反射就是动态发现类型信息的能力。它帮助程序设计人员在程序运行时利用一些信息去动态地使用类型,这些信息在设计时是未知的,这种能力类型于后期绑定。反射还支持的更高级的行为,能在运行时动态创建新类型,并且对这些新类型的操作进行调用。
一些在反射中经常使用的类
Assembly类
Assembly类是可重用、无版本冲突并且可自我描述的公共语言运行库应用程序构造块。可以使用Assembly.Load和Assembly.LoadFrom方法动态地加载程序集。
Type类
反射的中心是System.Type类。System.Type类是一个抽象类,代表公用类型系统中的一种类型。这个类使您能够查询类型名、类型中包含的模块和名称空间、以及该类型是一个数值类型还是一个引用类型。
System.Type类使您能够查询几乎所有与类型相关的属性,包括类型访问限定符、类型是否、类型的COM属性等等。
Activator类
Activator类支持动态创建.NET程序集和COM对象。可以通过CreateComInstanceFrom、CreateInstance、CreateInstanceFrom、GetObject四个静态方法加载COM对象或者程序集,并能创建指定类型的实例。
Binder类
Binder类是一个用于执行类型转换的绑定器,Type对象的InvokeMember方法接受Binder对象,这个对象描述了如何将传递给InvokeMember的参数转换成方法实际需要的类型。
Binder类是一个抽象类,要创建绑定器,需要重写方法BindToMethod、BindToField、SelectMehtod、SelectProperty和ChangeType。
DefaultMemberAttribute类
DefaultMemberAttribute类用于类型并带有一个指明默认成员名称的字符串参数。能够通过InvokeMember调用默认成员,而不需要传递调用成员的名称。当需要绑定器但不需要特别的绑定行为时就可以使用它。
其它
还有一些对元素类型信息描述的类,ConstrutorInfo(构造函数)、MethodInfo(方法)、FieldInfo(字段)、PropertyInfo(属性)、EventInfo(事件)、MemberInfo(成员)、ParameterInfo(参数)。如果查询得到了具有任何类型信息的实例,就可以获得该类型中任意元素的类型信息,当然出于安全原因,不保证会得到程序集中的任何信息。
示例
类定义:
using System;
using System.Collections.Generic;
using System.Text;

namespace ReflectionSample
  {
 /**//// <summary>
/// 说明:一个简单的类
/// 作者:文野
/// 联系:stwyhm.cnblog.com
/// </summary>
public class ClassSample
 {
// 默认构造
public ClassSample()
 {
this.name = "您调用了默认构造创建了一个类实例。";
}

// 带参构造
public ClassSample(string name)
 {
this.name = name;
}

// 字段
public string name;

public string Field;

// 属性
private string property;
public string Property
 {
 set { this.property = value; }
 get { return property; }
}

// public方法
public string PublicClassMethod()
 {
return string.Format("您反射了一个Public方法");
}

// private方法
private string PrivateClassMethod()
 {
return string.Format("您反射了一个Private方法");
}

// static方法
public static string StaticMethod()
 {
return "您反射了一个Static方法";
}

// 帶參方法
public string ParameterMethod(string para)
 {
return para;
}

public event EventHandler eventHandler;

public void DoEvent()
 {
eventHandler(null,EventArgs.Empty);
}
}
}
反射示例
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.Reflection;
using ReflectionSample;

 /**//// <summary>
/// 说明:一个简单的使用反射示例
/// 作者:文野
/// 联系:stwyhm.cnblog.com
/// </summary>
public partial class _Default : System.Web.UI.Page
  {
protected void Page_Load(object sender, EventArgs e)
 {
string path = Server.MapPath(Request.Path);
string filePath = path.Substring(0, path.LastIndexOf('\\')) + @"\bin\ReflectionSample.dll";
// 获取程序集
Assembly classSampleAssembly = Assembly.LoadFrom(filePath);

// 从程序集中获取指定对象类型
Type classSampleType = classSampleAssembly.GetType("ReflectionSample.ClassSample");

 使用Activator创建一个实例#region 使用Activator创建一个实例

// 通过对象类型创建对象实例
ClassSample s1 = Activator.CreateInstance(classSampleType) as ClassSample;

Response.Write(s1.name + "(使用Activator创建一个实例)<br />");

#endregion

 动态调用构造函数#region 动态调用构造函数

// 调用无参构造
 ConstructorInfo studentConstructor1 = classSampleType.GetConstructor(new Type[] { });
 ClassSample s2 = studentConstructor1.Invoke(new object[] { }) as ClassSample;
Response.Write(s2.name + "<br />");

// 调用有参构造
 ConstructorInfo studentConstructor2 = classSampleType.GetConstructor(new Type[] { typeof(string) });
 ClassSample s3 = studentConstructor2.Invoke(new object[] { "您调用了有参构造创建了一个类实例。" }) as ClassSample;
Response.Write(s3.name + "<br />");

#endregion

 反射方法#region 反射方法

// 调用非静态方法
 string returnValue1 = classSampleType.InvokeMember("PublicClassMethod", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { }) as string;
Response.Write(returnValue1 + "<br />");

// 调用静态方法
 string returnValue2 = classSampleType.InvokeMember("StaticMethod", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, s1, new object[] { }) as string;
Response.Write(returnValue2 + "<br />");

// 调用私有方法
 string returnValue3 = classSampleType.InvokeMember("PrivateClassMethod", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, s1, new object[] { }) as string;
Response.Write(returnValue3 + "<br />");

#endregion

 反射参数#region 反射参数

MethodInfo parameterMethod = classSampleType.GetMethod("ParameterMethod");
ParameterInfo[] paras = parameterMethod.GetParameters();
for (int i = 0; i < paras.Length; i++)
 Response.Write(string.Format("您反射了一个带参方法。参数名:{0},参数类型:{1},是不是可选参数:{2},参数位置:{3},默认值:{4}<br/>", new object[] { paras[i].Name, paras[i].ParameterType.ToString(), paras[i].IsOptional.ToString(), paras[i].Position.ToString(), paras[i].DefaultValue.ToString() }));

#endregion

 反射属性#region 反射属性

 classSampleType.InvokeMember("Property", BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { "您反射了一个属性" });
 string returnValue4 = classSampleType.InvokeMember("Property", BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { }) as string;
Response.Write(returnValue4 + "<br />");

#endregion

 反射字段#region 反射字段

 classSampleType.InvokeMember("Field", BindingFlags.SetField | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { "您反射了一个字段" });
 string returnValue5 = classSampleType.InvokeMember("Field", BindingFlags.GetField | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { }) as string;
Response.Write(returnValue5 + "<br />");

#endregion
}
}
总结:
我们看到,简单的反射使用还是挺简单的,一般只要指定搜索的名称与搜索的类型就可以了。而且我觉得现实中使用反射大部分是都是通过动态创建一个接口的实现类的实例,然后调用接口中定义的方法,还是很少象上面那样通过Type调用类内的各个成员。 [内有附件]
2007年4月24日
本来对正则表达式不是很了解,但由于项目需要,项目主要没有采用存储过程方式来存储SQL语句,所以很有可能被黑客用SQL注入攻击,现在就在网上找了找解决办法,在业务层来过滤SQL语句,防止SQL注入攻击,主要是采用了正则表达式,因为正则表达式对字符串的操作是很强大的. 首先用一个Validate()类来封装正则表达式和相关操作: //验证是否有SQL注入字符 private bool ValidateQuery(Hashtable queryConditions) { //构造SQL的注入关键字符 #region 字符 string[] strBadChar = {"and" ,"exec" ,"insert" ,"select" ,"delete" ,"update" ,"count" ,"or" //,"*" ,"%" ,":" ,"\'" ,"\"" ,"chr" ,"mid" ,"master" ,"truncate" ,"char" ,"declare" ,"SiteName" ,"net user" ,"xp_cmdshell" ,"/add" ,"exec master.dbo.xp_cmdshell" ,"net localgroup administrators"}; #endregion //构造正则表达式 string str_Regex = ".*(" for (int i = 0; i < strBadChar.Length - 1; i++) { str_Regex += strBadChar[i] + "|" } str_Regex += strBadChar[strBadChar.Length - 1] + ").*" //避免查询条件中_list情况 foreach (string str in queryConditions.Keys) { if(str.Substring(str.Length - 5)=="_list") { //去掉单引号检验 str_Regex = str_Regex.Replace("|'|", "|"); } string tempStr = queryConditions[str].ToString(); if (Regex.Matches(tempStr.ToString(), str_Regex).Count > 0) { //有SQL注入字符 return true; } } return false; } queryConditions 是一个hashtable,用于传入查询条件,hashtable中的键值(key)为:@name,相对应SQL中的参数,那Value则对应为参数的实际值了. 正则表达式的应用主要是按这样的规律来过滤字符串的: .*(and|exec|select|update|or|'|''|).* // str_Regex 核心函数主要是: Regex.Matches(tempStr.ToString(), str_Regex). 要是在 tempStr 字符串中含有非法字符, 则函数的Count值将大于0 好了,就这样就可以判断是否含有SQL注入攻击字符了.
2007年1月31日
使用方法:
1.head中加入
<script type="text/javascript" src="pic-js/prototype.js"></script>
<script type="text/javascript" src="pic-js/scriptaculous.js?load=effects"></script>
<script type="text/javascript" src="pic-js/lightbox.js"></script>
<link rel="stylesheet" href="pic-css/lightbox.css" type="text/css" media="screen" />
2.放置blank.gif close.gif closelabel.gif loading.gif next.gif nextlabel.gif prev.gif prevlabel.gif
到文件夹pic-img中。
放置lightbox.css到pic-css文件夹
放置effects.js lightbox.js prototype.js scriptaculous.js到pic-js文件夹。
以上的文件夹位置可以自己设置。
3.在预览图片链接中加入标签rel="lightbox" 例如:
<a href="images/image-1.jpg" rel="lightbox" title="my caption">
<IMG height=40 src="pic-img/thumb-1.jpg" width=100 border="0"></a>
这样就可以显示例一效果
以下方法可以对一组图片(图片数量无限)进行浏览
<a href="images/image-1.jpg" rel="lightbox[plants]">
<IMG height=40 alt="第一张(共3张)" src="pic-img/thumb-1.jpg" width=100 border="0"></a>
<a href="images/image-2.jpg" rel="lightbox[plants]">
<IMG height=40 alt="第二张(共3张)" src="pic-img/thumb-2.jpg" width=100 border="0"></a>
<a href="images/image-3.jpg" rel="lightbox[plants]">
<IMG height=40 alt="第三张(共3张)" src="pic-img/thumb-3.jpg" width=100 border="0"></a> [内有附件]
2007年1月29日
在开发一个项目时,通常是在一个测试服务器上先进行开发的,等开发彻底完成后,在将迁移到正式的服务器上去迁移通常包括开发应用程序和数据库,这里的数据库迁移仅仅只需迁移数据库的结构,即在正式服务器数据库中拥有于测试服务器上一样的数据库结构,单不需要我们在开发过程的测试数据,相当于说一开始正式服务器的中数据库是空的。完成这项工作很简单,只需数据库的导出功能即可,具体操作:在企业管理器里->反手键-〉所有任务-〉生成SQL脚本 。 在生成的脚本中,可以在SQL 查询分析器中执行。 该脚本的功能:创建所有表结构(只创建结构,并没有数据),更重要的是可以创建存储过程。
在进行一个软件的第二次开发中,通常要遇到这样的问题:正式服务器的数据库里面已经包含了重要的数据资源,现在有这样的想法:我要将正式服务器上数据库中所有数据表结构以及里面的数据资源都迁移到另一个数据库中去,完成这样的功能同样也很简单:在企业管理器里->反手键-〉所有任务-〉导出数据。 这样就可以完成上述功能,但有个问题是:这样的操作不能获得正式服务器上数据库中的存储过程。
为了既能导出数据资源又导出存储过程,我的看法就这有分两步来完成:
第一步:导出数据资源(同样包括了数据表结构),具体操作:在企业管理器里->反手键-〉所有任务-〉导出数据
第二步:导出存储过程,具体操作:在企业管理器里->反手键-〉所有任务-〉生成SQL脚本 , 再重生成的SQL脚本文件里,提取出创建存储过程的部分,复制到SQL查询分析器里,执行。
如果不闲麻烦,也可以一步完成以上两步,但以上两步都可以在客户端完成,若想一步完成的话,就需要使用分离数据库,在还原数据库了,即在企业管理器里->反手键-〉所有任务-〉分离数据库,将数据库分离出来,通常该分离数来的数据库被存放在SQL的安装目录下,具体的路径为(若安装在C盘):C:\Program Files\Microsoft SQL Server\MSSQL\Data 下,分离完数据库后,该数据库将不在显示在企业管理器中,然后要远程到服务器上去,在目录下找到该分离出来的数据文件(通常有两个分别为 .ldf .mdf),然后把该文件拷备到你要转移的那个数据库服务器上去,路径同样是:C:\Program Files\Microsoft SQL Server\MSSQL\Data 下,再在企业管理器里->数据库->反手键-〉所有任务-〉附加数据库,浏览到刚刚的两个文件,这样就可以将数据库一丝不漏的弄到另一个数据库上去了,但还没有完,你需要用同样的方法,将正式服务器上的数据库中,将你分离的数据库给附加出来哦.... 不然当别人打开企业管理器时,被你分离的数据库是不显示出来的,兄弟,做人要厚道哦.....
这些只是我的办法,如果你有更好的高见,能更方便的实现以上功能,那要多请你指导了,同时我还想提一点,数据的转移还包括视图,用户自定义函数,用户自定义数据类型,这些都是在应用中用常用的,你要是有好想法,我们一起分享了。
2006年8月15日
AjaxTextBox 出炉了
用了一个晚上,好不容易把vs2003 下开发的 AjaxTextBox 升迁到 vs2005,汗``````
AjaxTextBox 简介:
比上传统的 textbox 来说,AjaxText的功能就强大多了,可以动态实现资料的查询,就如金山词霸一样,可以根据用户的需要去动态查询数据库的资料。
原来,我们都是利用模糊查找来收索出资料信息,现在直接通过这个控件就可以做到这点了,只要是有资料收索的地方都可以用到它了。

2006年7月28日
本着对 AJAX 技术的狂热,看到了 anan 把我门的 blog 用 ajax 技术 改的这么帅!这的很手痒,于是就决定把我们的Member用 AJAX 技术重新构架一下,经过一周的努力,现在终于与大家见面了``````````````
这次 Memebr 的重建,更多使用的不是 ASP。NET ,而是 JAVASCRIPT ,主要就是想基于 AJAX.DLL 来开发这个框架,给用户最大的体检就不用多说了吧,最大的体验就:网页无刷新!!!
简述该网页的制作流程:
程序设计:卢浩森
美工设计:卢凡
新 Member 系统功能简介:
用户必须是网管会成员,主要是提供网管会成员的及时通讯交流,用户需要注册,填写关于自己的详细信息,然后才能登录,登录成功后,用户可以看到网管会成员的信息,点击每位成员的姓名可以看到他们的详细信息介绍。同样,用户可以在“欢迎 XXX” 点击自己的姓名,就可以修改本人的信息。
在用于在显示用户信息的 datagrid 的 分页 是无刷新,显示用户信息,以及修改本人信息都使用了 AJAX 技术
在查询方面,做的不是很好,主要是因为:还是使用了服务器控件,使得页面在刷新,让用户觉得不是很爽,在随着研发部 AJAX 的研究的发展,就会更加改进功能。
好了,说了这么多,我们同学都等及了吧,现在登录:www.dormforce.net/member
就可以使用该网页了,快去看看吧,有什么意见,请赶紧提出,发送email:luhaosen@dormforce.net 我们会继续改进 Member 功能的,谢谢大家支持```````
2006年7月27日
1.使用快捷键快速操作.
F1 -帮助
F2 -剪切
F3 -拷贝
F4-粘贴
F5-隐藏/显示画笔面板
F6-隐藏/显示颜色面板
F7-隐藏/显示图层面板
F8-隐藏/显示信息面板
F9-隐藏/显示动作面板
F12-恢复
Shift+f5-填充
Shift+f6-羽化
Shift+f7-选择→反选
ctrl+h-隐藏选定区域
ctrl+d-取消选定区域
ctrl+w-关闭文件
ctrl+Q-退出PHOTOSHOP
Esc-取消操作
2.按Tab键可以显示或隐藏工具箱和调色板,按"shift+Tab"键可以显示或隐藏除工具以外的其他面板。
3.按住shift用绘画工具在画面点击就可以在每两点间画出直线,按住鼠标拖动便可画出水平或垂直线。
4.使用其他工具时,按住ctrl键可切换到move工具的功能(除了选择hand工具时)按住空格键可切换到hand工具的功能。
5.同时按住alt和ctrl+或-可让画框与画面同时缩放。
6.使用其他工具时,按ctrl+空格键可切换到zoom in工具放大图象显示比例,按alt+ctrl+空格可切换到zoom out工具缩小图象显示比例。
7.在hand工具上双击鼠标可以使图象匹配窗口的大小显示。
8.按住alt双击photoshop底板相当于open as。
9.按住shife双击photoshop底板相当于save。
10.按住ctrl双击photoshop底板相当于new file。
11.按住ale点击工具盒中带小点的工具可循环选择隐藏的工具。
12.按ctrl+alt+{数字键0}或在zoom工具上双击鼠标可使图象文件以1:1比例显示。
13.在各种设置框内,只要按住alt键,cancel键会变成键reset键,按reset键变可恢复默认设置。
14.按shift+backspace键可直接调用fill填充对话框。
15.按alt+backspace(delete)键可将前景色填入选取框按ctrl+backspace(delete)键可将背景色填入选取框。
16.同时按住ctrl和alt移动可马上复制到新的layer并可同时移动物体。
17.再用裁切工具裁切图片并调整裁切点时按住ctrl便不会贴近画面边缘。
18.若要在一个宏(action)中的某一命令后新增一条命令,可以先选中该命令,然后单击调色板上的开始录制(begin recording)图标,选择要。
增加的命令,再单击停止录制(stop recording)图标即可。
19.在layers,channels,paths面板上,按alt单击,按单击这些面板底部的工具图标时,对于有对话的工具可调出相应的对话框来更改设置。
20.在使用filter→render→lighting effectts滤镜时,若要在对话框内复制光源,可先按住alt键后再拖动光源即可实现复制。
21.调用curves对话框时,按住键于格线内单击鼠标可以增加网格线,提高曲线精度。
22.若要在两上窗口间拖放拷贝,拖动过程中按住shift键,图像拖动到目的窗口后会自动居中。
23.按住shift选择区域时可在原区域上增加新的区域;按住alt选择区域时,可在原区域上减去新选区域,同时按住shift和alt选择区域时,可取得与原选择区域相交的部分
24.移动图层和选取框时,按住shift键可做水平,垂直或45度角的移动,按键盘上的方向键,可做每次1像素的移动,按住shift键再键盘上的方向键可做每次10像素的移动。
25.使用笔形工具制作路径是按住shift键可以强制路径或方向线成水平或垂直或45度角按住ctrl键可暂时切换到路径选取工具按住alt键将笔形光标在黑色的接点上单击可以改变方向线的方向,使曲线可以转折;按alt键用路径选取(direct selection)工具单击路径会选取整个路径,要同时选取多个路径可按住shift后逐个单击,用路径选取工具是按住ctrl+alt键移近路径会切换到加节点与件节点的笔行工具。
26.在使用选取工具时,按shift键拖动鼠标可以在原选取框外增加选取范围;同时按shift与alt键拖动鼠标可以选取与原选取框重叠的范围(交集)。
27.ctrl+delete加填前景颜色,ctrl或shift加delete填背景颜色。
28.空格加ctrl(注意顺序)快速调出放大镜, 再加alt变成缩小镜。
29.若要将图像用于网面上,可将图像模式设置为indexed color索引色彩模式,有文件小,传输快的优点, 如果再选择gif89a export(gif输出),可以设置透明的效果,并将文件保存成gif格式。
30.使用filter→render→clouds滤镜时,先按住alt可加云彩的反差,先按住shift键则降低反差 。
31.双击放大镜可使画面以的100%比例显示大小。
32.按ctrl+r 出现标尺,在标尺拉出辅助线时按住就可以准确的让辅助线贴近刻度。
33.在使用自由变形(layer→free→transform)功能时,按ctrl键并拖动某一控制点可以进行随意变形的调整,"shift+ctrl"键并拖动某一控制点可以时行倾斜调整;按alt键并拖动某一控制点可以进行对称调整;按shift+ctrl+alt键并拖动某一控制点可以进行透视效果的调整。
34.在photoshop5.0以上版本中右键点击文字,在layer选effects...可快速做出随字体改变的阴影及光芒效果。
35.在安装photoshop的时候在select country中选择all other countries;在select components中确定选择了cmap files;这样安装完后,您的photoshop就可以正常使用中文了。
36.在photoshop5.0中在history控制面板中点右上角的小三角选clear history可以暂时缓解你对虚拟内存的要求。
37.在使用filter→render→clouds滤镜时,若要产生更多明显的纹理图案,可先按住alt键后再执行该命令。
38.大部分工具在使用时按caps lock键可使工具图标与精 确十线相互切换。
39.按f键可把photoshop面板的显示模式顺序替换为:标准显示 带菜单的全屏显示 全屏显示。
40.想从中心开始画选框可按住alt拖动。
41.按住shift加上tab键可以显示或隐藏除工具 箱外的其他调色板。
42.工具箱(多种工具共用一个快捷键的可同时按【Shift】加此快捷键选取)
矩形、椭圆选框工具 【M】
裁剪工具 【C】
移动工具 【V】
套索、多边形套索、磁性套索 【L】
魔棒工具 【W】
喷枪工具 【J】
画笔工具 【B】
像皮图章、图案图章 【S】
历史记录画笔工具 【Y】
像皮擦工具 【E】
铅笔、直线工具 【N】
模糊、锐化、涂抹工具 【R】
减淡、加深、海棉工具 【O】
钢笔、自由钢笔、磁性钢笔 【P】
添加锚点工具 【+】
删除锚点工具 【-】
直接选取工具 【A】
文字、文字蒙板、直排文字、直排文字蒙板 【T】
度量工具 【U】
直线渐变、径向渐变、对称渐变、角度渐变、菱形渐变 【G】
油漆桶工具 【K】
吸管、颜色取样器 【I】
抓手工具 【H】
缩放工具 【Z】
默认前景色和背景色 【D】
切换前景色和背景色 【X】
切换标准模式和快速蒙板模式 【Q】
标准屏幕模式、带有菜单栏的全屏模式、全屏模式 【F】
临时使用移动工具 【Ctrl】
临时使用吸色工具 【Alt】
临时使用抓手工具 【空格】
打开工具选项面板 【Enter】
快速输入工具选项(当前工具选项面板中至少有一个可调节数字) 【0】至【9】
循环选择画笔 【[】或【]】
选择第一个画笔 【Shift】+【[】
选择最后一个画笔 【Shift】+【]】
建立新渐变(在”渐变编辑器”中) 【Ctrl】+【N】
文件操作
新建图形文件 【Ctrl】+【N】
用默认设置创建新文件 【Ctrl】+【Alt】+【N】
打开已有的图像 【Ctrl】+【O】
打开为... 【Ctrl】+【Alt】+【O】
关闭当前图像 【Ctrl】+【W】
保存当前图像 【Ctrl】+【S】
另存为... 【Ctrl】+【Shift】+【S】
存储副本 【Ctrl】+【Alt】+【S】
页面设置 【Ctrl】+【Shift】+【P】
打印 【Ctrl】+【P】
打开“预置”对话框 【Ctrl】+【K】
显示最后一次显示的“预置”对话框 【Alt】+【Ctrl】+【K】
设置“常规”选项(在预置对话框中) 【Ctrl】+【1】
设置“存储文件”(在预置对话框中) 【Ctrl】+【2】
设置“显示和光标”(在预置对话框中) 【Ctrl】+【3】
设置“透明区域与色域”(在预置对话框中) 【Ctrl】+【4】
设置“单位与标尺”(在预置对话框中) 【Ctrl】+【5】
设置“参考线与网格”(在预置对话框中) 【Ctrl】+【6】
设置“增效工具与暂存盘”(在预置对话框中) 【Ctrl】+【7】
设置“内存与图像高速缓存”(在预置对话框中) 【Ctrl】+【8】
编辑操作
还原/重做前一步操作 【Ctrl】+【Z】
还原两步以上操作 【Ctrl】+【Alt】+【Z】
重做两步以上操作 【Ctrl】+【Shift】+【Z】
剪切选取的图像或路径 【Ctrl】+【X】或【F2】
拷贝选取的图像或路径 【Ctrl】+【C】
合并拷贝 【Ctrl】+【Shift】+【C】
将剪贴板的内容粘到当前图形中 【Ctrl】+【V】或【F4】
将剪贴板的内容粘到选框中 【Ctrl】+【Shift】+【V】
自由变换 【Ctrl】+【T】
应用自由变换(在自由变换模式下) 【Enter】
从中心或对称点开始变换 (在自由变换模式下) 【Alt】
限制(在自由变换模式下) 【Shift】
扭曲(在自由变换模式下) 【Ctrl】
取消变形(在自由变换模式下) 【Esc】
自由变换复制的象素数据 【Ctrl】+【Shift】+【T】
再次变换复制的象素数据并建立一个副本 【Ctrl】+【Shift】+【Alt】+【T】
删除选框中的图案或选取的路径 【DEL】
用背景色填充所选区域或整个图层 【Ctrl】+【BackSpace】或【Ctrl】+【Del】
用前景色填充所选区域或整个图层 【Alt】+【BackSpace】或【Alt】+【Del】
弹出“填充”对话框 【Shift】+【BackSpace】
从历史记录中填充 【Alt】+【Ctrl】+【Backspace】
图像调整
调整色阶 【Ctrl】+【L】
自动调整色阶 【Ctrl】+【Shift】+【L】
打开曲线调整对话框 【Ctrl】+【M】
在所选通道的曲线上添加新的点(‘曲线’对话框中) 在图象中【Ctrl】加点按
在复合曲线以外的所有曲线上添加新的点(‘曲线’对话框中) 【Ctrl】+【Shift】
加点按
移动所选点(‘曲线’对话框中) 【↑】/【↓】/【←】/【→】
以10点为增幅移动所选点以10点为增幅(‘曲线’对话框中) 【Shift】+【箭头】
选择多个控制点(‘曲线’对话框中) 【Shift】加点按
前移控制点(‘曲线’对话框中) 【Ctrl】+【Tab】
后移控制点(‘曲线’对话框中) 【Ctrl】+【Shift】+【Tab】
添加新的点(‘曲线’对话框中) 点按网格
删除点(‘曲线’对话框中) 【Ctrl】加点按点
取消选择所选通道上的所有点(‘曲线’对话框中) 【Ctrl】+【D】
使曲线网格更精细或更粗糙(‘曲线’对话框中) 【Alt】加点按网格
选择彩色通道(‘曲线’对话框中) 【Ctrl】+【~】
选择单色通道(‘曲线’对话框中) 【Ctrl】+【数字】
打开“色彩平衡”对话框 【Ctrl】+【B】
打开“色相/饱和度”对话框 【Ctrl】+【U】
全图调整(在色相/饱和度”对话框中) 【Ctrl】+【~】
只调整红色(在色相/饱和度”对话框中) 【Ctrl】+【1】
只调整黄色(在色相/饱和度”对话框中) 【Ctrl】+【2】
只调整绿色(在色相/饱和度”对话框中) 【Ctrl】+【3】
只调整青色(在色相/饱和度”对话框中) 【Ctrl】+【4】
只调整蓝色(在色相/饱和度”对话框中) 【Ctrl】+【5】
只调整洋红(在色相/饱和度”对话框中) 【Ctrl】+【6】
去色 【Ctrl】+【Shift】+【U】
反相 【Ctrl】+【I】
图层操作
从对话框新建一个图层 【Ctrl】+【Shift】+【N】
以默认选项建立一个新的图层 【Ctrl】+【Alt】+【Shift】+【N】
通过拷贝建立一个图层 【Ctrl】+【J】
通过剪切建立一个图层 【Ctrl】+【Shift】+【J】
与前一图层编组 【Ctrl】+【G】
取消编组 【Ctrl】+【Shift】+【G】
向下合并或合并联接图层 【Ctrl】+【E】
合并可见图层 【Ctrl】+【Shift】+【E】
盖印或盖印联接图层 【Ctrl】+【Alt】+【E】
盖印可见图层 【Ctrl】+【Alt】+【Shift】+【E】
将当前层下移一层 【Ctrl】+【[】
将当前层上移一层 【Ctrl】+【]】
将当前层移到最下面 【Ctrl】+【Shift】+【[】
将当前层移到最上面 【Ctrl】+【Shift】+【]】
激活下一个图层 【Alt】+【[】
激活上一个图层 【Alt】+【]】
激活底部图层 【Shift】+【Alt】+【[】
激活顶部图层 【Shift】+【Alt】+【]】
调整当前图层的透明度(当前工具为无数字参数的,如移动工具) 【0】至【9】
保留当前图层的透明区域(开关) 【/】<br>
投影效果(在”效果”对话框中) 【Ctrl】+【1】
内阴影效果(在”效果”对话框中) 【Ctrl】+【2】
外发光效果(在”效果”对话框中) 【Ctrl】+【3】
内发光效果(在”效果”对话框中) 【Ctrl】+【4】
斜面和浮雕效果(在”效果”对话框中) 【Ctrl】+【5】
应用当前所选效果并使参数可调(在”效果”对话框中) 【A】
图层混合模式<br>
循环选择混合模式 【Alt】+【-】或【+】
正常 【Ctrl】+【Alt】+【N】
阈值(位图模式) 【Ctrl】+【Alt】+【L】
溶解 【Ctrl】+【Alt】+【I】
背后 【Ctrl】+【Alt】+【Q】
清除 【Ctrl】+【Alt】+【R】
正片叠底 【Ctrl】+【Alt】+【M】
屏幕 【Ctrl】+【Alt】+【S】
叠加 【Ctrl】+【Alt】+【O】
柔光 【Ctrl】+【Alt】+【F】
强光 【Ctrl】+【Alt】+【H】
颜色减淡 【Ctrl】+【Alt】+【D】
颜色加深 【Ctrl】+【Alt】+【B】
变暗 【Ctrl】+【Alt】+【K】
变亮 【Ctrl】+【Alt】+【G】
差值 【Ctrl】+【Alt】+【E】
排除 【Ctrl】+【Alt】+【X】
色相 【Ctrl】+【Alt】+【U】
饱和度 【Ctrl】+【Alt】+【T】
颜色 【Ctrl】+【Alt】+【C】
光度 【Ctrl】+【Alt】+【Y】
去色 海棉工具+【Ctrl】+【Alt】+【J】
加色 海棉工具+【Ctrl】+【Alt】+【A】
暗调 减淡/加深工具+【Ctrl】+【Alt】+【W】
中间调 减淡/加深工具+【Ctrl】+【Alt】+【V】
高光 减淡/加深工具+【Ctrl】+【Alt】+【Z】
选择功能
全部选取 【Ctrl】+【A】
取消选择 【Ctrl】+【D】
重新选择 【Ctrl】+【Shift】+【D】
羽化选择 【Ctrl】+【Alt】+【D】
反向选择 【Ctrl】+【Shift】+【I】
路径变选区 数字键盘的【Enter】
载入选区 【Ctrl】+点按图层、路径、通道面板中的缩约图
滤镜
按上次的参数再做一次上次的滤镜 【Ctrl】+【F】
退去上次所做滤镜的效果 【Ctrl】+【Shift】+【F】
重复上次所做的滤镜(可调参数) 【Ctrl】+【Alt】+【F】
选择工具(在“3D变化”滤镜中) 【V】
立方体工具(在“3D变化”滤镜中) 【M】
球体工具(在“3D变化”滤镜中) 【N】
柱体工具(在“3D变化”滤镜中) 【C】
轨迹球(在“3D变化”滤镜中) 【R】
全景相机工具(在“3D变化”滤镜中) 【E】
视图操作
显示彩色通道 【Ctrl】+【~】
显示单色通道 【Ctrl】+【数字】
显示复合通道 【~】
以CMYK方式预览(开关) 【Ctrl】+【Y】
打开/关闭色域警告 【Ctrl】+【Shift】+【Y】
放大视图 【Ctrl】+【+】
缩小视图 【Ctrl】+【-】
满画布显示 【Ctrl】+【0】
实际象素显示 【Ctrl】+【Alt】+【0】
向上卷动一屏 【PageUp】
向下卷动一屏 【PageDown】
向左卷动一屏 【Ctrl】+【PageUp】
向右卷动一屏 【Ctrl】+【PageDown】
向上卷动10 个单位 【Shift】+【PageUp】
向下卷动10 个单位 【Shift】+【PageDown】
向左卷动10 个单位 【Shift】+【Ctrl】+【PageUp】
向右卷动10 个单位 【Shift】+【Ctrl】+【PageDown】
将视图移到左上角 【Home】
将视图移到右下角 【End】
显示/隐藏选择区域 【Ctrl】+【H】
显示/隐藏路径 【Ctrl】+【Shift】+【H】
显示/隐藏标尺 【Ctrl】+【R】
显示/隐藏参考线 【Ctrl】+【;】
显示/隐藏网格 【Ctrl】+【”】
贴紧参考线 【Ctrl】+【Shift】+【;】
锁定参考线 【Ctrl】+【Alt】+【;】
贴紧网格 【Ctrl】+【Shift】+【”】
显示/隐藏“画笔”面板 【F5】
显示/隐藏“颜色”面板 【F6】
显示/隐藏“图层”面板 【F7】
显示/隐藏“信息”面板 【F8】
显示/隐藏“动作”面板 【F9】
显示/隐藏所有命令面板 【TAB】
显示或隐藏工具箱以外的所有调板 【Shift】+【TAB】
文字处理(在”文字工具”对话框中)
左对齐或顶对齐 【Ctrl】+【Shift】+【L】
中对齐 【Ctrl】+【Shift】+【C】
右对齐或底对齐 【Ctrl】+【Shift】+【R】
左/右选择 1 个字符 【Shift】+【←】/【→】
下/上选择 1 行 【Shift】+【↑】/【↓】
选择所有字符 【Ctrl】+【A】
选择从插入点到鼠标点按点的字符 【Shift】加点按
左/右移动 1 个字符 【←】/【→】
下/上移动 1 行 【↑】/【↓】
左/右移动1个字 【Ctrl】+【←】/【→】
将所选文本的文字大小减小2 点象素 【Ctrl】+【Shift】+【[$lt]】
将所选文本的文字大小增大2 点象素 【Ctrl】+【Shift】+【[$gt]】
将所选文本的文字大小减小10 点象素 【Ctrl】+【Alt】+【Shift】+【[$lt]】
将所选文本的文字大小增大10 点象素 【Ctrl】+【Alt】+【Shift】+【[$gt]】
将行距减小2点象素 【Alt】+【↓】
将行距增大2点象素 【Alt】+【↑】
将基线位移减小2点象素 【Shift】+【Alt】+【↓】
将基线位移增加2点象素 【Shift】+【Alt】+【↑】
将字距微调或字距调整减小20/1000ems 【Alt】+【←】
将字距微调或字距调整增加20/1000ems 【Alt】+【→】
将字距微调或字距调整减小100/1000ems 【Ctrl】+【Alt】+【←】
将字距微调或字距调整增加100/1000ems 【Ctrl】+【Alt】+【→】
2006年7月22日
1. 打开新的窗口并传送参数:
传送参数:
response.write("<script>window.open(’*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"’)</script>")
接收参数:
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.点击表格行链接另一页
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 + "’);");
}
双击表格连接到另一页
在itemDataBind事件中
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 + "’");
}
双击表格打开新一页
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 + "’)");
}
★特别注意:【?id=】 处不能为 【?id =】
6.表格超连接列传递参数
<asp:HyperLinkColumn Target="_blank" headertext="ID号" DataTextField="id" NavigateUrl="aaa.aspx?id=’
<%# DataBinder.Eval(Container.DataItem, "数据字段1")%>’ & name=’<%# DataBinder.Eval(Container.DataItem, "数据字段2")%>’ />
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里
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事件中
e.items.cell["你的列"].text=DateTime.Parse(e.items.cell["你的列"].text.ToString("yyyy-MM-dd"))
9.获取错误信息并到指定页面
不要使用Response.Redirect,而应该使用Server.Transfer
e.g
// in global.asax
protected void Application_Error(Object sender, EventArgs e) {
if (Server.GetLastError() is HttpUnhandledException)
Server.Transfer("MyErrorPage.aspx");
//其余的非HttpUnhandledException异常交给ASP.NET自己处理就okay了 :)
}
Redirect会导致post-back的产生从而丢失了错误信息,所以页面导向应该直接在服务器端执行,这样就可以在错误处理页面得到出错信息并进行相应的处理
10.清空Cookie
Cookie.Expires=[DateTime];
Response.Cookies("UserName").Expires = 0
11.自定义异常处理
//自定义异常处理类
using System;
using System.Diagnostics;
namespace MyAppException
{
/// <summary>
/// 从系统异常类ApplicationException继承的应用程序异常处理类。
/// 自动将异常内容记录到Windows NT/2000的应用程序日志
/// </summary>
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);
}
}
//日志记录类
using System;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading;
namespace MyEventLog
{
/// <summary>
/// 事件日志记录类,提供事件日志记录支持
/// <remarks>
/// 定义了4个日志记录方法 (error, warning, info, trace)
/// </remarks>
/// </summary>
public class ApplicationLog
{
/// <summary>
/// 将错误信息记录到Win2000/NT事件日志中
/// <param name="message">需要记录的文本信息</param>
/// </summary>
public static void WriteError(String message)
{
WriteLog(TraceLevel.Error, message);
}
/// <summary>
/// 将警告信息记录到Win2000/NT事件日志中
/// <param name="message">需要记录的文本信息</param>
/// </summary>
public static void WriteWarning(String message)
{
WriteLog(TraceLevel.Warning, message);
}
/// <summary>
/// 将提示信息记录到Win2000/NT事件日志中
/// <param name="message">需要记录的文本信息</param>
/// </summary>
public static void WriteInfo(String message)
{
WriteLog(TraceLevel.Info, message);
}
/// <summary>
/// 将跟踪信息记录到Win2000/NT事件日志中
/// <param name="message">需要记录的文本信息</param>
/// </summary>
public static void WriteTrace(String message)
{
WriteLog(TraceLevel.Verbose, message);
}
/// <summary>
/// 格式化记录到事件日志的文本信息格式
/// <param name="ex">需要格式化的异常对象</param>
/// <param name="catchInfo">异常信息标题字符串.</param>
/// <retvalue>
/// <para>格式后的异常信息字符串,包括异常内容和跟踪堆栈.</para>
/// </retvalue>
/// </summary>
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();
}
/// <summary>
/// 实际事件日志写入方法
/// <param name="level">要记录信息的级别(error,warning,info,trace).</param>
/// <param name="messageText">要记录的文本.</param>
/// </summary>
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 );
//写入事件日志
eventLog.WriteEntry(messageText, LogEntryType);
}
catch {} //忽略任何异常
}
} //class ApplicationLog
}
12.Panel 横向滚动,纵向自动扩展
<asp:panel style="overflow-x:scroll;overflow-y:auto;"></asp:panel>
13.回车转换成Tab
<script language="javascript" for="document" event="onkeydown">
if(event.keyCode==13 && event.srcElement.type!=’button’ && event.srcElement.type!=’submit’ && event.srcElement.type!=’reset’ && event.srcElement.type!=’’&& event.srcElement.type!=’textarea’);
event.keyCode=9;
</script>
onkeydown="if(event.keyCode==13) event.keyCode=9"
14.DataGrid超级连接列
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.模板列
<ASP:TEMPLATECOLUMN visible="False" sortexpression="demo" headertext="ID">
<ITEMTEMPLATE>
<ASP:LABEL text=’<%# DataBinder.Eval(Container.DataItem, "ArticleID")%>’ runat="server" width="80%" id="lblColumn" />
</ITEMTEMPLATE>
</ASP:TEMPLATECOLUMN>
<ASP:TEMPLATECOLUMN headertext="选中">
<HEADERSTYLE wrap="False" horizontalalign="Center"></HEADERSTYLE>
<ITEMTEMPLATE>
<ASP:CHECKBOX id="chkExport" runat="server" />
</ITEMTEMPLATE>
<EDITITEMTEMPLATE>
<ASP:CHECKBOX id="chkExportON" runat="server" enabled="true" />
</EDITITEMTEMPLATE>
</ASP:TEMPLATECOLUMN>
后台代码
protected void CheckAll_CheckedChanged(object sender, System.EventArgs e)
{
//改变列的选定,实现全选或全不选。
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.数字格式化
【<%#Container.DataItem("price")%>的结果是500.0000,怎样格式化为500.00?】
<%#Container.DataItem("price","{0:¥#,##0.00}")%>
int i=123456;
string s=i.ToString("###,###.00");
18.日期格式化
【aspx页面内:<%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date")%>
显示为: 2004-8-11 19:44:28
我只想要:2004-8-11 】
<%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date","{0:yyyy-M-d}")%>
应该如何改?
【格式化日期】
取出来,一般是object((DateTime)objectFromDB).ToString("yyyy-MM-dd");
【日期的验证表达式】
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]))$
【大小写转换】
HttpUtility.HtmlEncode(string);
HttpUtility.HtmlDecode(string)
19.如何设定全局变量
Global.asax中
Application_Start()事件中
添加Application[属性名] = xxx;
就是你的全局变量
20.怎样作到HyperLinkColumn生成的连接后,点击连接,打开新窗口?
HyperLinkColumn有个属性Target,将器值设置成"_blank"即可.(Target="_blank")
【ASPNETMENU】点击菜单项弹出新窗口
在你的menuData.xml文件的菜单项中加入URLTarget="_blank",如:
<?xml version="1.0" encoding="GB2312"?>
<MenuData ImagesBaseURL="images/">
<MenuGroup>
<MenuItem Label="内参信息" URL="Infomation.aspx" >
<MenuGroup ID="BBC">
<MenuItem Label="公告信息" URL="Infomation.aspx" URLTarget="_blank" LeftIcon="file.gif"/>
<MenuItem Label="编制信息简报" URL="NewInfo.aspx" LeftIcon="file.gif" />
......
最好将你的aspnetmenu升级到1.2版
21.读取DataGrid控件TextBox值
foreach(DataGrid dgi in yourDataGrid.Items)
{
TextBox tb = (TextBox)dgi.FindControl("yourTextBoxId");
tb.Text....
}
23.在DataGrid中有3个模板列包含Textbox分别为 DG_ShuLiang (数量) DG_DanJian(单价) DG_JinE(金额)分别在5.6.7列,要求在录入数量及单价的时候自动算出金额即:数量*单价=金额还要求录入时限制为 数值型.我如何用客户端脚本实现这个功能?
〖思归〗
<asp:TemplateColumn HeaderText="数量">
<ItemTemplate>
<asp:TextBox id="ShuLiang" runat=’server’ Text=’<%# DataBinder.Eval(Container.DataItem,"DG_ShuLiang")%>’
onkeyup="javascript:DoCal()"
/>
<asp:RegularExpressionValidator id="revS" runat="server" ControlToValidate="ShuLiang" ErrorMessage="must be integer" ValidationExpression="^\d+$" />
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="单价">
<ItemTemplate>
<asp:TextBox id="DanJian" runat=’server’ Text=’<%# DataBinder.Eval(Container.DataItem,"DG_DanJian")%>’
onkeyup="javascript:DoCal()"
/>
<asp:RegularExpressionValidator id="revS2" runat="server" ControlToValidate="DanJian" ErrorMessage="must be numeric" ValidationExpression="^\d+(\.\d*)?$" />
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="金额">
<ItemTemplate>
<asp:TextBox id="JinE" runat=’server’ Text=’<%# DataBinder.Eval(Container.DataItem,"DG_JinE")%>’ />
</ItemTemplate>
</asp:TemplateColumn><script language="javascript">
function DoCal()
{
var e = event.srcElement;
var row = e.parentNode.parentNode;
var txts = row.all.tags("INPUT");
if (!txts.length || txts.length < 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);
}
</script>
24.datagrid选定比较底下的行时,为什么总是刷新一下,然后就滚动到了最上面,刚才选定的行因屏幕的关系就看不到了。
page_load
page.smartNavigation=true
25.在Datagrid中修改数据,当点击编辑键时,数据出现在文本框中,怎么控制文本框的大小 ?
private void DataGrid1_ItemDataBound(obj sender,DataGridItemEventArgs e)
{
for(int i=0;i<e.Item.Cells.Count-1;i++)
if(e.Item.ItemType==ListItemType.EditType)
{
e.Item.Cells[i].Attributes.Add("Width", "80px")
}
}
26.对话框
private static string ScriptBegin = "<script language=\"JavaScript\">";
private static string ScriptEnd = "</script>";
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. 将时间格式化:string aa=DateTime.Now.ToString("yyyy年MM月dd日");
1.1 取当前年月日时分秒
currentTime=System.DateTime.Now;
1.2 取当前年
int 年= 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 秒= DateTime.Now.Second;
1.8 取当前毫秒
int 毫秒= DateTime.Now.Millisecond;
28.自定义分页代码:
先定义变量 :
public static int pageCount; //总页面数
public static int curPageIndex=1; //当前页面
下一页:
if(DataGrid1.CurrentPageIndex < (DataGrid1.PageCount - 1))
{
DataGrid1.CurrentPageIndex += 1;
curPageIndex+=1;
}
bind(); // DataGrid1数据绑定函数
上一页:
if(DataGrid1.CurrentPageIndex >0)
{
DataGrid1.CurrentPageIndex += 1;
curPageIndex-=1;
}
bind(); // DataGrid1数据绑定函数
直接页面跳转:
int a=int.Parse(JumpPage.Value.Trim());//JumpPage.Value.Trim()为跳转值
if(a<DataGrid1.PageCount)
{
this.DataGrid1.CurrentPageIndex=a;
}
bind();
29.DataGrid使用:
添加删除确认:
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(’确认删除此项吗?’);");
}
}
}
样式交替:
ListItemType itemType = e.Item.ItemType;
if (itemType == ListItemType.Item )
{
e.Item.Attributes["onmouseout"] = "javascript:this.style.backgroundColor=’#FFFFFF’;";
e.Item.Attributes["onmouseover"] = "javascript:this.style.backgroundColor=’#d9ece1’;cursor=’hand’;" ;
}
else if( itemType == ListItemType.AlternatingItem)
{
e.Item.Attributes["onmouseout"] = "javascript:this.style.backgroundColor=’#a0d7c4’;";
e.Item.Attributes["onmouseover"] = "javascript:this.style.backgroundColor=’#d9ece1’;cursor=’hand’;" ;
}
添加一个编号列:
DataTable dt= c.ExecuteRtnTableForAccess(sqltxt); //执行sql返回的DataTable
DataColumn dc=dt.Columns.Add("number",System.Type.GetType("System.String"));
for(int i=0;i<dt.Rows.Count;i++)
{
dt.Rows[i]["number"]=(i+1).ToString();
}
DataGrid1.DataSource=dt;
DataGrid1.DataBind();
DataGrid1中添加一个CheckBox,页面中添加一个全选框
private void CheckBox2_CheckedChanged(object sender, System.EventArgs e)
{
foreach(DataGridItem thisitem in DataGrid1.Items)
{
((CheckBox)thisitem.Cells[0].Controls[1]).Checked=CheckBox2.Checked;
}
}
将当前页面中DataGrid1显示的数据全部删除
foreach(DataGridItem thisitem in DataGrid1.Items)
{
if(((CheckBox)thisitem.Cells[0].Controls[1]).Checked)
{
string strloginid= DataGrid1.DataKeys[thisitem.ItemIndex].ToString();
Del (strloginid); //删除函数
}
}
30.当文件在不同目录下,需要获取数据库连接字符串(如果连接字符串放在Web.config,然后在Global.asax中初始化)
在Application_Start中添加以下代码:
Application["ConnStr"]=this.Context.Request.PhysicalApplicationPath+ConfigurationSettings.
AppSettings["ConnStr"].ToString();
31. 变量.ToString()
字符型转换 转为字符串
12345.ToString("n"); //生成 12,345.00
12345.ToString("C"); //生成 ¥12,345.00
12345.ToString("e"); //生成 1.234500e+004
12345.ToString("f4"); //生成 12345.0000
12345.ToString("x"); //生成 3039 (16进制)
12345.ToString("p"); //生成 1,234,500.00%
32、变量.Substring(参数1,参数2);
截取字串的一部分,参数1为左起始位数,参数2为截取几位。 如:string s1 = str.Substring(0,2);
33.在自己的网站上登陆其他网站:(如果你的页面是通过嵌套方式的话,因为一个页面只能有一个FORM,这时可以导向另外一个页面再提交登陆信息)
<SCRIPT language="javascript">
<!--
function gook(pws)
{
frm.submit();
}
//-->
</SCRIPT> <body leftMargin="0" topMargin="0" onload="javascript:gook()" marginwidth="0" marginheight="0">
<form name="frm" action=" http://220.194.55.68:6080/login.php?retid=7259 " method="post">
<tr>
<td>
<input id="f_user" type="hidden" size="1" name="f_user" runat="server">
<input id="f_domain" type="hidden" size="1" name="f_domain" runat="server">
<input class="box" id="f_pass" type="hidden" size="1" name="pwshow" runat="server">
<INPUT id="lng" type="hidden" maxLength="20" size="1" value="5" name="lng">
<INPUT id="tem" type="hidden" size="1" value="2" name="tem">
</td>
</tr>
</form>
文本框的名称必须是你要登陆的网页上的名称,如果源码不行可以用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");
}
2006年7月21日
最近在看 AJAX ,看到anan 用AJAX 将Blog 改的这么好,心里好痒痒的,现在我也在用AJAX 重构 Member 系统,效果很乐观哦,不过现在遇到了一个问题,在 baidu 和 google 上转了好久,问题还是没得到解决,现在来请教一下大家。
来说说问题吧:也就是 Javascript 的参数传递问题:
<html>
<script language = "javascript" type = "text/javascript">
function getId(var Id)
{
alert(Id);
}
</script>
<body>
<a href="javascript:getId(1);">GetId</a>
</body>
</html>
思路是 在 HTML 的页面上,想通过超连接(href)来实现javascript的函数调用,在函数调用中有参数的传递,但是该程序并不能实现在参数的传递,汗!!!
我想这样做了对比:
<html>
<script language = "javascript" type = "text/javascript">
function getId()
{
alert(1);
}
</script>
<body>
<a href="javascript:getId();">GetId</a>
</body>
</html>
这样的话,就可以调用 getId()函数了,并且弹出了“1”,郁闷中······
在 baidu 上有这样的答案:
<a href="javascript:jacascriptcode">test</a> 和 <a href=# onlick="javascriptcode">test</a>
但这两个例子,似乎是在比较了两种方法,达到了同样效果,但我遇到了参数传递问题,大家来给我点意见哈····
|