”面向对象”比你想象的要难得多

也许只有我有这种想法,不过我曾经以为计算机科学课上学过的“面向对象”是很简单的东西。我的意思 是,创建一些类来模拟现实世界能有多难啊?其实,那还真是挺难的。 十年之后,我仍然在学习如何合理地建模。我后悔以前我没有花更多的时间来学习面向对象和设计模式。优秀的建模技术对于每一个开发团队都是非常有价值的。

软件开发的难点在于沟通

这里的沟通是指与人的沟通,而不是socket编程。有时你的确会遇上棘手的技术问题,但是这种情况根本不常见。常见的问题在于那些你和项目经理之间的、你和客户之间的、还有你和其他开发者之间的误解。培养你的软技能吧。

学会拒绝

当我刚开始工作的时候,我非常急切的想要去讨好别人。这也就是说,我几乎不能去回绝别人对我的要求。我加了很多班,但是还是不能完成他们交代给我的所有事情。结果他们表示不满意,而我也表示要崩溃了。

如果你从不回绝别人,你的答应就显得毫无意义。承担能力所及的事情,如果别人不停地指派给你更多的事情,你需要明确的表示那意味着将会耽误其他的工作。

为了应付这种事情,我会随身携带一张列有待办事项的纸(To-do list)。当人们叫我去做什么事情的时候,我就给他们看这张纸,并且问他们我应该为他们挤掉哪个事情。这是我用来拒绝别人的一种好办法。继续阅读

编者按:这是国外程序员Al katib总结的一些编程习惯。

1. 动手编码之前,你需要对要编码实现的解决方案有一个正式的或粗略的设计。永远不要在没有任何设计的前提下就开始编码,除非所编代码不重要。

2. 优秀的代码文档跟编程语言知识一样重要。在代码源文件中,为每个主要的代码段添加注释,解释代码的基本逻辑。最好注明程序的构建和修改日期,以及修改的原因也是非常有必要的。

3. 维护程序的各个版本同样重要。当前有些编程工具都自带一个版本管理工具。无论你什么时候改变自己的程序,它们都会将其保存为.bak文件。
我的方法是为每个程序维护三个不同的版本。比如说,我有一个名为program.c的文件,这个文件同时也被其他项目组成员使用。我把这个文件复制为 program.c.old作为备份文件,并且当我修改时,我会备份另一个名为program.c.wrk的副本文件。当成功完成修改时替换 program.c.wrk文件。
你还可以给自己的程序版本添加一个日期或一些注释,像program260505.c或programReadFnWrking.c。

4. 如果工程包含多个源文件,则声称一个README文件,注明每个源文件、数据文件、临时文件以及日志文件(如果有的话)的作用。你还可以注明编译和运行步骤。继续阅读

如果你处在局域网的内网中,想获取你的外网IP地址。这里有一个使用Javascript调用ip138获取外网IP的方法,十分简单,代码如下:

 

JavaScript代码
  1. <script language="javascript">      
  2. xml=new ActiveXObject("Microsoft.XMLHTTP");      
  3. xml.open("GET","http://www.ip138.com/ip2city.asp",false);      
  4. xml.send();      
  5. kk=xml.ResponseText;      
  6. i=kk.indexOf("[");      
  7. ie=kk.indexOf("]");      
  8. ip=kk.substring(i+1,ie);      
  9. document.write("<span style=‘color:red;font-size:12;‘ cursor=‘hand‘>您的IP地址是:" + ip + "</span>");      
  10. </script>  

 

文字不清晰,K图也断断续续的了。这里icech找到一个缩小图片不失真的代码,还是不错的,测试成功!针对GIF和JPG的图片效果不错。

代码如下:

 

Java代码
  1. public static void reduceImg(String imgsrc, String imgdist, int widthdist,      
  2.         int heightdist) {      
  3.     try {      
  4.         File srcfile = new File(imgsrc);      
  5.         if (!srcfile.exists()) {      
  6.             return;      
  7.         }      
  8.         Image src = javax.imageio.ImageIO.read(srcfile);      
  9.      
  10.         BufferedImage tag= new BufferedImage((int) widthdist, (int) heightdist,      
  11.                 BufferedImage.TYPE_INT_RGB);      
  12.      
  13.         tag.getGraphics().drawImage(src.getScaledInstance(widthdist, heightdist,  Image.SCALE_SMOOTH), 00,  null);      
  14. //        tag.getGraphics().drawImage(src.getScaledInstance(widthdist, heightdist,  Image.SCALE_AREA_AVERAGING), 0, 0,  null);      
  15.               
  16.         FileOutputStream out = new FileOutputStream(imgdist);      
  17.         JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);      
  18.         encoder.encode(tag);      
  19.         out.close();      
  20.      
  21.     } catch (IOException ex) {      
  22.         ex.printStackTrace();      
  23.     }      
  24. }    

这篇文章是由José M. Aguilar在他卓越的博客中以西班牙语的形式首发,其后Timm Martin在获得Aguilar先生的授权下,对该文章进行翻译、修改,并且在DevTopics上发布。

以下13个小技巧可以使得你的代码在长时间内依然能够保持容易理解和维护。

1. 对不同级别的代码进行注释

对于不同级别的代码块,要使用统一的方法来进行注释。例如:

    * 对于每一个类,需要包含一段简明扼要的描述,作者和上一次修改的时间
    * 对于每一个方法,需要包含这个方法的用途,功能,参数以及返回结果

