2007年1月24日
摘要: 折腾了一天,NHibernate1.2在VS2005下的配置,终于通了,做个简单的备忘吧,以防以后再走弯路。

1、首先,我使用的是单独的配置文件hibernate.cfg.xml,我觉得这样更合理些,比较把那些配置都放在Web.config里更合理点吧,文件内容是这样的:
阅读全文
posted @ 2007-01-24 11:13 HenryZhang 阅读(1413) 评论(6) 编辑
摘要: ASP.NET AJAX中的服务端Timer控件的简单使用

这个例子比较有意思了,如果想弄个网页时钟的话,用这种方式简直易如反掌呀,呵呵

在UpdatePanel中放一个Label和一个Timer,当然,这个Timer是Ajax Extensions中的,双击Timer,添加Tick事件Label1.Text = "Panel refreshed at:" + DateTime.Now.ToLongTimeString();

,好了,运行吧,噢,对,还得设置Timer的Interval,原例中设10000,我设1000,也就是一秒一次了,这才像时钟呀,OK,运行,效果不错

TerryLee在文中还说Timer控件可以作为UpdatePanel的触发器不管是否在UpdatePanel中,没错,我试着把Timer拖出了UpdatePanel,还是能触发,不过嘛,整个页面刷新了
阅读全文
posted @ 2007-01-24 11:12 HenryZhang 阅读(138) 评论(0) 编辑
摘要: 在母版页中使用UpdatePanel控件

这个例子很简单了,在母版页中放一个ScriptManager,注意不要放在ContentPlaceHolder里面,然后在一个Content Page页中,加入一个UpdatePanel,并在UpdatePanel里放一个日历控件,运行显示,点日历控件中的上下月时,页面并没有刷新。


通过Master Page刷新UpdatePanel

这个例子也不难,不过做起来步骤多些:
先在MasterPage里放两个按钮,一个加,一个减


并在MasterPage的Page_Load里加入
ScriptMa阅读全文
posted @ 2007-01-24 11:11 HenryZhang 阅读(243) 评论(0) 编辑
摘要: 在服务器端自定义异常处理

在页面上放置ScriptManager和UpdatePanel,并在UpdatePanel里放置两个文本框一个标签和一个按钮,用于输入两个数,并计算相除后的结果,按钮的Click事件如下:

阅读全文
posted @ 2007-01-24 11:10 HenryZhang 阅读(138) 评论(0) 编辑

1、首先,在UpdatePanel和UpdateProgress外面放一个Button
<asp:Button ID="Panel1Trigger" runat="server" OnClick="Panel1Trigger_Click" Text="Trigger" />
事件定义如前:
    protected void Panel1Trigger_Click(object sender, EventArgs e)
    {
        System.Threading.Thread.Sleep(3000);
        Label1.Text = DateTime.Now.ToString() + " - trigger";
    }
2、设置UpdatePanel的Tigger
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:Label ID="Label1" runat="server" Text="Panel Rendered"></asp:Label>
                <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Refresh" />
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="Panel1Trigger" />
            </Triggers>
        </asp:UpdatePanel>
根据例子的步骤,这里实际上是通过设计器设置的Tiggers:
选择UpdatePanel控件,在属性窗口中Triggers属性行单击ellipsis (…)。

创建一个异步更新触发器,并设置控件ID为Panel1Trigger。

3、下面是关键部分,添加脚本:
var prm = Sys.WebForms.PageRequestManager.getInstance();
function CancelAsyncPostBack() {
    if (prm.get_isInAsyncPostBack()) {
      prm.abortPostBack();
    }
}
prm.add_initializeRequest(InitializeRequest);
prm.add_endRequest(EndRequest);
var postBackElement;
function InitializeRequest(sender, args) {
    if (prm.get_isInAsyncPostBack()) {
        args.set_cancel(true);
    }
    postBackElement = args.get_postBackElement();
    if (postBackElement.id = 'Panel1Trigger') {
        $get('UpdateProgress1').style.display = 'block';                
    }
}
function EndRequest(sender, args) {
    if (postBackElement.id = 'Panel1Trigger') {
        $get('UpdateProgress1').style.display = 'none';
    }
}

以上是例子中的原码,然后就出了一些问题,当然,我也遇到了,一是Sys未定义,开始的解决方案是重装2.0或把var Sys放在function里面,但在这里似乎不实用了,
prm.add_initializeRequest(InitializeRequest);
prm.add_endRequest(EndRequest);
这两名话能放在哪个里面?哪个也不行,最终的解决方法是把段JS放在页面后面,正如阿蒙所说:
“我想你的原因可能是这样: 
你的ScriptManager控件放在body中 
而你的javascript代码放在了ScriptManager控件之前的位置 
因为html是逐行加载的 
由于var prm = Sys.PageRequestManager.getInstance();在加载ScriptManager控件的js代码之前就被调用了,所以就出现了Sys未定义的情况 
但是如果你把这行代码放在每个function中,或者把整段js代码放在ScriptManager控件之后,就不会出现这个问题了!”

这最终解决了这个问题。

再看看代码的含义:

prm.add_initializeRequest(InitializeRequest);//设置初始化时调用的函数
prm.add_endRequest(EndRequest);//设置请求完毕后调用的函数


if (prm.get_isInAsyncPostBack()) {
        args.set_cancel(true);
    }//在初始化的时候设置可以取消

$get('UpdateProgress1').style.display//设置进度信息是否显示。

OK 了!

posted @ 2007-01-24 11:09 HenryZhang 阅读(65) 评论(0) 编辑
摘要: 上一篇学习了UpdateProgress,现在看看用JS脚本来控件它。

首先,用JS脚本控制它取消更新

先在UpdateProgress里放一个Html按钮,并设置它的onclick为自己定义的函数,如下:

阅读全文
posted @ 2007-01-24 11:09 HenryZhang 阅读(95) 评论(0) 编辑
摘要: UpdateProgress控件

把例子都做完了,才知道,这个是显示进度用的,英语太差了。

简单应用:
在页面上放置ScriptManager、UpdatePanel、UpdateProgress,在UpdatePanel里添加一个标签和一个按钮,设置相关属性如下:
UpdateProgress的文本:Progress……
阅读全文
posted @ 2007-01-24 11:08 HenryZhang 阅读(416) 评论(0) 编辑

问题终于解决了,先看看我的问题:

var u = window.location.toString();

想把地址栏中的某个参数清除掉,包括&,参数名=参数值,其中,参数值还有可能是汉字

用了这样的方法:
u = u.replace(/&addExJobTitle=(.+)&?/g,'');

查了半天才弄出来的,解释一下:

