posted @
2008-07-08 15:08 郑浩宇 阅读(136) |
评论 (0) |
编辑
虽然已经有了ASP.NET AJAX了,最近学习ASP.NET控件的时候,逐步理解了原始的控件异步回调(代码取自《ASP.NET 2.0 高级编程》):
首先,在Render事件中添加好一个事件
protected override void RenderContents(HtmlTextWriter output)

{
output.RenderBeginTag(HtmlTextWriterTag.Div);

output.AddAttribute(HtmlTextWriterAttribute.Type, "text");
output.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID);
output.AddAttribute(HtmlTextWriterAttribute.Name, this.ClientID);
output.AddAttribute(HtmlTextWriterAttribute.Value, this.Text);

output.AddAttribute("OnBlur", "ClientCallback();");
this.AddAttributesToRender(output);
output.RenderBeginTag(HtmlTextWriterTag.Input);
output.RenderEndTag();
output.RenderEndTag();
}
这里最重要的就是output.AddAttribute("OnBlur","ClientCallback();");
然后在OnPreRender事件中,添加如下代码:
protected override void OnPreRender(EventArgs e)

{
//Page.ClientScript.RegisterClientScriptInclude("UtilityFunctions", "JScript.js");
Page.ClientScript.RegisterStartupScript(typeof(Page), "ControlFocus", "document.getElementById('" + this.ClientID + "').focus();", true);
Page.ClientScript.RegisterStartupScript(typeof(Page),"ClientCallback","function ClientCallback() {"+"args=document.getElementById('"+this.ClientID+"').value;"+Page.ClientScript.GetCallbackEventReference(this,"args","CallbackHandler",null,"ErrorHandler",true)+"}");
//向服务器发送请求,由服务器端生成回调的客户端脚本。
}