当你在一个团队里面的时候,采用一套注释的标准是非常重要的。当然,使用一种大家都认可的注释约定和工具(例如C#的XML注释和Java的Javadoc)在一定程度上能推动这项任务。

2. 使用段落注释

首先把代码块分解成多个“段落”,每一个段落都执行单一的任务;然后在每一个“段落”开始之前添加注释,告诉阅读代码的人接下来的这段代码是干什么用的

    // 检查所有记录都是正确的
    foreach (Record record in records)
    {
        if (rec.checkStatus()==Status.OK)
        {
            . . .
        }
    }
    // 现在开始进行处理
    Context ctx = new ApplicationContext();
    ctx.BeginTransaction();
    . . .

3. 对齐注释行

对于那些在行末写有注释的代码,应该对齐注释行来使得方便阅读

    const MAX_ITEMS = 10; // maximum number of packets
    const MASK = 0x1F;    // mask bit TCP

有些开发人员使用tab来对齐注释,而另外一些人会用空格来对齐。由于tab在不同的编辑器和集成开发环境中会有所不同,所以最佳的方法是使用空格来对齐注释行。

4. 不要侮辱阅读者的智慧

要避免没用的注释,例如

    if (a == 5)        //如果a等于5
        counter = 0    //把counte设为0

这不单把时间浪费在写没用的注释上面,同时也在分散读者的注意力。

5. 要有礼貌

应当避免没有礼貌的注释,例如“要注意一些愚蠢的用户会输入一个负数”,或者“修正由菜鸟工程师写的愚蠢得可怜的代码而导致的副作用”。这样的注释对于代码的写注释的人来说并没有任何好处,同时你永远都不会知道将来这些注释会被谁来阅读,你的老板,一个客户或者是刚才被你数落的愚蠢得可怜的工程师。

6. 直截了当

不要在注释里面写过多的废话。避免在注释里面卖弄ASCII艺术,写笑话,作诗和过于冗长。简而言之就是保持注释的简单和直接。

7. 使用统一的风格

有些人觉得注释应该让非程序员也能看懂。另外一些人觉得注释需要面对的读者只是程序员。无论如何,正如Successful Strategies for Commenting Code中所说的,最重要的是注释的风格需要统一,并且总是面向相同的读者。就自己而论,我怀疑非程序员是否会去读代码,所以我觉得注释应该面向程序员来写。

8. 在内部使用特殊的标签

当你在一个团队里工作的时候,采用一组一致的标签能帮助不同的程序员沟通。例如,很多团队会采用“TODO”标签来表示一段尚未完成的代码

    int Estimate(int x, int y)
    {
        // TODO: implement the calculations
        return 0;
    }

标签注释并不会解释代码,它们寻求注意或者是传递信息。但是如果适当地使用这种技术,要记住跟进这段代码并且完成该标签传递的任务。

9. 在写代码的同时添加注释

当你在写代码而且记忆犹新的同时就添加注释。如果等到项目后期才添加注释,会让你事倍功半。“我没有时间写注释”,“我的时间很紧迫”和“项目已经延迟了”,这些都是不写注释的常见借口。有些工程师觉最佳的解决方法是“注释先行”。例如:

    public void ProcessOrder()
    {
        // Make sure the products are available
        // Check that the customer is valid
        // Send the order to the store
        // Generate bill
    }

10. 把自己想象为注释的读者(事实上就是如此)

当你正在给代码写注释的时候,不仅仅为日后维护你的代码的开发者考虑,同时也设想一下如果自己就是注释的读者。Phil Haack曾经说过:

    “一旦一行代码被敲到文件中, 你就已经要开始维护那一行代码了。”

所以,我们自己就是好(或者坏)注释的第一个受益者(或者受害者)。

11. 更新代码的时候要更新注释

如果注释没有随着代码的修改而更新,那么这些注释将是毫无意义的。代码和注释需要同步,否则注释只会让维护代码的开发者更加痛苦。需要特别注意的是,一些重构的工具会自动更新代码,但是却没有自动更新注释,那么注释就自然而然地过期作废了。

12. 良好可读性代码是注释的金科玉律

对于很多开发者来说,一个基本的原则就是:让代码自己描述自己。虽然有人怀疑这是由不喜欢写注释的程序员所倡导的一场运动,但是无需解释的代码有很大的好处,这些代码更加容易理解甚至让注释变得没有必要。例如,在我的文章Fluid Interfaces中就给大家展示了什么是清晰的无需解释的代码。

    Calculator calc = new Calculator();
    calc.Set(0);
    calc.Add(10);
    calc.Multiply(2);
    calc.Subtract(4);
    Console.WriteLine( “Result: {0}”, calc.Get() );

在这个例子里面,注释就像是违反了第4条技巧那样,变得毫无必要。要写出可读性好的代码,你需要使用适当的命名方式(在经典的Ottinger’s Rules中有阐述),保证恰当的缩进,并且采用编码风格指导。如果代码不遵守这条技巧,那么注释看起来就好像是为自己不好的代码的写道歉信一样。

13. 跟你的同事分享这些技巧

虽然从第10条技巧中我们已经知道了自己就是好注释的得益者,但是这些技巧对于所有的开发者来说都是很有帮助的,尤其是整个团队都有相同共识的情况下。因此,大方地跟你的同事去分享这些技巧,让我们写出更加容易理解和维护的代码。

1 创建脚本块
<script language=”JavaScript”>
JavaScript 代码写在这里面
</script>

2 隐藏脚本代码
<script language=”JavaScript”>
<!–
document.write(“Hello”);
// –>
</script>
在不支持JavaScript的浏览器中将不执行相关代码

3 浏览器不支持的时候显示
<noscript>
Hello to the non-JavaScript browser.
</noscript>

4 链接外部脚本文件
<script language=”JavaScript” src="/”filename.js"”></script>

5 注释脚本
// This is a comment
document.write(“Hello”); // This is a comment
/*
All of this
is a comment
*/

6 输出到浏览器
document.write(“<strong>Hello</strong>”);

7 定义变量
var myVariable = “some value”;

8 字符串相加
var myString = “String1” + “String2”;

9 字符串搜索
<script language=”JavaScript”>
<!–
var myVariable = “Hello there”;
var therePlace = myVariable.search(“there”);
document.write(therePlace);
// –>
</script>

10 字符串替换
thisVar.replace(“Monday”,”Friday”);

11 格式化字串
<script language=”JavaScript”>
<!–
var myVariable = “Hello there”;
document.write(myVariable.big() + “<br>”);
document.write(myVariable.blink() + “<br>”);
document.write(myVariable.bold() + “<br>”);
document.write(myVariable.fixed() + “<br>”);
document.write(myVariable.fontcolor(“red”) + “<br>”);
document.write(myVariable.fontsize(“18pt”) + “<br>”);
document.write(myVariable.italics() + “<br>”);
document.write(myVariable.small() + “<br>”);
document.write(myVariable.strike() + “<br>”);
document.write(myVariable.sub() + “<br>”);
document.write(myVariable.sup() + “<br>”);
document.write(myVariable.toLowerCase() + “<br>”);
document.write(myVariable.toUpperCase() + “<br>”);
var firstString = “My String”;
var finalString = firstString.bold().toLowerCase().fontcolor(“red”);
// –>
</script>

12 创建数组
<script language=”JavaScript”>
<!–
var myArray = new Array(5);
myArray[0] = “First Entry”;
myArray[1] = “Second Entry”;
myArray[2] = “Third Entry”;
myArray[3] = “Fourth Entry”;
myArray[4] = “Fifth Entry”;
var anotherArray = new Array(“First Entry”,”Second Entry”,”Third Entry”,”Fourth Entry”,”Fifth Entry”);
// –>
</script>

13 数组排序
<script language=”JavaScript”>
<!–
var myArray = new Array(5);
myArray[0] = “z”;
myArray[1] = “c”;
myArray[2] = “d”;
myArray[3] = “a”;
myArray[4] = “q”;
document.write(myArray.sort());
// –>
</script>

14 分割字符串
<script language=”JavaScript”>
<!–
var myVariable = “a,b,c,d”;
var stringArray = myVariable.split(“,”);
document.write(stringArray[0]);
document.write(stringArray[1]);
document.write(stringArray[2]);
document.write(stringArray[3]);
// –>
</script>

15 弹出警告信息
<script language=”JavaScript”>
<!–
window.alert(“Hello”);
// –>
</script>

16 弹出确认框
<script language=”JavaScript”>
<!–
var result = window.confirm(“Click OK to continue”);
// –>
</script>

17 自定义函数
<script language=”JavaScript”>
<!–
function multiple(number1,number2) {
var result = number1 * number2;
return result;
}
// –>
</script>

18 调用JS函数
<a href=”#” onClick=”functionName()”>Link text</a>
<a href="/”javascript:functionName"()”>Link text</a>

19 在页面加载完成后执行函数
<body onLoad=”functionName();”>
Body of the page
</body>

20 条件判断
<script>
<!–
var userChoice = window.confirm(“Choose OK or Cancel”);
var result = (userChoice == true) ? “OK” : “Cancel”;
document.write(result);
// –>
</script>

21 指定次数循环
<script>
<!–
var myArray = new Array(3);
myArray[0] = “Item 0”;
myArray[1] = “Item 1”;
myArray[2] = “Item 2”;
for (i = 0; i < myArray.length; i++) {
document.write(myArray[i] + “<br>”);
}
// –>
</script>

22 设定将来执行
<script>
<!–
function hello() {
window.alert(“Hello”);
}
window.setTimeout(“hello()”,5000);
// –>
</script> 

23 定时执行函数
<script>
<!–
function hello() {
window.alert(“Hello”);
window.setTimeout(“hello()”,5000);
}
window.setTimeout(“hello()”,5000);
// –>
</script>

24 取消定时执行
<script>
<!–
function hello() {
window.alert(“Hello”);
}
var myTimeout = window.setTimeout(“hello()”,5000);
window.clearTimeout(myTimeout);
// –>
</script>

25 在页面卸载时候执行函数
<body onUnload=”functionName();”>
Body of the page
</body>

JavaScript就这么回事2:浏览器输出

26 访问document对象
<script language=”JavaScript”>
var myURL = document.URL;
window.alert(myURL);
</script>

27 动态输出HTML
<script language=”JavaScript”>
document.write(“<p>Here’s some information about this document:</p>”);
document.write(“<ul>”);
document.write(“<li>Referring Document: “ + document.referrer + “</li>”);
document.write(“<li>Domain: “ + document.domain + “</li>”);
document.write(“<li>URL: “ + document.URL + “</li>”);
document.write(“</ul>”);
</script>

28 输出换行
document.writeln(“<strong>a</strong>”);
document.writeln(“b”);

29 输出日期
<script language=”JavaScript”>
var thisDate = new Date();
document.write(thisDate.toString());
</script>

30 指定日期的时区
<script language=”JavaScript”>
var myOffset = -2;
var currentDate = new Date();
var userOffset = currentDate.getTimezoneOffset()/60;
var timeZoneDifference = userOffset – myOffset;
currentDate.setHours(currentDate.getHours() + timeZoneDifference);
document.write(“The time and date in Central Europe is: “ + currentDate.toLocaleString());
</script>

31 设置日期输出格式
<script language=”JavaScript”>
var thisDate = new Date();
var thisTimeString = thisDate.getHours() + “:” + thisDate.getMinutes();
var thisDateString = thisDate.getFullYear() + “/” + thisDate.getMonth() + “/” + thisDate.getDate();
document.write(thisTimeString + “ on “ + thisDateString);
</script>

32 读取URL参数
<script language=”JavaScript”>
var urlParts = document.URL.split(“?”);
var parameterParts = urlParts[1].split(“&”);
for (i = 0; i < parameterParts.length; i++) {
var pairParts = parameterParts[i].split(“=”);
var pairName = pairParts[0];
var pairValue = pairParts[1];
document.write(pairName + “ :“ +pairValue );
}
</script>
你还以为HTML是无状态的么?

33 打开一个新的document对象
<script language=”JavaScript”>
function newDocument() {
document.open();
document.write(“<p>This is a New Document.</p>”);
document.close();
}
</script>

34 页面跳转
<script language=”JavaScript”>
window.location = “http://www.x-force.cn/”;
</script>

35 添加网页加载进度窗口
<html>
<head>
<script language=‘javaScript‘>
var placeHolder = window.open(‘holder.html‘,‘placeholder‘,‘width=200,height=200‘);
</script>
<title>The Main Page</title>
</head>
<body onLoad=‘placeHolder.close()‘>
<p>This is the main page</p>
</body>
</html>

JavaScript就这么回事3:图像

36 读取图像属性
<img src="/”image1.jpg"” name=”myImage”>
<a href=”# ” onClick=”window.alert(document.myImage.width)”>Width</a>

37 动态加载图像
<script language=”JavaScript”>
myImage = new Image;
myImage.src = “Tellers1.jpg”;
</script>

38 简单的图像替换
<script language=”JavaScript”>
rollImage = new Image;
rollImage.src = “rollImage1.jpg”;
defaultImage = new Image;
defaultImage.src = “image1.jpg”;
</script>
<a href="/”myUrl"” onMouseOver=”document.myImage.src = rollImage.src;”
onMouseOut=”document.myImage.src = defaultImage.src;”>
<img src="/”image1.jpg"” name=”myImage” width=100 height=100 border=0>

39 随机显示图像
<script language=”JavaScript”>
var imageList = new Array;
imageList[0] = “image1.jpg”;
imageList[1] = “image2.jpg”;
imageList[2] = “image3.jpg”;
imageList[3] = “image4.jpg”;
var imageChoice = Math.floor(Math.random() * imageList.length);
document.write(‘<img src=”’ + imageList[imageChoice] + ‘“>’);
</script>

40 函数实现的图像替换
<script language=”JavaScript”>
var source = 0;
var replacement = 1;
function createRollOver(originalImage,replacementImage) {
var imageArray = new Array;
imageArray[source] = new Image;
imageArray[source].src = originalImage;
imageArray[replacement] = new Image;
imageArray[replacement].src = replacementImage;
return imageArray;
}
var rollImage = createRollOver(“image1.jpg”,”rollImage1.jpg”);
</script>
<a href=”#” onMouseOver=”document.myImage1.src = rollImage1[replacement].src;”
onMouseOut=”document.myImage1.src = rollImage1[source].src;”>
<img src="/”image1.jpg"” width=100 name=”myImage1” border=0>
</a>

41 创建幻灯片
<script language=”JavaScript”>
var imageList = new Array;
imageList[0] = new Image;
imageList[0].src = “image1.jpg”;
imageList[1] = new Image;
imageList[1].src = “image2.jpg”;
imageList[2] = new Image;
imageList[2].src = “image3.jpg”;
imageList[3] = new Image;
imageList[3].src = “image4.jpg”;
function slideShow(imageNumber) {
document.slideShow.src = imageList[imageNumber].src;
imageNumber += 1;
if (imageNumber < imageList.length) {
window.setTimeout(“slideShow(“ + imageNumber + “)”,3000);
}
}
</script>
</head>
<body onLoad=”slideShow(0)”>
<img src="/”image1.jpg"” width=100 name=”slideShow”>

42 随机广告图片
<script language=”JavaScript”>
var imageList = new Array;
imageList[0] = “image1.jpg”;
imageList[1] = “image2.jpg”;
imageList[2] = “image3.jpg”;
imageList[3] = “image4.jpg”;
var urlList = new Array;
urlList[0] = “http://some.host/”;
urlList[1] = “http://another.host/”;
urlList[2] = “http://somewhere.else/”;
urlList[3] = “http://right.here/”;
var imageChoice = Math.floor(Math.random() * imageList.length);
document.write(‘<a href=”’ + urlList[imageChoice] + ‘“><img src=”’ + imageList[imageChoice] + ‘“></a>’);
</script>

JavaScript就这么回事4:表单

43 表单构成
<form method=”post” action=”target.html” name=”thisForm”>
<input type=”text” name=”myText”>
<select name=”mySelect”>
<option value=”1”>First Choice</option>
<option value=”2”>Second Choice</option>
</select>
<br>
<input type=”submit” value=”Submit Me”>
</form>

44 访问表单中的文本框内容
<form name=”myForm”>
<input type=”text” name=”myText”>
</form>
<a href=‘#‘ onClick=‘window.alert(document.myForm.myText.value);‘>Check Text Field</a>

45 动态复制文本框内容
<form name=”myForm”>
Enter some Text: <input type=”text” name=”myText”><br>
Copy Text: <input type=”text” name=”copyText”>
</form>
<a href=”#” onClick=”document.myForm.copyText.value =
document.myForm.myText.value;”>Copy Text Field</a>

46 侦测文本框的变化
<form name=”myForm”>
Enter some Text: <input type=”text” name=”myText” onChange=”alert(this.value);”>
</form>

47 访问选中的Select
<form name=”myForm”>
<select name=”mySelect”>
<option value=”First Choice”>1</option>
<option value=”Second Choice”>2</option>
<option value=”Third Choice”>3</option>
</select>
</form>
<a href=‘#‘ onClick=‘alert(document.myForm.mySelect.value);‘>Check Selection List</a>

48 动态增加Select项
<form name=”myForm”>
<select name=”mySelect”>
<option value=”First Choice”>1</option>
<option value=”Second Choice”>2</option>
</select>
</form>
<script language=”JavaScript”>
document.myForm.mySelect.length++;
document.myForm.mySelect.options[document.myForm.mySelect.length – 1].text = “3”;
document.myForm.mySelect.options[document.myForm.mySelect.length – 1].value = “Third Choice”;
</script>

49 验证表单字段
<script language=”JavaScript”>
function checkField(field) {
if (field.value == “”) {
window.alert(“You must enter a value in the field”);
field.focus();
}
}
</script>
<form name=”myForm” action=”target.html”>
Text Field: <input type=”text” name=”myField”onBlur=”checkField(this)”>
<br><input type=”submit”>
</form>

50 验证Select项
function checkList(selection) {
if (selection.length == 0) {
window.alert(“You must make a selection from the list.”);
return false;
}
return true;
}

51 动态改变表单的action
<form name=”myForm” action=”login.html”>
Username: <input type=”text” name=”username”><br>
Password: <input type=”password” name=”password”><br>
<input type=”button” value=”Login” onClick=”this.form.submit();”>
<input type=”button” value=”Register” onClick=”this.form.action = ‘register.html’; this.form.submit();”>
<input type=”button” value=”Retrieve Password” onClick=”this.form.action = ‘password.html’; this.form.submit();”>
</form>

52 使用图像按钮
<form name=”myForm” action=”login.html”>
Username: <input type=”text” name=”username”><br>
Password: <input type=”password”name=”password”><br>
<input type=”image” src="/”login.gif"” value=”Login”>
</form>

53 表单数据的加密
<SCRIPT LANGUAGE=‘JavaScript‘>
<!–
function encrypt(item) {
var newItem = ‘‘;
for (i=0; i < item.length; i++) {
newItem += item.charCodeAt(i) + ‘.‘;
}
return newItem;
}
function encryptForm(myForm) {
for (i=0; i < myForm.elements.length; i++) {
myForm.elements[i].value = encrypt(myForm.elements[i].value);
}
}

//–>
</SCRIPT>
<form name=‘myForm‘ onSubmit=‘encryptForm(this); window.alert(this.myField.value);‘>
Enter Some Text: <input type=text name=myField><input type=submit>
</form>

JavaScript就这么回事5:窗口和框架

54 改变浏览器状态栏文字提示
<script language=”JavaScript”>
window.status = “A new status message”;
</script>

55 弹出确认提示框
<script language=”JavaScript”>
var userChoice = window.confirm(“Click OK or Cancel”);
if (userChoice) {
document.write(“You chose OK”);
} else {
document.write(“You chose Cancel”);
}
</script>

56 提示输入
<script language=”JavaScript”>
var userName = window.prompt(“Please Enter Your Name”,”Enter Your Name Here”);
document.write(“Your Name is “ + userName);
</script>

57 打开一个新窗口
//打开一个名称为myNewWindow的浏览器新窗口
<script language=”JavaScript”>
window.open(“http://www.liu21st.com/”,”myNewWindow”);
</script>

58 设置新窗口的大小
<script language=”JavaScript”>
window.open(“http://www.liu21st.com/”,”myNewWindow”,‘height=300,width=300‘);
</script>

59 设置新窗口的位置
<script language=”JavaScript”>
window.open(“http://www.liu21st.com/”,”myNewWindow”,‘height=300,width=300,left=200,screenX=200,top=100,screenY=100‘);
</script>

60 是否显示工具栏和滚动栏
<script language=”JavaScript”>
window.open(“http://www.x-force.cn/",toolbar=no, menubar=no);
</script>

61 是否可以缩放新窗口的大小
<script language=”JavaScript”>
window.open(‘http://www.x-force.cn/‘ , ‘myNewWindow‘, ‘resizable=yes‘ );</script>

62 加载一个新的文档到当前窗口
<a href=‘#‘ onClick=‘document.location = ‘125a.html‘;‘ >Open New Document</a>

63 设置页面的滚动位置
<script language=”JavaScript”>
if (document.all) { //如果是IE浏览器则使用scrollTop属性
document.body.scrollTop = 200;
} else { //如果是NetScape浏览器则使用pageYOffset属性
window.pageYOffset = 200;
}</script>

64 在IE中打开全屏窗口
<a href=‘#‘ onClick=”window.open(‘http://www.juxta.com/‘,‘newWindow‘,‘fullScreen=yes‘);”>Open a full-screen window</a>

65 新窗口和父窗口的操作
<script language=”JavaScript”>
//定义新窗口
var newWindow = window.open(“128a.html”,”newWindow”);
newWindow.close(); //在父窗口中关闭打开的新窗口
</script>在新窗口中关闭父窗口
window.opener.close()

66 往新窗口中写内容
<script language=”JavaScript”>
var newWindow = window.open(“”,”newWindow”);
newWindow.document.open();
newWindow.document.write(“This is a new window”);
newWIndow.document.close();
</script>

67 加载页面到框架页面
<frameset cols=”50%,*”>
<frame name=”frame1” src="/”135a.html"”>
<frame name=”frame2” src="/”about:blank"”>
</frameset>
在frame1中加载frame2中的页面
parent.frame2.document.location = “135b.html”;

68 在框架页面之间共享脚本
如果在frame1中html文件中有个脚本
function doAlert() {
window.alert(“Frame 1 is loaded”);
}
那么在frame2中可以如此调用该方法

<body onLoad=”parent.frame1.doAlert();”>
This is frame 2.
</body>

69 数据公用
可以在框架页面定义数据项,使得该数据可以被多个框架中的页面公用
<script language=”JavaScript”>
var persistentVariable = “This is a persistent value”;
</script>
<frameset cols=”50%,*”>
<frame name=”frame1” src="/”138a.html"”>
<frame name=”frame2” src="/”138b.html"”>
</frameset>

这样在frame1和frame2中都可以使用变量persistentVariable

70 框架代码库
根据以上的一些思路,我们可以使用一个隐藏的框架页面来作为整个框架集的代码库

<frameset cols=”0,50%,*”>
<frame name=”codeFrame” src="/”140code.html"”>
<frame name=”frame1” src="/”140a.html"”>
<frame name=”frame2” src="/”140b.html"”>
</frameset>

今天在Linux上装了一个Tomcat,发现它自带的那个jsvc启动脚本实在太古老了。于是就在网上Search了一下,加上自己修改code。写了一个适合于tomcat6用的jsvc启动脚本。使用以后就可以把tomcat做为linux的Service来自启动了。

把这段代码保存为 /etc/rc.d/init.d/tomcat ,然后运行
#chkconfig –add tomcat
用–list看一下是否系统已有tomcat启动文件
#ckhconfig –list
即可把tomcat 添加为系统服务自动随系统启动了。这个脚本会在runlevel 3/4/5三种模式自动启动。

 

代码
  1. #!/bin/sh   
  2. ##############################################################################   
  3. #   
  4. #   Copyright 2004 The Apache Software Foundation.   
  5. #   
  6. #   Licensed under the Apache License, Version 2.0 (the "License");   
  7. #   you may not use this file except in compliance with the License.   
  8. #   You may obtain a copy of the License at   
  9. #   
  10. #       http://www.apache.org/licenses/LICENSE-2.0   
  11. #   
  12. #   Unless required by applicable law or agreed to in writing, software   
  13. #   distributed under the License is distributed on an "AS IS" BASIS,   
  14. #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   
  15. #   See the License for the specific language governing permissions and   
  16. #   limitations under the License.   
  17. ##############################################################################   
  18. #   
  19. # Small shell script to show how to start/stop Tomcat using jsvc   
  20. # If you want to have Tomcat running on port 80 please modify the server.xml   
  21. # file:   
  22. #   
  23. #    <!– Define a non-SSL HTTP/1.1 Connector on port 80 –>   
  24. #    <Connector className="org.apache.catalina.connector.http.HttpConnector"   
  25. #               port="80" minProcessors="5" maxProcessors="75"   
  26. #               enableLookups="true" redirectPort="8443"   
  27. #               acceptCount="10" debug="0" connectionTimeout="60000"/>   
  28. #   
  29. # That is for Tomcat-5.0.x (Apache Tomcat/5.0)   
  30. #   
  31. # chkconfig: 345 87 13   
  32. # description: Tomcat Daemon   
  33. # processname: jsvc   
  34. # pidfile: /var/run/jsvc.pid   
  35. # config:   
  36. #   
  37. # Source function library   
  38. . /etc/rc.d/init.d/functions   
  39. #   
  40. # Adapt the following lines to your configuration   
  41. JAVA_HOME=/usr/java/default  
  42. CATALINA_HOME=/opt/apache-tomcat   
  43. DAEMON_HOME=/opt/apache-tomcat   
  44. TOMCAT_USER=root   
  45.   
  46. # for multi instances adapt those lines.   
  47. TMP_DIR=/var/tmp   
  48. PID_FILE=/var/run/jsvc.pid   
  49. CATALINA_BASE=/opt/apache-tomcat   
  50.   
  51. CATALINA_OPTS="-Djava.library.path=/home/jfclere/jakarta-tomcat-connectors/jni/native/.libs"  
  52. CLASSPATH=   
  53. $JAVA_HOME/lib/tools.jar:   
  54. $CATALINA_HOME/bin/commons-daemon.jar:   
  55. $CATALINA_HOME/bin/bootstrap.jar   
  56.   
  57. prog="tomcat"  
  58.   
  59. start(){   
  60.     #   
  61.     # Start Tomcat   
  62.     #   
  63.     echo -n $"Starting $prog:"  
  64.     $DAEMON_HOME/bin/jsvc    
  65.     -user $TOMCAT_USER    
  66.     -home $JAVA_HOME    
  67.     -Dcatalina.home=$CATALINA_HOME    
  68.     -Dcatalina.base=$CATALINA_BASE    
  69.     -Djava.io.tmpdir=$TMP_DIR    
  70.     -wait 10    
  71.     -pidfile $PID_FILE    
  72.     -outfile $CATALINA_HOME/logs/catalina.out    
  73.     -errfile ‘&1‘    
  74.     $CATALINA_OPTS    
  75.     -cp $CLASSPATH    
  76.     org.apache.catalina.startup.Bootstrap   
  77.     #   
  78.     # To get a verbose JVM   
  79.     #-verbose    
  80.     # To get a debug of jsvc.   
  81.     #-debug    
  82.     RETVAL=$?   
  83.     [ $RETVAL = 0 ] && touch /var/lock/subsys/jsvc   
  84.     [ $RETVAL = 0 ] && echo_success || echo_failure   
  85.     echo   
  86.     return $RETVAL   
  87. }   
  88.   
  89. stop(){   
  90.     #   
  91.     # Stop Tomcat   
  92.     #   
  93.     echo -n $"Stopping $prog: "  
  94.     $DAEMON_HOME/bin/jsvc    
  95.     -stop    
  96.     -pidfile $PID_FILE    
  97.     org.apache.catalina.startup.Bootstrap   
  98.     RETVAL=$?   
  99.     [ $RETVAL = 0 ] && rm /var/lock/subsys/jsvc   
  100.     [ $RETVAL = 0 ] && echo_success || echo_failure   
  101.     echo   
  102.     return $RETVAL   
  103. }   
  104.   
  105. case "$1" in   
  106.   start)   
  107.     start   
  108.   ;;   
  109.   stop)   
  110.     stop   
  111.   ;;   
  112.   restart|reload)   
  113.     stop   
  114.     start   
  115.   ;;   
  116.   status)   
  117.     status jsvc   
  118.     RETVAL=$?   
  119.   ;;   
  120.   *)   
  121.     echo "Usage %0 start/stop/restart"  
  122.     exit 1;;   
  123. esac   

密码已经是我们生活工作中必不可少的工具,但一个不安全的密码有又有可能会给我们造成不必要的损失。作为网站设计者,如果我们在网页中能对用户输入的密码进行安全评估,并显示出相应的提示信息,那么对用户设置一个安全的密码将有很大帮助。同时也使得网站更具人性化,更有吸引力.

什么是一个安全的密码呢?本程序按以下的方式进行评估.

1.如果密码少于5位,那么就认为这是一个弱密码.

2.如果密码只由数字、小写字母、大写字母或其它特殊符号当中的一种组成,则认为这是一个弱密码.

3.如果密码由数字、小写字母、大写字母或其它特殊符号当中的两种组成,则认为这是一个中度安全的密码.

4.如果密码由数字、小写字母、大写字母或其它特殊符号当中的三种以上组成,则认为这是一个比较安全的密码.

本程序将根据用户输入的密码分别显示不同的颜色表示密码的强度,具体程序如下:

以下是代码:

< script language=javascript>

//CharMode函数
//测试某个字符是属于哪一类.
function CharMode(iN){
if (iN>=48 && iN < =57) //数字
return 1;
if (iN>=65 && iN < =90) //大写字母
return 2;
if (iN>=97 && iN < =122) //小写
return 4;
else
return 8; //特殊字符
}

//bitTotal函数
//计算出当前密码当中一共有多少种模式
function bitTotal(num){
modes=0;
for (i=0;i< 4;i++){
if (num & 1) modes++;
num>>>=1;
}
return modes;
}

//checkStrong函数
//返回密码的强度级别

function checkStrong(sPW){
if (sPW.length< =4)
return 0; //密码太短
Modes=0;
for (i=0;i< sPW.length;i++){
//测试每一个字符的类别并统计一共有多少种模式.
Modes|=CharMode(sPW.charCodeAt(i));
}

return bitTotal(Modes);

}

//pwStrength函数
//当用户放开键盘或密码输入框失去焦点时,根据不同的级别显示不同的颜色

function pwStrength(pwd){
O_color="#eeeeee";
L_color="#FF0000";
M_color="#FF9900";
H_color="#33CC00";
if (pwd==null||pwd==){
Lcolor=Mcolor=Hcolor=O_color;
}
else{
S_level=checkStrong(pwd);
switch(S_level) {
case 0:
Lcolor=Mcolor=Hcolor=O_color;
case 1:
Lcolor=L_color;
Mcolor=Hcolor=O_color;
break;
case 2:
Lcolor=Mcolor=M_color;
Hcolor=O_color;
break;
default:
Lcolor=Mcolor=Hcolor=H_color;
}
}

document.getElementById("strength_L").style.background=Lcolor;
document.getElementById("strength_M").style.background=Mcolor;
document.getElementById("strength_H").style.background=Hcolor;
return;
}

< /script>

< form name=form1 action="" >
输入密码:
< input type=password size=10 onKeyUp=pwStrength(this.value)
onBlur=pwStrength(this.value)>
< br>密码强度:
< table width="217" border="1" cellspacing="0" cellpadding="1" bordercolor="#cccccc"
height="23" style=display:inline>
< tr align="center" bgcolor="#eeeeee">

< td width="33%" id="strength_L">弱< /td>

< td width="33%" id="strength_M">中< /td>

< td width="33%" id="strength_H">强< /td>
< /tr>
< /table>

< /form>

目前,最常用的三种动态网页语言有ASP(Active Server Pages),JSP(JavaServer Pages),PHP (Hypertext Preprocessor)。

简 介

  ASP全名Active Server Pages,是一个WEB服务器端的开发环境,利用它可以产生和执行动态的、互动的、高性能的WEB服务应用程序。ASP采用脚本语言VBScript(Java script)作为自己的开发语言。

  PHP是一种跨平台的服务器端的嵌入式脚本语言。它大量地借用C,Java和Perl语言的语法, 并耦合PHP自己的特性,使WEB开发者能够快速地写出动态产生页面。它支持目前绝大多数数据库。还有一点,PHP是完全免费的,不用花钱,你可以从 PHP官方站点(http: //www.PHP.net)自由下载。而且你可以不受限制地获得源码,甚至可以从中加进你自己需要的特色。

  JSP是Sun公司推出的新一代网站开发语言,Sun公司借助自己在Java上的不凡造诣,将Java从Java应用程序和Java Applet之外,又有新的硕果,就是JSP,Java Server Page。JSP可以在Serverlet和JavaBean的支持下,完成功能强大的站点程序。

  三者都提供在 HTML代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。但JSP代码被编译成 Servlet并由Java虚拟机解释执行,这种编译操作仅在对JSP页面的第一次请求时发生。在ASP 、PHP、JSP环境下,HTML代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑。普通的 HTML页面只依赖于Web服务器,而ASP 、PHP、JSP页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到HTML代码中,然后一起发送给浏览器。ASP 、PHP、JSP三者都是面向Web服务器的技术,客户端浏览器不需要任何附加的软件支持。

技术特点:
ASP:
1. 使用VBScript 、 JScript等简单易懂的脚本语言,结合HTML代码,即可快速地完成网站的应用程序。
2. 无须compile编译,容易编写,可在服务器端直接执行。
3. 使用普通的文本编辑器,如Windows的记事本,即可进行编辑设计。
4. 与浏览器无关(Browser Independence), 客户端只要使用可执行HTML码的浏览器,即可浏览Active Server Pages所设计的网页内容。Active ServerPages 所使用的脚本语言(VBScript 、 Jscript)均在WEB服务器端执行,客户端的浏览器不需要能够执行这些脚本语言。
5.Active Server Pages能与任何ActiveX scripting语言兼容。除了可使用VB Script或JScript语言来设计外,还通过plug-in的方式,使用由第三方所提供的其它脚本语言,譬如REXX 、Perl 、Tcl等。脚本引擎是处理脚本程序的COM(Component Object Model) 对象。
6. 可使用服务器端的脚本来产生客户端的脚本。
7. ActiveX Server Components(ActiveX 服务器组件 )具有无限可扩充性。可以使用Visual Basic 、Java 、Visual C++ 、COBOL等程序设计语言来编写你所需要的ActiveX Server Component 。

PHP:
1 数据库连接
PHP 可以编译成具有与许多数据库相连接的函数。PHP与MySQL是现在绝佳的群组合。你还可以自己编写外围的函数去间接存取数据库。通过这样的途径当你更换使用的数据库时,可以轻松地修改编码以适应这样的变化。PHPLIB就是最常用的可以提供一般事务需要的一系列基库。但PHP提供的数据库接口支持彼此不统一,比如对Oracle, MySQL,Sybase的接口,彼此都不一样。这也是PHP的一个弱点。

JSP:
1.将内容的产生和显示进行分离
使用JSP技术,Web页面开发人员可以使用HTML或者XML标识来设计和格式化最终页面。使用JSP标识或者小脚本来产生页面上的动态内容。产生内容的逻辑被封装在标识和JavaBeans群组件中,并且捆绑在小脚本中,所有的脚本在服务器端执行。如果核心逻辑被封装在标识和Beans中,那么其它人,如Web管理人员和页面设计者,能够编辑和使用JSP页面,而不影响内容的产生。在服务器端,JSP引擎解释JSP标识,产生所请求的内容(例如,通过存取JavaBeans群组件,使用JDBC技术存取数据库),并且将结果以HTML(或者XML)页面的形式发送回浏览器。这有助于作者保护自己的代码,而又保证任何基于HTML的Web浏览器的完全可用性。

2.强调可重用的群组件
绝大多数JSP页面依赖于可重用且跨平台的组件(如:JavaBeans或者Enterprise JavaBeans)来执行应用程序所要求的更为复杂的处理。开发人员能够共享和交换执行普通操作的组件,或者使得这些组件为更多的使用者或者用户团体所使用。基于组件的方法加速了总体开发过程,并且使得各种群组织在他们现有的技能和优化结果的开发努力中得到平衡。

3.采用标识简化页面开发
Web 页面开发人员不会都是熟悉脚本语言的程序设计人员。JavaServer Page技术封装了许多功能,这些功能是在易用的、与JSP相关的XML标识中进行动态内容产生所需要的。标准的JSP标识能够存取和实例化 JavaBeans组件,设定或者检索群组件属性,下载Applet,以及执行用其它方法更难于编码和耗时的功能。通过开发定制化标识库,JSP技术是可以扩展的。今后,第三方开发人员和其它人员可以为常用功能建立自己的标识库。这使得Web页面开发人员能够使用熟悉的工具和如同标识一样的执行特定功能的构件来工作。 JSP技术很容易整合到多种应用体系结构中,以利用现存的工具和技巧,并且扩展到能够支持企业级的分布式应用。作为采用Java技术家族的一部分,以及 Java 2EE的一个成员,JSP技术能够支持高度复杂的基于Web的应用。由于JSP页面的内置脚本语言是基于Java程序设计语言的,而且所有的JSP页面都被编译成为Java Servlet,JSP页面就具有Java技术的所有好处,包括健壮的存储管理和安全性。作为Java平台的一部分,JSP拥有Java程序设计语言“一次编写,各处执行”的特点。随着越来越多的供货商将JSP支持加入到他们的产品中,您可以使用自己所选择的服务器和工具,修改工具或服务器并不影响目前的应用。

应用范围:
ASP是Microsoft开发的动态网页语言,也继承了微软产品的一贯传统,只能执行于微软的服务器产品,IIS(Internet Information Server) (windows NT)和PWS(Personal Web Server)(windows 98)上。Unix下也有ChiliSoft的组件来支持ASP,但是ASP本身的功能有限,必须通过ASP+COM的群组合来扩充,Unix下的COM 实现起来非常困难。

PHP3可在Windows,Unix,Linux的Web服务器上正常执行,还支持IIS,Apache等一般的Web服务器,用户更换平台时,无需变换PHP3代码,可即拿即用。

JSP 同PHP3类似,几乎可以执行于所有平台。如Win NT,Linux,Unix。在NT下IIS通过一个外加服务器,例如JRUN或者ServletExec,就能支持JSP。知名的Web服务器 Apache已经能够支持JSP。由于Apache广泛应用在NT、Unix和Linux上,因此JSP有更广泛的执行平台。虽然现在NT操作系统占了很大的市场份额,但是在服务器方面Unix的优势仍然很大,而新崛起的Linux更是来势不小。从一个平台移植到另外一个平台,JSP和JavaBean甚至不用重新编译,因为Java字节码都是标准的与平台无关的。

性能比较:
有人做过试验,对这三种语言分别做回圈性能测试及存取Oracle数据库测试。在循环性能测试中,JSP只用了令人吃惊的四秒钟就结束了20000*20000的回圈。而ASP、PHP测试的是 2000*2000循环(少一个数量级),却分别用了63秒和84秒。(参考PHPLIB)。 数据库测试中,三者分别对 oracle 8 进行 1000 次 Insert,Update,Select和Delete: JSP 需要 13 秒,PHP 需要 69 秒,ASP则 需要 73 秒。

前景分析:
  目前在国内PHP与ASP应用最为广泛。而JSP由于是一种较新的技术,国内采用的较少。但在国外, JSP已经是比较流行的一种技术,尤其是电子商务类的网站,多采用JSP。采用PHP的网站如新浪网(sina)、中国人(Chinaren)等,但由于 PHP本身存在的一些缺点,使得它不适合应用于大型电子商务站点,而更适合一些小型的商业站点。首先,PHP缺乏规模支持。其次,缺乏多层结构支持。对于大负荷站点,解决方法只有一个:分布计算。数据库、应用逻辑层、表示逻辑层彼此分开,而且同层也可以根据流量分开,群组成二维数组。而PHP则缺乏这种支持。还有上面提到过的一点,PHP提供的数据库接口支持不统一,这就使得它不适合运用在电子商务中。

ASP和JSP则没有以上缺陷, ASP可以通过Microsoft Windowsd的COM/DCOM获得ActiveX规模支持,通过DCOM和Transcation Server获得结构支持;JSP可以通过SUN Java的Java Class和EJB获得规模支持,通过EJB/CORBA以及众多厂商的Application Server获得结构支持。三者中,JSP应该是未来发展的趋势。世界上一些大的电子商务解决方案提供商都采用JSP/Servlet。比较出名的如 IBM的E-business,它的核心是采用JSP/Servlet的Web Sphere。它们都是通过CGI来提供支持的。但去年10月后它推出了Enfinity,一个采用JSP/Servlet的电子商务 Application Server,而且声言不再开发传统软件。

总之,ASP,PHP,JSP三者都有相当数量的支持者,由此也可以看出三者各有所长。正在学习或使用动态页面的朋友可根据三者的特点选择一种适合自己的语言。

本文转载自『异次元の世界』http://www.x-force.cn/article.asp?id=106

1. 打开新的窗口并传送参数:
传送参数:
response.write("<script>window.open(‘*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+…+"‘)</script>")

接收参数:
string a = Request.QueryString("id");
string b = Request.QueryString("id1");

2.为按钮添加对话框

传送参数:
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("");
}
strBuilder.Append(ex.Message).Append("").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.Inf
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"

http://dotnet.aspx.cc/exam/enter2tab.aspx

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.委托讨论
http://community.csdn.net/Expert/topic/2651/2651579.xml?temp=.7183191
http://dev.csdn.net/develop/article/22/22951.shtm

22.读取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使用:

3.1添加删除确认:

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(‘确认删除此项吗?‘);");

}

}

}