要替换的参数是:addExJobTitle
“.” (可能是)表示任何字符
“+” 表示匹配一次或多次
后面的“&” 表示该参数的结尾处,因为可能后面还有参数,或没有参数了,所以使用
“?” 表示零次或一次
“/g” 表示全局匹配

posted @ 2007-01-24 11:07 HenryZhang 阅读(154) 评论(0) 编辑

这两天和JS的正则表达式干上了,问题还没解决,先把搜到的有用的东西存一下:

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 
匹配首尾空格的正则表达式:(^\s*)|(\s*$)(像vbscript那样的trim函数)
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

^  匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a"  
$  匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A"  
*  匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa  
+  匹配前面元字符1次或多次,/ba*/将匹配ba,baa,baaa  
?  匹配前面元字符0次或1次,/ba*/将匹配b,ba  
(x)  匹配x保存x在名为$1...$9的变量中  
x|y  匹配x或y  
{n}  精确匹配n次  
{n,}  匹配n次以上  
{n,m}  匹配n-m次  
[xyz]  字符集(character set),匹配这个集合中的任一一个字符(或元字符)  
[^xyz]  不匹配这个集合中的任何一个字符  
[\b]  匹配一个退格符 
\b  匹配一个单词的边界  
\B  匹配一个单词的非边界 
\cX  这儿,X是一个控制符,/\cM/匹配Ctrl-M  
\d  匹配一个字数字符,/\d/ = /[0-9]/  
\D  匹配一个非字数字符,/\D/ = /[^0-9]/  
\n  匹配一个换行符  
\r  匹配一个回车符  
\s  匹配一个空白字符,包括\n,\r,\f,\t,\v等  
\S  匹配一个非空白字符,等于/[^\n\f\r\t\v]/  
\t  匹配一个制表符  
\v  匹配一个重直制表符  
\w  匹配一个可以组成单词的字符

posted @ 2007-01-24 11:07 HenryZhang 阅读(102) 评论(1) 编辑

用编程的方法控制UpdatePanel,先看一个例子,通过ScriptManagerRegisterAsyncPostBackControl()方法注册一个异步提交的控件:

<div>
    <asp:ScriptManager ID="sm1" runat="server"></asp:ScriptManager>
    <asp:UpdatePanel ID="up1" runat="server">
        <ContentTemplate>
            <asp:Label ID="lblInfo" runat="server" Text="更新时间:"></asp:Label>
            <asp:Label ID="lblTime" runat="server" ForeColor="red"></asp:Label>
        </ContentTemplate>
    </asp:UpdatePanel>
    <asp:Button ID="btnTest" runat="server" Text="测试" OnClick="btnTest_Click" />
    </div>

protected void Page_Load(object sender, EventArgs e)
    {
        sm1.RegisterAsyncPostBackControl(btnTest);
    }
    protected void btnTest_Click(object sender, EventArgs e)
    {
        lblTime.Text = DateTime.Now.ToString();
    }

注意,btnTest并没有在UpdatePanel里,而是通过代码里的RegisterAsyncPostBackControl注册地。

再注意,在CLICK事件里只有一句lblTime.Text=.....,而且,UpdatePanel 没有设置UpdateMode,这是我无意之间忘了,没想到效果竟然也对,原例中是这样的
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">

void Button1_Click(object sender, EventArgs e)
{
this.Label2.Text = DateTime.Now.ToString();
this.UpdatePanel1.Update();
}
设置了UpdateMode="Conditional",Update方法才管用,两者都设置,程序才能正常运行,为什么?

UpdatePanel还可以嵌套使用,即在一个UpdatePanelContentTemplate中还可以放入另一个UpdatePanel。当最外面的UpdatePanel被触发更新时,它里面的子UpdatePanel也随着更新,里面的UpdatePanel触发更新时,只更新它自己,而不会更新外层的UpdatePanel,例子太简单了,不用写了。

同一页面上使用多个UpdatePanel

由于UpdatePanel默认的UpdateModeAlways,如果页面上有一个局部更新被触发,则所有的UpdatePanel都将更新,这是我们不愿看到的,我们只需要UpdatePanel在它自己的触发器触发的时候更新就可以了,所以需要把UpdateMode设置为Conditional。
例子很长,就不粘过来了,核心的地方有以下几点:

1、<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true" />
2、每个UpdatePanel的UpdateMode="Conditional"
3、因为触发服务器事件的控件可能全在其中一个UpdatePanel中,所以,在需要的地方(其它UpdatePanel)使用Triggers来指定当前的UpdatePanel由哪个控件激发。

OK,今天就到这了,感谢TerryLee的教程。

posted @ 2007-01-24 11:06 HenryZhang 阅读(54) 评论(0) 编辑

开始学习UpdatePanel控件,好像是个非常常用的控件。

先看一下基本的结构:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <!---->
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger />
        <asp:PostBackTrigger />
    </Triggers>
</asp:UpdatePanel>

该控件的强大之处在于不用编写任何客户端脚本,只要在一个页面上添加几个UpdatePanel控件和一个ScriptManager控件就可以自动实现局部更新。
ContenteTemplate标签用来定义UpdatePanel的内容,在它里面可以放任何ASP.NET元素。如果你想要使用编程的手法来控制UpdatePanel中的内容,就需要使用ContenteTemplateContainer
ContenteTemplate太简单了,只需要像平时使用控件一样往里堆就可以了,控件的事件也没有什么特殊的,但是如果要使用编程的手法去设置UpdatePanel中的内容,需要创建一个UpdatePanel,并且添加控件到ContentTemplateContainer,而不能直接添加控件到ContentTemplate,如果想直接设置ContentTemplate,则需要编写一个自定义的Template,并去实现位于System.Web.UI命名空间下的接口ITemplate

看一个使用ContentTemplateContainer的例子:
protected void Page_Load(object sender, EventArgs e)
    {
        UpdatePanel up1 = new UpdatePanel();
        up1.ID = "UpdatePanel1";
        up1.UpdateMode = UpdatePanelUpdateMode.Conditional;
        Button button1 = new Button();
        button1.ID = "Button1";
        button1.Text = "Submit";
        button1.Click += new EventHandler(Button_Click);
        Label label1 = new Label();
        label1.ID = "Label1";
        label1.Text = "A full page postback occurred.";
        up1.ContentTemplateContainer.Controls.Add(button1);
        up1.ContentTemplateContainer.Controls.Add(label1);
        Page.Form.Controls.Add(up1);
    }
    protected void Button_Click(object sender, EventArgs e)
    {
        ((Label)Page.FindControl("Label1")).Text = "Panel refreshed at " +
            DateTime.Now.ToString();
    }

不用多解释了,只要知道创建好控件后,加到ContentTemplateContainer里:)

再来看看Triggers属性:

ASP.NET AJAX中有两种Triggers:分别为AsyncPostBackTriggerPostBackTrigger,简单地说,AsyncPostBackTrigger就是异步调用、局部更新,和我们预想的Ajax效果一样,PostBackTrigger就是整个页面都要刷新(还不理解,既然整个页都刷新了,为什么还要用这个:( ),还是看一个例子:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
 <div>
     <asp:Button ID="Button1" runat="server" Text="异步回送" OnClick="Button1_Click"/>&nbsp;&nbsp;
     <asp:Button ID="Button2" runat="server" Text="整页回送" OnClick="Button2_Click"/><br />
     <br />
     <asp:Label ID="Label1" runat="server" Text="当前时间" Font-Bold="True" Font-Size="Large"></asp:Label></div>
    </ContentTemplate>
    <Triggers>
 <asp:AsyncPostBackTrigger ControlID="Button1"/>
 <asp:PostBackTrigger ControlID="Button2" />
    </Triggers>
</asp:UpdatePanel>

TerryLee的UpdatePanel(一)就到这,咱也先抄到这吧,HOHO!

posted @ 2007-01-24 11:05 HenryZhang 阅读(68) 评论(0) 编辑

/// 除去所有在html元素中标记
public static string striphtml(string strhtml)
 {
 string stroutput=strhtml;
 Regex regex = new Regex(@"<[^>]+>|</[^>]+>");
 stroutput = regex.Replace(stroutput,"");
 return stroutput;
 
 }

posted @ 2007-01-24 11:03 HenryZhang 阅读(24) 评论(0) 编辑

今天在QQ群里有人发了个不错的方法,以前写这个总觉得麻烦,下面这个确实不错

if (num1 > "G的单位")
            {
                text2 = Math.Round(((double) num1) / 1073741824, 2) + " GB";
            }
            else if (num1 > "M的单位")
            {
                text2 = Math.Round(((double) num1) / 1048576, 2) + " MB";
            }
            else if (num1 > "K的单位")
            {
                text2 = Math.Round(((double) num1) / 1024, 2) + " KB";
            }
            else
            {
                text2 = num1 + " Byte";
            } 

posted @ 2007-01-24 11:03 HenryZhang 阅读(170) 评论(0) 编辑
和第二天一起出来了,不是真正意义上的天了,算次吧
继续学习中...............................
ScriptManager对WebService的应用:
先新建一个WebService用于测试WebServiceSample.asmx,
[ScriptService]
public class WebServiceSample : System.Web.Services.WebService {
    public WebServiceSample()
    {
    }
    [WebMethod]
    public string EchoString(String s)
    {
        return "Hello " + s;
    }
}
千万不要忘了
ScriptService,更不要忘了using System.Web.Script.Services;ScriptService的名称空间,TerryLee的文章中没有写using,可能是认为太简单了吧,害得我搜到另一篇文章才知道滴:)
废话少说,看一下完整代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<script type="text/javascript" language="JavaScript">
    function OnbuttonGo_click()
    {
        requestSimpleService = WebServiceSample.EchoString(
            document.getElementById('inputName').value,       //params
            OnRequestComplete    //Complete event
            );
        return false;
    }
    function OnRequestComplete(result)
    {
        alert(result);
    }
</script>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
        <Services>
            <asp:ServiceReference Path="WebServiceSample.asmx"/>
        </Services>
    </asp:ScriptManager>
    <div>
        <input type="text" id="inputName" size=20/>
        <input id="button" type="button" value="调 用" onclick="return OnbuttonGo_click()" /></div>
    </form>
</body>
</html>
一个客户端的事件,调用服务器端的方法,返回结果到客户端,这就是Ajax,需要注意的是
WebServiceSample.EchoString(document.getElementById('inputName').value,         OnRequestComplete);中的OnRequestComplete,表示的是调用完成后执行的方法,可不是EchoString需要的参数哟,当然OnRequestComplete(result)中,你不用result肯定没问题。
噢,对,文章中还提示了可以用
ServiceReference sr = new ServiceReference();
        sr.Path = "WebServiceSample.asmx";
        ScriptManager1.Services.Add(sr);
代替直接在页面设置ScriptManager的Services属性。

至于ScriptManagerProxy,实在是和ScriptManager太像了,只不过,
由于一个ASPX页面上只能有一个ScriptManager控件,所以在有母版页的情况下,如果需要在Master-PageContent-Page中需要引入不同的脚本时,这就需要在Content-page中使用ScriptManagerProxy,而不是ScriptManager。
posted @ 2007-01-24 11:02 HenryZhang 阅读(71) 评论(0) 编辑
ScriptManager控件包括在ASP.NET 2.0 AJAX Extensions中,它用来处理页面上的所有组件以及页面局部更新,所有需要支持ASP.NET AJAXASP.NET页面上有且只能有一个ScriptManager控件。TerryLee 的第一个例子中,放了一个ScriptManager控件,但实际使用的是UpdatePanel控件,是每个页面必须有一个ScriptManager控件呢,还是在这个例子里可以没有呢?
再说UpdatePanel控件,其实很简单,只是在ContentTemplate里放了两个服务器端控件,使用方法和平时一样,但这样就实现了控件执行服务器端事件而无刷新,呵呵,是挺方便的。

第二个例子,是一个错误处理的例子,在页面回传时如果发生了异常AsyncPostBackError事件将被触发,错误信息的处理依赖于AllowCustomErrors属性、AsyncPostBackErrorMessage属性和Web.config中的<customErrors>配置区,先看一下完整的代码:
郁闷!这里发文章居然有字数限制,代码粘不上来:(
例子中有一个ScriptManager控件
ScriptManager1,设置了OnAsyncPostBackError="ScriptManager1_AsyncPostBackError",也就是当发生异常时,调用ScriptManager1_AsyncPostBackError方法。
protected void ScriptManager1_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e)
    {
        ScriptManager1.AsyncPostBackErrorMessage = "异常信息为:" + e.Exception.Message;
    }
在UpdatePanel中放了一个Lable和两个Button,Label用来显示信息,Button分别触发一个成功和一个抛出异常的方法:
protected void ErrorProcessClick_Handler(object sender, EventArgs e)
{
throw new ArgumentException();
}
protected void SuccessProcessClick_Handler(object sender, EventArgs e)
{
UpdatePanelMessage.Text = "The asynchronous postback completed successfully.";
}
可以看到,成功,则设置Label的属性,失败则抛出异常,ScriptManager遇到异常后,
设置了AsyncPostBackErrorMessage属性。

看一下两个按钮:
<asp:Button runat="server" ID="Button1" Text="Submit Successful Async Postback"
    OnClick="SuccessProcessClick_Handler" OnClientClick="ClearErrorState()" />