也就是在服务器端生成客户端代码,注意最后一个方法GetCallbackEventReference,我理解的是在服务器端捕捉了客户端的请求之后,生成相应的客户端脚本,在服务器端回调的时候,客户端决定用什么函数处理回调和错误。
服务器端实现接口的一个方法,也就是接收到客户端的请求之后,由服务器端先处理,然后再把结果和相应代码发回客户端。
#region ICallbackEventHandler Members
public string RaiseCallbackEvent(string eventArgument)
{
int result;
if (!Int32.TryParse(eventArgument, out result))
throw new Exception("The method is not implemented.");
return "Valid Data";
}
#endregion
最后,在jscript.js文件中写好相应的回调处理函数即可:
var args;
var ctx;
function ValidateText(ctl)
{
if(ctl.value=='')
{
alert("Please enter a value");
ctl.focus();
}
}
function CallbackHandler(args,ctx)
{
alert("The data is valid");
}
function ErrorHandler(args,ctx)
{
alert("The data is not a number");
}
posted @
2007-07-20 00:31 郑浩宇 阅读(189) |
评论 (0) |
编辑
以前对于基础知识有些没有很好的掌握,特决定开辟一个日志,专门记录一些基础的问题。一天进步1%,70天就能积累一倍!
1.ArrayList是类,Array是数据结构,所以ArrayList需要在遍历的时候强制类型转换,Array不用,如果不希望强制类型转换,可以考虑使用范型。
2.装箱和拆箱
装箱是:容许将值类型作为引用类型(比如:对象)进行处理的过程,而拆箱是允许将引用作为值类型的进行处理的过程.
比如:
int num=100;
object obj=num;
Console.WriteLine("对象的值={0}",obj);
int变量 num 的值被负给object的变量obj.将值类型转换为引用类型就叫装相.
int num=100;
object obj=num;
int num=(int)obj;
Console.WriteLine("num:{0}",num);
将num的值副给obj对象时,不需要进行显示装相,系统将自动装箱.
posted @
2007-07-19 10:08 郑浩宇 阅读(167) |
评论 (1) |
编辑
这篇文章是我第一次写关于ASP.NET AJAX的文章,关注这个框架已经很长时间了但是一直没有学得很好,主要是刚开始的时候没有理解ASP.NET AJAX,而是受《AJAX IN ACTION》这本书的影响很大,过于关注客户端代码,但是那本书也没有提出如何和服务器端进行交互,看了赵老师的MSDN WebCast之后进步很快,今天就照着官方的例子实现了。
官方的代码我不愿意再重复了,也没有很多的意义,如果有朋友想看的话,请您访问:
http://ajax.asp.net/docs/tutorials/UpdatePanelWithWebService.aspx 这篇文章只是说明一点,那就是一些需要注意的问题。
首先,在Web服务之中,在类的前面要加上[ScriptService]标签。
否则客户端无法调用该Web服务。
然后就是调试的时候,把IDE和IE相关联 这样的话,VS.NET就可以找到出错的代码行了。
UserContext用语服务器端和客户端回调的时候保存数据。
posted @
2007-06-08 21:24 郑浩宇 阅读(432) |
评论 (0) |
编辑
摘要: 今天看《ASP.NET 2.0高级编程》,学会了ADO.NET 2.0中的数据批量更新,把代码发到这里,以供日后之需。 DemoBulkUpdate.aspx<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="DemoBulkUpdate.aspx.cs"Inherits="DemoBulkUpdate"%><!DOCTYPEh...
阅读全文
posted @
2007-02-22 00:10 郑浩宇 阅读(746) |
评论 (3) |
编辑
摘要: usingSystem;namespaceDstrQueue{/**////<summary>///Class1的摘要说明。///</summary>classQueueNode{Objectitem;QueueNodelink;}classQueue{/**////<summary>///应用程序的主入口点。///</summary>[STAThr...
阅读全文
posted @
2006-12-14 19:08 郑浩宇 阅读(94) |
评论 (1) |
编辑
摘要: usingSystem;namespaceDataStructure.LinkedList{/**////<summary>///Class1的摘要说明。///</summary>publicclassListNode{publicstringairport;publicListNodelink;publicListNodeprevious;}publicclassLink...
阅读全文
posted @
2006-12-14 19:07 郑浩宇 阅读(329) |
评论 (0) |
编辑
摘要: 栈:usingSystem;namespaceDataStructure.Stack{/**////<summary>///Class1的摘要说明。///</summary>classStackNode{Objectitem;StackNodelink;}classStack{/**////<summary>///应用程序的主入口点。///</summar...
阅读全文
posted @
2006-12-14 19:05 郑浩宇 阅读(60) |
评论 (0) |
编辑
摘要: usingSystem;namespaceDataStructure.HeapPQ{/**////<summary>///Class1的摘要说明。///</summary>classPriorityQueueApplet{/**////<summary>///应用程序的主入口点。///</summary>[STAThread]staticvoidMa...
阅读全文
posted @
2006-12-14 19:01 郑浩宇 阅读(476) |
评论 (0) |
编辑
using System;

namespace Hanoi


{

/**//// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1

{

/**//// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)

{

moveTowers(3/**//*disks*/,/**//*from peg*/1,/**//*to peg*/3,/**//*using spare peg*/2);
Console.ReadLine();
}
public static void moveTowers(int n,int start,int finish,int spare)

{
//利用作为辅助的备用柱子将位于起始
//柱子的n个圆盘移到终止柱子上
if(n==1)

{
Console.WriteLine("move a disk from peg"+start+"to peg"+finish);
}
else

{
moveTowers(n-1,start,spare,finish);
Console.WriteLine("move a disk from peg "+start+"to peg"+finish);
moveTowers(n-1,spare,finish,start);
}
}
}
}

posted @
2006-12-14 19:00 郑浩宇 阅读(241) |
评论 (0) |
编辑
摘要: usingSystem;usingSystem.IO;namespaceBinaryTreeSearch{/**////<summary>///Class1的摘要说明。///</summary>classBinaryTreeSearch{/**////<summary>///应用程序的主入口点。///</summary>[STAThread]stat...
阅读全文
posted @
2006-12-14 18:58 郑浩宇 阅读(321) |
评论 (0) |
编辑
摘要: 以前学习冒泡算法,总是弄不清楚n和n-1等一些变量的关系,原因是没有弄明白它的真正含义,今天写了一个冒泡算法的JS小程序,终于弄明白了。varR1=newArray();R1[1]=35;R1[2]=55;R1[3]=65;R1[4]=20;R1[5]=30;R1[6]=25;R1[7]=0;R1[8]=7;R1[9]=5;R1[10]=3;varR2=newArray(35,55,65,20,3...
阅读全文
posted @
2006-11-20 18:12 郑浩宇 阅读(547) |
评论 (4) |
编辑
posted @
2006-11-16 22:46 郑浩宇 阅读(1263) |
评论 (1) |
编辑
最近在写一个小应用 就是把XML的文件的内容写入Excel文件 经过在网上搜索,认真研究终于写出了这段脚本,但是试验多次之后,总有错误,一直没弄清楚到底怎么回事,终于找到了,先把XML的文档公布一下:
<?xml version="1.0" encoding="utf-8"?>
<root>
<ad>
<date>2006-11-2</date>
<count>5</count>
</ad>
<ad>
<date>2006-11-1</date>
<count>5</count>
</ad>
</root>
就是把最后一个<ad>节点的<date>和<count>的值写入Excel文件的A1和B1 的尾部即可,开始的时候我把代码写成:
var dateArray=xmldoc.getElementsByTagName('date');
var lastDate=dateArray.item(dateArray.length-1).firstChild;//取文本
var countArray=xmldoc.getElementsByTagName('count');
var lastCount=countArray.item(countArray.length-1).firstChild;
这是不行的,因为firstChild节点虽然指的是文本,但是它依然是一个节点,必须取它的指,必须在后面加上nodeValue,而且nodeValue必须匹配text节点,不能用在Element节点上,完整代码应该是:
1 var exl=new ActiveXObject("Excel.Application");
2 exl.Workbooks.Open("d:\\ajax\\adCount\\ad.xls");
3
4 var xmldoc=new ActiveXObject('Microsoft.XMLDOM');
5 xmldoc.async=false;
6 xmldoc.load("ad.xml");
7
8 var dateArray=xmldoc.getElementsByTagName('date');
9 var lastDate=dateArray.item(dateArray.length-1).firstChild.nodeValue;//取文本
10
11 var countArray=xmldoc.getElementsByTagName('count');
12 var lastCount=countArray.item(countArray.length-1).firstChild.nodeValue;
13
14 exl.Workbooks(1).Worksheets(1).Activate();
15 var lineCount=exl.Workbooks(1).ActiveSheet.Columns(1).Count;
16
17 var theSheet=exl.Workbooks(1).ActiveSheet;
18 theSheet.Cells(lineCount,1).value=lastDate;
19 theSheet.Cells(lineCount,2).value=lastCount;
20 exl.ActiveWorkbook.Save();
21 exl.Quit();
下载:
/Files/tyrael007/Ad.rar
posted @
2006-11-03 09:03 郑浩宇 阅读(329) |
评论 (0) |
编辑
posted @
2006-11-01 20:41 郑浩宇 阅读(764) |
评论 (1) |
编辑
如题
posted @
2006-10-22 20:06 郑浩宇 阅读(117) |
评论 (0) |
编辑
不用邀请函了,可以直接注册Gmail邮箱了。
http://gmail.com
posted @
2006-10-21 17:56 郑浩宇 阅读(177) |
评论 (1) |
编辑
posted @
2006-10-05 12:53 郑浩宇 阅读(361) |
评论 (7) |
编辑
昨天 我从当当购买了一本《XML高级编程》,是Wrox的红皮书系列,后来,我到
http://www.wrox.com下载相关代码,但是没有这本Professional XML 2nd Edtion,然后我还到Wrox的论坛上去看,有一位兄弟发贴询问下载地址,然后好像Wrox的人说了一些原因,大概就是Wrox的东家换了,如果想下载2003年以前的代码,请去Apress。
按图索骥,我去了
http://support.apress.com/ 单击那个右上角的链接,如图:

然后,您就可以看到一个图书列表,在这个列表中找到您需要下载代码的书名,然后单击(不要右击用迅雷下载),

这样就会跳转到一个所谓的宣传页面,让您输入Email地址以便它为您发送Apress的新书,不要理他,直接右击下面的小字链接“Click here ”,选择“用迅雷下载”即可。
posted @
2006-09-27 11:18 郑浩宇 阅读(179) |
评论 (0) |
编辑
摘要: 在很多语言的学习中,“事件”都是一个比较难理解,但是又是一个很重要的概念。JavaScript中的事件处理也是一样,正因为有了事件处理,才会出现Ajax拖动的效果。本文就讨论一下JavaScript中的事件处理,读过之后,您就会知道,很多Ajax框架实现拖动效果的原理了。一、 IE Event对象(一)IE Event对象的主要属性和方法 在IE中有一个专门负责事件处理的...
阅读全文
posted @
2006-09-22 16:03 郑浩宇 阅读(3473) |
评论 (15) |
编辑
一、引言
在C#和Java语言中,面向对象是以类的方式实现的,特别是继承这个特性,类的方式继承表现出了强大的功能,而且也易于学习。JavaScript不是纯的面向对象的语言,而是基于对象的语言,对象的继承是以原型函数的形式继承的,很多初学者刚开始接触的时候不太理解,但是JavaScript这种以原型函数的形式实现面向对象技术,不仅是可行的,而且还为面向对象技术提供了动态继承的功能,本文主要讨论了JavaScript的面向对象技术。
二、原型对象概述
每个JavaScript对象都有原型对象,对象都继承原型对象的所有属性。一个对象的原型是由创建该对象的构造函数定义的。JavaScript的所有函数都有一个名为prototype的属性,该属性引用了原型对象,该原型对象初始化的时候只有constructor属性来引用创建该原型对象的对象。JavaScript没有Class定义类的概念,构造函数就定义了类,并初始化类中的属性,每个类的成员都会从原型对象中继承相同的属性,也就是说,原型对象提供了类的实例共享的属性和方法,这就节约了内存。
当读取一个对象的属性的时候,JavaScript会先从对象中查找,如果没有查找到,才会到原型对象中查找该属性(或方法),所以,尤其是对于方法,最好保存到原型对象中以便于共享,并且达到节省内存的目的,而且原型对象还有一个强大的功能,那就是如果通过构造函数实例化一些对象后,再给构造函数的原型对象增加属性和方法,那么它原来实例化的对象实例将会继承这些增加的属性和方法。
三、对象属性、对象方法、类属性、类方法
每个对象都会有自己单独的实例属性和实例方法的副本,如果实例化5个对象,那么就会有5个对象的实例属性和实例方法副本。This关键字引用它们的实例对象,也就是说,谁操作了实例方法,this就引用谁;访问了哪个实例对象的属性,this就引用这个实例对象。
类方法和类属性只有一个副本,类方法调用的时候必须引用类的名字,例如:Date.setHours();
下面用一个程序来表现实例属性、实例方法、类属性、类方法

function Mobile(kind,brand)
{
this.kind=kind;//定义手机的种类,例如GSM/CDMA
this.brand=brand;//定义手机的品牌,this关键字表示用该构造函数实例化之后的对象
}

/**//*
定义类的第二步是在构造函数的原型对象中定义它的实例方法或其他属性
该对象定义的任何属性都将这个类的所有实例继承。
*/
//拨号,这里只是返回电话号码

Mobile.prototype.dial = function(phoneNo)
{
return phoneNo;
};

/**//*
定义类的第三步是定义类方法,常量和其他必要的类属性,作为构造函数自身的属性,而不是构造函数
原型对象的属性,注意,类方法没有使用关键字this,因为他们只对他们的实际参数进行操作。
*/
//开机关机方法

Mobile.turnOn=function()
{
return "The power of mobile is on";
}

Mobile.turnOff=function()
{
return "The power of mobile is off";
}
//类属性,这样他们就可以被用作常量,注意实际上他们并不是只读的
Mobile.screenColor=64K;//假设该类手机的屏幕颜色都是64K彩屏的
四、子类化
JavaScript支持子类化,只需把子类的原型对象用超类实例化即可,但是应该注意,这样子类化之后就会存在一个问题,由于是用超类实例化子类的原型对象取得的,所以就冲掉了自己本身的由JavaScript提供的constructor属性,为了确保constructor的正确性,需要重新指定一下,子类化的程序例子如下:
/***** 子类化 *****/
//下面是子类构造函数智能型手机
function SmartPhone(os)
{
this.os=os;
}
//我们将Mobile对象作为它的原型
//这意味着新类的实例将继承SmartPhone.prototype,
//后者由Mobile.prototype继承而来
//Mobile.prototype又由Object.prototype继承而来
SmartPhone.prototype=new Mobile(GSM,Nokia);
//下面给子类添加一个新方法,发送电子邮件,这里只是返回Email地址
SmartPhone.prototype.sendEmail=function(emailAddress) {
return this.emailAddress
}
//上面的子类化方法有一点缺陷,由于我们明确把SmartPhone.prototype设成了我们所创建的一个对象,所以就覆盖了JS提供
//的原型对象,而且丢弃了给定的Constructor属性。该属性引用的是创建这个对象的构造函数。但是SmartPhone对象集成了它的
//父类的constructor,它自己没有这个属性,明确设置着一个属性可以解决这个问题:
SmartPhone.prototype.constructor=SmartPhone;
var objSmartPhone=new SmartPhone();//实例化子类
posted @
2006-09-22 15:57 郑浩宇 阅读(447) |
评论 (0) |
编辑