3.2样式交替:

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‘;" ;

}

3.3添加一个编号列:

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();

3.4 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);

34.在自己的网站上登陆其他网站:(如果你的页面是通过嵌套方式的话,因为一个页面只能有一个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");
}

35.警告窗口

/**//// <summary>
/// 服务器端弹出alert对话框
/// </summary>
/// <param name="str_Message">提示信息,例子:"不能为空!"</param>
/// <param name="page">Page类</param>
public void Alert(string str_Message,Page page)
{
page.RegisterStartupScript("","<script>alert(‘"+str_Message+"‘);</script>");
}

36.重载此警告窗口,使某控件获得焦点

/**//// <summary>
/// 服务器端弹出alert对话框,并使控件获得焦点
/// </summary>
/// <param name="str_Ctl_Name">获得焦点控件Id值,比如:txt_Name</param>
/// <param name="str_Message">提示信息,例子:"请输入您姓名!"</param>
/// <param name="page">Page类</param>
public void Alert(string str_Ctl_Name,string str_Message,Page page)
{
page.RegisterStartupScript("","<script>alert(‘"+str_Message+"‘);document.forms(0)."+str_Ctl_Name+".focus(); document.forms(0)."+str_Ctl_Name+".select();</script>");
}

37.确认对话框

/**//// <summary>
/// 服务器端弹出confirm对话框
/// </summary>
/// <param name="str_Message">提示信息,例子:"您是否确认删除!"</param>
/// <param name="btn">隐藏Botton按钮Id值,比如:btn_Flow</param>
/// <param name="page">Page类</param>
public void Confirm(string str_Message,string btn,Page page)
{
page.RegisterStartupScript("","<script> if (confirm(‘"+str_Message+"‘)==true){document.forms(0)."+btn+".click();}</script>");
}

