兜兜的学习札记

人類的全部才能無非是時間和耐心的混合物.---巴尔扎克
posts - 4, comments - 12, trackbacks - 1, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

2006年12月13日

昨天在做项目的时候遇到了这个问题,因为在WebControl里面并不包含对DateTimePicker控件的定义,
所以对时间的处理可以选择控制String的格式,然后将String转化成DateTime再储存到数据库中。
如何将String转化成DateTime类型呢,如下面代码所示:

            // Set the birthday of the employee.
            if (!string.IsNullOrEmpty(txtBirthday.Text))
            
{
                employee.Birthday 
= DateTime.Parse(txtBirthday.Text,
                    System.Globalization.DateTimeFormatInfo.CurrentInfo);
            }

这是其中的一种方法,可以将类似于2006-1-1,2006-01-01等格式的日期转化成DateTime类型,另外还有一个方法:

            // Set the birthday of the employee.
            if (!string.IsNullOrEmpty(txtBirthday.Text))
            
{
                employee.Birthday 
= DateTime.ParseExact(txtBirthday.Text,
                   
"yyyy-MM-dd", System.Globalization.DateTimeFormatInfo.CurrentInfo);
            }

可以自己定义所转化的日期的格式。

但是实际上这样从页面空间上直接通过输入字符串的方式来填写日期,并转化为DateTime类型保存到数据库中还是比较危险的。
如果输入的字符串稍有差池,就会带来Exception。配合下面的正则表达式就好办了,这个是从网上搜刮来的超强的判断输入日期
格式的正则表达式,允许输入的日期格式为yyyy-MM-dd,其中输入2006-1-1,2006-01-01这种格式都是有效的,而且包含了对不同
年份2月的天数,闰年的控制等等:

^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$

所以在界面txtBirthday输入框增加一个RegularExpressionValidator配合使用控制日期的输入格式就可以了。

posted @ 2006-12-13 11:17 小小兜 阅读(2590) 评论(0) 编辑

2006年12月10日

为了以后查阅方便,都是最常用的正则表达式
转自岁月如歌的Blog
[注]其中蓝色的为我修改过的

写在前面: 正则表达式用于字符串处理、表单验证等场合,实用高效。但用到时总是不太把握,以致往往要查证一番。现将一些常用的表达式收集于此,以备不时之需。
: 上次和crackabc、hitme等人讨论过一次,发现网上google来的谬误多多这次重新整理一下,力求精简正确。也希望大家能一起来琢磨琢磨,捉捉bugs.
: 以下表达式均在RegexBuddy测试修正过,若有错,还望指出。另外注意,在不同的语言环境下,对正则的支持都可能不一样,际应用时注意不同之处

 

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行

匹配HTML标记的正则表达式:< (\S*?)[^>]*>.*?|< .*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用

匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用

匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字

匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位
这个经验证使错误的,其实本来vs2005就自带了对身份证验证的正则表达式 \d{17}[\d|X]|\d{15}

匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用

匹配特定数字:
^[1-9]\d*$    //匹配正整数
^-[1-9]\d*$   //匹配负整数
^-?[1-9]\d*$   //匹配整数
^[1-9]\d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串
评注:最基本也是最常用的一些表达式

posted @ 2006-12-10 20:21 小小兜 阅读(117) 评论(1) 编辑

说起来我真的很痛恨JavaScript,虽然可以做出这样那样的漂亮的效果
但是它的复杂程度和传来传去的关系是在让我是丈二和尚摸不着头脑了
今天下午折腾了一个下午才折腾出来2行代码,总算是解决了关闭窗口并刷新夫窗口的问题
最折腾人的代码就是如何用
Javascript判断是否点击了页面窗口的关闭按钮:

    <script type="text/javascript">
        
function closewindow() 
        
{
            
if
 (window.dialogArguments) 
            
{
                
// Calling the method (given as argument) to cause the postback

                window.dialogArguments.doPostBack();
             }

             
else
             
{
                opener.doPostBack();
             }

             window.close();  
        }

        
function window.onbeforeunload()
        
{
            
if(event.clientX>document.body.clientWidth&&event.clientY<0||
event.altKey)
            
{
                closewindow();
            }

        }

    
</script>

其中最重要的是判断范围的事件要写在window.
onbeforeunload事件里面,
今天一直写在window.onunload事件里面,所以一直不触发,奶了个QQ,气死我了

