344791576
344791576
关注数: 20
粉丝数: 79
发帖数: 625
关注贴吧数: 23
1111
马头爱吧 马头人的最爱。
因为此版本的应用程序不支持其项目类型(.csproj)的解决方法 因为此版本的应用程序不支持其项目类型(.csproj),若要打开它,请使用支持此类型项 有的时候vs无缘无故的出现如下错误:"因为此版本的应用程序不支持其项目类型(.csproj),若要打开它,请使用支持此类型项目的版本" 解决办法:如果是这个提示,可能是由于你安装mssql是否导致的 问题 在命令行中请运行: devenv.exe /resetskippkgs 即可恢复
C# 上传多个附件 <%@ Page Language="c#" CodeBehind="MultiAttchments.aspx.cs" AutoEventWireup="false" Inherits="WebApplication3.MultiAttchments" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <html> <head> <script> function AddAttachments() { document.getElementById('attach').innerText = "继续添加附件"; tb = document.getElementById('attAchments'); newRow = tb.insertRow(); newRow.insertCell().innerHTML = "<input name='File' size='50' type='file'> <input type=button value='删除' onclick='delFile(this.parentElement.parentElement.rowIndex)'>"; } function delFile(index) { document.getElementById('attAchments').deleteRow(index); tb.rows.length > 0?document.getElementById('attach').innerText = "继续添加附件":document.getElementById('attach').innerText = "添加附件"; } </script> </head> <body ms_positioning="GridLayout"> <form id="form1" method="post" runat="server" enctype="multipart/form-data"> <div> <table id="attAchments"> </table> </div> <span> <img src="icoAddFl.gif"> </span><a id="attach" style="font-family: 宋体; font-size: 9pt;" title="如果您要发送多个附件,您只需多次点击“继续添加附件”即可, 要注意附件总量不能超过发送限制的大小。"
javascript特效隔几秒一换图片 这是JS:(放到<head></head>内) <script language="JavaScript"> <!-- function MM_preloadImages() { //v3.0 var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array(); var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++) if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}} } function MM_swapImgRestore() { //v3.0 var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc; } function MM_swapImage() { //v3.0 var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3) if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];} } function MM_jumpMenu(targ,selObj,restore){ //v3.0 eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'"); if (restore) selObj.selectedIndex=0; } function MM_findObj(n, d) { //v4.01 var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) { d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);} if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n]; for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); if(!x && d.getElementById) x=d.getElementById(n); return x; } //--> </script> 调用: <img src="images/qjy-1.jpg" width="257" height="183" id="swap"> <script> var imageURL=new Array("qjy-1.jpg","qjy-2.jpg","qjy-3.jpg","qjy-4.jpg","qjy-5.jpg","qjy-6.jpg"); var i=0; setInterval("swap.src='images/'+imageURL[i]; if(i<imageURL.length-1) {i++} else {i=0}",2000); </script>
VS2008 打不开.csproj 的解决方法 如果VS提示你说 不支持………… 之类的? 如果是这个提示,可能是由于你安装mssql是否导致的 问题 请运行: devenv.exe /resetskippkgs 即可恢复
C# Eval在asp.net中的用法及作用 Eval( " ")和Bind( " ") 这两种一个单向绑定,一个双向绑定,bind是双向绑定,但需数据源支持 ASP.NET 2.0改善了模板中的数据绑定操作,把v1.x中的数据绑定语法DataBinder.Eval(Container.DataItem, fieldname)简化为Eval(fieldname)。Eval方法与DataBinder.Eval一样可以接受一个可选的格式化字符串参数。缩 短的Eval语法与DataBinder.Eval的不同点在于,Eval会根据最近的容器对象(例如DataListItem)的DataItem属性 来自动地解析字段,而DataBinder.Eval需要使用参数来指定容器。由于这个原因,Eval只能在数据绑定控件的模板中使用,而不能用于 Page(页面)层。当然,ASP.NET 2.0页面中仍然支持DataBinder.Eval,你可以在不支持简化的Eval语法的环境中使用它。 下面的例子演示了如何使用新的简化的Eval数据绑定语法绑定到DataList数据项模板(ItemTemplate)中的Image、Label和HyperLink控件。 代码 <asp:DataList ID="DataList1 " RepeatColumns="5 " Width="600 " runat="server " DataSourceID="ObjectDataSource1 "> <ItemTemplate> <asp:HyperLink ID="HyperLink1 " runat="server " NavigateUrl='<%# Eval( "PhotoID ", "PhotoFormViewPlain.aspx?ID={0} ")%>'> <asp:Image ID= "Image1 " Runat= "server " ImageUrl= <%# Eval( "FileName ", "images/thumbs/{0} ")%>/></asp:HyperLink> <asp:Label ID="CaptionLabel " runat="server " Text='<%# Eval( "Caption ") %>' /> </ItemTemplate> </asp:DataList><br /> <asp:ObjectDataSource ID="ObjectDataSource1 " runat="server " TypeName="DataComponentTableAdapters.PhotosTableAdapter " SelectMethod="GetPhotosForAlbum "> 数据绑定也可以作为控件的主题定义(theme definition)的一部分,这样我们就可以通过改变主题来随意地改变模板化控件的布局和外观。但是Theme(主题)模板中只能使用Eval(或者 后面讨论的Bind)。绑定到任意的用户代码是被禁止的。 1.DataBinder.Eval用法 //显示二位小数 <%# DataBinder.Eval(Container.DataItem, "UnitPrice", "${0:F2}") %> //{0:G}代表显示True或False 代码 <ItemTemplate> <asp:Image Width="12" Height="12" Border="0" runat="server" AlternateText='<%# DataBinder.Eval(Container.DataItem, "Discontinued", "{0:G}") %>' ImageUrl='<%# DataBinder.Eval(Container.DataItem, "Discontinued", "~/images/{0:G}.gif") %>' /></ItemTemplate>
C#操作office Excel public class ImportExportToExcel { private string strConn ; private System.Windows.Forms.OpenFileDialog openFileDlg=new System.Windows.Forms.OpenFileDialog(); private System.Windows.Forms.SaveFileDialog saveFileDlg=new System.Windows.Forms.SaveFileDialog(); public ImportExportToExcel() { // // TODO: 在此处添加构造函数逻辑 // this.openFileDlg.DefaultExt = "xls"; this.openFileDlg.Filter = "Excel文件 (*.xls)|*.xls"; this.saveFileDlg.DefaultExt="xls"; this.saveFileDlg.Filter= "Excel文件 (*.xls)|*.xls"; } 从Excel文件导入到DataSet#region 从Excel文件导入到DataSet // /// <summary> // /// 从Excel导入文件 // /// </summary> // /// <param name="strExcelFileName">Excel文件名</param> // /// <returns>返回DataSet</returns> // public DataSet ImportFromExcel(string strExcelFileName) // { // return doImport(strExcelFileName); // } /**//// <summary> /// 从选择的Excel文件导入 /// </summary>
C#获取文件对应的系统图标【图标是以图片形式保存的】 //得到path路径指向的文件对应系统的图标然后转换成位图格式 Bitmap bitmap = Icon.ExtractAssociatedIcon(path).ToBitmap(); //在把位图格式的文件转换成image格式,方法中用到的aa是一个方法,随便写一个返回bool类型的方法就可以了 Image image = bitmap.GetThumbnailImage( Icon.ExtractAssociatedIcon(path).Width, Icon.ExtractAssociatedIcon(path).Height, new Image.GetThumbnailImageAbort(aa), new IntPtr()); //将图片保存到根目录 image.Save("aa.gif");
C#代码创建icon图标,该图标对应path路径中的文件图标 Icon icon = Icon.ExtractAssociatedIcon(path); 上面的path是文件路径
在winform中使用程序读取和修改App.config里面的appSettings节点 在winform中使用程序读取和修改App.config里面的appSettings当中的Value值 这里我写成了两个方法,以供大家参考! 一,命名空间 using System; using System.Configuration; using System.Xml; 二,方法 //读取Value值 public static string GetConfigString(string key) { // // TODO: 在此处添加构造函数逻辑 // return ConfigurationSettings.AppSettings[key]; } //写操作 public static void SetValue(string AppKey,string AppValue) { XmlDocument xDoc = new XmlDocument(); //获取可执行文件的路径和名称 xDoc.Load(System.Windows.Forms.Application.ExecutablePath + ".config"); XmlNode xNode; XmlElement xElem1; XmlElement xElem2; xNode = xDoc.SelectSingleNode("//appSettings"); xElem1 = (XmlElement)xNode.SelectSingleNode("//add[@key='" + AppKey + "']"); if ( xElem1 != null ) xElem1.SetAttribute("value",AppValue); else { xElem2 = xDoc.CreateElement("add"); xElem2.SetAttribute("key",AppKey); xElem2.SetAttribute("value",AppValue); xNode.AppendChild(xElem2); } xDoc.Save(System.Windows.Forms.Application.ExecutablePath + ".config"); }
轻松掌握SQL Sever中各种语句的完整语法 下列语句部分是Mssql语句,不可以在access中使用。 SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句: 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' --- 开始 备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(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 tabname 6、说明: 增加一个列:Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、说明: 添加主键:Alter table tabname add primary key(col) 说明: 删除主键:Alter table tabname drop primary key(col) 8、说明: 创建索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname 注:索引是不可更改的,想更改必须删除重新建。 9、说明: 创建视图:create view viewname as select statement 删除视图:drop view viewname 10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert 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 运算符
Microsoft SQL Server 2008 Express版本 具有高级服务的 Microsoft SQL Server 2008 Express (SQL Server 2008 Express) 是一种免费、易用的 SQL Server Express 版本,它包括图形管理工具,并提供了用于报表和基于文本的高级搜索的强大功能。SQL Server 2008 Express 提供强大而可靠的数据管理工具,它功能丰富,能够保护数据并提高性能.它是小型服务器应用程序和本地数据存储区的理想选择。 具有高级服务的 SQL Server 2008 Express 具备 SQL Server 2008 Express 中的全部功能,此外,您还可以: * 借助 SQL Server 2008 Management Studio Basic 这一易于使用的图形管理工具,轻松管理 SQL Server 2008 Express. * 对 SQL Server 表中纯字符数据发出全文查询.全文查询可以包括词和短语,或者词或短语的多种形式. * 对本地关系数据运行 SQL Server Reporting Services 报表. 具有高级服务的 SQL Server 2008 Express 作为应用程序的嵌入部分,可以免费下载、免费部署和免费再分发,使用它可轻松快速地开发和管理具有强大内置报表和全文搜索功能的数据驱动应用程序. 下载:具有高级服务的 Microsoft? SQL Server? 2008 Express
Sql server STUFF的用法 一个整数值,指定删除和插入的开始位置。如果 start 或 length 为负,则返回空字符串。如果 start 比第一个 character_expression 长,则返回空字符串。start 可以是 bigint 类型。 STUFF ( character_expression , start , length ,character_expression ) 参数 character_expression 一个字符数据表达式。character_expression 可以是常量、变量,也可以是字符列或二进制数据列。 start 一个整数值,指定删除和插入的开始位置。如果 start 或 length 为负,则返回空字符串。如果 start 比第一个 character_expression 长,则返回空字符串。start 可以是 bigint 类型。 length 一个整数,指定要删除的字符数。如果 length 比第一个 character_expression 长,则最多删除到最后一个 character_expression 中的最后一个字符。length 可以是 bigint 类型。 返回类型 如果 character_expression 是受支持的字符数据类型,则返回字符数据。如果 character_expression 是一个受支持的 binary 数据类型,则返回二进制数据。 备注 如果开始位置或长度值是负数,或者如果开始位置大于第一个字符串的长度,将返回空字符串。如果要删除的长度大于第一个字符串的长度,将删除到第一个字符串中的第一个字符。 如果结果值大于返回类型支持的最大值,则产生错误。 示例 以下示例在第一个字符串 abcdef 中删除从第 2 个位置(字符 b)开始的三个字符,然后在删除的起始位置插入第二个字符串,从而创建并返回一个字符串。 1SELECT STUFF('abcdef', 2, 3, 'ijklmn'); 2GO 下面是结果集: aijklmnef
动态SQL简介 介绍的嵌入式SQL语句为编程提供了一定的灵活性,使用户可以在程序运行过程中根据实际需要输入WHERE子句或HAVING子句中某些变量的值。这些SQL语句的共同特点是,语句中主变量的个数与数据类型在预编译时都是确定的,只有主变量的值是程序运行过程中动态输入的,我们称这类嵌入式SQL语句为静态SQL语句。 静态SQL语句提供的编程灵活性在许多情况下仍显得不足,有时候我们需要编写更为通用的程序。例如,查询学生选课关系SC,任课教师想查选修某门课程的所有学生的学号及其成绩,班主任想查某个学生选修的所有课程的课程号及相应成绩,学生想查某个学生选修某门课程的成绩,也就是说查询条件是不确定的,要查询的属性列也是不确定的,这时就无法用一条静态SQL语句实现了。 实际上,如果在预编译时下列信息不能确定,我们就必须使用动态SQL技术: ·SQL语句正文 ·主变量个数 ·主变量的数据类型 ·SQL语句中引用的数据库对象(例如列、索引、基本表、视图等) 动态SQL方法允许在程序运行过程中临时“组装”SQL语句,主要有三种形式: (1) 语句可变。可接收完整的SQL语句。即允许用户在程序运行时临时输入完整的SQL语句。 (2) 条件可变。 对于非查询语句,条件子句有一定的可变性。例如删除学生选课记录,既可以是因某门课临时取消,需要删除有关该课程的所有选课记录,也可以是因为某个学生退学,需要删除该学生的所有选课记录。 对于查询语句,SELECT子句是确定的,即语句的输出是确定的,其他子句(如WHERE子句、HAVING短语)有一定的可变性。例如查询学生人数,可以是查某个系的学生总数,查某个性别的学生人数,查某个年龄段的学生人数,查某个系某个年龄段的学生人数等等,这时SELECT子句的目标列表达式是确定的(COUNT(*)),但WHERE子句的条件是不确定的。 (3) 数据库对象、查询条件均可变。对于查询语句,SELECT子句中的列名、FROM子句中的表名或视图名、WHERE子句和HAVING短语中的条件等等均可由用户临时构造,即语句的输入和输出可能都是不确定的。例如我们前面查询学生选课关系SC的例子。对于非查询语句,涉及的数据库对象及条件也是可变的。 这几种动态形式几乎可覆盖所有的可变要求。为了实现上述三种可变形式,SQL提供了相应的语句,例如EXECUTE IMMEDIATE、PREPARE、EXECUTE、DESCRIBE等。使用动态SQL技术更多的是涉及程序设计方面的知识,而不是SQL语言本身,所以这里就不详细介绍了,有兴趣的读者可以参阅有关书籍。
用Javascript制作鼠标移动跟随 常在一些网站中看到,鼠标在网页上移到时,有一行文字、一张小图片或一个小动画总是跟着鼠标,除非把鼠标移出页面,否则,它就总是紧跟鼠标不放。你知道这种效果是怎么做出来的吗?你可能感到比较复杂。其实它是用Javascript编一段小程序来实现的,且程序也不长,也比较好理解。下面让我们来揭下它的面纱看看。 程序思路:图层可以用绝对坐标来确定其在页面中的位置,那么我们把图片、动画或文字放到图层上,再想办法动态获取鼠标的当前位置,再把图层移到鼠标的当前位置,那图层上的内容(图片、动画或文字)不也就移到当前鼠标的位置了吗?这样就达到了图片、动画或文字随鼠移动的目的了。 一、一个简单的图片、动画或文字随鼠标移动的例子 制作方法: 1、在 Dreamweaver3中,插入一个图层,在图层上写上要跟随鼠标移到的文字或图片。 2、在图层的属性面板上把“Layer ID”(图层的ID号)改为“div1”,以便程序操作;“T”值改为“-50”,使其初始位置在页面外;“Z-index”(层序号)值改为“50”,使其在最上层,不被其它层遮盖。完成后的图层代码如下,不是使用 Dreamweaver的网友可把代码复制到标记的后面: 〈div id="div1" style="position:absolute; left:250px; top:118px; width:60px; height:37px; z-index:"50"〉〈img src="image/0050.gif" width="32" height="32"〉图、文跟鼠标试验〈/div〉 ,这里的图片和文字可换成你所需要的。 3、在〈head〉与〈/head〉之间加上这样一段程序: 〈SCRIPT language="javascript"〉 〈!-- var x,y; //声明存放当前鼠标位置坐标的变量 var can=0 //声明能否移动的控制变量 function canmove() { //控制能否移动的函数 x=document.body.scrollLeft+event.clientX; //获取当前鼠标位置的X坐标 y=document.body.scrollTop+event.clientY; //获取当前鼠标位置的Y坐标 can=1;} //设置为可以移动 function move() { //移动图层的函数 if (can) { div1.style.posLeft=x+20; //设置图层位置的X坐标 div1.style.posTop=y;} // 设置图层位置的Y坐标 setTimeout("move()",30)} //每30毫秒刷新一次图层位置坐标 --〉 〈/SCRIPT〉 只要这几行代码就能使图片或文字跟着鼠标跑,有点出乎意料吧!事实就是这么简单。当然,这是最简单的一种,你可能看到的有些网页上的效果在移动的过程比这要复杂一些,但都是在这个基础上增加一些移动的变化过程而已。 4、当然要使真正的效果出现,还得在〈body〉标记中加上触发事件调用程序,使程序动作起来。在〈body〉标记中加上代码: ,前一个函数的作用是在网页加载时就调用“move()”程序,使其开始刷新图层的位置坐标;后一个事件的作用是,一旦在页面上移动鼠标,就重新计算它的位置坐标。 二、稍复杂一点的效果 在上例的基础上稍作一些改动,可获得更好的效果,如使“欢迎光临!”这几个字不仅是分开移动,在移到新位置后,还不停地左右移动,似乎在列队欢迎。要实现移动过程的变化,就要把每个文字分开,一个图层放一个字(或一张图片),然后分开移动到新的位置。所以为了方便,用数组来存放图层的位置坐标。另外,由于图层较多,插入图层比较麻烦,也会使代码大增加,因此采用了动态编写图层代码的办法。制作方法如下: 1、在〈head〉与〈/head〉之间插入下面这段程序:
javascript鼠标事件汇总 事 件 触发时机 一般事件 onclick 鼠标单击时触发此事件 ondblclick 鼠标双击时触发此事件 onmousedown 按下鼠标时触发此事件 onmouseup 鼠标按下后松开鼠标时触发此事件 onmouseover 当鼠标指针移动到某对象范围的上方时触发此事件 onmousemove 鼠标移动时触发此事件 onmouseout 当鼠标指针离开某对象范围时触发此事件 onkeypress 当键盘上的某个键被按下并且释放时触发此事件 onkeydown 当键盘上某个按键被按下时触发此事件 onkeyup 当键盘上某个按键被按放开时触发此事件 页面相关事件 onabort 图片在下载时被用户中断 onbeforeunload 当前页面的内容将要被改变时触发此事件 onerror 出现错误时触发此事件 onload 页面内容完成时触发此事件 onmove 浏览器的窗口被移动时触发此事件 onresize 当浏览器的窗口大小被改变时触发此事件 onscroll 浏览器的滚动条位置发生变化时触发此事件 onstop 浏览器的停止按钮被按下时触发此事件或者正在下载的文件被中断 onunload 当前页面将被改变时触发此事件 表单相关事件 onblur 当前元素失去焦点时触发此事件 onchange 当前元素失去焦点并且元素的内容发生改变而触发此事件 onfocus 当某个元素获得焦点时触发此事件 onreset 当表单中RESET的属性被激发时触发此事件 onsubmit 一个表单被递交时触发此事件 滚动字幕事件 onbounce 在Marquee内的内容移动至Marquee显示范围之外时触发此事件 onfinish 当Marquee元素完成需要显示的内容后触发此事件 onstart 当Marquee元素开始显示内容时触发此事件 编辑事件 onbeforecopy 当页面当前被选择内容将要复制到浏览者系统的剪贴板前触发此事件 onbeforecut 当页面中的一部分或者全部的内容将被移离当前页面[剪贴]并移动到浏览者的系统剪贴板时触发此事件 续表 事 件 触发时机 编辑事件 onbeforeeditfocus 当前元素将要进入编辑状态 onbeforepaste 内容将要从浏览者的系统剪贴板传送[粘贴]到页面中时触发此事件 onbeforeupdate 当浏览者粘贴系统剪贴板中的内容时通知目标对象 oncontextmenu 当浏览者按下鼠标右键出现菜单时或者通过键盘的按键触发页面菜单时触发的事件 oncopy 当页面当前的被选择内容被复制后触发此事件 oncut 当页面当前的被选择内容被剪切时触发此事件 ondrag 当某个对象被拖动时触发此事件 [活动事件] ondragdrop 一个外部对象被鼠标拖进当前窗口或者帧触发此事件 ondragend 当鼠标拖动结束时触发此事件,即鼠标的按钮被释放了 ondragenter 当被鼠标拖动的对象进入其容器范围内时触发此事件 ondragleave 当被鼠标拖动的对象离开其容器范围内时触发此事件 ondragover 当某被拖动的对象在另一对象容器范围内拖动时触发此事件 ondragstart 当某对象将被拖动时触发此事件 ondrop 在一个拖动过程中,释放鼠标键时触发此事件 onlosecapture 当元素失去鼠标移动所形成的选择焦点时触发此事件 onpaste 当内容被粘贴时触发此事件 onselect 当文本内容被选择时触发此事件 onselectstart 当文本内容选择将开始发生时触发的事件 外部事件 onafterprint 当文档被打印后触发此事件 onbeforeprint 当文档即将打印时触发此事件 onfilterchange 当某个对象的滤镜效果发生变化时触发的事件 onhelp 当浏览者按下F1键或者浏览器的帮助选择时触发此事件 onpropertychange 当对象的属性之一发生变化时触发此事件 onreadystatechange 当对象的初始化属性值发生变化时触发此事件
SQL命令简易查询 --语 句 功 能 --数据操作 SELECT --从数据库表中检索数据行和列 INSERT --向数据库表添加新数据行 DELETE --从数据库表中删除数据行 UPDATE --更新数据库表中的数据 --数据定义 CREATE TABLE --创建一个数据库表 DROP TABLE --从数据库中删除表 ALTER TABLE --修改数据库表结构 CREATE VIEW --创建一个视图 DROP VIEW --从数据库中删除视图 CREATE INDEX --为数据库表创建一个索引 DROP INDEX --从数据库中删除索引 CREATE PROCEDURE --创建一个存储过程 DROP PROCEDURE --从数据库中删除存储过程 CREATE TRIGGER --创建一个触发器 DROP TRIGGER --从数据库中删除触发器 CREATE SCHEMA --向数据库添加一个新模式 DROP SCHEMA --从数据库中删除一个模式 CREATE DOMAIN --创建一个数据值域 ALTER DOMAIN --改变域定义 DROP DOMAIN --从数据库中删除一个域 --数据控制 GRANT --授予用户访问权限 DENY --拒绝用户访问 REVOKE --解除用户访问权限 --事务控制 COMMIT --结束当前事务 ROLLBACK --中止当前事务 SET TRANSACTION --定义当前事务数据访问特征 --程序化SQL DECLARE --为查询设定游标 EXPLAN --为查询描述数据访问计划 OPEN --检索查询结果打开一个游标 FETCH --检索一行查询结果 CLOSE --关闭游标 PREPARE --为动态执行准备SQL 语句 EXECUTE --动态地执行SQL 语句 DESCRIBE --描述准备好的查询 ---局部变量 declare @id char(10) --set @id = '10010001' select @id = '10010001' ---全局变量 ---必须以@@开头 --IF ELSE declare @x int @y int @z int select @x = 1 @y = 2 @z=3 if @x > @y print 'x > y' --打印字符串'x > y' else if @y > @z print 'y > z' else print 'z > y' --CASE use pangu update employee set e_wage = case when job_level = '1' then e_wage*1.08 when job_level = '2' then e_wage*1.07 when job_level = '3' then e_wage*1.06 else e_wage*1.05 end --WHILE CONTINUE BREAK declare @x int @y int @c int select @x = 1 @y=1 while @x < 3 begin print @x --打印变量x 的值 while @y < 3 begin select @c = 100*@x + @y print @c --打印变量c 的值 select @y = @y + 1 end select @x = @x + 1 select @y = 1 end --WAITFOR --例 等待1 小时2 分零3 秒后才执行SELECT 语句 waitfor delay '01:02:03' select * from employee --例 等到晚上11 点零8 分后才执行SELECT 语句 waitfor time '23:08:00' select * from employee ***SELECT*** select *(列名) from table_name(表名) where column_name operator value ex:(宿主) select * from stock_information where stockid = str(nid) stockname = 'str_name' stockname like '% find this %' stockname like '[a-zA-Z]%' --------- ([]指定值的范围) stockname like '[^F-M]%' --------- (^排除指定范围)
javascript(JS)完全控制Select下拉框 1<select id="mysel" name="mysel"> 2 <option value="1">1 xxxxxxxxxx</option> 3 <option value="2">2 yyyyyyyyyy</option> 4 <option value="3">3 zzzzzzzzzz</option> 5 <option value="4">4 wwwwwwwwww</option> 6</select> 7<button onclick="setSel(3)">设置第3项为选中项</button> 8<button onclick="clearSel()">清空选择框</button> 9<button onclick="fillSel()">填充选择框</button> 10<button onclick="removeSel()">移除第一项</button> 11<button onclick="editSel()">修改第一项</button> 12 13<script type="text/javascript"> 14 function setSel(str){ 15 with(document.all){ 16 for(var i=0;i<mysel.options.length;i++){ 17 if (mysel.options.value==str){ 18 mysel.selectedIndex=i; 19 break; 20 } 21 } 22 } 23 } 24 25 26 function clearSel(){ 27 with(document.all){ 28 mysel.options.length=0; 29 } 30 } 31 32 function fillSel(){ 33 with(document.all){ 34 mysel.options.length=0; 35 mysel.options[0] = new Option("1 xxxxxxxxxx","1"); 36 mysel.options[1] = new Option("2 yyyyyyyyyy","2"); 37 mysel.options[2] = new Option("3 zzzzzzzzzz","3"); 38 mysel.options[3] = new Option("4 wwwwwwwwww","4"); 39 mysel.options[4] = new Option("5 aaaaaaaaaa","5"); 40 41 mysel.selectedIndex = 4; 42 } 43 } 44 45 function removeSel(){ 46 with(document.all){ 47 mysel.remove(0); 48 if (mysel.options.length>0){ 49 mysel.selectedIndex=0; 50 } 51 } 52 } 53 54 function editSel(){ 55 with(document.all){ 56 if (mysel.options.length>0){ 57 mysel.options[0] = new Option("这是新的第一项","new Value") 58 mysel.selectedIndex=0; 59 } 60 } 61 } 62</script>
C#中Const与readyOnly的区别 const就是一个包含不能修改值的变量,常数表达式是在编译时可别完全计算的表达式。因此不能从一个变量提取出的值来初始花常量,也就是常量不能通过变量来初始化。readyOnly允许把一个字段设置成变量,但可以执行一些计算,可以确定它的初始值。因为readyOnly是在计算时运行的,当然它可以使用某些变量初始化。readyOnly是实例成员,所以类的不同实例可以有不同的常量值,这使得readyOnly更加的灵活。 readyOnly关键字与const关键字的不同: 1、const字段只能在该字段的声明中初始化。readyOnly可以在声明和构造函数中初始化。因此,根据所使用的构造函数,readyOnly可能具有不同的值。 2、const是编译时常数,而readyOnly可以做运行时常数。 3、const默认就是静态的,而readyOnly如果设置成静态的就必须显示声明。 4、const对于引用类型的常数,可能的值只能是string和null,而readyOnly可以是任何类型。 * 需要注意的一个问题是: 对于一个 readonly 的 Reference 类型,只是被限定不能进行赋值(写)操作而已。而对其成员的读写仍然是不受限制的。 public static readonly Class1 my = new Class1(); … my.SomeProperty = 10; //正常 my = new Class1(); //出错,该对象是只读的 但是,如果上例中的 Class1 不是一个 Class 而是一个 struct,那么后面的两个语句就都会出错。 static readonly: Java 中 static 是当载入一个类时执行一次的。 C#中是怎么执行的,我没有查到。很奇怪几乎每本java的书都会说static的问题,C#的往往只说怎么用,但是应该是在main函数调用之前初始化,所以static readonly也是运行时的,可以用变量付值,如: private static readonly string path = System.Windows.Forms.Application.StartupPath + “aaa”;
js获取下拉框的值以及下拉框的显示 <select name="count" id="count" onChange="showCount(this)"> <option value="1">10</option> <option value="2">20</option> <option value="3">30</option> <option value="4">50</option> <option value="5">100</option> </select> <script language=javascript> function showCount(e){ { var aa = e.value;//这里是获取option中的value的值 var bb = e.options(e.selectedIndex).text;//这里是获取下拉列表中的数据。 } </script> 如果要是进行编辑,显示下拉框中的选中的值: <select name="count" id="count" onChange="showCount(this)"> <option value="1" <%="1".equal(bb)?"selected":""%>>10</option> <option value="2" <%="2".equal(bb)?"selected":""%>>20</option> <option value="3" <%="3".equal(bb)?"selected":""%>>30</option> <option value="4" <%="4".equal(bb)?"selected":""%>>50</option> <option value="5" <%="5".equal(bb)?"selected":""%>>100</option> </select>
Convert.ToInt32和int.Parse区别 Convert.ToInt32()与int.Parse()的区别(1)这两个方法的最大不同是它们对null值的处理方法: Convert.ToInt32(null)会返回0而不会产生任何异常,但int.Parse(null)则会产生异常。 没搞清楚Convert.ToInt32和int.Parse()的细细微区别时千万别乱用,否则可能会产生无法预料的结果,举例来说:假如从url中取一个参数page的值,我们知道这个值是一个int,所以即可以用Convert.ToInt32(Request.QueryString["page"]),也可以用,int.Parse(Request.QueryString["page"]),但是如果page这个参数在url中不存在,那么前者将返回0,0可能是一个有效的值,所以你不知道url中原来根本就没有这个参数而继续进行下一下的处理,这就可能产生意想不到的效果,而用后一种办法的话没有page这个参数会抛出异常,我们可以捕获异常然后再做相应的处理,比如提示用户缺少参数,而不是把参数值当做0来处理。 (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).
C#构造函数与析构函数 构造函数与析构函数是一个类中看似较为简单的两类函数,但在实际运用过程中总会出现一些意想不到的运行错误。本文将较系统的介绍构造函数与析构函数的原理及在C#中的运用,以及在使用过程中需要注意的若干事项。 关键字:构造函数;析构函数;垃圾回收器;非托管资源;托管资源 一.构造函数与析构函数的原理 作为比C更先进的语言,C#提供了更好的机制来增强程序的安全性。C#编译器具有严格的类型安全检查功能,它几乎能找出程序中所有的语法问题,这的确帮了程序员的大忙。但是程序通过了编译检查并不表示错误已经不存在了,在“错误”的大家庭里,“语法错误”的地位只能算是冰山一角。级别高的错误通常隐藏得很深,不容易发现。 根据经验,不少难以察觉的程序错误是由于变量没有被正确初始化或清除造成的,而初始化和清除工作很容易被人遗忘。微软利用面向对象的概念在设计C#语言时充分考虑了这个问题并很好地予以解决:把对象的初始化工作放在构造函数中,把清除工作放在析构函数中。当对象被创建时,构造函数被自动执行。当对象消亡时,析构函数被自动执行。这样就不用担心忘记对象的初始化和清除工作。 二.构造函数在C#中的运用 构造函数的名字不能随便起,必须让编译器认得出才可以被自动执行。它的命名方法既简单又合理:让构造函数与类同名。除了名字外,构造函数的另一个特别之处是没有返回值类型,这与返回值类型为void的函数不同。如果它有返回值类型,那么编译器将不知所措。在你可以访问一个类的方法、属性或任何其它东西之前, 第一条执行的语句是包含有相应类的构造函数。甚至你自己不写一个构造函数,也会有一个缺省构造函数提供给你。 class TestClass { public TestClass(): base() {} // 由CLR提供 } 下面列举了几种类型的构造函数 1)缺省构造函数 class TestClass { public TestClass(): base() {} } 上面已介绍,它由系统(CLR)提供。 2)实例构造函数 实例构造函数是实现对类中实例进行初始化的方法成员。如: using System; class Point { public double x, y; public Point() { this.x = 0; this.y = 0; } public Point(double x, double y) { this.x = x; this.y = y; } … } class Test { static void Main() { Point a = new Point(); Point b = new Point(3, 4); // 用构造函数初始化对象 … } } 声明了一个类Point,它提供了两个构造函数。它们是重载的。一个是没有参数的Point构造函数和一个是有两个double参数的Point构造函数。如果类中没有提供这些构造函数,那么会CLR会自动提供一个缺省构造函数的。但一旦类中提供了自定义的构造函数,如Point()和Point(double x, double y),则缺省构造函数将不会被提供,这一点要注意。
Visual Studio中的 XML标记 要在方法写完之后,然后在方法的上面敲/// 就会自动生成标记格式 比如 /// <summary> /// /// </summary> /// <param name="sqlstring"></param> /// <returns></returns> summary中的内容 在调用方法时鼠标悬停或者光标选中时会显示方法的功能
让RequiredFieldValidator失效的办法 在设计登录界面的时候我们会用RequiredFieldValidator来验证用户是否输入了用户名和密码,但这样一来我们点注册或其他的按钮时也会引发验证,因为为文本框为空,验证自然就通不过了,就不能实现Button的功能了 这个时候可以把Button的CauseValidation的属性设置为false就可以了
Init事件代码怎么添加 很简单 直接复制load事件然后把load改成Init,然后把括号里面的参数去掉 protected void Page_Init() { } 就长这样子 接下来转载网友的文章 <script language="c#" runat="server"> int intGlobal = 0; void Page_Init() { intGlobal++; message1.Text += "<br/>Page_Init()被调用,intGlobal的值为" + intGlobal; } void Page_Load(object sender, EventArgs e) { intGlobal++; message2.Text += "<br/>Page_Load()被调用,intGlobal的值为" + intGlobal; } </script> <head id="Head1" runat="server"> <title>测试网页</title> </head> <body> <form id="form1" runat="server"> <input type="submit" value="提交" /> <br /> <asp:Label ID="message1" runat="server" /> <br /> <asp:Label ID="message2" runat="server" /></div> </form> </body> </html> 第一次运行将会看到 Page_Init()被调用,intGlobal的值为1 Page_Load()被调用,intGlobal的值为2 单击提交,将会看到 Page_Init()被调用,intGlobal的值为1 Page_Load()被调用,intGlobal的值为2 Page_Load()被调用,intGlobal的值为2 如果单击提交几次,将会看到intGlobal的值始终为2,而没有递增。因为页面是不能保留变量的,每次都是重新声明、使用新变量。而加载页面的顺序为Page_Init(),然后Page_Load(),所以刚打开时显示为1、2。而以后在提交过程中,虽然Page_Init()还是会被调用,但不能改变服务器控件的文本了,所以值虽然递增了,但message1的文本却没有显示。如果删除Page_Init()中的intGlobal++,则可以证明以上观点。因为那时intGlobal的值将始终为1。
C#中using用法及操作实践 C#关键字的用法不单只有一种方法的。现在我总结了一下Using和New的用法,顺便巩固下自己的知识。 Using (1)引用命名空间 using作为引入命名空间指令的用法规则为: using Namespace; 在.NET程序中,最常见的代码莫过于在程序文件的开头引入System命名空间,其原因在于System命名空间中封装了很多最基本最常用的操作,下面的代码对我们来说最为熟悉不过: using System; 这样,我们在程序中就可以直接使用命名空间中的类型,而不必指定详细的类型名称。using指令可以访问嵌套命名空间。 关于:命名空间 命名空间是.NET程序在逻辑上的组织结构,而并非实际的物理结构,是一种避免类名冲突的方法,用于将不同的数据类型组合划分的方式。例如,在.NET中很多的基本类型都位于System命名空间,数据操作类型位于System.Data命名空间, (2)创建命名空间别名 using为命名空间创建别名的用法规则为: using alias = namespace | type; 其中namespace表示创建命名空间的别名;而type表示创建类型别名。例如,在.NET Office应用中,常常会引入Microsoft.Office.Interop.Word.dll程序集,在引入命名空间时为了避免繁琐的类型输入,我们通常为其创建别名如下: using MSWord = Microsoft.Office.Interop.Word; 这样,就可以在程序中以MSWord来代替Microsoft.Office.Interop.Word前缀,如果要创建Application对象,则可以是这样, 而且还有一个好处就是,在一个.CS文件中引入了不同的命名空间但是相同的类名的时候,用别名就可以解决这问题了。 (3)强制资源清理 用途:清理非托管资源,不受GC控制的资源。Using结束后会隐式的调用Disposable方法。 用法: using (Class1 c = new Class1()) { }//清理非托管不受GC控制的资源 但是当对象使用using关键字的时候,必须实现IDisposable接口。其实using的使用和try-catch-finaly中,在finaly代码域调用Disposable方法效果一样。注意Using不能使用多个不同的类 Class1 f = new Class1(); try { //执行代码 } catch() { //异常处理 } finally { f.Disposable(); } using 语句获取一个或多个资源,执行一个语句,然后处置该资源。 using 语句: using ( 资源获取 ) 嵌入语句 资源获取: 局部变量声明 表达式 资源是实现 System.IDisposable 的类或结构,它包含名为 Dispose 的单个无参数方法。(如:截图2)正在使用资源的代码可以调用 Dispose 以指示不再需要该资源。如果不调用 Dispose,则最终将因为垃圾回收而发生自动处置。 如果资源获取的形式是局部变量声明,那么此局部变量声明的类型必须为System.IDisposable 或是可以隐式转换为 System.IDisposable 的类型。如果资源获取的形式是表达式,那么此表达式必须是 System.IDisposable 或是可以隐式转换为 System.IDisposable 的类型。 C#中using用法举例: class TestUsing:IDisposable { public void Dispose() { Console.WriteLine("Dispose"); } public void Method() { Console.WriteLine("Do a method"); } } 调用这个类: using(TestUsing tu=new TestUsing()) { tu.Method(); } 可以看到先后输出了Do a method和Dispose。 备注:实例化的对象必须实现 System.IDisposable 接口 在资源获取中声明的局部变量必须是只读的,且必须包含一个初始值设定项。 using 语句被翻译成三个部分:获取、使用和处置。资源的使用隐式封闭在包含一个 finally 子句的 try语句中。此 finally 子句处置资源。如果获取了 null 资源,则不进行对 Dispose 的调用,也不引发任何异常。 例如,下列形式的 using 语句 using (R r1 = new R()) { r1.F(); } 完全等效于 R r1 = new R(); try { r1.F(); } finally { if (r1 != null) ((IDisposable)r1).Dispose(); } using确保执行IDisposable接口的对象在退出块时立即释放,主要是为了防止忘记关闭数据库连接可能导致的.net可执行程序的各种问题。
理解C#里的Main()的四种形式 static void Main() static int Main() static void Main(string[] args) static int Main(string[] args) 首先是返回类型,分两种,void和int 一般的应用程序在执行结束之后,都会给操作系统返回一个执行结果代码,类型为int,来说明自己的执行情况. int返回类型的main函数是标准的main函数,最后根据执行结果向操作系统返回结果代码. void类型的main函数就是不返回任何东西的非标准main函数类型. 然后是参数类型,这个也分两种,不带参数的和带一个string数组的 应用程序在执行的时候可以加参数,带有参数的main函数,会把命令行传递进来的参数放在这个string数组里,然后你可以通过检查这个数组里的元素来获取用户输入的参数 不带参数的main函数是忽略命令行参数的,也就是不管用户有没有加参数,都不进行处理
C# 可访问性级别 使用访问修饰符 public、protected、internal 或 private 可以为成员指定以下声明的可访问性之一。 声明的可访问性含义public 访问不受限制。 protected 访问仅限于包含类或从包含类派生的类型。 internal 访问仅限于当前程序集。 protected internal 访问仅限于从包含类派生的当前程序集或类型。 private 访问仅限于包含类型。 一个成员或类型只能有一个访问修饰符,使用 protectedinternal 组合时除外。 命名空间上不允许使用访问修饰符。命名空间没有访问限制。 根据发生成员声明的上下文,只允许某些声明的可访问性。如果在成员声明中未指定访问修饰符,则使用默认的可访问性。 不嵌套在其他类型中的顶级类型的可访问性只能是 internal 或 public。这些类型的默认可访问性是 internal。 嵌套类型是其他类型的成员,它们可以具有下表所示的声明的可访问性。 属于默认的成员可访问性该成员允许的声明的可访问性enum public 无 class private public protected internal private protected internal interface public 无 struct private public internal private 嵌套类型的可访问性取决于它的可访问域,该域是由已声明的成员可访问性和直接包含类型的可访问域这二者共同确定的。但是,嵌套类型的可访问域不能超出包含它的类型的可访问域。
可空类型 -- C#入门经典(第3版) 首先论述另一个较简单的泛型类型(nullable type):可空类型,解决值类型的一个小问题。 12.2.1 可空类型 在前面的章节中,介绍了值类型(大多数基本类型,例如int、double和所有的结构)区别于引用类型(string和所有的类)的一种方式:值类型必须包含一个值,它们可以在声明之后、赋值之前,在未赋值的状态下存在,但不能以任何方式使用。而引用类型可以是null。 有时让值类型为空是很有用的,泛型使用System.Nullable<T>类型提供了使值类型为空的一种方式。例如: System.Nullable<int> nullableInt; 这行代码声明了一个变量nullableInt,它可以拥有int变量能包含的任意值,还可以拥有值null。所以可以编写下面的代码: nullableInt = null; 如果nullableInt是一个int类型的变量,上面的代码是不能编译的。 前面的赋值等价于: nullableInt = new System.Nullable<int>(); 与其他变量一样,无论是初始化为null(使用上面的语法),还是通过给它赋值来初始化,都不能在初始化之前使用它。 可以像测试引用类型一样,测试可空类型,看看它们是否为null: if (nullableInt == null) { ... } 另外,可以使用HasValue属性: if (nullableInt.HasValue) { ... } 这不适用于引用类型,即使引用类型有一个HasValue属性,也不能使用这种方法,因为引用类型的变量值为null,就表示不存在对象,当然就不能通过对象来访问这个属性,此时会抛出一个异常。 使用Value属性可以查看引用类型的值。如果HasValue是true,就说明Value属性有一个非空值。但如果HasValue是false,就说明变量被赋予了null,访问Value属性会抛出System. InvalidOperationException类型的异常。 可空类型要注意的一点是,它们非常有用,以致于修改了C#语法。上面可空类型的变量不使用上述语法,而是使用下面的语法: int? nullableInt; int ?是System.Nullable<int>的缩写,但可读性更高。在后面的章节中就使用这个语法。 1. 运算符和可空类型 对于简单类型如int,可以使用+、–等运算符来处理值。而对于可空类型,这是没有区别的:包含在可空类型中的值会隐式转换为需要的类型,使用适当的运算符。这也适用于结构和自己提供的运算符。例如: int? op1 = 5; int? result = op1 * 2; 注意其中result变量的类型也是int?。下面的代码不会编译: int? op1 = 5; int result = op1 * 2; 为了使上面的代码正常工作,必须进行显式转换: int? op1 = 5; int result = (int)op1 * 2; 只要op1有一个值,上面的代码就可以正常运行,如果op1是null,就会生成System.Invalid OperationException类型的异常。 这就引出了下一个问题:当运算等式中的一个或两个值是null时,例如上面代码中的op1,会发生什么情况?答案是:对于除了bool?之外的所有简单可空类型,该操作的结果是null,可以把它解释为“不能计算”。对于结构,可以定义自己的运算符来处理这种情况(详见本章后面的内容)。对于bool?,为&和 | 定义的运算符会得到非空返回值,如表12-1所示。 表 12-1 op1 op2 op1 & op2 op1 | op2 true true true true true false false true true null null true false true false true false false
结构和类的区别 使用结构类型 类定义的一种引用类型,它总是创建在堆上的。某些时候类中只包含极少的数据,因为管理堆而造成的开销显得不合算,在这种情况下更好的做法是将类型定义成一个结构。由于结构式在堆栈上存储的,所以能有效地减少内存管理开销(前提是这个结构足够小)。 结构可以包含它自己的字段、方法和构造函数,这个类完全相同(但和枚举不同)。区别在于结构式值类型,而不是引用类型。 常用的结构类型: 在C#中,基本数值类型int,long和float分别是System.Int32,System.Int64和System.Single这三种结构类型的别名。 结构和类在语法上很相似,但两者存在一些重要的差别: 1.不能为机构声明一个自己默认的构造函数(无参数构造函数)。因为编译器始终为结构生成默认的构造函数。编译器为结构生成的默认构造函数总是将字段设为0、false、或者null,这和类是一样的。所以结构可以不写构造函数,但是要是自定义了构造函数那么就必须显示的初始化每一个字段否则编译报错。 2.在一个类中,可以在声明的同时初始化一个字段但在机构中这是不允许的。每个结构 必须在它的构造函数中初始化所有的字段 3.类可以从一个基类继承,但是结构不能 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace structExample { /// <summary> /// 不写有参数的构造函数自动初始化各字段为0,false,null等 /// </summary> struct StructTest { //private int intX=0;不能在结构中声明并实例化字段,在类中是可以的 private int intX; private string stringA; private ArrayList array; public int IntX { get { return intX; } } public string StringA { get { return stringA; } } public ArrayList Array { get { return array; } } } struct StructWithParamInConstructor { private int intX; private string stringA; private ArrayList array; public int IntX { get { return intX; } } public string StringA { get { return stringA; } } public ArrayList Array { get { return array; } } /// <summary> /// 如果在结构中设置了一个非默认的构造函数,那么就必须显示的对每个字段进行初始化 /// 否则编译报错 /// </summary> /// <param name="x"></param> /// <param name="a"></param> /// <param name="array"></param> public StructWithParamInConstructor(int x,string a,ArrayList array) { intX = x; stringA = a; this.array = array; } } class Demo { static void Main(string[] args) { ArrayList array = new ArrayList(); array.Add("zlg"); //StructTest structTest = new StructTest(12, "abc",array); StructTest structTest = new StructTest(); Console.WriteLine(structTest.IntX);//被默认初始化为0
创建out参数 using System; namespace Test { class Demo { public static void Out(out int a, out int b) { a = 7; b = 8; } static void Main(string[] args) { int c, d; Out(out c,out d); Console.WriteLine("C={0},D={1}", c, d); } } } 这样可以在声明了一个变量之后可以不用初始化,而利用方法进行初始化
理解参数数组 参数数组的作用有点类似方法重载,只不过参数数组的重载是相对于参数的数目滴 先看一段代码 class Class1 { public static int Min(int[] paramList) { if (paramList == null || paramList.Length == 0) { throw new ArgumentException(); } int currentMin = paramList[0]; foreach (int i in paramList) { if (i < currentMin) { currentMin = i; } } return currentMin; } } class Demo { static void Main(string[] args) { int[] array = new int[3]; array[0] = 3; array[1] = 5; array[2] = 1; int min = Class1.Min(array); Console.WriteLine(min); } } 作用是取出一个数组中的最小值 应该这样调用方法 int[] array = new int[3]; array[0] = 3; array[1] = 5; array[2] = 1; int min = Class1.Min(array); 假如参数有十个那么就要建立一个长度10的数组然后对数组中各元素赋值。这样是很麻烦的 所以参数数组params就出场了 class Class1 { public static int Min(params int[] paramList) { //这里的代码很上面的完全一样 } } class Demo { static void Main(string[] args) { int min = Class1.Min(1,3,5);//这里可以写任意个参数 Console.WriteLine(min); } } 关于params数组有以下几点需要注意 1.只能在一维数组上使用params关键字,下面的做法是错误的 public static int Min(params int[,] table)//编译时错误 2.不能重载一个只基于params关键字的方法, public static int Min(int[] paramList) public static int Min(params int[] paramList)//编译时错误 3.不允许ref或out params数组 public static int Min(ref params int [] paramList) public static int Min(out params int [] paramList) 4.params数组必须是方法的最后一个参数(也就是说每个方法只能有一个params数组参数) public static int Min(params int [] paramList,int i)//编译错误 5.编译器会检查并拒绝任何可能有歧义的重载,例如下面两个Min方法就存在歧义,如果传递的是两个int参 数时就无法知道要调用哪一个方法。 public static int Min(params int [] paramList) public static int Min(int,params int [] paramList) 6. 非params方法总是优先于一个params方法,也就是说,如果愿意仍然可以为普通情况创建一个方法的重载版本 public static int Min(int leftHandSide,int rightHandSide) public static int Min(params int[] paramList) 假如传递两个int参数,那么调用的肯定是第一个方法 使用params object[] 这种情况是用于当参数不仅数目不固定而且参数类型不固定时
CheckListBox的全选与反选 for (int i = 0; i < checkedListBox.Items.Count; i++) { checkedListBox.SetItemChecked(i, true);//全选 } for (int i = 0; i < checkedListBox.Items.Count; i++) { checkedListBox.SetItemChecked(i, false);//全不选 } for (int i = 0; i < checkedList.Items.Count; i++) { if (checkedListBox.GetItemChecked(i))//判断选项是否选中 { checkedListBox.SetItemChecked(i, false);//如果选中则取消 } else { checkedListBox.SetItemChecked(i, true); //如果没选中则选中 } }还有就是单机选项时不会自动选中复选框,只要把CheckOnClick选为true就可以了
ArrayList类的Remove和RemoveAt方法 Remove方法 功能:删除与指定值相同的第一个元素 格式:object.Insert(指定的值) 效果: 数组{0、2、3、4、5、4} 删除第一次出现4的元素 RemoveAt方法 功能:删除指定索引值的那个元素。 格式:object.Insert(索引值) 效果: 数组{0、2、3、4、5、4} 可以这样简单的记忆:Remove at 某个位置, Remove 某个东西,所以RemoveAt是删除索引处的元素,Remove是删除跟参数一样的东西呵呵
ArrayList的简单使用 class Test { public static void Main() { ArrayList array = new ArrayList(); CreateList(ref array); Console.WriteLine("姓名\t电话\t年龄"); ShowList(array); Console.WriteLine("请输入要删除的名字:"); string name = Console.ReadLine(); DeleteListItem(name, ref array); Console.WriteLine("删除后的结果为:"); ShowList(array); Console.ReadLine(); } static void CreateList(ref ArrayList tmpArrayList) { ArrayList list = new ArrayList(); list.Add("zlg"); list.Add(23); list.Add("13850193744"); tmpArrayList.Add(list); list = new ArrayList();//隔离内存 list.Add("lsm"); list.Add(23); list.Add("13559467263"); tmpArrayList.Add(list); } static void ShowList(ArrayList tmpArrayList) { ArrayList list; for (int i = 0; i < tmpArrayList.Count; i++) { list =(ArrayList) tmpArrayList;//返回object所以要强转 for (int j = 0; j < list.Count; j++) { Console.Write("{0}\t", list[j]); } Console.WriteLine(); } } static void DeleteListItem(string name,ref ArrayList tmpArrayList) { ArrayList list; int index = -1; for (int i = 0; i < tmpArrayList.Count; i++)//确定要删除的项目的索引 { list =(ArrayList) tmpArrayList; if ((string)list[0] == name) { index = i; } } tmpArrayList.RemoveAt(index); Console.WriteLine("删除成功!"); } }
对泛型的一些小认识 想要理解泛型的话,先要理解下面的东西 object存在的问题 我们知道object对象可以用于存储任意对象,看下面的代码 using System.Collections; ..... Queue myQueue=new Queue(); Circle myCircle=new Circle(); myQueue.Enqueue(myCircle); ... myCircle=(Circle)myQueue.Dequeue(); 在看看队列中是怎么定义方法的 入队:public void Enqueue(object item)--------接受任何对象但以object存储 出队:public object Dequeue()------返回object 所以返回时要进行显示的类型转换,这样会导致object类型所提供的灵活性大打折扣 Circle myCircle=new Circle(); myCircle=(Circle)myQueue.Dequeue();//强制类型转换 还有一种情况 Queue myQueue=new Queue(); Circle myCircle=new Circle(); myQueue.Enqueue(myCircle); Clock myClock=new Clock(); myCircle=(Clock)myQueue.Dequeue(); 这种情况虽然能编译,但它实际是无效的,因为Clock和Circle不兼容,这只有在运行时才能出现错误,因为编译器在编译时没有足够多的信息来辨别 还有一种情况 Quene myQueue=new Queue(); int myInt=99; myQueue.Enqueue(myInt);//将int装箱成一个object ... myInt=(int)myQueue.Dequeue();//将object拆箱成一个int 由于反复的进行装箱拆箱操作,对性能产生了影响 泛型就应运而生了 using System.Collections.Generic; ... Queue<Circle> myQueue=new Queue<Circle>(); Circle myCircle=new Circle(); myQueue.Enqueue(myCircle); myCircle=myQueue.Dequeue(); 注意两个地方 1.<Circle>2.执行Dequeue方法时不需要进行强制类型转换; 因为这里用到了泛型 Queue<Circle> myQueue=new Queue<Circle>();的功能就是声明一个队列而且这个队列只能存储Circle类型的,所以出队时不用进行强制类型转换; 创建泛型方法 先看代码 static void Swap<T>(ref T first,ref T second) { T temp=first; first=second; second=temp; } 这里的T是占位符,可以把T看做是传入的参数类型,也就是说这个Swap方法可以对很多类型的对象进行交换下面演示使用方法 int a=1,b=2;// 交换int Swap<int>(ref a,ref b) ... string s1="Hello",s2="World";//交换string Swap<string>(ref s1,ref s2) 这样就省去了很多装拆箱的步骤
目录与文件管理--System.IO 1. 创建并删除指定目录 using System; using System.IO; class Test { public static void Main(string[] args) { //指定要操作的目录 string path = "c:\\MyDir"; try { //确定目录是否存在 if (Directory.Exists(path)) { Console.WriteLine("目录已存在"); return; } //创建目录 Directory.CreateDirectory(path); Console.WriteLine("创建目录成功!"); Console.WriteLine("是否删除?Y or N"); string str = Console.ReadLine(); if (str.ToUpper() == "Y") { Directory.Delete(path); Console.WriteLine("删除成功!"); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } } 2. 目录的移动 using System; using System.IO; using System.Security; namespace GetFileSystemEntries { class Test { static void Main(string[] args) { Test test = new Test(); string path = Directory.GetCurrentDirectory(); string filter = "*.exe"; test.PrintFileSystemEntries(path); test.PrintFileSystemEntries(path,filter); test.GetLogicalDrives(); test.GetParent(path); test.Move("c:\\2", "c:\\3\\2");//把2移动到3下不能写成test.Move("c:\\2", "c:\\3") test.Move("c:\\2", "c:\\3");//作用是把2改名成3 } //显示文件系统目录路径 void PrintFileSystemEntries(string path) { try { //获取文件系统目录路径 string[] directoryEntries = Directory.GetFileSystemEntries(path); foreach (string tmpDir in directoryEntries) { Console.WriteLine(tmpDir); } } catch (ArgumentNullException) { Console.WriteLine("路径为空"); } catch (SecurityException) { Console.WriteLine("检测到安全性错误"); } catch (ArgumentException) { Console.WriteLine("路径是一个零长度的字符串"); } catch (DirectoryNotFoundException) { Console.WriteLine("指定的路径无效"); } } //方法重载 void PrintFileSystemEntries(string path, string filter) { try { string[] directoryEntries = Directory.GetFileSystemEntries(path, filter); foreach (string tmp in directoryEntries) { Console.WriteLine(tmp); } } catch (ArgumentNullException) { Console.WriteLine("路径为空"); } catch (SecurityException) { Console.WriteLine("检测到安全性错误"); } catch (ArgumentException) { Console.WriteLine("路径是一个零长度的字符串"); } catch (DirectoryNotFoundException) { Console.WriteLine("指定的路径无效"); } } // 显示所有的逻辑驱动器 void GetLogicalDrives() { try { string[] drives = Directory.GetLogicalDrives(); foreach (string tmp in drives) { Console.WriteLine(tmp); } } catch (IOException) { Console.WriteLine("输入输出异常"); } catch (SecurityException) { Console.WriteLine("检测到安全性错误"); } } void GetParent(string path) { try { DirectoryInfo directoryInfo = Directory.GetParent(path); Console.WriteLine(directoryInfo.FullName); } catch (ArgumentNullException) { Console.WriteLine("路径为空"); } catch (ArgumentException) { Console.WriteLine("路径是一个零长度的字符串"); } } //移动目录 void Move(string sourcePath, string destinationPath) { try { Directory.Move(sourcePath, destinationPath); Console.WriteLine("移动目录成功"); } catch (ArgumentNullException) { Console.WriteLine("路径为空"); } catch (SecurityException) { Console.WriteLine("检测到安全性错误"); } catch (ArgumentException) { Console.WriteLine("路径是一个零长度的字符串"); } catch (DirectoryNotFoundException) { Console.WriteLine("指定的路径无效"); } catch (IOException) { Console.WriteLine("试图将一个目录移到已存在的卷或目标"); } } } }
C# 特性(Attribute)入门 特性(Attributes)是一种崭新的声明性信息。我们不仅可以通过特性来定义设计层面的信息(例如help file, URL for documentation)以及运行时(run-time)信息(例如使XML与class相联系),而且我们还可以利用特性建立自描述(self-describing)组件。在这篇教程中,我们将会看到如何建立和添加特性到各种程序实体以及如何在运行时环境中获取特性信息。 定义 正如MSDN中所描述的那样----- “特性是被指定给某一声明的一则附加的声明性信息。” 使用预定义(Pre-defined)特性 在C#中,有一个小的预定义特性**。在学习如何建立我们自己的定制特性(custom attributes)之前,我们先来看看在我们的代码中如何使用预定义特性。 using System; public class AnyClass { [Obsolete("Don't use Old method, use New method", true)] static void Old( ) { } static void New( ) { } public static void Main( ) { Old( ); } } 我们先来看一下上面这个例子,在这个例子中我们使用了Obsolete特性,它标记了一个不应该再被使用的程序实体。第一个参数是一个字符串,它解释了为什么该实体是过时的以及应该用什么实体来代替它。实际上,你可以在这里写任何文本。第二个参数告诉编译器应该把使用这个过时的程序实体当作一种错误。它的默认值是false,也就是说编译器对此会产生一个警告。 当我们尝试编译上面这段程序的时候,我们将会得到一个错误: AnyClass.Old()' is obsolete: 'Don't use Old method, use New method' 开发定制特性(custom attributes) 现在让我们来看看如何开发我们自己的特性。 首先我们要从System.Attribute派生出我们自己的特性类(一个从System.Attribute抽象类继承而来的类,不管是直接还是间接继承,都会成为一个特性类。特性类的声明定义了一种可以被放置在声明之上新的特性)。 using System; public class HelpAttribute : Attribute { } 不管你是否相信,我们已经建立了一个定制特性,现在我们可以用它来装饰现有的类就好像上面我们使用Obsolete attribute一样。 [Help()] public class AnyClass { } 注意:对一个特性类名使用Attribute后缀是一个惯例。然而,当我们把特性添加到一个程序实体,是否包括Attribute后缀是我们的自由。编译器会首先在System.Attribute的派生类中查找被添加的特性类。如果没有找到,那么编译器会添加Attribute后缀继续查找。 到目前为止,这个特性还没有起到什么作用。下面我们来添加些东西给它使它更有用些。 using System; public class HelpAttribute : Attribute { public HelpAttribute(String Descrition_in) { this.description = Description_in; } protected String description; public String Description { get { return this.description; } } } [Help("this is a do-nothing class")] public class AnyClass { } 在上面的例子中,我们给HelpAttribute特性类添加了一个属性并且在后续的部分中我们会在运行时环境中查寻它。
静态类和非静态类的区别 class ExampleTest { static ExampleTest() { Console.WriteLine("test static default constructor in unstatic class"); } public ExampleTest() { Console.WriteLine("test default constructor in unstaic class"); } } static class ExampleTest2 { static ExampleTest2() { Console.WriteLine("test static Method in static class"); } #region 静态类不能调用实例构造函数 //public ExampleTest2() //{ // Console.WriteLine("test unstatic method in static class"); //} #endregion #region 静态类中不能调用实例方法 //public void getAlert() //{ // Console.WriteLine("Alert,alert"); //} #endregion public static void getAlert() { Console.WriteLine("Alert,alert"); } } 从上面两个类中,我们得到结论: 1、构造函数,无论在静态类或非静态类中,如果我们定义了一个static的构造函数,那么只要创建这个类的实例或调用这个类的方法,都将自动调用这个Static的构造函数,并且Static的构造函数是不能有访问权限的。static的构造函数是不能有参数的。 2、静态类中不能调用实例构造函数 2、静态类中不能创建非静态的方法。即静态方法中只能创建静态方法,但在非静态类中可以调用静态方法(这个情况我们经常使用的) ____________________________________________________________________________________ 静态构造函数: (1)用于对静态字段、只读字段等的初始化。 (2)添加static关键字,不能添加访问修饰符,因为静态构造函数都是私有的。 (3)类的静态构造函数在给定应用程序域中至多执行一次:只有创建类的实例或者引用类的任何静态成员才激发静态构造函数 (4)静态构造函数是不可继承的,而且不能被直接调用。 (5)如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行。 (6)任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项。 (7)如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数。 经典例子: 1 /**//************************************************** 2 * 静 态 构 造 函 数 练 习 3 * (1)①②③……为执行顺序 4 * (2)输出结果: static A() 5 * static B() 6 * X = 1, Y = 2 7 ***************************************************/ 8 using System; 9 class A 10 { 11 public static int X; 12 13 static A() //④ 执行完后返回到③ 14 { 15 X = B.Y + 1; 16 Console.WriteLine("static A()"); 17 } 18 } 19 20 class B 21 { 22 public static int Y = A.X + 1; //③ 调用了A的静态成员, 23 // 转到A的静态构造函数----> 24 25 static B() //② 如果带有初始值设定项的静态字段, 26 // 执行该类的静态构造函数时, 27 // 先要按照文本顺序执行那些初始值设定项。 28 // 转到初始值设定项----> 29 { 30 Console.WriteLine("static B()"); 31 } 32 33 static void Main() //① 程序入口, 34 // 如果类中包含用来开始执行的 Main 方法, 35 // 该类的静态构造函数将在调用 Main 方法之前执行。 36 // 转到B的静态构造函数----> 37 { 38 Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);//⑤ 输出结果 39 Console.ReadLine(); 40 } 41 }
单件模式---初解 前言 单件(Singleton)模式作为设计模式的一个典型且相对简单的构造型模式,已经在很多项目的实际开发中被广泛采用,由于其所有相关操作都是基于同一个实例的引用,因此单件模式的使用主要出于如下几个目的: 逻辑上仅仅只有一个实例才可以保证逻辑的正确性。 通过共享减少内存的使用,作为应用中一些集中的统一数据机制存在。 减少因为频繁的构造过程带来应用上的性能损失。 下面是一个最简单的经典单件模式实现方式: using System; namespace VisionLogic.DesignPattern.Practice ...{ public class Singleton ...{ private static Singleton instance; private Singleton() ...{ } public static Singleton Instance ...{ get ...{ if (instance == null) ...{instance = new Singleton(); instance.data = 0; } return instance; } } /**//// <summary> /// 共享的实例数据 /// </summary> private int data; public int Data ...{ get ...{ return data; } set ...{ data = value; } } } } 示例1 那么客户端在实际的使用中通过静态的Instance属性就可以获得一个唯一的实例,无论哪一个客户程序对于引用实例的操作都会在其他客户程序中同步更新。 using System; using System.Diagnostics; using VisionLogic.DesignPattern.Practice; namespace VisionLogic.DesignPattern.Practice.Client ...{ class Program ...{ static void Main(string[] args) ...{ Singleton instance1 = Singleton.Instance; Singleton instance2 = Singleton.Instance; instance1.Data = 30; Trace.WriteLine(instance2.Data);// 注意哦是实例二的data哦 instance2.Data = 15; Trace.WriteLine(instance1.Data); } } } 结果: 30 15 示例2 单件模式的主要注意事项 上面的例子虽然简单,但实际使用中还需要考虑不要因为面向对象特性和新的开发平台特性,所导致的单件类型性质的变异。 不要实现ICloneable接口或者继承自其相关的子类,否则客户程序可以跳过已经隐蔽起来的类构造函数,导致私有的Singleton() { } 部分的实效。 using System; using System.Collections; namespace danjianmoshi { public class BaseEntity : ICloneable { public object Clone() { return this.MemberwiseClone(); } //public int MemberwiseClone() //{ //} } public class Singleton : BaseEntity { private int _data; private static Singleton _instance; private Singleton() { } public static Singleton Instance { get { if (_instance == null) { _instance = new Singleton(); _instance._data = 0; } return _instance; } } public int Data { get { return _data; } set { _data = value; } } } class Demo { public static void Main(string[] args) { Singleton instance1 = Singleton.Instance; Singleton instance2 = (Singleton)instance1.Clone(); instance1.Data = 30; Console.WriteLine(instance2.Data); instance2.Data = 15; Console.WriteLine(instance1.Data); } } }
CSS控制元素的定位--Relative和Absolute的用法 5.1 元素的定位 Position:static | absolute | fixed | relative Static: 默认值,元素按照自身默认的方位显示 Absolute: 绝对定位,以含有定位属性的父元素为基准 Fixed: 浏览器不支持改属性 Relative: 相对定义,元素以自身位置为基准,按照边偏移属性中定义的属性值显示 5.2 绝对定位 在页面中使用绝对定位的元素会从文档中独立的显示出来,所以使用绝对定位的元素可能会遮盖其他的页面元素 5.2.1 绝对定位与父元素 在使用绝对定位的时候,定位参照元素是包含定位属性的父元素,如果没有这样的父元素,则按照body元素位置确定显示位置 一个使用嵌套绝对定位元素的实例 <style type="text/css"> .main { position:absolute; top:50px; left:50px; width:400px; height:200px; border:2px solid red; } .include { position:absolute; left:50%; top:50px; border:2px solid green; width:300px; height:50px;} </style> </head> <body> <div style="text-indent: 21pt; margin: 0cm 0cm 0pt" ><div style="mso-bidi-font-weight: normal">这是父元素定位属性为position,自身属性也是position的实例</div></div> 绝对定位与相邻元素 在使用绝对定位的时候绝对定位元素会独立显示,并不影响其他元素的显示位置(但可能会覆盖其他元素),也就是说与绝对定位元素相邻的元素会忽略绝对定位元素的存在 看例子 <style type="text/css"> .DIV1 { background:red; width:200px; height:100px; } .absolute { position:absolute; top:50px; left:50px; width:400px; height:100px; background:green} .div2 { background:yellow; width:200px; height:100px} </style> </head> <body> <div style="margin: 0cm 0cm 0pt" ><div style="margin: 0cm 0cm 0pt" ><div style="margin: 0cm 0cm 0pt" ></body> </html> 绿色的是绝对定位的div 红色和黄色的仍然按原来的块元素自动换行排列 5.3 相对定位 相对定位是按照元素自身所在的位置,使用边偏移属性来重新定义元素的显示位置 看例子 <style type="text/css"> .div1 { background:red; width:200px; height:100px; } .relative { position:relative; top:50px; left:50px; width:400px; height:100px; background:green } .div2 { background-color:yellow; width:200px; height:100px; } </style> </head> <body> <div style="margin: 0cm 0cm 0pt" ><div style="mso-bidi-font-weight: normal">这是相对定位,相对定位占据原来的位置,但根据原来位置的左上角用偏移量进行定位</div> <div style="margin: 0cm 0cm 0pt" ></body> </html>
CSS中垂直居中 相关 例一 原理: 主要是通过控制字体的大小和行高来控制居中 看实例 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>无标题文档</title> <style type="text/css"> .div1 { background-color:#3399FF; line-height:200px; font-size:150px; } div { float:left; width:250px; height:200px; background:#666666; border:4px solid #000000; } img { height:100px; vertical-align:middle } </style> </head> <body> <div src="1.jpg" alt="111"/> </div> <div></div> </body> </html> 实例中 line-height 是表示行高,这里只嵌入了一个img标签,相当于一行字,所以蓝色区域加上边框是200px 旁边灰色区域是用于对照的,高度被定义为200px font-size 表示字体大小,这里img是内联元素,可以模糊的理解为也安字来处理了,所以图片的高不超过 192(200-4-4边框的粗细)的话那么都是只算一行的,就会一直居中 例二. 子元素大小固定的垂直居中 原理: 使用相对定位和负的边界属性值实现,先子元素的上边界位于父元素的50%处,然后调整相对定位,使子元素便宜自身高度的50% <style type="text/css"> .div1 { width:300px; height:500px; background-color:#99FFCC} .div2 { position:relative; top:50%; margin-top:-50px; height:100px; width:200px; background-color:#9933FF}</style> </head> <body> <div border="0" small="0" src="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fhiphotos.baidu.com%2Fhehegungun%2Fpic%2Fitem%2Fabd60e036ddddac308fa93ee.jpg&urlrefer=85495f1978b8cc4c4b8eba68c062a4e7"> 例三 子元素大小不固定的垂直居中 和例二中不同,例二子元素大小是固定的所以很容易的就知道子元素高度的一半是多少,然后利用margin-top即可解决,本例中的子元素大小是无法预知的,所以要有参照物 class为in的div没有设定大小,所以他的大小和子元素是一样的,虽然没有大小,但是还是可以确定上边界所在的位置的,这里取上边界固定于father的50%处 因为in和sun的大小是一样的,所以当sun的中线和in的上边界重合时,那么in的上边界所在的位置就是sun的中线所在的位置 由此可知此时sun位于father的中间 top:-50% 这句话的使sun在in内垂直方向由下至上偏移百分之五十 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>无标题文档</title> <style type="text/css"> .father { position:relative; width:500px; height:300px; border:4px solid #000000; background-color:#99FF66 } .in { position:absolute; top:50%; width:250px; background-color:#CC6699 } .son { position:relative; top:-50%; width:200px; height:100px; background:#999999; border:2px solid #00000 } </style> </head> <body> <div border="0" small="0" src="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fhiphotos.baidu.com%2Fhehegungun%2Fpic%2Fitem%2F58256edd98fcd61b5982dd8b.jpg&urlrefer=b67d56f275c4e7f3b044ad1e9ddbfe08">
CSS网页布局入门教程1:一列固定宽度 本系列教程为入门级教程,适合初学者学习,由最简单的知识一点一点进阶。主要以实例为主,很少部分理论,这样更适应初学者快速掌握。因本人也正在学习,难免有一些错误或疏漏地方,望各位给予指正。本教程参考《CSS网站布局实录》一书,在此向作者表示感谢。 要想学好DIV+CSS,首先要有一定的HTML和CSS知识,如果这些你还不了解,建议你先去补习这一课,再来学习本教程。另外还要抛弃传统表格布局的思维模式,至于为什么,在你学习本教程中慢慢就会体会到。如果这些你都准备好了,那么开始吧! 一列固定宽度 一列固定宽度是基础中的基础,所以这节作为入门的第一节。 我们给div使用了layout作为id名称,为了便于查看,使用了background-color: #E8F5FE;将div的背景色设置成浅蓝色,用border: 2px solid #A9C9E2;将边框设置成天蓝色。背景色和边框的属性将会在以后的教程中讲解。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml1%2FDTD%2Fxhtml1-transitional.dtd&urlrefer=e9b2a1e0c6d358d677c4ee0138b67400"> <html xmlns="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml&urlrefer=d0f4243b5ce5e5fa54fdafc10831c319"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>一列固定宽度——AA25.CN</title> <style type="text/css"> <!-- #layout { border: 2px solid #A9C9E2; background-color: #E8F5FE; height: 200px; width: 300px; } --> </style> </head> <body> <div id="layout">一列固定宽度(AA25.CN)</div> </body> </html>
用C#关闭显示器--呵呵省电 我这人有点毛病,明明显示器耗不了多少电,但就是舍不得 索性就写些小代码 using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.Threading; namespace ShutDownMonitor { class Program { static void Main(string[] args) { Console.WriteLine("Monitor is being shut off"); Thread.Sleep(1000); Monitor.TurnOff(); Console.Read();//之前在这一句上废了很大劲,是想用鼠标或者键盘的事件来处理,呵呵能力有限,只 能等我学的多了再写那些复杂的代码啦呵呵,现在用简单的代码只要回车就能实现唤醒屏幕啦 Monitor.TurnOn(); Console.WriteLine("Monitor is turned on"); } } class Monitor { [DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam); public static void TurnOn() { SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, -1); } public static void TurnOff() { SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2); } static readonly IntPtr HWND_BROADCAST = new IntPtr(0xffff); const uint WM_SYSCOMMAND = 0x0112; const int SC_MONITORPOWER = 0xf170; } } 呵呵不过后来发现,无论按什么键或者动鼠标都是可以唤醒的哦
setInterval和setTimeout的使用区别 这两个方法都可以用来实现在一个固定时间段之后去执行JavaScript。不过两者各有各的应用场景。 方 法实际上,setTimeout和setInterval的语法相同。它们都有两个参数,一个是将要执行的代码字符串,还有一个是以毫秒为单位的时间间隔,当过了那个时间段之后就将执行那段代码。 不过这两个函数还是有区别的,setInterval在执行完一次代码之后,经过了那个固定的时间间隔,它还会自动重复执行代码,而setTimeout只执行一次那段代码。 如果将setTimeout加在函数的末尾形成递归,则两者的功能就一样了
HTML特殊字符大全 只要你认识了 HTML 标记,你便会知道特殊字符的用处。 HTML 原始码 显示结果 描述 < < 小於号或显示标记 > > 大於号或显示标记 & & 可用於显示其它特殊字符 " " 引号 ® ® 己注册 © © 版权 ™ ? 商标   半方大的空白   全方大的空白 不断行的空白 ■ ISO Latin-1 特殊字符 : HTML 原始码 显示结果 描述 Æ Æ Uppercase AE diphthing Á Á Uppercase A, acute accent   Uppercase A, circumflex accent À À Uppercase A, grave accent Å Å Uppercase A, ring à à Uppercase A, tilde Ä Ä Uppercase A, dieresis or umlaut mark Ç Ç Uppercase C, cedilla Ð Ð Uppercase Eth, Icelandic É É Uppercase E, acute accent Ê Ê Uppercase E, circumflex accent È È Uppercase E, grave accent Ë Ë Uppercase E, dieresis or umlaut mark Í Í Uppercase I, acute accent Î Î Uppercase I, circumflex accent Ì Ì Uppercase I, grave accent Ï Ï Uppercase I, dieresis or umlaut mark Ñ Ñ Uppercase N, tilde Ó Ó Uppercase O, acute accent Ô Ô Uppercase O, circumflex accent Ò Ò Uppercase O, grave accent Ø Ø Uppercase O, slash Õ Õ Uppercase O, tilde Ö Ö Uppercase O, dieresis or umlaut mark Þ Þ Uppercase THORN, Icelandic Ú Ú Uppercase U, acute accent Û Û Uppercase U, circumflex accent Ù Ù Uppercase u, grave accent Ü Ü Uppercase U, dieresis or umlaut mark Ý Ý Uppercase Y, acute accent æ æ Lowercase ae diphthing á á Lowercase a, acute accent â â Lowercase a, circumflex accent à à Lowercase a, grave accent å å Lowercase a, ring ã ã Lowercase a, tilde ä ä Lowercase a, dieresis or umlaut mark ç ç Lowercase c, cedilla ð ð Lowercase eth, Icelandic é é Lowercase e, acute accent ê ê Lowercase e, circumflex accent è è Lowercase e, grave accent ë ë Lowercase e, dieresis or umlaut mark í í Lowercase i, acute accent î î Lowercase i, circumflex accent ì ì Lowercase i, grave accent ï ï Lowercase i, dieresis or umlaut mark ñ ñ Lowercase n, tilde ó ó Lowercase o, acute accent ô ô Lowercase o, circumflex accent ò ò Lowercase o, grave accent ø ø Lowercase o, slash õ õ Lowercase o, tilde ö ö Lowercase o, dieresis or umlaut mark ß ß Lowercase sharp s, German (sz ligature) þ þ Lowercase thorn, Icelandic ú ú Lowercase u, acute accent û û Lowercase u, circumflex accent ù ù Lowercase u, grave accent ü ü Lowercase u, dieresis or umlaut mark ý ý Lowercase y, acute accent ÿ ÿ Lowercase y, dieresis or umlaut mark
C#索引器的使用 首先先看一个简单的位运算的例子 int a = 10; Console.WriteLine((a & (1 << 2))); if ((a & (1 << 2)) != 0) { Console.WriteLine("true"); } else Console.WriteLine("false"); int b = (a | (1 << 3)); Console.WriteLine(b); ------------------得到的结果为 0 false 10 --------------------------- 解析: 1<<2表示把1右移2位,所以得到二进制的00......100 10的二进制为00....1010 , “&”表示与预算,所以a&(1<<2)为 0 “~”的作用为按位取补,比如~(1<<2)的二进制表示为001 所以(a & (1 << 2)) != 0的作用是看a的索引为2的位置是否为0,若为0则表达式为false,不为0则表达式为true a|=(1<<6)的作用为将索引6的比特设为1; 现在我们换种方法进行操作,我们把int想象成由一个32比特构成的数组而不是单纯的一个int 我们希望可以这样读取a[6]或者a[6]=true;很直观,但int不能这样用,这个时候就要搬出索引器来啦 struct IntBits { private int bits; public IntBits(int value) { bits = value; } public bool this[int index] { get { return (bits & (1 << index)) != 0; } set { if (value)//如果value为true,就开启比特否则关闭 { bits |= (1 << index); } else { bits &= ~(1 << index); } } } int adapted=10; IntBits bits = new IntBits(adapted); bool peek = bits[2]; Console.WriteLine(peek); bits[2] = true; peek = bits[2]; Console.WriteLine(peek); 运行结果: False True
深入研究表单提交方式:GET/POST 大家知道目前表单提交的方式有GET和POST。我在这里不多说什么,给大家看一个以GET方式提交的表单的请求: GET /cgi-bin/tech/method.cgi?GET=GET HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */* Referer: http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Flocalhost%2F%2Fother.html&urlrefer=6da17e37ea7ea459b1f3743fccb82e59 Accept-Language: zh-cn Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Host: localhost:8080 Connection: Keep-Alive 这个请求是我们通过这个HTML代码发出的: <form action="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Flocalhost%3A8080%2Fcgi-bin%2Ftech%2Fmethod.cgi&urlrefer=3eb581061d46beeb9e93bd99444f7ec9" method="GET"> <input type="text" size="10" value="GET" name="GET"> <input type=submit value="GET方式"> </form> 这个请求已经超出了我们研究的范围,我们只研究其中的第一行。其中,第一个"GET"说出了提交的方式,是以GET方式提交的;中间的就是提交给服务器上哪个程序,前面一部分"/cgi-bin/tech/method.cgi"就是我们HTML的form中action的内容,而后面的"GET=GET"就是HTML的form中,input的内容:我们发现IE已经把这个表单的内容转换成特定格式了。在Perl中,通过$GET=$ENV{'QUERY_STRING'}获得以GET发送的数据。 我们再看一个以POST方式提交的表单的请求: POST /cgi-bin/tech/method.cgi HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms- powerpoint, application/vnd.ms-excel, application/msword, */* Referer: http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Flocalhost%2F%2Fother.html&urlrefer=6da17e37ea7ea459b1f3743fccb82e59 Accept-Language: zh-cn Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Host: localhost:8080 Content-Length: 9 Connection: Keep-Alive POST=POST 同样给出HTML: <form action="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Flocalhost%3A8080%2Fcgi-bin%2Ftech%2Fmethod.cgi&urlrefer=3eb581061d46beeb9e93bd99444f7ec9" method="POST"> <input type="text" size="10" value="POST" name="POST"> <input type=submit value="POST方式"> </form> 我们发现其中的数据跑到了最下面。在Perl中,通过read(STDIN,$POST,$ENV{'CONTENT_LENGTH'})获得以POST发送的数据。我记得GET发送数据最多只能1024字节,而POST好像很大很大! 思考:如果我有这么一段HTML代码,它将会出现什么问题呢? <form action="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Flocalhost%3A8080%2Fcgi-bin%2Ftech%2Fmethod.cgi%3FGET%3DGET&urlrefer=4e24ffcfef7890bd2f1a1d8abd8692f8" method="POST"> <input type="text" size="10" value="POST" name="POST"> <input type=submit value="GET/POST方式"> </form> 这个代码在很多程序上可能用到过,但是大多数人不会好好的想一想,究竟哪些内容是以GET发送的,哪些内容是以POST发送的。我们看看它的请求是什么: POST /cgi-bin/tech/method.cgi?GET=GET HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms- powerpoint, application/vnd.ms-excel, application/msword, */* Referer: http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Flocalhost%2F%2Fother.html&urlrefer=6da17e37ea7ea459b1f3743fccb82e59
目录中查找文件 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace FindFiles { class Program { static void Main(string[] args) { DirectoryInfo dir = new DirectoryInfo("c:\\"); FileInfo[] files = dir.GetFiles("*"); //所有文件 foreach (FileInfo file in files) { Console.WriteLine("Name:" + file.Name); //获取文件名 Console.WriteLine("Size:" + file.Length.ToString()); //获取文件大小 } } } }
DirectoryInfo与Directory,File与FileInfo 不同点: DictoryInfo类必须实例化后才能使用,而Dicrtory类只提供了静态的方法。在实际编程中如果多次使用某个对象,一般用DirectoryInfo类;如果仅执行某一个操作,则使用Directory类提供的静态方法效率更高一些。 待续。。。。 FileInfo类必须被实例化才能使用,File的方法都是静态的
菜鸟XML入门-------添加节点 XmlDocument doc = new XmlDocument();//创建Xml临时文件,用于最后保存成xml文件 doc.LoadXml("<BlockSet></BlockSet>");//创建根节点 XmlNode root = doc.SelectSingleNode("BlockSet");//选择根节点 for (int i = 0; i < 7; i++) { XmlElement xelType = doc.CreateElement("Type");//添加元素 XmlElement xelID = doc.CreateElement("ID"); xelID.InnerText = ((BlockInfo)info).GetIdString();//修改元素的值 xelType.AppendChild(xelID); XmlElement xelColor = doc.CreateElement("Color"); xelColor.InnerText = ((BlockInfo)info).GetColorString(); xelType.AppendChild(xelColor); root.AppendChild(xelType);//把type元素加入根节点 } 执行语句后的效果: <?xml version="1.0" encoding="utf-8" ?> <BlockSet> <Type> <ID>0000001110001000000000000</ID> <Color>-65536</Color> </Type> <Type> <ID> 0000001100001100000000000</ID> <Color>-345</Color> </Type> <Type> <ID>0000001000010000110000000</ID> <Color>-123444444</Color> </Type> <Type> <ID>0000001100011000000000000</ID> <Color>-32767</Color> </Type> <Type> <ID>0010000100001000010000100</ID> <Color>-83335536</Color> </Type> <Type> <ID>1111100000000000000000000</ID> <Color>-6553600</Color> </Type> <Type> <ID>0111000010000100000000000</ID> <Color>-1553611</Color> </Type> </BlockSet>
上传文件 #region 上传文件 /// <summary> /// 上传文件 /// </summary> public void SaveLoad2() { string fileName = "";//附件文件名 string filePath = "";//附件文件的路径 string fileType = "";//附件文件的类别 string erros = "";//判断是否失败 System.Web.HttpFileCollection _files = System.Web.HttpContext.Current.Request.Files; try { ArrayList al = null; al = new ArrayList(); for (int i = 0; i < _files.Count; i++) { string ffileID = System.Guid.NewGuid().ToString();//序列号 string guid = System.Guid.NewGuid().ToString(); HttpPostedFile hPostedFile = _files; string tempName = _files.FileName; if (fileName != null) { ///上载文件 if (i == 0) { fileType = Request.Params["FileType"].ToString(); } else { fileType = Request.Params["FileType" + i].ToString(); } string tempDates = DateTime.Now.ToFileTimeUtc().ToString(); string aa2 = tempName.Substring(tempName.LastIndexOf('\\') + 1); fileName = tempDates + aa2; filePath = MapPath("saveAs/"); hPostedFile.SaveAs(filePath + fileName); Common.SessionLib sl = new Common.SessionLib(); ///添加文件到数据库中 string sn1 = "insert into ffile (serid,filename,filepath,filetype,ffileid) values('" + Session["cxid"].ToString() + "','" + fileName + "','" + filePath + fileName + "','" + fileType + "','" + ffileID + "')"; al.Add(sn1); string sb2 = "insert into cxfuyanshou (fid,ysid,contens, pid,state)" + "values('" + guid + "','" + Session["cxid"].ToString() + "','上传文件成功'," + sl.Eid + ",0)"; al.Add(sb2); } } DBHelper.WebDBHelper.InsertArraySQLByTrans(al, out erros); if (erros == "") { json.Success = true; Common.LogHelper.WriteLog("保存上传文件信息成功:原因" + erros, Common.SysMenu.行政审批, "重新办理验收"); } else { json.Success = false; json.Error = erros; Common.LogHelper.WriteLog("保存上传文件信息失败" + erros, Common.SysMenu.行政审批, "重新办理验收"); } Response.Write(json.ToString()); } catch (Exception e) { Response.Write("{success:false , msg:'上传文件失败'}"); Common.LogHelper.WriteLog("保存上传文件信息失败" + e.ToString(), Common.SysMenu.行政审批, "重新办理验收"); } } #endregion
如何响应GridView 控件中的按钮事件 在单击 GridView 控件中的按钮时,将引发 RowCommand 事件。GridView 控件具有内置功能,用于进行编辑、删除和分页等操作。还可以添加按钮并使用 RowCommand 事件向控件添加自定义功能。 可以通过下面的方式向 GridView 控件添加自定义功能: 向 GridView 控件添加 ButtonField 字段。 向 GridView 控件中的模板添加 Button、LinkButton 或 ImageButton 控件。 可以使用事件参数的 CommandName 属性在事件处理程序方法中标识按钮的功能。如果使用的是 ButtonField 或 TemplateField 对象,则还可以使用 CommandArgument 属性来标识当前行。使用的是 ButtonField 对象时,CommandArgument 属性自动设置为行索引。使用的是 TemplateField 对象时,控件不会自动设置 CommandArgument 属性。在这种情况下,如果必须在事件处理程序中确定行索引,则可以使用数据绑定表达式将该按钮的 CommandArgument 属性设置为行索引。 响应 GridView 控件中的按钮事件将按钮的 CommandName 属性设置为标识其功能的字符串,如“打印”或“复制”。 如果使用的是 TemplateField 对象并且必须在事件处理程序方法中访问行索引,则将按钮的 CommandArgument 属性设置为标识当前行的表达式。 下面的示例演示如何将 TemplateField 列中某个按钮的 CommandArgument 属性设置为当前行索引。在该示例中,该列包含一个显示购物车的 Button 控件。 <asp:TemplateField> <ItemTemplate> <asp:Button ID="AddButton" runat="server" CommandName="AddToCart" CommandArgument="<%# ((GridViewRow) Container).RowIndex %>" Text="Add to Cart" /> </ItemTemplate> </asp:TemplateField> 为 GridView 控件的 RowCommand 事件创建一个方法。在该方法中,执行下列操作: 检查事件参数对象的 CommandName 属性来查看传入什么字符串。 如果需要,使用 CommandArgument 属性检索包含该按钮的行的索引。 为用户单击的按钮执行相应的逻辑。 下面的示例演示响应 GridView 控件中的按钮单击的方法。在该示例中,TemplateField 列中的按钮发送命令“AddToCart”。RowCommand 事件处理程序确定被单击的按钮。如果被单击的是购物车按钮,则代码执行相应的逻辑。 protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) { if (e.CommandName == "AddToCart") { // Retrieve the row index stored in the // CommandArgument property. int index = Convert.ToInt32(e.CommandArgument); // Retrieve the row that contains the button // from the Rows collection. GridViewRow row = GridView1.Rows[index]; // Add code here to add the item to the shopping cart. } }
TextBox的AutoPostBack引发的问题 有时候在页面上单击一个控制时发现第一次动作没有效果,比如单击按钮跳转页面时,第一次单击没有效果,第二次单击才转向了想要的页面 这很可能就是TextBox的autoPostBack属性被设为true了 而 TextBox的AutoPostBack是发生在textbox失去焦点的时候发生的,而不是鼠标离开textbox时发生, 所以你在单击按钮时发生的是textbox的postback,而不是按钮的click事件,所以就出现了上一幕。
asp.net页面回传与js调用服务端事件、PostBack的原理详解 Asp.net 中在客户端触发服务器端事件分为两种情况: 一. WebControls中的Button 和HtmlControls中的Type为submit的HtmlInputButton 这两种按钮最终到客户端的表现形式为:<input type="submit" value="Submit">,这是Form表单的提交按钮,点击以后会作为参数发送到服务端,参数是这样的: 控件的name属性=控件的value值,对应上面的例子就是:Submit1= Submit。服务器端会根据接收到的控件的name属性的这个key来得知是这个按钮被点击了,从而在服务端触发这个按钮的点击事件。 二. HtmlControls 中的 Type为button的HtmlInputButton 和其它所有的控件事件,比如LinkButton点击,TextBox的Change事件等等: 这些事件在客户端产生后会经过一个统一的机制发送到服务端。 1.首先asp.net页框架会使用两个Hidden域来存放表示是哪个控件触发的事件,以及事件的参数: <!―表示触发事件的控件,一般是这个控件的name --> <input type="hidden" value="" /> <!―表示触发事件的参数,一般是当某个控件有两个以上的事件时,用来区别是哪个事件 --> <input type="hidden" value="" /> 2.服务端会生成一个jscript的方法来处理所有这些事件的发送,这段代码是: <script> function __doPostBack(eventTarget, eventArgument) { var theform = document.WebForm2; theform.__EVENTTARGET.value = eventTarget; theform.__EVENTARGUMENT.value = eventArgument; theform.submit(); } </script> 3.每个会引发服务端事件的控件都会在响应的客户端事件中调用上面的代码: 比如,HtmlControls 中的 Type为button的HtmlInputButton的点击事件 <!―客户端的点击事件调用__doPostBack,eventTarget 参数为'Button2',表示是name为'Button2’控件触发的事件,eventArgument 为空,表示这个Type为button的HtmlInputButton只有一个客户端触发的服务端事件--> <input Button2','')" type="button" value="Button" /> 又比如,TextBox控件的Change事件 <!―客户端的onchange事件调用__doPostBack,eventTarget 参数为’TextBox1’,表示是name为’TextBox1’控件触发的事件,而TextBox控件只有一个客户端触发的服务端事件 TextChanged,故服务器就会去触发这个TextBox的TextChanged事件-> <input type="text" TextBox1','')" /> 4.客户端触发事件后调用__doPostBack方法,将表示触发的控件源的eventTarget 和事件参数eventArgument分别付给两个隐藏域__EVENTTARGET和__EVENTARGUMENT,然后提交Form,在服务端根据 __EVENTTARGET和__EVENTARGUMENT来判断是哪个控件的什么事件触发了。 第二章、 PostBack的原理 __doPostBack是一个纯粹并且是非常简单的javascript函数,大部分的页面PostBack都是由它触发的。注意,这里是“大部分”, 因为只有两个Web Server Control 会自己触发页面的PostBack,其它的所有控件都是通过__doPostBack函数触发页面的PostBack,那先来看一下这个函数的定义吧: CODE1: <input type="hidden" value="" /> <input type="hidden" value="" /> function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument;
Literal的通俗解释 MSDN里的解释对于一个初学者来说实在是晦涩难懂 先看一下代码 <%@ Page Language="C#" %><script runat="server"> protected void Page_Load(object sender, EventArgs e) { Literal1.Text = "This <b>text</b> is inserted dynamically."; if (radioEncode.Checked == true) { Literal1.Mode = LiteralMode.Encode; } if(radioPassthrough.Checked == true) { Literal1.Mode = LiteralMode.PassThrough; } }</script></script><html><head runat="server"></head><body> <form id="form1" runat="server"> <div> <br /> <asp:RadioButton ID="radioEncode" runat="server" GroupName="LiteralMode" Checked="True" Text="Encode" AutoPostBack="True" /> <br /> <asp:RadioButton ID="radioPassthrough" runat="server" GroupName="LiteralMode" Text="PassThrough" AutoPostBack="True" /> <br /> <br /> <asp:Literal ID="Literal1" runat="server"></asp:Literal> </div> </form></body></html> 现在再看MSDN中的解释: 在您要以编程方式设置文本而不添加额外的 HTML 标记时,可以向 Web 窗体页添加 Literal Web 服务器控件。 在要向页面动态添加文本而不添加任何不属于该动态文本的元素时,Literal 控件是一种很有用的方式。 例如,您可以使用 Literal 控件来显示您从一个文件或者流中读取的 HTML。
GridView中不能添加CheckBoxField的原因 在GridView的“编辑列”选项中的checkboxfield是用于显示数据库中的定义为“bit”的列的值的 当数据库中为1时,CheckBoxField单元格显示勾选状态,为0则未勾选 这样一来就容易理解为什么有时候在添加数据源后GridView中就不能添加CheckBoxField了 原因是GridView会检测数据源中选定数据库的列,如果选定的列中没有bit数据类型的,那么GridView就会自动把CheckBoxField列取消,因为此时checkboxfield从数据库中读到的数据不能正确的用于显示勾选或不勾选
Sever对象的简单使用 Transfer类似于Response.Redirect 接下来用实例演示 HtmlEncode,UrlEncode,MapPath protected void Button1_Click(object sender, EventArgs e) { Response.Write(Server.HtmlEncode("<H1>标题</H1>")); } 输出:<H1>标题</H1> protected void Button2_Click(object sender, EventArgs e) { Response.Write("<H1>标题</H1>"); } 输出:标题(H1好标题的样式) protected void Button3_Click(object sender, EventArgs e) { Response.Redirect("Default2.aspx?a="+Server.UrlEncode("a&b")); } 输出:a&b protected void Button4_Click(object sender, EventArgs e) { Response.Redirect("Default2.aspx?a=a&b"); } 输出:a protected void Button5_Click(object sender, EventArgs e) { Response.Write(Server.MapPath("Default2.aspx")); } 输出Default2.aspx的绝对路径
HTTP协议中的GET方法和POST方法 HTTP协议中GET方法和POST方法是有所不同的,RFC1945中的英文原文如下: 8.1 GET The GET method means retrieve whatever information (in the form of an entity) is identified by the Request-URI. If the Request-URI refers to a data-producing process, it is the produced data which shall be returned as the entity in the response and not the source text of the process, unless that text happens to be the output of the process. The semantics of the GET method changes to a "conditional GET" if the request message includes an If-Modified-Since header field. A conditional GET method requests that the identified resource be transferred only if it has been modified since the date given by the If-Modified-Since header, as described in Section 10.9. The conditional GET method is intended to reduce network usage by allowing cached entities to be refreshed without requiring multiple requests or transferring unnecessary data. 8.3 POST The POST method is used to request that the destination server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line. POST is designed to allow a uniform method to cover the following functions: o Annotation of existing resources; o Posting a message to a bulletin board, newsgroup, mailing list, or similar group of articles; o Providing a block of data, such as the result of submitting a form [3], to a data-handling process; o Extending a database through an append operation. The actual function performed by the POST method is determined by the server and is usually dependent on the Request-URI. The posted entity is subordinate to that URI in the same way that a file is subordinate to a directory containing it, a news article is subordinate to a newsgroup to which it is posted, or a record is subordinate to a database. A successful POST does not require that the entity be created as a resource on the origin server or made accessible for future reference. That is, the action performed by the POST method might not result in a resource that can be identified by a URI. In this case, either 200 (ok) or 204 (no content) is the appropriate response status, depending on whether or not the response includes an entity that describes the result. If a resource has been created on the origin server, the response should be 201 (created) and contain an entity (preferably of type "text/html") which describes the status of the request and refers to the new resource. A valid Content-Length is required on all HTTP/1.0 POST requests. An HTTP/1.0 server should respond with a 400 (bad request) message if it cannot determine the length of the request message's content. Applications must not cache responses to a POST request because the
1
下一页