<asp:Button runat="server" ID="Button2" Text="Submit Async Postback With Error"
    OnClick="ErrorProcessClick_Handler" OnClientClick="ClearErrorState()" />

除了设置OnClick外,还设置了
OnClientClick,以前真不知道这个东西到底有什么用,是先执行OnClientClick再执行OnClick?还是?看完这个例子,也不太明白,呵呵,ClearErrorState做的事就是清除了出错的信息,
页面上的JS如下:

<script type="text/javascript" language="javascript">
var divElem = 'AlertDiv';
var messageElem = 'AlertMessage';
var errorMessageAdditional = 'Please try again.';
var bodyTag = 'bodytag';
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
function ToggleAlertDiv(visString)
{
     if (visString == 'hidden')
     {
     $get(bodyTag).style.backgroundColor = 'white';                        
     }
     else
     {
     $get(bodyTag).style.backgroundColor = 'gray';                        
     }
     var adiv = $get(divElem);
     adiv.style.visibility = visString;
}
function ClearErrorState() {
     $get(messageElem).innerHTML = '';
     ToggleAlertDiv('hidden');                    
}
function EndRequestHandler(sender, args)
{
   if (args.get_error() != undefined && args.get_error().httpStatusCode == '500')
   {
       var errorMessage = args.get_error().message
       args.set_errorHandled(true);
       ToggleAlertDiv('visible');
       $get(messageElem).innerHTML = '"' +
        errorMessage + '" ' + errorMessageAdditional;
   }
}
</script>

很简单,有点糊涂的是
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);这句话,页面调用完要执行的吗?还是?......看来还是有很多基础的东东要学呀
posted @ 2007-01-24 11:01 HenryZhang 阅读(131) 评论(0) 编辑

发布有段时间了,早就看到了TerryLee的文章,一直没好好看,现在是时候好好研究一下了,首先,先看看官方网站提供的相关组件的下载

 安装程序:下载

相关Released文档:Doc版本       PDF版本

Atlas CTP版本升级到ASP.NET Ajax向导文档:下载

记得以前装过,检查一下,先装上工具再说。

ASP.NET AJAX官方网站上有三个下载:

1ASP.NET AJAX:这部分是ASP.NET AJAX的核心部分,包括了核心AJAX类型系统,网络协议层(networking stack),组件模型,扩展器(extender)基类,以及与ASP.NET集成的服务器端功能(包括广受欢迎的ScriptManagerUpdatePanel,和 Timer控件)

2ASP.NET AJAX “Value-Add”CTPASP.NET AJAX社区支持的“增值”CTP部分,包括了以前各个Atlas CTP版本包含的,但并不在完全支持的“核心”1.0 版本内的额外的高级特性。通过进一步的反馈,这些将会逐步稳定的增加到核心1.0中去

3ASP.NET AJAX Control Toolkit:包含了基于ASP.NET AJAX 1.0 版“核心”下载版本的28个非常酷的免费AJAX控件。它是一个开源项目,由微软和非微软开发人员共同开发的,去CodePlex下载代码

下一步,可以创建项目了,安装完成后,打开VS2005,新建网站,在项目模板中会出现一项ASP.NET AJAX-enabled Web site,直接选择它就可以了

新建完成的项目中会自动在Web.config中做好相关的配置,并且AJAXExtensionToolbox.dll已经添加到了VS的工具箱中,不需要再手工添加

posted @ 2007-01-24 11:00 HenryZhang 阅读(93) 评论(0) 编辑
想到了自己从作程序以来的学习经历,发现总是今天想学这个,明天想学那个,学哪个都是三天打鱼两天晒网,到今天,就是没有一样精通的,学过几天控件开发,学过几天JAVA,学过几天C,起初的想法都是觉得这些东西很有用,想学好,但都没坚持下来,经高人指点,顿时醒悟,这些东西没有最终学下去,一方面的原因就是这些知识没有和手上的工作直接关联,导致过几天就没兴趣了,再就是自己做事不够坚持,反省了一下,决定还是从和自己工作相关的先入手,DOTNET有很多自己还不了解不熟悉的地方,一个一个来,AJAX,水晶报表,控件等等,本应是都该支的东东,何必再挑三捡四,先搞通一样再说,好,现从AJAX开始,NOW。
posted @ 2007-01-24 10:58 HenryZhang 阅读(87) 评论(0) 编辑

最近的项目接近完工了,可昨天在一次测试中竟然出现这样的问题,单独浏览站点时,没有任何问题,可当模拟多个用户并发访问时,出错了,查了半天,原来是代码中static的问题,static 表示静态,在内存中占据固定的存储空间,当把变量声明为static后,无论哪个用户来访问,取到的都是相同的值,这样当然有问题了,以前不知道这个东西到底是什么作用,只知道加上它后就能obj.  点出东西来,现在算是明白点了,以后注意。

当时将变量声明为static的原因是,在ajax方法中要使用页面上的一些值,但不能直接得到,于是想到将这些值存在static的变量中,这样在ajax方法中便能得到了,最后的解决方法是,将这些需要的值存于页面的hidden中,调用ajax的方法时,将这些hidden的值作为参数传入,问题解决。

posted @ 2007-01-24 10:57 HenryZhang 阅读(181) 评论(2) 编辑
早上来了,就看到一篇提高JS加载速度的文章,原名为“提高js加载速度的完美解决方案”,看了后觉得标题实在夸大了,不过还有值得借鉴的地方,实际要解决的事实是,在页面中如果要通过加载JS来显示部分内容(例如:广告),可通过以下方式:
<span id="myjs1">kk.fitdown 精彩内容载入中...</span>   (此处是要显示内容的地方)

接下来,在页面底部:
<span id="span_myjs1">
<script src="/js/topjs.js"></script>
</span>
<script type="text/javascript">
myjs1.innerHTML=span_myads1.innerHTML;
span_myjs1.innerHTML="";
</script>
这样就能实现文章载入完后在载入广告,提高的文档的显示速度。

实际做的事情就是,把原来要显示内容的地方先放一个提示的信息,如“加载中...”,然后在自己定义的一个位置载入JS,再通过代码设置目标位置的内容,呵呵,不知道说没说明白:)
posted @ 2007-01-24 10:56 HenryZhang 阅读(737) 评论(1) 编辑
前两天在开发中遇到了截取字符串的问题,使用C#中的SubString时,不论汉字还是字母,全角还是半角,都当做一个字符处理,无法适应页中显示的要求,于是自己写了个StringSub,截取时全角字符计为两个长度,而半角字符计为一个,未经严格测试,代码如下:
        /// <summary>
        /// 对指定字符串取指定长度,考虑了全角半角的问题
        /// </summary>
        /// <param name="str"></param>
        /// <param name="len"></param>
        /// <returns></returns>
        public static string StringSub(string str, int len)
        {
            string temp = "";
            System.Text.ASCIIEncoding n = new System.Text.ASCIIEncoding();
            byte[] b = n.GetBytes(str);
            int i = 0;
            int j = 0;
            while (i < len && j < b.Length)
            {
                temp += str.Substring(0, 1);
                str = str.Substring(1);
                if (b[j] >= 63)
                    i = i + 2;
                else
                    i++;
                j++;
            }
            return temp;
        }