38.重载确认对话框,点击确定触发一个隐藏按钮事件,点击取消触发一个隐藏按钮事件

/**//// <summary>
/// 服务器端弹出confirm对话框,询问用户准备转向那些操作,包括“确定”和“取消”时的操作
/// </summary>
/// <param name="str_Message">提示信息,比如:"成功增加数据,单击"确定"按钮填写流程,单击"取消"修改数据"</param>
/// <param name="btn_Redirect_Flow">"确定"按钮id值</param>
/// <param name="btn_Redirect_Self">"取消"按钮id值</param>
/// <param name="page">Page类</param>
public void Confirm(string str_Message,string btn_Redirect_Flow,string btn_Redirect_Self,Page page)
{
page.RegisterStartupScript("","<script> if (confirm(‘"+str_Message+"‘)==true){document.forms(0)."+btn_Redirect_Flow+".click();}else{document.forms(0)."+btn_Redirect_Self+".click();}</script>");
}

39.获得焦点

/**//// <summary>
/// 使控件获得焦点
/// </summary>
/// <param name="str_Ctl_Name">获得焦点控件Id值,比如:txt_Name</param>
/// <param name="page">Page类</param>
public void GetFocus(string str_Ctl_Name,Page page)
{
page.RegisterStartupScript("","<script>document.forms(0)."+str_Ctl_Name+".focus(); document.forms(0)."+str_Ctl_Name+".select();</script>");
}

