C#经典项目经验总结.doc_第1页
C#经典项目经验总结.doc_第2页
C#经典项目经验总结.doc_第3页
C#经典项目经验总结.doc_第4页
C#经典项目经验总结.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

原価知識String与string的区别string是c#中的类,String是.net Framework的类(在c# IDE中不会显示蓝色) c# string映射为.net Framework的String 如果用string,编译器会把它编译成String,所以如果直接用String就可以让编译器少做一点点工作 如果使用c#,建议使用string,比较符合规范 string始终代表 System.String(1.x) 或 :System.String(2.0) ,String只有在前面有using System;的时候并且当前命名空间中没有名为String的类型(class、struct、delegate、enum)的时候才代表System.String string是关键字,String不是,也就是说string不能作为类、结构、枚举、字段、变量、方法、属性的名称,而String可以。Convert.ToInt32(); 与Int32.Parse的区别Convert.ToInt32()与int.Parse()的区别(1)这两个方法的最大不同是它们对null值的处理方法: Convert.ToInt32(null)会返回0而不会产生任何异常,但int.Parse(null)则会产生异常。2)还有一点区别就是 a. Convert.ToInt32(double value) 如果 value 为两个整数中间的数字,则返回二者中的偶数;即 3.5转换为4,4.5 转换为 4,而 5.5 转换为 6。 不过4.6可以转换为5,4.4转换为4 b. int.Parse(4.5) 直接报错:输入字符串的格式不正确. c. int(4.6) = 4 Int转化其他数值类型为Int时没有四舍五入,强制转换 int.Parse是转换String为int Convert.ToInt32是转换继承自Object的对象为int的. 你得到一个object对象,你想把它转换为int,用int.Parse就不可以,要用Convert.ToInt32. 个人总结: (1)Convert.ToInt32的参数比较多,Int.Parse只能转换string类型的. (2)Parse就是把String转换成int,char,double.等,也就是*.Parse(string) 括号中的一定要是string. (3)Convert可以提供多种类型的转换,也就是Convert.*()括号中可以为很多种类型(包括string).2. Subst命令的使用Subst是DOS下的一个优秀的命令,它的可执行文件Substexe在C:Windowssystem32文件夹下(此路径指windows xp系统),其正规的中文名称应该是“给目录赋驱动器符命令”。它的功能是以磁盘驱动器符代替路径名称,以使驱动器符与指定的子目录路径等效。 其命令格式很简单:Subst Drive1 Drive2 Path ,subst R: C:LiuProjectGenKaRun其中“Drive1”是指定替代磁盘路径的虚拟的新驱动器符,“Drive2 Path”是指定所要替代的文件夹及其路径。用户可以利用它将任意目录虚拟成一个磁盘驱动器,如果用户需要删除虚拟的盘符,可以执行Subst Drive1 D命令。同时,并非所有的程序都可以正确使用Subst命令所生成的驱动器符,比如Format、Sys、Fdisk等一些如今还常用的命令,这些命令必须使用真实的驱动器,它们拒绝对Subst虚拟的驱动器进行操作。对于网络磁盘驱动器,Subst命令也是无能为力的。在dos命令提示符下执行subst命令虚拟增加的盘符,重启电脑或者注销电脑后,虚拟增加的盘符会消失,如果重启电脑或者注销电脑后盘符不消失,可以编辑批处理放在启动脚本里即可。网上说的是编辑系统根目录下的AUTOEXEC.BAT文件,在我的电脑上试过了,不行的,也许与另有原因吧。高级使用技巧初步了解了Subst命令的用途及用法,不妨再看看它的一些高级使用技巧:1隐藏驱动器Subst的看家本领是虚拟磁盘驱动器符,虽然微软建议用户采用没有使用的盘符进行虚拟,但并不表示它不能虚拟已经存在的盘符,比如A盘、C盘等。于是用户可以通过Subst命令虚拟A、C等盘符,直接覆盖这些已经存在的盘符,使他人无法看到该盘的真正内容,以达到隐藏真实驱动器的目的。例如,用户先在D盘根目录下创建一个名为“Aaa”的文件夹,最好将文件夹的属性设置为“只读”和“隐藏”。然后在C盘根目录下打开“Autoexecbat”文件,加入以下代码:Echo Off C Windowssystem32Subst A D Aaa这样每次在系统启动后软盘的图标就变为硬盘的样子,其中的内容也变了,从而实现偷梁换柱的目的。需要还原的时候,只需在MSDOS方式下,运行“SubstA D”就行了。2特殊软件的安装有少数软件在安装时会提示需要从A盘中提取安装信息,这时难道只有将文件拷贝到软盘后再安装吗?完全没有这个必要,Subst命令可以“欺骗”这些需要用软盘安装的软件。用户把软盘中的文件全部拷贝到硬盘上的任意文件夹中,再将该文件夹用Subst命令虚拟成A盘后,即可顺利安装。3模拟光盘自动运行目前大部分多媒体光盘都带有一个自动运行命令,方便了用户的使用。然而若将光盘上的所有内容全盘拷贝到硬盘上就不能正常运行。这时,用户可以将放置光盘内容的文件夹虚拟成光盘驱动器(Subst F D Guangpan,假设F 为光驱),则软件能正常运行。3. ASP.NET UseSubmitBehavior 属性如果该控件使用了客户端浏览器的提交机制,则为 true;否则为 false。默认值为 true。当 UseSubmitBehavior 属性为 false 时,控件开发人员可以使用 GetPostBackEventReference 方法来返回 Button 的客户端回发事件。GetPostBackEventReference 方法返回的字符串包含客户端函数调用的文本,可以插入到客户端事件处理程序中。Button控件的onclick、oncommand、commandname、CommandArgument的区别.Button控件Button控件在执行后被解析为代码,而Button控件的优点就在于提交程序的同时能够传递参数,传递参数是靠CommandName与CommandArgument属性来完成的。举两个Button控件的例子。public void Button_Click(Object sender,EventArgs e) string argName = (Button)sender).CommandName; /sender为一个对象,故CommandArgument为string string argArg = (Button)sender).CommandArgument; Label1.Text=您选中的动作为:+argName+,动作目标是:+argArg+;Button控件演示/public void Button_Click(Object sender,CommandEventArgs e) string argName = e.CommandName; /CommandEventArgsr为一个类,故CommandArgument.ToString(); string argArg = e.CommandArgument.ToString(); Label1.Text=您选中的动作为:+argName+,动作目标是:+argArg+;Button控件演示分析:1.两个程序用不同的方法完成相同的功能和效果。 2.类CommandEventArgs有两个公共属性,CommandName(用来获取命令的名称)和CommandArgument(用来获取命令的参数)。二者相互关联。 3.两个程序分别用OnClick与OnCommand激发事件,区别在于OnCommand是带值传递的。 4.所有Button类的Web控件(如ImageButton,LinkButton)均含有CommandName和CommandArgument这两个属性。问题:上文中两个程序采用的参数CommandEventArgs,EventArgs有什么区别?为什么在第一个程序中使用EventArgs,而不能使用CommandEventArgs(已经验证,出现“Button_Click”的重载均与委托“System.EventHandler”不匹配)?例子:/fuhengyu/blog/item/b37e14fb3e6055264e4aea65.html解决:在网上查资料得到的结果:这类问题出现的原因就是在控件的一些事件里面调用了函数,而这些函数的参数与该事件所要用到的参数类型不一致。在MSDN中搜索OnPageIndexChanging、OnPageIndexChanged等关键字就可以得到:C#protected virtual void OnPageIndexChanged (EventArgs e)C#protected virtual void OnPageIndexChanging (DetailsViewPageEventArgs e)C#protected virtual void OnRowDeleting (GridViewDeleteEventArgs e)C#protected virtual void OnRowDeleted ( DataRowChangeEventArgs e)这样,在何种事件中使用什么样的参数类型就一目了然了。还有后面的OnRowDeleted、OnRowDeleting也是同样的道理。相应事件:public void MyList_Page(object sender, GridViewPageEventArgs e)public void MyDataGrid_Delete(Object sender, GridViewDeleteEventArgs e)5.关闭子窗口刷新父窗口,并且走进!IsPostBack用window.open()打开子窗口时,刷新父窗口window.opener.location.href=window.opener.location.href;window.close();window.showModalDialog和window.open关闭子页面时刷新父页面 父窗体打开页面的javascriptfunctionGoToPage(id)vartitle=title;varurl=xxxxx.aspx?ID=+id+&Radom=+Math.random();varWidth=700;varHeight=600;vararguemnts=newObject();arguemnts.window=window;if(document.all&window.print)window.showModalDialog(url,arguemnts,dialogWidth:+Width+px;dialogHeight:+Height+px;center:yes;status:no;scroll:yes;help:no;);elsewindow.open(url,width=+Width+px,height=+Height+px,resizable=1,scrollbars=1);子页面执行代码后:Response.Write(window.dialogArguments.window.location=window.dialogArguments.window.location;);Response.Write(self.close(););如果是window.open打开的:Response.Write(window.opener.location.热reload(););Response.Write(window.opener=null;window.close(););6.关闭当前页面时刷新父页面最终解决办法 由于某种原因,原来页面里或项目的关闭子窗口刷新父页面的方法在有的项目里不好用。现在介绍一种在.net中的万能方法。1.在父页面中加一个隐藏的LinkButton(好像只有LinkButton会产生:_doPostBack()事件),不用设置它的Visible属性,只需把它显示的文字清空,如下所示:2.在这个LinkButton的单击事件中写你要处理的事情,如下所示:protected void btnFresh_Click(object sender, EventArgs e) 你要处理的事情; 3.在父页面的Page_Load事件中写:btnFresh.Attributes.Add(onfocus, javascript:_doPostBack(btnFresh,);)当Linkbutton获得焦点时触发单击事件4.在父页面中写如下JS!-function openwin(budgetyear,budgetitem,department)/弹出模态窗口var url = budget/budget_share2_share_e.aspx?budgetyear= +budgetyear+&budgetitem=+budgetitem+&department=+department;var option = dialogHeight: 500px, center: yes; status: no;help:no;var result = window.showModalDialog(url, option);if (result = OK) /子页面里的window.dialogArguments.returnValue = OK document.allbtnFresh.focus();/这样保证在子页面关闭时就给父页面的Linkbutton复了焦点,从而触发Linkbutton的单击事件5.在子页面里的确定按钮事件的最后面写上string strReturn=;strReturn+=window.dialogArguments.returnValue = OK;window.close();strReturn+=;this.Page.RegisterClientScriptBlock(,strReturn);Response.Expires简述默认情况下,ASP禁止了浏览器和代理的缓冲功能。如果有一个每次都不要更新的页面,就应该打开 浏览器和代理的缓冲,这将允许浏览器和代理在一段时间内使用该页面的“缓冲”拷贝数据。缓冲能够大大地减轻服务器的数据转载量,并提高用户的浏览性能。哪些类别的动态页面适合被缓存呢?下面是一些例子:天气页面,每5分钟更新一次 新闻或版本列表页面,每天更新2次 注意:使用浏览器或者代理缓存后,对Web服务器的点击次数就会减少。如果想精确地了解所有页面,或者对于邮递广告,就不适于使用浏览器和代理缓存了。浏览器缓存由HTTP“Expires”头参数控制,它由Web服务器发送给浏览器。ASP提供了2个简单的方法发送这个头部参数。设置页面在未来一定时间内到期,可以使用Response.Expires属性。下面的例子将告诉浏览器内容在10分钟后过期:设置Response.Expires为负数或者0,就禁止了缓存。对第2个属性Response.ExpiresAbsolute的设置,允许指定在一个特殊时间到来时内容过期。除了使用Response对象来设置到期时间,还可以在HTML文件头部写标记。尽管代理不会注意到这个标记,但是一些浏览器可以。最后,对于HTTP代理,使用Response.CacheControl可以指示是否缓存内容。设置属性为“Public”,打开代理缓存内容的功能。默认情况下,这个属性是设置成“Private”的。注意:不要让代理缓冲那些显示给特定用户的页面,因为代理可能会将属于其他用户的页面送给当前用户。 用base target =self(转载)在创建或修改布局复杂Asp.Net服务器端控件时,大量的时间都是在编译,等待JIT,修改,编译,JIT. 这样一个循环中,而且两个编译常常还很耗费时间。特别地,当控件已集成在页面之中后,在出现一些布局效果上的小偏差,再调整起来将是一个非常无趣和耗时的工作。 而这时如果能直接修改已输出的Html,很可能会更加迅速的找到问题所在。但是不幸的时,通过浏览器Save As出来的html代码显然是不太具有修改价值的。因为本来就只是要进行细微的布局调整,而Save As出来页面新的布局问题可能比本身要解决的问题更加严重。 那么就直接通过View Source把代码copy出来存为html文件呢?这时后我们会发现页面里面所有通过相对路径定位的资源都回丢失,比如什么图片啊,javascript啊等等,缺失了这些东西,页面也就同样失去了再调整编辑的价值。 在HTML中,有一个base标签,这个元素似乎只在模态窗口提交页面避免弹出新窗口的时候,有用到过,平时似乎很少有看到网页用这个元素。殊不知这个base在调试html代码时,非常有用。比如你的ASP.NET页面是/Index.aspx,而这个Index.aspx中显现有很多通过相对路径引用的图片或JavaScript资源,这时我们通过View Source把它的html代码在本地存为: index.htm文件,只用再在其标签中加入这么一行。我们再打开这个index.htm时,会发现这时和打开/Index.aspx的效果是一样的,所有的图片和脚本都正常被载入,这时候在IE Tool Bar等DOM查看工具帮助下,就可以很方便通过直接修改html来调整页面或控件输出的外观样式,在找到错误后再去服务器端代码中进行修改。使用模型窗口时,重复打开画面的解决方法最近项目中一个小问题卡了我不少时间。我遇到的问题是:在项目的弹出式的模型窗口里,我需要将数据提交到服务器。然后从服务器再返回到本页面。结果:返回了本页面,窗口却是从新打开的。现在来谈一下解决方法:书上说在模型窗口中加入标签即可。我把该标签放上去却没有任何反应,当时我不明白这为什么?后来经过查证原来这个属性有IE6与IE7之分。忘了说我的浏览器是IE7的。注:1、如果你是IE6,你将加入到标签里就可以了。2、如果你是IE7,你必须将加入到的对口中位置。代码示例: test . window.showModalDialog方式/模式窗口数据不刷新(缓存)问题window.showModalDialog方式 function ShowDialog(url) var iWidth=300; /窗口宽度 var iHeight=200;/窗口高度 var iTop=(window.screen.height-iHeight)/2; var iLeft=(window.screen.width-iWidth)/2; window.showModalDialog(url,window,dialogHeight: +iHeight+px; dialogWidth: +iWidth+px; dialogTop: +iTop+; dialogLeft: +iLeft+; resizable: no; status: no;scroll:no); 注意这里的第二个参数,window4.模式窗口数据不刷新(缓存)问题在jsp页面加入如下语句 5,模式窗口中,链接弹出新窗口问题在和间加入6.无提示关闭页面的方法function Close() var ua=navigator.userAgent var ie=navigator.appName=Microsoft Internet Explorer?true:false if(ie) var IEversion=parseFloat(ua.substring(ua.indexOf(MSIE )+5,ua.indexOf(;,ua.indexOf(MSIE ) if(IEversion 5.5) var str = str += ; document.body.insertAdjacentHTML(beforeEnd, str); document.all.noTipClose.Click(); else window.opener =null; window.close(); else window.close() response.expires一般情况下,当用户请求WEB服务器时,服务器把请求回复给客户端。在客户端,浏览器把缓存作为一种加快速度的策略,就是当请求时先检查缓存的情况,如果有就直接调缓存了,而不请求服务器了。 在WEB程序设计中,有时为了防止重复的提交或者严格的次序等,必须让用户的数据立即在使用后就过期,当用户后退时就显示过期而不能继续使用。也算是为安全考虑的吧。 一般,response.expires写在页面的最上端,后面跟的是一个时间,就是过期的时间,0表示立即过期。 -1也是一样的道理.即是-9999也是一样的Ajax(Asynchronous JavaScript + XML)的定义1. 2.3. RegisterStartupScript和RegisterClientScriptBlock输出位置的区别Page.Response.Write( var response; ); Page.RegisterStartupScript( RegisterStartupScript , var RegisterStartupScript; ); Page.RegisterClientScriptBlock( RegisterClientScriptBlock , var RegisterClientScriptBlock; ); Response.Write输出后的位置在源文件的第一行. RegisterClientScriptBlock输出后的位置会在 的下一行.(在自带的脚本和一些隐藏域之下). RegisterStartupScript输出后的位置会在 的上一行. RegisterClientScriptBlock的原型与RegisterStartupScript相同,两个函数不同在于将其包含的脚本代码写入到HTML文件的不同位置.RegisterClientScriptBlock在 Page 对象的 元素的开始标记后立即发出客户端脚本,RegisterStartupScript则是在Page 对象的 元素的结束标记之前发出该脚本。如果你的脚本有与页面对象(doucument对象)进行交互的语句,则推荐使用RegisterStartupScript,反之如果要想客户端脚本尽可能早的执行,则可以使用RegisterClientScriptBlock或Response.Write。 RegisterClientScriptBlock一般返回的是客户端函数的包装,而RegisterStartupScript返回得函数在document装载完成后会执行,类似于我们平时所说的body onload= f() 里面的函数;这两个方法在客户端呈现的代码位置不同,RegisterClientScriptBlock在 之后,而RegisterStartupScript在 之前。 补充例子:. function block() - RegisterClientScriptBlock()方法输出的在这里 function startup() - RegisterStartupScript()方法输出的在这里 有关一个.aspx文件中放置多个Form的疑问问:其实每个Form我已经用不同的ID来标识了,为什么还会出现这样的错误?难道ASP.Net不允许一个页面中存在多个Form吗?另外还想问一下,如果一个页面有多个Form,也就对应多个提交按钮,那么Page.IsValid值是如何判断的?答1:.NET下只能有一个唯一的form答2:.net默认在一个aspx文件中只能放一个form你如果要达到多表单效果,可以用容器,比如说:panel。panel控件就很好,我用过一些,你将需要显示的东西放在各个panel里,不想显示的只要将panel的visable属性设为false就行。这样就代替了多个form答3:ASP.NET只允许有一个runat=server的Form,但允许有不含runat=server的其它form存在,这跟ASP.NET的Page Framework的postback机制有关答4:你还是可以加传统的Form,但是不能在服务器端使用答5:Page.IsValid是对应RunAt=Server的那个Form,因为只有这个Form,Asp.Net会自动加上OnSubmit的Javascript在windowsserver2003下发附件,上传大文件注意事项? 在windowsserver2003下携带多个附件或者较大的附件进行发送时系统报错:Request对象错误ASP0104:80004005不允许操作出现上述信息,请进行如下操作:先在服务里关闭iisadminservice服务找到windowssystem32inesrv下的metabase.xml,打开,找到ASPMaxRequestEntityAllowed把他修改为需要的值,默认为204800,即200K然后重启iisadminservice服务把它修改为51200000windowsserver2003 iis6.0 相对路径的解决方案(1)JavaScript 相对路径初始写法,次写法在IIS6.0中不认因此改为以下写法script type=text/javascript src= 也可以用ResolveUrl(/.);(2)在IIS中 属性-主目录-配置-选项中。把”启用父路径“前面打上勾。确认刷新。脚本发生错误 res:/ieframe.dll/aboutXP.dlg我在IE7中打开帮助-关于Internet Exploer-就会出现出错提示,存储空间不足 无法完成此项操作是因为注册表中IE相关的User-Agent等子项含非标准无效键值,超出默认的字符空间,以至于出错的,这些键值通常是由安装第三方浏览器造成的你这样处理:运行注册表,将“HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionInternet SettingsUser Agent”项下都删除了就没问题了。解决IIS写Excel的权限问题2008-12-24 09:36补充:使用以上方法必须对dcom进行配置,给用户使用office的权限。 具体配置方法如下: 1:在服务器上安装office的Excel软件. 2:在开始-运行中输入dcomcnfg.exe启动组件服务 3:依次双击组件服务-计算机-我的电脑-DCOM配置 4:在DCOM配置中找到Microsoft Excel 应用程序,在它上面点击右键,然后点击属性,弹出Microsoft Excel 应用程序属性对话框 5:点击标识标签,选择交互式用户 6:点击安全标签,在启动和激活权限上点击自定义,然后点击对应的编辑按钮,在弹出的安全性对话框中填加一个NETWORK SERVICE用户(注意要选择本计算机名),并给它赋予本地启动和本地激活权限. 7:依然是安全标签,在访问权限上点击自定义,然后点击编辑,在弹出的安全性对话框中也填加一个NETWORK SERVICE用户,然后赋予本地访问权限. 这样,我们便配置好了相应的Excel的DCOM权限. 注意:我是在WIN2003上配置的,在2000上,是配置ASPNET用户若不进行配置会出现错误 检索 COM 类工厂中 CLSID 为 00024500-0000-0000-C000-000000000046 的组件时失败,原因是出现以下错误: 80070005。 原因是用户没有使用Excel的权限。 导出到word同样要配置使用word的权限。败,原因是出现以下错误: 80070005 症状:oWordApplic = New Word.Application当程序运行到这句时出现下面的错误:检索 COM 类工厂中 CLSID 为 000209FF-0000-0000-C000-000000000046 的组件时失败,原因是出现以下错误: 80070005。oWordApplic = New Word.Application当程序运行到这句时出现下面的错误:检索 COM 类工厂中 CLSID 为 000209FF-0000-0000-C000-000000000046 的组件时失败,原因是出现以下错误: 80070005。 解决方法一:控制面板管理工具组件服务计算机我的电脑DCom配置找到Microsoft Word文档之后单击属性打开此应用程序的属性对话框。 2. 单击标识选项卡,然后选择交互式用户。 3.单击安全选项卡,分别在启动和激活权限和访问权限组中选中自定义,然后自定义-编辑-添加ASP.NET账户和IUSER_计算机名* 这些帐户仅在计算机上安装有 IIS 的情况下才存在。 13. 确保允许每个用户访问,然后单击确定。 14. 单击确定关闭 DCOMCNFG。解决方法二:如果上述方法不能解决问题,就应该是权限问题,请尝试用下面的方法:在web.config中使用身份模拟,在节中加入 此处我用的超级用户测试的-通过。ViewStatestatic就在当前页面中保存数据的. 谨慎A中static变量的用法2008-12-11 11:44像session.是会话级别的.只要会话没有过期.session中存的数据就在. viewstate是页面级别的.只要这个页面在.viewstate中存的数据就在. 在.Net平台下进行CS软件开发时,我们经常遇到以后还要用到某些变量上次修改后的值,为了简单起见,很多人都习惯用static来定义这些变量,我也是。这样非常方便,下一次调用某个函数时该变量仍然保存的是处理过的值,直接拿来用就可以了。 现在转入了BS软件开发,我们很自然地会沿用这种习惯。如在页面中统计某个按钮被按下的次数,先在类中OnClick事件的处理过程前定义一static变量times,则每次调用该按钮的OnClick事件时,令times增1即可,非常方便: C#:.static int times=0;.private void Button1_Click(object sender,EventArgs e) times+; Label1.Text=times.ToString(); 在我们庆幸如此方便之余,就未曾意识到我们已经埋下了一棵难以察觉的定时炸弹。为什么哪? 这还要从A的运行机制谈起。在CS模式软件开发过程中,我们通常不会关心应

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论