posted @ 2007-01-24 10:54 HenryZhang 阅读(219) 评论(0) 编辑
今天在网上看到了一个不错的日历控件
原作者:
CSDN 网友 KimSoft http://blog.csdn.net/kimsoft/archive/2006/05/24/753225.aspx

寒羽枫作了完善和修改,可以进行灵活的设置和修改,最重要的,就是兼容 IE、 FireFox
Js源码如下:
WebCalendar.js
<!--
var cal;
var isFocus=false; //是否为焦点
//以上为  寒羽枫 2006-06-25 添加的变量

//选择日期 → 由 寒羽枫 2006-06-25 添加
function SelectDate(obj,strFormat)
{
    var date = new Date();
    var by = date.getFullYear()-50;  //最小值 → 50 年前
    var ey = date.getFullYear()+50;  //最大值 → 50 年后
    //cal = new Calendar(by, ey,1,strFormat);    //初始化英文版,0 为中文版
    cal = (cal==null) ? new Calendar(by, ey, 0) : cal;    //不用每次都初始化 2006-12-03 修正
    cal.dateFormatStyle = strFormat;
    cal.show(obj);
}
/**//**//**//**
 * 返回日期
 * @param d the delimiter
 * @param p the pattern of your date
 2006-06-25 由 寒羽枫 修改为根据用户指定的 style 来确定;
 */
//String.prototype.toDate = function(x, p) {
String.prototype.toDate = function(style) {
/**//**//**//*
  if(x == null) x = "-";
  if(p == null) p = "ymd";
  var a = this.split(x);
  var y = parseInt(a[p.indexOf("y")]);
  //remember to change this next century ;)
  if(y.toString().length <= 2) y += 2000;
  if(isNaN(y)) y = new Date().getFullYear();
  var m = parseInt(a[p.indexOf("m")]) - 1;
  var d = parseInt(a[p.indexOf("d")]);
  if(isNaN(d)) d = 1;
  return new Date(y, m, d);
  */
  var y = this.substring(style.indexOf('y'),style.lastIndexOf('y')+1);//年
  var m = this.substring(style.indexOf('M'),style.lastIndexOf('M')+1);//月
  var d = this.substring(style.indexOf('d'),style.lastIndexOf('d')+1);//日
  if(isNaN(y)) y = new Date().getFullYear();
  if(isNaN(m)) m = new Date().getMonth();
  if(isNaN(d)) d = new Date().getDate();
  var dt ;
  eval ("dt = new Date('"+ y+"', '"+(m-1)+"','"+ d +"')");
  return dt;
}

/**//**//**//**
 * 格式化日期
 * @param   d the delimiter
 * @param   p the pattern of your date
 * @author  meizz
 */