40.子窗体返回主窗体

/**////<summary>
///名称:redirect
///功能:子窗体返回主窗体
///参数:url
///返回值:空
///</summary>
public void redirect(string url,Page page)
{
if ( Session["IfDefault"]!=(object)"Default")
{
page.RegisterStartupScript("","<script>window.top.document.location.href=‘"+url+"‘;</script>");
}
}

41.判断是否为数字

/**//// <summary>
/// 名称:IsNumberic
/// 功能:判断输入的是否是数字
/// 参数:string oText:源文本
/// 返回值: bool true:是 false:否
/// </summary>

public bool IsNumberic(string oText)
{
try
{
int var1=Convert.ToInt32 (oText);
return true;
}
catch
{
return false;
}
}

获得字符串实际长度(包括中文字符)

//获得字符串oString的实际长度
public int StringLength(string oString)
{
byte[] strArray=System.Text .Encoding.Default .GetBytes (oString);
int res=strArray.Length ;
return res;
}

42.将回车转换为TAB

//当在有keydown事件的控件上敲回车时,变为tab
public void Tab(System.Web .UI.WebControls .WebControl webcontrol)
{
webcontrol.Attributes .Add ("onkeydown", "if(event.keyCode==13) event.keyCode=9");
}

43.datagrid分页中如果删除时出现超出索引

public void jumppage(System.Web.UI.WebControls.DataGrid dg)
{
int int_PageLess; //定义页面跳转的页数
//如果当前页是最后一页
if(dg.CurrentPageIndex == dg.PageCount-1)
{
//如果就只有一页
if(dg.CurrentPageIndex == 0)
{
//删除后页面停在当前页
dg.CurrentPageIndex = dg.PageCount-1;
}
else
{
//如果最后一页只有一条记录
if((dg.Items.Count % dg.PageSize == 1) || dg.PageSize == 1)
{
//把最后一页最后一条记录删除后,页面应跳转到前一页
int_PageLess = 2;
}
else //如果最后一页的记录数大于1,那么在最后一页删除记录后仍然停在当前页
{
int_PageLess = 1;
}
dg.CurrentPageIndex = dg.PageCount – int_PageLess;
}
}
}