posted @ 2006-12-10 20:00 小小兜 阅读(2508) 评论(1) 编辑

搜索了不知道多少网页,包括中文的英文的中国的美国的
就没有找到一个切实的可行的方案来很好的解决如何在Atlas UpdatePanel里面使用FileUpload的控件
最后的解决还是依靠下载了最新版本的Asp.Net AJax,也就是Atals改名的升级版本
编辑界面更加漂亮,而且提供的UpdatePanel里面Trigger的支持种类也多了很多

如需要,请到http://ajax.asp.net/下载最新版本的Asp.Net Ajax.

如何在Asp:UpdatePanel里面使用FileUpload控件的解决方案如下:
1.下载最新版本的Asp.Net Ajax:
http://ajax.asp.net/
2.修改Web.Config文件,请从http://www.codeproject.com/Ajax/HelloAtlas.asp下载,参照修改:
3. 参照下面的代码使用FileUpload空间。特别注意<Trigger>Attribute的内容。下面内容可以从http://ajax.asp.net/docs/ViewSample.aspx?sref=System.Web.UI.PostBackTrigger%23PostBackTriggerCS.aspx  得到。

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>

<script runat="server">

    private string saveDir 
= @"Uploads\";
    
    protected 
void UploadButton_Click(object sender, EventArgs e)
    
{
        
if (FileUpload1.HasFile && FileUpload1.FileBytes.Length < 10000 &&
            
!CheckForFileName())
        
{
            string savePath 
= Request.PhysicalApplicationPath + saveDir +
                Server.HtmlEncode(FileName.Text);
            FileUpload1.SaveAs(savePath);
            UploadStatusLabel.Text 
= "Your file was uploaded successfully.";
        }

        
else
        
{
            UploadStatusLabel.Text 
= "You did not specify a file to upload, or a file name, or the file was too large. Please try again.";
        }

    }


    protected 
void CheckButton_Click(object sender, EventArgs e)
    
{
        
if (FileName.Text.Length > 0)
        
{
            string s 
= CheckForFileName() ? "exists already." : "does not exist.";
            UploadStatusLabel.Text 
= "The file name choosen " + s;
        }

        
else
        
{
            UploadStatusLabel.Text 
= "Specify a file name to check.";
        }

    }

    private Boolean CheckForFileName()
    
{
        System.IO.FileInfo fi 
= new System.IO.FileInfo(Request.PhysicalApplicationPath + 
            saveDir 
+ Server.HtmlEncode(FileName.Text));
            
return fi.Exists;
    }


</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    
<title>PostBackTrigger Example</title>
</head>
<body>
    
<form id="form1" runat="server">
    
<div>
    
<asp:ScriptManager ID="ScriptManager1" runat="server" />
    
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
    
<ContentTemplate>
    
<fieldset>
    
<legend>FileUpload in an UpdatePanel</legend>
       First, enter a file name to upload your file to: 
       
<asp:TextBox ID="FileName" runat="server" />
       
<asp:Button ID="CheckButton" Text="Check" runat="server" OnClick="CheckButton_Click" />
       
<br />
       Then, browse and find the file to upload:
       
<asp:FileUpload id="FileUpload1"                 
           runat
="server">
       
</asp:FileUpload>
       
<br />
       
<asp:Button id="UploadButton" 
           Text
="Upload file"
           OnClick
="UploadButton_Click"
           runat
="server">
       
</asp:Button>    
       
<br />
       
<asp:Label id="UploadStatusLabel"
           runat
="server" style="color:red;">
       
</asp:Label>           
    
</fieldset>
    
</ContentTemplate>
    
<Triggers>
    
<asp:PostBackTrigger ControlID="UploadButton" />
    
</Triggers>
    
</asp:UpdatePanel>
    
</div>
    
</form>
</body>
</html>

此次最愤慨的找了这么多网页,很多作者都自称绝对可以解决,实际上不知道他们是否真正实验过了
害我浪费了那么多的时间帮他们实验,结果到最后才发现仍然不能解决,真是气人。
这个解决方案经过验证是可行的。希望能帮到那些一直在寻找解决方案却仍然没有结果的人们。

posted @ 2006-12-10 19:57 小小兜 阅读(1357) 评论(10) 编辑