Date.prototype.format = function(style) {
  var o = {
    "M+" : this.getMonth() + 1, //month
    "d+" : this.getDate(),      //day
    "h+" : this.getHours(),     //hour
    "m+" : this.getMinutes(),   //minute
    "s+" : this.getSeconds(),   //second
    "w+" : "天一二三四五六".charAt(this.getDay()),   //week
    "q+" : Math.floor((this.getMonth() + 3) / 3),  //quarter
    "S"  : this.getMilliseconds() //millisecond
  }
  if(/(y+)/.test(style)) {
    style = style.replace(RegExp.$1,
    (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  }
  for(var k in o){
    if(new RegExp("("+ k +")").test(style)){
      style = style.replace(RegExp.$1,
        RegExp.$1.length == 1 ? o[k] :
        ("00" + o[k]).substr(("" + o[k]).length));
    }
  }
  return style;
};

/**//**//**//**
 * 日历类
 * @param   beginYear 1990
 * @param   endYear   2010
 * @param   lang      0(中文)|1(英语) 可自由扩充
 * @param   dateFormatStyle  "yyyy-MM-dd";
 * @version 2006-04-01
 * @author  KimSoft (jinqinghua [at] gmail.com)
 * @update
 */
function Calendar(beginYear, endYear, lang, dateFormatStyle) {
  this.beginYear = 1990;
  this.endYear = 2010;
  this.lang = 0;            //0(中文) | 1(英文)
  this.dateFormatStyle = "yyyy-MM-dd";

  if (beginYear != null && endYear != null){
    this.beginYear = beginYear;
    this.endYear = endYear;
  }
  if (lang != null){
    this.lang = lang
  }

  if (dateFormatStyle != null){
    this.dateFormatStyle = dateFormatStyle
  }

  this.dateControl = null;
  this.panel = this.getElementById("calendarPanel");
  this.container = this.getElementById("ContainerPanel");
  this.form  = null;

  this.date = new Date();
  this.year = this.date.getFullYear();
  this.month = this.date.getMonth();


  this.colors = {
  "cur_word"      : "#FFFFFF",  //当日日期文字颜色
  "cur_bg"        : "#00FF00",  //当日日期单元格背影色
  "sel_bg"        : "#FFCCCC",  //已被选择的日期单元格背影色 2006-12-03 寒羽枫添加
  "sun_word"      : "#FF0000",  //星期天文字颜色
  "sat_word"      : "#0000FF",  //星期六文字颜色
  "td_word_light" : "#333333",  //单元格文字颜色
  "td_word_dark"  : "#CCCCCC",  //单元格文字暗色
  "td_bg_out"     : "#EFEFEF",  //单元格背影色
  "td_bg_over"    : "#FFCC00",  //单元格背影色
  "tr_word"       : "#FFFFFF",  //日历头文字颜色
  "tr_bg"         : "#666666",  //日历头背影色
  "input_border"  : "#CCCCCC",  //input控件的边框颜色
  "input_bg"      : "#EFEFEF"   //input控件的背影色
  }

  this.draw();
  this.bindYear();
  this.bindMonth();
  this.changeSelect();
  this.bindData();
}

/**//**//**//**
 * 日历类属性(语言包,可自由扩展)
 */
Calendar.language = {
  "year"   : [[""], [""]],
  "months" : [["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],
        ["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"]
         ],
  "weeks"  : [["日","一","二","三","四","五","六"],
        ["SUN","MON","TUR","WED","THU","FRI","SAT"]
         ],
  "clear"  : [["清空"], ["CLS"]],
  "today"  : [["今天"], ["TODAY"]],
  "close"  : [["关闭"], ["CLOSE"]]
}

Calendar.prototype.draw = function() {
  calendar = this;

  var mvAry = [];
  //mvAry[mvAry.length]  = '  <form name="calendarForm" style="margin: 0px;">'; //因 <form> 不能嵌套, 2006-12-01 由寒羽枫改用 Div
  mvAry[mvAry.length]  = '  <div name="calendarForm" style="margin: 0px;">';
  mvAry[mvAry.length]  = '    <table width="100%" border="0" cellpadding="0" cellspacing="1">';
  mvAry[mvAry.length]  = '      <tr>';
  mvAry[mvAry.length]  = '        <th align="left" width="1%"><input style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:16px;height:20px;" name="prevMonth" type="button" id="prevMonth" value="&lt;" /></th>';
  mvAry[mvAry.length]  = '        <th align="center" width="98%" nowrap="nowrap"><select name="calendarYear" id="calendarYear" style="font-size:12px;"></select><select name="calendarMonth" id="calendarMonth" style="font-size:12px;"></select></th>';
  mvAry[mvAry.length]  = '        <th align="right" width="1%"><input style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:16px;height:20px;" name="nextMonth" type="button" id="nextMonth" value="&gt;" /></th>';
  mvAry[mvAry.length]  = '      </tr>';
  mvAry[mvAry.length]  = '    </table>';
  mvAry[mvAry.length]  = '    <table id="calendarTable" width="100%" style="border:0px solid #CCCCCC;background-color:#FFFFFF" border="0" cellpadding="3" cellspacing="1">';
  mvAry[mvAry.length]  = '      <tr>';
  for(var i = 0; i < 7; i++) {
    mvAry[mvAry.length]  = '      <th style="font-weight:normal;background-color:' + calendar.colors["tr_bg"] + ';color:' + calendar.colors["tr_word"] + ';">' + Calendar.language["weeks"][this.lang][i] + '</th>';
  }
  mvAry[mvAry.length]  = '      </tr>';
  for(var i = 0; i < 6;i++){
    mvAry[mvAry.length]  = '    <tr align="center">';
    for(var j = 0; j < 7; j++) {
      if (j == 0){
        mvAry[mvAry.length]  = '  <td style="cursor:default;color:' + calendar.colors["sun_word"] + ';"></td>';
      } else if(j == 6) {
        mvAry[mvAry.length]  = '  <td style="cursor:default;color:' + calendar.colors["sat_word"] + ';"></td>';
      } else {
        mvAry[mvAry.length]  = '  <td style="cursor:default;"></td>';
      }
    }
    mvAry[mvAry.length]  = '    </tr>';
  }
  mvAry[mvAry.length]  = '      <tr style="background-color:' + calendar.colors["input_bg"] + ';">';
  mvAry[mvAry.length]  = '        <th colspan="2"><input name="calendarClear" type="button" id="calendarClear" value="' + Calendar.language["clear"][this.lang] + '" style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:100%;height:20px;font-size:12px;"/></th>';
  mvAry[mvAry.length]  = '        <th colspan="3"><input name="calendarToday" type="button" id="calendarToday" value="' + Calendar.language["today"][this.lang] + '" style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:100%;height:20px;font-size:12px;"/></th>';
  mvAry[mvAry.length]  = '        <th colspan="2"><input name="calendarClose" type="button" id="calendarClose" value="' + Calendar.language["close"][this.lang] + '" style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:100%;height:20px;font-size:12px;"/></th>';
  mvAry[mvAry.length]  = '      </tr>';
  mvAry[mvAry.length]  = '    </table>';
  //mvAry[mvAry.length]  = '  </from>';
  mvAry[mvAry.length]  = '  </div>';
  this.panel.innerHTML = mvAry.join("");
 
  /**//******** 以下代码由寒羽枫 2006-12-01 添加 **********/
  var obj = this.getElementById("prevMonth");
  obj.onclick = function () {calendar.goPrevMonth(calendar);}
  obj.onblur = function () {calendar.onblur();}
  this.prevMonth= obj;
 
  obj = this.getElementById("nextMonth");
  obj.onclick = function () {calendar.goNextMonth(calendar);}
  obj.onblur = function () {calendar.onblur();}
  this.nextMonth= obj;
 
 

  obj = this.getElementById("calendarClear");
  obj.onclick = function () {calendar.dateControl.value = "";calendar.hide();}
  this.calendarClear = obj;
 
  obj = this.getElementById("calendarClose");
  obj.onclick = function () {calendar.hide();}
  this.calendarClose = obj;
 
  obj = this.getElementById("calendarYear");
  obj.onchange = function () {calendar.update(calendar);}
  obj.onblur = function () {calendar.onblur();}
  this.calendarYear = obj;
 
  obj = this.getElementById("calendarMonth");
  with(obj)
  {
    onchange = function () {calendar.update(calendar);}
    onblur = function () {calendar.onblur();}
  }this.calendarMonth = obj;
 
  obj = this.getElementById("calendarToday");
  obj.onclick = function () {
    var today = new Date();
    calendar.date = today;
    calendar.year = today.getFullYear();
    calendar.month = today.getMonth();
    calendar.changeSelect();
    calendar.bindData();
    calendar.dateControl.value = today.format(calendar.dateFormatStyle);
    calendar.hide();
  }
  this.calendarToday = obj;
  /**//******** 以上代码由寒羽枫 2006-12-01 添加 **********/
 
  /**//*
  //this.form = document.forms["calendarForm"];  
  this.form.prevMonth.onclick = function () {calendar.goPrevMonth(this);}
  this.form.nextMonth.onclick = function () {calendar.goNextMonth(this);}
 
  this.form.prevMonth.onblur = function () {calendar.onblur();}
  this.form.nextMonth.onblur = function () {calendar.onblur();}

  this.form.calendarClear.onclick = function () {calendar.dateControl.value = "";calendar.hide();}
  this.form.calendarClose.onclick = function () {calendar.hide();}
  this.form.calendarYear.onchange = function () {calendar.update(this);}
  this.form.calendarMonth.onchange = function () {calendar.update(this);}
 
  this.form.calendarYear.onblur = function () {calendar.onblur();}
  this.form.calendarMonth.onblur = function () {calendar.onblur();}
 
  this.form.calendarToday.onclick = function () {
    var today = new Date();
    calendar.date = today;
    calendar.year = today.getFullYear();
    calendar.month = today.getMonth();
    calendar.changeSelect();
    calendar.bindData();
    calendar.dateControl.value = today.format(calendar.dateFormatStyle);
    calendar.hide();
  }
*/
}

//年份下拉框绑定数据
Calendar.prototype.bindYear = function() {
  //var cy = this.form.calendarYear;
  var cy = this.calendarYear;//2006-12-01 由寒羽枫修改
  cy.length = 0;
  for (var i = this.beginYear; i <= this.endYear; i++){
    cy.options[cy.length] = new Option(i + Calendar.language["year"][this.lang], i);
  }
}

//月份下拉框绑定数据
Calendar.prototype.bindMonth = function() {
  //var cm = this.form.calendarMonth;
  var cm = this.calendarMonth;//2006-12-01 由寒羽枫修改
  cm.length = 0;
  for (var i = 0; i < 12; i++){
    cm.options[cm.length] = new Option(Calendar.language["months"][this.lang][i], i);
  }
}

//向前一月
Calendar.prototype.goPrevMonth = function(e){
  if (this.year == this.beginYear && this.month == 0){return;}
  this.month--;
  if (this.month == -1) {
    this.year--;
    this.month = 11;
  }
  this.date = new Date(this.year, this.month, 1);
  this.changeSelect();
  this.bindData();
}

//向后一月
Calendar.prototype.goNextMonth = function(e){
  if (this.year == this.endYear && this.month == 11){return;}
  this.month++;
  if (this.month == 12) {
    this.year++;
    this.month = 0;
  }
  this.date = new Date(this.year, this.month, 1);
  this.changeSelect();
  this.bindData();
}

//改变SELECT选中状态
Calendar.prototype.changeSelect = function() {
  //var cy = this.form.calendarYear;
  //var cm = this.form.calendarMonth;
  var cy = this.calendarYear;//2006-12-01 由寒羽枫修改
  var cm = this.calendarMonth;
  for (var i= 0; i < cy.length; i++){
    if (cy.options[i].value == this.date.getFullYear()){
      cy[i].selected = true;
      break;
    }
  }
  for (var i= 0; i < cm.length; i++){
    if (cm.options[i].value == this.date.getMonth()){
      cm[i].selected = true;
      break;
    }
  }
}

//更新年、月
Calendar.prototype.update = function (e){
  //this.year  = e.form.calendarYear.options[e.form.calendarYear.selectedIndex].value;
  //this.month = e.form.calendarMonth.options[e.form.calendarMonth.selectedIndex].value;
  this.year  = e.calendarYear.options[e.calendarYear.selectedIndex].value;//2006-12-01 由寒羽枫修改
  this.month = e.calendarMonth.options[e.calendarMonth.selectedIndex].value;
  this.date = new Date(this.year, this.month, 1);
  this.changeSelect();
  this.bindData();
}

//绑定数据到月视图
Calendar.prototype.bindData = function () {
  var calendar = this;
  var dateArray = this.getMonthViewArray(this.date.getYear(), this.date.getMonth());
  var tds = this.getElementById("calendarTable").getElementsByTagName("td");
  for(var i = 0; i < tds.length; i++) {
  //tds[i].style.color = calendar.colors["td_word_light"];
  tds[i].style.backgroundColor = calendar.colors["td_bg_out"];
    tds[i].onclick = function () {return;}
    tds[i].onmouseover = function () {return;}
    tds[i].onmouseout = function () {return;}
    if (i > dateArray.length - 1) break;
    tds[i].innerHTML = dateArray[i];
    if (dateArray[i] != "&nbsp;"){
      tds[i].onclick = function () {
        if (calendar.dateControl != null){
          calendar.dateControl.value = new Date(calendar.date.getFullYear(),
                                                calendar.date.getMonth(),
                                                this.innerHTML).format(calendar.dateFormatStyle);
        }
        calendar.hide();
      }
      tds[i].onmouseover = function () {
        this.style.backgroundColor = calendar.colors["td_bg_over"];
      }
      tds[i].onmouseout = function () {
        this.style.backgroundColor = calendar.colors["td_bg_out"];
      }
      if (new Date().format(calendar.dateFormatStyle) ==
          new Date(calendar.date.getFullYear(),
                   calendar.date.getMonth(),
                   dateArray[i]).format(calendar.dateFormatStyle)) {
        //tds[i].style.color = calendar.colors["cur_word"];
        tds[i].style.backgroundColor = calendar.colors["cur_bg"];
        tds[i].onmouseover = function () {
          this.style.backgroundColor = calendar.colors["td_bg_over"];
        }
        tds[i].onmouseout = function () {
          this.style.backgroundColor = calendar.colors["cur_bg"];
        }
        //continue; //若不想当天单元格的背景被下面的覆盖,请取消注释 →  2006-12-03 寒羽枫添加
      }//end if
     
      //设置已被选择的日期单元格背影色 2006-12-03 寒羽枫添加
      if (calendar.dateControl != null && calendar.dateControl.value == new Date(calendar.date.getFullYear(),
                   calendar.date.getMonth(),
                   dateArray[i]).format(calendar.dateFormatStyle)) {
        tds[i].style.backgroundColor = calendar.colors["sel_bg"];
        tds[i].onmouseover = function () {
          this.style.backgroundColor = calendar.colors["td_bg_over"];
        }
        tds[i].onmouseout = function () {
          this.style.backgroundColor = calendar.colors["sel_bg"];
        }
      }
    }
  }
}

//根据年、月得到月视图数据(数组形式)
Calendar.prototype.getMonthViewArray = function (y, m) {
  var mvArray = [];
  var dayOfFirstDay = new Date(y, m, 1).getDay();
  var daysOfMonth = new Date(y, m + 1, 0).getDate();
  for (var i = 0; i < 42; i++) {
    mvArray[i] = "&nbsp;";
  }
  for (var i = 0; i < daysOfMonth; i++){
    mvArray[i + dayOfFirstDay] = i + 1;
  }
  return mvArray;
}

//扩展 document.getElementById(id) 多浏览器兼容性 from meizz tree source
Calendar.prototype.getElementById = function(id){
  if (typeof(id) != "string" || id == "") return null;
  if (document.getElementById) return document.getElementById(id);
  if (document.all) return document.all(id);
  try {return eval(id);} catch(e){ return null;}
}

//扩展 object.getElementsByTagName(tagName)
Calendar.prototype.getElementsByTagName = function(object, tagName){
  if (document.getElementsByTagName) return document.getElementsByTagName(tagName);
  if (document.all) return document.all.tags(tagName);
}

//取得HTML控件绝对位置
Calendar.prototype.getAbsPoint = function (e){
  var x = e.offsetLeft;
  var y = e.offsetTop;
  while(e = e.offsetParent){
    x += e.offsetLeft;
    y += e.offsetTop;
  }
  return {"x": x, "y": y};
}

//显示日历
Calendar.prototype.show = function (dateObj, popControl) {
  if (dateObj == null){
    throw new Error("arguments[0] is necessary")
  }
  this.dateControl = dateObj;
 
  //if (dateObj.value.length > 0){
  //this.date = new Date(dateObj.value.toDate());
  //this.date = new Date(dateObj.value.toDate(this.dateFormatStyle));//由寒羽枫修改,带入用户指定的 style 
  this.date = (dateObj.value.length > 0) ? new Date(dateObj.value.toDate(this.dateFormatStyle)) : new Date() ;//2006-12-03 寒羽枫添加 → 若为空则显示当前月份
  this.year = this.date.getFullYear();
  this.month = this.date.getMonth();
  this.changeSelect();
  this.bindData();
  //}
  if (popControl == null){
    popControl = dateObj;
  }
  var xy = this.getAbsPoint(popControl);
  this.panel.style.left = xy.x -25 + "px";
  this.panel.style.top = (xy.y + dateObj.offsetHeight) + "px";
 
  //由寒羽枫 2006-06-25 修改 → 把 visibility 变为 display,并添加失去焦点的事件
  //this.setDisplayStyle("select", "hidden");
  //this.panel.style.visibility = "visible";
  //this.container.style.visibility = "visible";
  this.panel.style.display = "";
  this.container.style.display = "";
 
  dateObj.onblur = function(){calendar.onblur();}
  this.container.onmouseover = function(){isFocus=true;}
  this.container.onmouseout = function(){isFocus=false;}
}

//隐藏日历
Calendar.prototype.hide = function() {
  //this.setDisplayStyle("select", "visible");
  //this.panel.style.visibility = "hidden";
  //this.container.style.visibility = "hidden";
  this.panel.style.display = "none";
  this.container.style.display = "none";
  isFocus=false;
}

//焦点转移时隐藏日历 → 由寒羽枫 2006-06-25 添加
Calendar.prototype.onblur = function() {
    if(!isFocus){this.hide();}
}

//以下由寒羽枫 2006-06-25 修改 → 用<iframe> 遮住 IE 的下拉框
/**//**//**//*
//设置控件显示或隐藏
Calendar.prototype.setDisplayStyle = function(tagName, style) {
  var tags = this.getElementsByTagName(null, tagName)
  for(var i = 0; i < tags.length; i++) {
    if (tagName.toLowerCase() == "select" &&
       (tags[i].name == "calendarYear" ||
      tags[i].name == "calendarMonth")){
      continue;
    }
    //tags[i].style.visibility = style;
    tags[i].style.display = style;
  }
}
*/
//document.write('<div id="ContainerPanel" style="visibility:hidden"><div id="calendarPanel" style="position: absolute;visibility: hidden;z-index: 9999;');
document.write('<div id="ContainerPanel" style="display:none"><div id="calendarPanel" style="position: absolute;display: none;z-index: 9999;');
document.write('background-color: #FFFFFF;border: 1px solid #CCCCCC;width:175px;font-size:12px;"></div>');
if(document.all)
{
document.write('<iframe style="position:absolute;z-index:2000;width:expression(this.previousSibling.offsetWidth);');
document.write('height:expression(this.previousSibling.offsetHeight);');
document.write('left:expression(this.previousSibling.offsetLeft);top:expression(this.previousSibling.offsetTop);');
document.write('display:expression(this.previousSibling.style.display);" scrolling="no" frameborder="no"></iframe>');
}
document.write('</div>');
//var calendar = new Calendar();  //此句被 寒羽枫注释,否则 IE 将报错
//调用calendar.show(dateControl, popControl);
//-->



调用方法

    1、引用 WebCalendar.js
    <script src="js/WebCalendar.js" type="text/javascript"></script>

    2、编写触发的脚本事件
    this.Txt_Date.Attributes["onclick"] = "SelectDate(this,'yyyy-MM-dd')";

    <input name="Txt_Date" type="text" maxlength="10" id="Txt_Date" onclick="SelectDate(this,'yyyy/MM/dd')" />

相关的修改可以在
new Calendar时通过改变其参数实现,SelectDate(this,'yyyy-MM-dd')将指定其显示的格式。
posted @ 2007-01-24 10:51 HenryZhang 阅读(1193) 评论(0) 编辑
三天的假期,去了女朋友家,见到了很多亲戚,既紧张又兴奋的感觉,回来已经累得动弹不了了,但今天上班却是精神得很,想想以往的假期,一个一个的“黄金周”,好像还是这半个周过得最有意义,也最充实了,看来休息放松的最好方式不是睡觉呀:)
posted @ 2007-01-24 10:48 HenryZhang 阅读(22) 评论(0) 编辑
1、美特斯邦威:不加寻常班    
  2、特步: 加班,死一般的感觉    
  3、百事:加班无极限    
  4、森马:上什么公司,加什么班   
  5、脑白金:今年过节不加班,加班只加节假日    
  6、汇仁肾宝:他加我也加    
  7、李宁:加班,一切皆有可能    
  8、旺旺:你加,我加,大家加,加加   
  9、农夫山泉:加班确实有点烦    
  10、好迪:大家加,才是真的加 
  11、白加黑:白天加白班,不瞌睡;晚上加晚班,睡不着 
  12、联想:公司不加班,公司会怎么样 
  13、娃哈哈:妈妈~~我也要加班! 
  14、清嘴:你知道加班的味道吗? 
  15、安踏:我加班,我喜欢! 
  16、NIKE:Just 加 it! 
  17、钙中钙:现在的加班啊,它含金量高,加一天顶过去五天,实惠!你瞧我,一口气加了5天,不费劲  
posted @ 2007-01-24 10:45 HenryZhang 阅读(31) 评论(0) 编辑
飘来飘去的感觉。。。。。。
很久以前就在园子里注册了用户,一直也没写什么东东,也在别的地方注册过博客,一直也没好好用过哪个,呵呵,前几天看到了百度的个人空间,感觉不错,于是决定坚持用下去,这段时间做得还不错,原则就是不能把别人的东西一通地粘过来,因为以前粘过来几乎就再也不看了,所以决定只写看过的看懂的总结,因个人水平有限,原创的东西还是很少的,不过能把别人的东西学好写下来也不错吧,嘿,这几天在学TerryLee的一系列文章,还有DLL的Nhibernate,才知道这么多高手,写了这么多好文章,都在园子里,或在CSDN里,所以就想把百度的东西搬过来,先把以前的都清一下,好好在这两个地方写一些自己的学习结果,任何一件事,坚持才重要!
posted @ 2007-01-24 10:44 HenryZhang 阅读(76) 评论(0) 编辑

公告

昵称:HenryZhang
园龄:5年10个月
粉丝:0
关注:0
<2007年1月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910