诛仙散7能拆多少珠子:七招制胜ASP.NET应用程序开发 - 奋斗的日志 - 网易博客

来源:百度文库 编辑:九乡新闻网 时间:2024/07/07 14:23:11
学习ASP.NET中的心得,与收集的一些资料 相对路径

七招制胜ASP.NET应用程序开发

默认分类 2007-01-31 17:09:36 阅读114 评论0   字号: 订阅

七招制胜ASP.NET应用程序开发

随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
  1. ~ 的用法
  
    一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不同层次的两个目录的aspx文件分别引用时,问题就会出现了。
  
    ~/image/about.bmp 是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览它。
  
    2. 在刷新和提交页面后,保存你的页面滚动条的位置
  
    经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370个控件又需要他选择一下?
  
    用下面的方法可以很快地确定和记住你提交前的位置。
  
    网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,不过他使用了Web Behavior这意味着你需要使用一个.htc文件
  
  Private Sub RetainScrollPosition()
  
  Dim saveScrollPosition As New StringBuilder
  Dim setScrollPosition As New StringBuilder
  
  RegisterHiddenField("__SCROLLPOS", "0")
  saveScrollPosition.Append("<script language='javascript'>")
  saveScrollPosition.Append("function saveScrollPosition() {")
  saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = thebody.scrollTop;")
  saveScrollPosition.Append("}")
  saveScrollPosition.Append("thebody.onscroll=saveScrollPosition;")
  saveScrollPosition.Append("</script>")
  
  RegisterStartupScript("saveScroll", saveScrollPosition.ToString())
  
  If (Page.IsPostBack = True) Then
  
  setScrollPosition.Append("<script language='javascript'>")
  setScrollPosition.Append("function setScrollPosition() {")
  setScrollPosition.Append(" thebody.scrollTop = " & Request("__SCROLLPOS") & ";")
  setScrollPosition.Append("}")
  setScrollPosition.Append("thebody.onload=setScrollPosition;")
  setScrollPosition.Append("</script>")
  RegisterStartupScript("setScroll", setScrollPosition.ToString())
  
  End If
  
  End Sub
  
  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  RetainScrollPosition()
  End Sub 

  3. DataList使用不同风格的模板
  
    这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个元素或是加一个促销广告图等等。
  
  Dim theme As String
  theme = DropDownList1.SelectedValue
  
  DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
  DataList1.DataSource = DS
  DataList1.DataBind()
  
    4. 设置服务器端控件的焦点
  
  Private Sub SetFocus(ByVal controlToFocus As Control)
  Dim scriptFunction As New StringBuilder
  Dim scriptClientId As String
  
  scriptClientId = controlToFocus.ClientID
  scriptFunction.Append("<script language='javascript'>")
  scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
  scriptFunction.Append("</script>")
  RegisterStartupScript("focus", scriptFunction.ToString())
  End Sub
  
  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  If (Page.IsPostBack = False) Then
  SetFocus(TextBox1)
  End If
  End Sub
  
    5. 滚动DataGrid
  
    这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控件放在一个DIV中将overflow属性设置成auto
  
  <div style=“height:400px;width:200px;overflow:auto”>
  <asp:datagrid runat=“server”/>
  </div>
  
    6. 动态创建控件
  
    利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
  
  Sub Page_Load()
  Dim i as Integer
  For i=0 to 4
  Dim myUserControl as Control
  myUserControl = Page.LoadControl(“foo.ascx”)
  PlaceHolder1.Controls.Add(myUserControl)
  PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
  Next i
  End Sub
  
    7. 客户端代码的使用
  
    1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
  
  asp:ImageButton
  ImageUrl=“start.jpg”
  onMouseOver=“rollover(this);”
  onMouseOut=“rollout(this)”
  rolloversrc=“myrollover.jpg”
  rolloutsrc=“myrollout.jpg”
  runat=“server”/>
  
  <input type=Button clientHandler()”
  onServerClick=“Button1_Click” … />
  
    2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所有的客户端控件。
  
  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles MyBase.Load
   RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
  End Sub
  
    3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术
  
    以上文章介绍了一些ASP.NET中常用而且比较实用的技巧,希望能对大家的实际开发有所裨益! 添加评论 | 固定链接 | 引用通告 (0) | 写入日志 | DotNet

彻底删除项目的VSS源代码管理信息[转]

有时候出差把项目带出去后,打开时老是提示我要连接源代码管理服务器,这个程序用到的源代码服务器管理我当然连接不上,看着很不爽,就开始删除源代码管理信息。 先删除解决方案目录、各个项目目录下的:
    mssccprj.scc
    工程名.vssscc
    vssver.scc
    项目名.csproj.vspscc这四类文件后,打开项目仍然报没删除干净,报下面错误:  (×)  解决方案看起来是受源代码管理,但无法找到它的绑定信息。保存解决方案的源代码管理设置的 MSSCCPRJ.SCC 文件或其他项可能已被删除。由于无法自动恢复这些缺少的信息,缺少绑定的项目将被视为不受源代码管理。 再去打开项目文件的 项目名.csproj 文件,我们可以在开头部分看到类似下面的代码:            ProjectType = "Web"
        ProductVersion = "7.10.3077"
        SchemaVersion = "2.0"
        ProjectGuid = "{2CBB68B7-FE78-4CEF-981B-6A0529A32889}"
        SccProjectName = "SAK"
        SccLocalPath = "SAK"
        SccAuxPath = "SAK"
        SccProvider = "SAK"
    > 删除下面的配置信息
        SccProjectName = "SAK"
        SccLocalPath = "SAK"
        SccAuxPath = "SAK"
        SccProvider = "SAK"
 OK,这个世界清静了,每次打开解决方案,不会都看到烦人的提示源代码信息了。 添加评论 | 固定链接 | 引用通告 (0) | 写入日志 | DotNet

创建动态模版列

的时候我们需要邦定很复杂的DataGrid,我们知道DataGrid,DataList等控件都有Template列,我们可以通过动态的邦定模版列来实现,复杂逻辑的邦定。由于Page继承TemplateControl,所以在Page对象里面就可以使用TemplateControl类里面的方法LoadTemplate,我们可以利用这个方法加载指定路径用户控件来实现丰富的表示(顺便提一下还有一个LoadControl的方法和LoadTemplate有相同的参数类型,也就是说我们可以利用LoadControl方法动态的加载用户控件,可以实现自定义的用户界面,将页面元素分成一些小的用户控件可以根据用户的定义来加载),我们还可以实现Itemplate接口实现摸版列的动态邦定。 1、使用LoadTemplate实现: 下面我们看一个例子,我们建立一个ASP.NET的Web应用程序,在添加一个ascx的用户控件叫webusercontrol1.ascx如下所示,该用户控件里面只有一个Label控件用来邦定一个Lastname字段: <%@ Control Language="C#" %> 接下来我们将要创建一个DataGrid控件DataGrid1,我们将在Page_Load事件里面添加如下的代码: string connstr = @"Integrated Security=SSPI;User Catalog=Northwind;Data Source=MyServer\NetSDK"; SqlConnection cnn=new SqlConnection(connstr); SqlDataAdapter da=new SqlDataAdapter("select * from employees", cnn); DataSet ds=new DataSet(); da.Fill(ds, "employees"); ITemplate temp= Page.LoadTemplate("webusercontrol1.ascx"); TemplateColumn tc=new TemplateColumn(); tc.HeaderText = "Last Name"; tc.ItemTemplate = temp; DataGrid1.Columns.Add(tc); DataGrid1.DataSource = ds; DataGrid1.DataMember = "employees"; DataGrid1.DataBind(); 先面我们分析一下上面的代码,我们使用一个SQL Server里面自带的示例数据库Northwind。我们将得到所有的员工信息,然后填充数据集,然后我们声明一个Itemplate类型的对象temp用来装载邦定的用户控件。我们在声明一个TemplateColumn来动态创建一个模版列,接下来我们给该模版列添加信息,其中包括HeaderText等等,由于我们将要邦定的事ItemTemplate所以我们将刚才装载的temp赋值给该模版列的ItemTemplate对象,最后我们就将新的摸版列添加到DataGrid里面并邦定数据。 注意到上面过程,我们的用户控件里面有一个数据邦定的Label这个很重要,只有这样我们才能实现数据邦定的功能,否则就是显示一个有着相同信息的列。 2、使用Itemplate实现: 上面我们使用LoadTemplate实现动态摸版列的邦定,接下来我们将使用Itemplate接口来实现。Itemplate接口有一个方法InstantiateIn(Control container)。这个方法必须指定摸版列的父亲控件。下面的代码将会实现Itemplate接口,我们使用下面的代码创建一个新的类: using System; using System.Web.UI; using System.Web.UI.WebControls; using System.Data;  namespace DynamicDataGridTemplates{ public class CTemplateColumn:ITemplate{ private string colname; public CTemplateColumn(string cname){ colname=cname; } //为了使用接口必须实现的方法 public void InstantiateIn(Control container) { LiteralControl l = new LiteralControl(); l.DataBinding += new EventHandler(this.OnDataBinding); container.Controls.Add(l); } public void OnDataBinding(object sender, EventArgs e){ LiteralControl l = (LiteralControl) sender; DataGridItem container = (DataGridItem) l.NamingContainer; l.Text = ((DataRowView) container.DataItem)[colname].ToString(); } } } 在构造函数里面我们为邦定列指定了列名。我们使用InstantiateIn创建了一个LiteralControl控件l,同时我们为这个控件添加事件邦定事件,这样我们可以在邦定DataGrid的时候可以处理邦定这个控件,同时为了实现事件邦定事件,我们还编写了事件处理函数OnDataBinding,在这里我们将用指定的列邦定数据。 接下来我们将我们的自定义的摸版列动态的添加到DataGrid里面,如下的代码是Page_Load里面的: DataGrid datagrid1=new DataGrid(); TemplateColumn tc1=new TemplateColumn(); tc1.ItemTemplate=new CTemplateColumn("lastname"); tc1.HeaderText="Last Name"; datagrid1.Columns.Add(tc1); Page.Controls[1].Controls.Add(datagrid1); string connstr = @"Integrated Security=SSPI;User Catalog=Northwind;Data Source=MyServer\NetSDK"; SqlConnection cnn=new SqlConnection(connstr); SqlDataAdapter da=new SqlDataAdapter("select * from employees", cnn) DataSet ds=new DataSet(); da.Fill(ds, "employees"); datagrid1.DataSource = ds; datagrid1.DataMember = "employees"; datagrid1.DataBind(); 首先我们New一个DataGrid出来,然后声明一个模版列tc1,在设置tc1的ItemTemplate为我们自定一个模版列(不要忘了用列名这个参数),然后指定这个模版列的其他信息,最后利用DataSet邦定数据(不要忘了将控件添加到它的父控件里面,比如:datagrid1.Columns.Add(tc1);)。 上面介绍了两种动态邦定模版列的方法,希望可以对初学者有所帮助,其实这里的方法是很简单的,我想这里最关键的问题是如何理解面向对象,希望通过这篇文章的描述初学者可以对面向对象有更好的理解,我们这里使用了接口的继承以及父类子类之间的关系,通过使用接口的继承我们可以制作一个模版列的工厂可以使用同一种模式产生不同的模版列,因为我们使用的是接口(详细信息请见《设计模式》)。
添加评论 | 固定链接 | 引用通告 (0) | 写入日志 | 计算机与 Internet

锁定DataGrid某些列或标题栏

一、锁定列
1、先在网页上添加一个ID为DataGrid_container的容器
并在容器中添加一个DataGrid
设定容器的样式(指定为DataGrid_Container容器)
DIV#DataGrid_Container{
   OVERFLOW: auto; WIDTH: 600px;  HEIGHT: 252px;
   }
没有该样式,滚动条就不会出现(注意设置适当的宽度和高度)。
2、设定锁定样式
.Lock_Col {LEFT: .scrollLeft); ;relative;
}
3、在网页的之间添加如下代码:

function lockCol(Table_ID) 
{
   var table = document.getElementById(Table_ID);
   var cTR = table.getElementsByTagName("TR");  
   for (i = 0; i < cTR.length; i++)
      {
      var tr = cTR.item(i);
      for(j = 0; j < 4; j++)
         {
            tr.cells[j].className = 'Lock_Col'//将j列样式设定为Lock_Col,该列被锁定
         }
      }
}

例如单独锁定某列:cTR.item(0).cells[5].className = 'Lock_Col'
上例中对0~3列的锁定即完成了。
二、锁定标题栏
1、添加样式
.Lock_Header 
{
;relative;
Z-INDEX: 30;  TOP: .scrollTop-2);
}
2、定义DataGrid的HEADER的CssClass为该样式即可
添加评论 | 固定链接 | 引用通告 (0) | 写入日志 | 计算机与 Internet

textarea实现maxlength控制

    onkeypress=doKeypress()
    onkeydown=doKeydown()
    onbeforepaste=doBeforePaste()
    onpaste=doPaste()
>


maxLength = 20
element=document.all["test"]

function doKeypress()
{
    if(!isNaN(maxLength))
    {
        maxLength = parseInt(maxLength)
        var oTR = element.document.selection.createRange()
        if(oTR.text.length >= 1)
            event.returnValue = true
        else if(element.value.length > maxLength-1)
            event.returnValue = false
    }
}

function doKeydown()
{
    setTimeout(function()
    {
        maxLength = parseInt(maxLength)
        if(!isNaN(maxLength))
        {
            if(element.value.length > maxLength-1)
            {
                var oTR = window.document.selection.createRange()
                oTR.moveStart("character", -1*(element.value.length-maxLength))
                oTR.text = ""
            }
        }
    },1)
}

function doBeforePaste()
{
    if(!isNaN(maxLength))
        event.returnValue = false
}

function doPaste()
{
    if(!isNaN(maxLength))
    {
        event.returnValue = false
        maxLength = parseInt(maxLength)
        var oTR = element.document.selection.createRange()
        var iInsertLength = maxLength - element.value.length + oTR.text.length
        var sData = window.clipboardData.getData("Text").substr(0, iInsertLength)
        oTR.text = sData;
    }
}

添加评论 | 固定链接 | 引用通告 (0) | 写入日志 | 计算机与 Internet

在asp.net中将所有错误信息在一个页面中显示

要实现将所有的错误信息在一个页面中显示,首先用户必须将Web.config中的  
设置为Off。所有的页面都从一个基础页面继承。基础页面定义如下:
using System;
using System.Web;
using System.Data;
using System.Data.SqlClient;

using Human.SystemFrameworks;
using Human.Common;
using Human.Common.Data;

namespace Human.WebUI
{
    /**//// 
    /// PageBase 的摘要说明。
    /// 

    public class PageBase:System.Web.UI.Page
    {
        private const String KEY_CACHEACCOUNT = "Cache:Account:";
        private  string _ErrorMessage;

        private static string UrlSuffix
        {
            get
            {
                return HttpContext.Current.Request.Url.Host + HttpContext.Current.Request.ApplicationPath;
            }
        }
        public static String SecureUrlBase
       {
            get
            {
                return (HumanConfiguration.EnableSSL ? @"https://": @"http://") + UrlSuffix;
            }
        }

        public PageBase()
        {
            Page.Error+=new EventHandler(Page_Error);
        }

        protected  void Page_Error(object Sender, EventArgs e)
        {
            Exception objErr = Server.GetLastError().GetBaseException();
            ErrorMessage=objErr.Message;
        }

        public  string ErrorMessage
        {
            get
            {
                return _ErrorMessage;
            }
            set
            {
                _ErrorMessage=value;
            }
        }

        public static string UrlBase
        {
            get
            {
                return @"http://"+UrlSuffix; 
            }
        }

        public DataSet Account
        {
            get
            {
                try
                {
                    return (DataSet)(Session[KEY_CACHEACCOUNT]);
                }
                catch
                {
                    return (null);  // for design time
                }
            }
            set
            {
                if ( null == value )
                {
                    Session.Remove(KEY_CACHEACCOUNT);
                }
                else
                {
                    Session[KEY_CACHEACCOUNT] = value;
                }
            }
        }

    }
}
新建一个ErrorPage.aspx页面,在页面中增加一个Label控件,用于显示错误信息!
定义如下:
 1using System;
 2using System.Collections;
 3using System.ComponentModel;
 4using System.Data;
 5using System.Drawing;
 6using System.Web;
 7using System.Web.SessionState;
 8using System.Web.UI;
 9using System.Web.UI.WebControls;
10using System.Web.UI.HtmlControls;
11
12namespace Human.WebUI
13{
14    /**//// 
15    /// ErrorPage 的摘要说明。
16    /// 

17    public class ErrorPage : PageBase
18    {
19        protected System.Web.UI.WebControls.Label ErrorMessageLabel;
20    
21        private PageBase page;
22
23        private void Page_Load(object sender, System.EventArgs e) 
24        {
25            if (!Page.IsPostBack)
26            {
27                page=(PageBase)Context.Handler;
28                string errMessage="";
29                System.Exception appException=Server.GetLastError();
30
31                int errorcode=0;
32                try
33                {
34                    HttpException checkexception=(HttpException)appException;
35                    errorcode=checkexception.GetHttpCode();
36                }
37                catch
38                {
39                }
40                switch (errorcode)
41                {
42                    case 404:
43                    {
44                        ErrorMessageLabel.Text="您访问的网页不存在!";
45                        break;
46                    }
47                    case 403:
48                    {
49                        break;
50                    }
51                    default:
52                    {
53                        ErrorMessageLabel.Text=page.ErrorMessage;
54                        ErrorMessage=null;
55                        break;
56                    }
57                }
58            }
59        }
60
61        Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
62        override protected void OnInit(EventArgs e)
63        {
64            //
65            // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
66            //
67            InitializeComponent();
68            base.OnInit(e);
69        }
70        
71        /**//// 
72        /// 设计器支持所需的方法 - 不要使用代码编辑器修改
73        /// 此方法的内容。
74        /// 

75        private void InitializeComponent()
76        {    
77            this.Load += new System.EventHandler(this.Page_Load);
78
79        }
80        #endregion
81    }
82}
83在上面的代码中,我不知道如何判断appException是不是HttpException类型,所以只有采用
    try
    {
     HttpException checkexception=(HttpException)appException;
     errorcode=checkexception.GetHttpCode();
    }
    catch
    {
    }
但这样也是可行的。
最后需要增加一个关键的语句,即在Global.aspx中的Application_Error事件中加入:Server.Transfer("ErrorPage.aspx");即可。 添加评论 | 固定链接 | 引用通告 (0) | 写入日志 | 计算机与 Internet

Oracle和Tomcat端口冲突

今天新装了Oracle 9i 结果启动Tomcat后打开 http://localhost:8080 出来的是oracle的相关页面,管理工具—服务中关掉oracle的http服务再启动tomcat又好了,看来端口有冲突。
查了一下,改动tomcat端口很容易,打开D:\Tomcat5\conf\server.xml
找到这么一段

                  maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" connectionTimeout="20000"
               disableUploadTimeout="true" />
       
将port="8080"改为 port="8081"就ok了,可不要改成80等热门端口哟

 

改变或关闭Oracle XDB的ftp和http端口
Oracle 9i开始,创建数据库时默认包含了XDB特性。一旦启动了数据库和Listener,Oracle XDB的http服务就占用8080端口,刚好和JBoss、Tomcat等默认端口冲突。因此,必须有一个做出更改。改Tomcat等容易,只是一时不知道怎么改XDB的配置。
在Google上搜索一下,找到了答案。原来Oracle XDB的端口设置不在配置文件中,而是在数据库里。修改XDB的http和ftp服务端口的方法有3种:

1.使用sys登录Oracle,利用dbms_xdb修改端口设置

  SQL> -- Change the HTTP/WEBDAV port from 8080 to 8081
  SQL> call dbms_xdb.cfg_update(updateXML(
    2        dbms_xdb.cfg_get()
    3      , '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()'
    4      , 8081))
    5  /

  Call completed.


  SQL> -- Change the FTP port from 2100 to 2111
  SQL> call dbms_xdb.cfg_update(updateXML(
    2         dbms_xdb.cfg_get()
    3       , '/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()'
    4       , 2111))
    5  /

  Call completed.


  SQL> COMMIT;

  Commit complete.


  SQL> EXEC dbms_xdb.cfg_refresh;

  PL/SQL procedure successfully completed.


2.使用OEM console,选择数据库,XML Database,Configuration。更改XDB的有关设置。

3.去掉数据库的初始化参数:  dispatchers='(PROTOCOL=TCP) (SERVICE=XDB)',将会禁止XDB的http和ftp服务。

添加评论 | 固定链接 | 引用通告 (0) | 写入日志 | 计算机与 Internet

登录系统时自动打开数字键盘

登录画面时使用打开数字键为预设值 当您登录Windows时,电脑会要求您输入您的密码,可是您的数字渐区Numlock往往没亮起,Windows XP的登录资料库能帮您解决此问题。


在[HKEY_USERS\.DEFAULT\Control Panel\Keyboard]项下

InitialKeyboardIndicators

改成0是不打开,2是自动打开。

添加评论 | 固定链接 | 引用通告 (0) | 写入日志 | 计算机与 Internet

在 ASP.NET 中使用计时器

在 ASP.NET 中使用计时器(Timer)
我在实验中发现在 ASP.NET 中可以使用计时器(Timer)完成一些定时动作。这一点可能会对我们的一些 Web 程序有益。

下面首先介绍我测试使用的一个例子:

首先在 global.asax 中的 Application_OnStart 事件过程中定义计时器,代码如下:
[VB.NET] global.asax
<%@ import Namespace="System.Timers" %>


[C#]必须引用命名空间:using System.Timers;   protected void Application_Start(Object sender, EventArgs e)
  {
   //创建一个计时器,单位:毫秒
   Timer aTimer = new Timer(10000);   //将 aTimer_Elapsed 指定为计时器的 Elapsed 事件处理程序
   aTimer.Elapsed += new ElapsedEventHandler(aTimer_Elapsed);   //AutoReset 属性为 true 时,每隔指定时间循环一次;
   //如果为 false,则只执行一次。
            aTimer.AutoReset = true;
   aTimer.Enabled = true;   //先给 Application("TimeStamp") 指定一个初值
   Application.Lock();
   Application["TimeString"] = DateTime.Now.ToString();
   Application.UnLock();
  }    ///
  /// 定义定时器的Elapsed事件
  ///

  ///
  ///
  private void aTimer_Elapsed(object sender, ElapsedEventArgs e)
  {
   Application.Lock();
   Application["TimeString"] = DateTime.Now.ToString();
   Application.UnLock();
  } 
然后我们简单写一个 test.aspx 来查看 Application("TimeStamp") 的值。代码如下:
[VB.NET] test.aspx
<%
Response.Write(Application("TimeStamp"))
%>
[C#]test.aspxprivate void Form1_Load(object sender,EventArgs e){   Response.Write(Application["TimeString"]);}

分析:

根据 global.asax 中的代码,我们设定了一个计时器,每隔 10 秒钟执行一次 Fresher() 过程;在 Fresher() 过程中我们事实上只是重新写入了一个 Application("TimeStamp") 新值。换句话说,Application("TimeStamp") 的值是应该每隔 10 秒钟更新一次的。

是不是这样的呢?通过 test.aspx 的反复刷新观察 Application("TimeStamp") 的值,的确发现这个值在每隔 10 秒地变化一次,而其他时候则保持不变。与我们的预期是一致的。

意义:

通过引入计时器我们可以在 ASP.NET 的全局性程序(Application)中灵活的使用计时器完成一些定时操作,比如:在社区/论坛系统中,每隔 5 分钟更新一次在线用户列表,每隔 1 个小时更新一次用户经验值,或者每隔一天备份一次关键数据等等。这个思路应该是很诱人的。

探讨:

Q: 是否在 ASP.NET 代码的任何地方都可以使用计时器呢?
A: 我没有测试过在普通 *.aspx 中插入计时器的情形。但从 B/S 程序的特点来看,即使在 *.aspx 中插入计时器可行,也不是一种好的选择。因为对于 B/S 程序来说,服务器接到客户端的请求本身就是一个事件,在这个事件处理过程中,服务器必须迅速的作出回应,为客户端产生相应的 HTML 代码,然后结束这一过程。如果在 *.aspx 使用计时器(如果允许的话),则第一没有太大必要,第二很容易使系统因为插入的计时器过多(因为每一次 *.aspx 的执行都有可能插入一个新的计时器)而使系统瘫痪。

因此,我建议只在 global.asax 的 Application_OnStart 中使用比较安全一些 添加评论 | 固定链接 | 引用通告 (0) | 写入日志 | 计算机与 Internet

Web.Config详细解释

Web.Config详细解释如下:(一).Web.Config是以XML文件规范存储,配置文件分为以下格式
    1.配置节处理程序声明
      特点: 位于配置文件的顶部,包含在标志中。
    2.特定应用程序配置
      特点:  位于中。 可以定义应用程序的全局常量设置等信息.
    3.配置节设置
      特点:  位于节中,控制Asp.net运行时的行为.
    4.配置节组
      特点:  用标记,可以自定义分组,可以放到内部或其它标记的内部.
(二).配置节的每一节
    1.
        根元素,其它节都是在它的内部.
    2.
        此节用于定义应用程序设置项。对一些不确定设置,还可以让用户根据自己实际情况自己设置
        用法:
        I.
        
    
        
        定义了一个连接字符串常量,并且在实际应用时可以修改连接字符串,不用修改程式代码.
        II.
     
          
        定义了一个错误重定向页面.
     3.
        格式:
                       defaultLanguage="c#"
             debug="true"
           />
        I.default language: 定义后台代码语言,可以选择C#和VB.net两种语言.
        IIdebug : 为true时,启动aspx调试; 为false不启动aspx调试,因而可以提高应用程序运行
                  时的性能。 一般程序员在开发时设置为true,交给客户时设置为false.
     4.
         格式:
                     mode="RemoteOnly"
            defaultRedirect="error.aspx"
           
           
         />
         I.mode : 具有On,Off,RemoteOnly 3种状态。On表示始终显示自定义的信息; Off表示始终显示详细的asp.net错误信息; RemoteOnly表示只对不在本地Web服务器上运行的用户显示自定义信息.
         II.defaultRedirect: 用于出现错误时重定向的URL地址. 是可选的
         III.statusCode:  指明错误状态码,表明一种特定的出错状态.
         IV. redirect:错误重定向的URL.
      5.
          格式:
                       requestEncoding="utf-8"
             responseEncoding="utf-8"
             fileEncoding="utf-8"
          /> 
          I.requestEncoding: 它用来检查每一个发来请求的编码. 
          II.responseEncoding: 用于检查发回的响应内容编码.
          III.fileEncoding: 用于检查aspx,asax等文件解析的默认编码.   
      6.
          格式:
                      mode="InProc"
            stateConnectionString="tcpip=127.0.0.1:42424"
            sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
            cookieless="false"
            timeout="20"
          />
          I.mode: 分为off,Inproc,StateServer,SqlServer几种状态
                 这里有详细介绍此属性: http://blog.csdn.net/chengking/archive/2005/10/27/518079.aspx
          II. stateConnectionString :指定Asp.net应用程序存储远程会话状态的服务器名,默认为本机
          III.sqlConnectionString: 当用会话状态数据库时,在这里设置连接字符串
          IV. Cookieless: 设置为true时,表示不使用cookie会话状态来标识客户; 否则,相反.
          V.  TimeOut: 用来定义会话状态存储的时间,超过期限,将自动终止会话.
      7.
        格式:
                      
            
        

        
            
        

         I.Windows: 使用IIS验证方式
         II.Forms: 使用基于窗体的验证方式
         III.Passport: 采用Passport cookie验证模式
         IV.None: 不采用任何验证方式
         里面内嵌Forms节点的属性涵义:
         I.Name: 指定完成身份验证的Http cookie的名称.
         II.LoginUrl: 如果未通过验证或超时后重定向的页面URL,一般为登录页面,让用户重新登录
         III.Protection: 指定 cookie数据的保护方式.
            可设置为: All None Encryption Validation四种保护方式
            a. All表示加密数据,并进行有效性验证两种方式
            b. None表示不保护Cookie.
            c. Encryption表示对Cookie内容进行加密
            d. validation表示对Cookie内容进行有效性验证
         IV. TimeOut: 指定Cookie的失效时间.  超时后要重新登录.
添加评论 | 固定链接 | 引用通告 (0) | 写入日志 | 计算机与 Internet

C#中String编码转换

必须引用System.Text命名空间

将 gb2312 转换 big5 编码

代码如下:

  private void button1_Click(object sender, System.EventArgs e)
  {
   byte[] temp;
   //将 textBox1.Text 转换为 byte 数组
   temp = Encoding.Default.GetBytes(textBox1.Text);
   //利用 Encoding 类的 Convert 方法,将 temp 的编码由 gb2312 转换为 big5 编码
   temp = Encoding.Convert(Encoding.GetEncoding("gb2312"),Encoding.GetEncoding("big5"),temp);
   //将  byte 数组 转换为 string
   textBox2.Text = Encoding.Default.GetString(temp);
  }

转自:http://blog.csdn.net/ruixing123/archive/2005/04/08/339788.aspx

添加评论 | 固定链接 | 引用通告 (0) | 写入日志 | 计算机与 Internet

.Net应用程序安装部署

.NET平台下WEB应用程序的部署(安装数据库和自动配置) 李洪根      

    在.NET平台下,部署 Web 解决方案是比较方便的。我们可以利用Visual Studio.NET 2003添加一个WEB安装项目,在部署的“文件系统编辑器”中添加项目的主输出和内容文件,非常简易地完成安装程序的制作。

       但是,这样制作的安装程序,只是将Web页和ASP.NET程序编译的DLL文件安装到目标机器的IIS目录,对于一般的应用程序是可以的(比如用Access数据库,可以一起打包到安装程序中);如果数据库是SQL SERVER,需要在部署的时候一并安装数据库,安装程序的制作就会复杂一些,需要我们自定义安装程序类。在安装程序类中执行SQL脚本并将连接字符串写入Web.config

l         安装数据库

微软MSDN上介绍过在部署应用程序的时候建立数据库。如:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsintro7/html/vxwlkWalkthroughUsingCustomActionToCreateDatabaseDuringInstallation.asp 

这种方法是创建一个安装程序类,在安装程序类中调用ADO.NET执行SQL 语句(SQL语句放在一个文本文件中)来创建数据库。

 

但是,这种方法有一个问题,如果用SQL Server2000生成了所有建表、视图、存储过程的一个脚本文件,用ADO.NET来执行这个脚本文件,就会因为脚本中有许多“GO”语句而出现错误。当然,我们可以把“GO”替换成换行符,利用ADO.NET一条条执行SQL 语句。很显然,这样的效率比较低。

 

最好的办法是调用osql执行脚本。(或者创建一个数据库项目的cmd文件,而cmd文件建立数据库的时候也是调用的osql)。

 

首先,我们新建一个ASP.NET Web应用程序,http://localhost/VbNetTest,并打开VbNetTest 项目创建部署项目

1.         在“文件”菜单上指向“添加项目”,然后选择“新建项目”。 2.         在“添加新项目”对话框中,选择“项目类型”窗格中的“安装和部署项目”,然后选择“模板”窗格中的“Web 安装项目”。在“名称”框中键入 Test Installer。 3.         单击“确定”关闭对话框。 4.         项目被添加到解决方案资源管理器中,并且文件系统编辑器打开。 5.         在“属性”窗口中,选择 ProductName 属性,并键入 GCRM。   VbNetTest项目的输出添加到部署项目中 1.         在“文件系统编辑器”中,选择“Web 应用程序”文件夹。在“操作”菜单上,指向“添加”,然后选择“项目输出”。 2.         在“添加项目输出组”对话框中,选择“项目”下拉列表中的“VbNetTest”。 3.         单击“确定”关闭对话框。 4.         从列表中选择“主输出”和“内容文件”组,然后单击“确定”。  创建安装程序类 1.         在“文件”菜单上指向“新建”,然后选择“项目”。 2.         在“新建项目”对话框中,选择“项目类型”窗格中的“Visual Basic 项目”,然后选择“模板”窗格中的“类库”。在“名称”框中键入 DBCustomAction。 3.         单击“打开”关闭对话框。 4.         从“项目”菜单中选择“添加新项”。 5.         在“添加新项”对话框中选择“安装程序类”。在“名称”框中键入 DBCustomAction。 6.         单击“确定”关闭对话框。  创建自定义安装对话框 1.         在解决方案资源管理器中选择“Test Installer”项目。在“视图”菜单上指向“编辑器”,然后选择“用户界面”。 2.         在用户界面编辑器中,选择“安装”下的“启动”节点。在“操作”菜单上,选择“添加对话框”。 3.         在“添加对话框”对话框中,选择“许可协议”对话框,然后单击“确定”关闭对话框。 4.         在“添加对话框”对话框中,选择“文本框 (A)”对话框,然后单击“确定”关闭对话框。 5.         在“操作”菜单上,选择“上移”。重复此步骤,直到“文本框 (A)”对话框位于“安装文件夹”节点之上。 6.         在“属性”窗口中,选择 BannerText 属性并键入:安装数据库.。 7.         选择 BodyText 属性并键入:安装程序将在目标机器上安装数据库。 8.         选择 Edit1Label 属性并键入:数据库名称:。 9.         选择 Edit1Property 属性并键入 CUSTOMTEXTA1。 10.        选择 Edit1Value 属性并键入:GsCrm。 11.        选择 Edit2Label 属性并键入:服务器名:。 12.        选择 Edit2Property 属性并键入 CUSTOMTEXTA2。 13.        选择 Edit2Value 属性并键入:(local)。 14.        选择 Edit3Label 属性并键入:用户名:。 15.        选择 Edit3Value 属性并键入:sa。 16.        选择 Edit3Property 属性并键入 CUSTOMTEXTA3。 17.        选择 Edit4Label 属性并键入:密码:。 18.        选择 Edit4Property 属性并键入 CUSTOMTEXTA4。 19.        选择 Edit2Visible、Edit3Visible 和 Edit4Visible 属性,并将它们设置为 False。 创建自定义操作 1.         在解决方案资源管理器中选择“Test Installer”项目。在“视图”菜单上指向“编辑器”,然后选择“自定义操作”。 2.         在自定义操作编辑器中选择“安装”节点。在“操作”菜单上,选择“添加自定义操作”。 3.         在“选择项目中的项”对话框中,双击“应用程序文件夹”。 4.         选择“主输出来自 DBCustomAction(活动)”项,然后单击“确定”关闭对话框。 5.         在“属性”窗口中,选择 CustomActionData 属性并键入 /dbname=[CUSTOMTEXTA1] /server=[CUSTOMTEXTA2] /user=[CUSTOMTEXTA3] /pwd=[CUSTOMTEXTA4] /targetdir="[TARGETDIR]\"。  附/targetdir="[TARGETDIR]\"是安装后的目标路径,为了在DBCustomAction类中获得安装后的路径,我们设置此参数。另外,安装后的路径也可以通过Reflection得到:        Dim Asm As System.Reflection.Assembly = _        System.Reflection.Assembly.GetExecutingAssembly        MsgBox("Asm.Location")添加文件 1.         将SQL Server生成的脚本文件DB.sql添加到“Test Installer”项目2.         将安装文件LisenceFile.rtf添加到“Test Installer”项目3.         在用户界面编辑器中,选择许可协议,设置LisenceFile属性为LisenceFile.rtf文件 工程中的文件 :将代码添加到安装程序类中,DBCustomAction.vb类

Imports System.ComponentModel

Imports System.Configuration.Install

Imports System.IO

Imports System.Reflection

 

True)> Public Class DBCustomAction

    Inherits System.Configuration.Install.Installer

 

#Region "组件设计器生成的代码 "

    Public Sub New()

        MyBase.New()

        '该调用是组件设计器所必需的

        InitializeComponent()

        '在 InitializeComponent() 调用之后添加任何初始化

    End Sub

    ' Installer 重写 dispose 以清理组件列表。

    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

        If disposing Then

            If Not (components Is Nothing) Then

                components.Dispose()

            End If

        End If

        MyBase.Dispose(disposing)

    End Sub

    Private components As System.ComponentModel.IContainer

    Private Sub InitializeComponent()

    End Sub

#End Region

    '执行SQL 语句

    Private Sub ExecuteSql(ByVal conn As String, ByVal DatabaseName As String, ByVal Sql As String)

        Dim mySqlConnection As New SqlClient.SqlConnection(conn)

        Dim Command As New SqlClient.SqlCommand(Sql, mySqlConnection)

        Command.Connection.Open()

        Command.Connection.ChangeDatabase(DatabaseName)

        Try

            Command.ExecuteNonQuery()

        Finally

            'Close Connection

            Command.Connection.Close()

        End Try

    End Sub    Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)

        MyBase.Install(stateSaver)

        ' ------------------------建立数据库-------------------------------------------------

        Try

            Dim connStr As String = String.Format("data source={0};user security info=false;packet size=4096", Me.Context.Parameters.Item("server"), Me.Context.Parameters.Item("user"), Me.Context.Parameters.Item("pwd"))

            '根据输入的数据库名称建立数据库

            ExecuteSql(connStr, "master", "CREATE DATABASE " + Me.Context.Parameters.Item("dbname"))

            '调用osql执行脚本

            Dim sqlProcess As New System.Diagnostics.Process

            sqlProcess.StartInfo.FileName = "osql.exe "

            sqlProcess.StartInfo.Arguments = String.Format(" -U {0} -P {1} -d {2} -i {3}db.sql", Me.Context.Parameters.Item("user"), Me.Context.Parameters.Item("pwd"), Me.Context.Parameters.Item("dbname"), Me.Context.Parameters.Item("targetdir"))

            sqlProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

            sqlProcess.Start()

            sqlProcess.WaitForExit()  '等待执行

            sqlProcess.Close()

            '删除脚本文件

            Dim sqlFileInfo As New System.IO.FileInfo(String.Format("{0}db.sql", Me.Context.Parameters.Item("targetdir")))

            If sqlFileInfo.Exists Then

                sqlFileInfo.Delete()

            End If

        Catch ex As Exception

            Throw ex

        End Try

 

        ' ---------------------将连接字符串写入Web.config-----------------------------------

        Try

            Dim FileInfo As System.IO.FileInfo = New System.IO.FileInfo(Me.Context.Parameters.Item("targetdir") & "\web.config")

            If Not FileInfo.Exists Then

                Throw New InstallException("没有找到配置文件")

            End If

            '实例化XML文档

            Dim XmlDocument As New System.Xml.XmlDocument

            XmlDocument.Load(FileInfo.FullName)

 

            '查找到appSettings中的节点

            Dim Node As System.Xml.XmlNode

            Dim FoundIt As Boolean = False

            For Each Node In XmlDocument.Item("configuration").Item("appSettings")

                If Node.Name = "add" Then

                    If Node.Attributes.GetNamedItem("key").Value = "connString" Then

                        '写入连接字符串

                        Node.Attributes.GetNamedItem("value").Value = String.Format("Persist Security Info=False;Data Source={0};Initial Catalog={1};User Size=4096;Pooling=true;Max Pool Size=100;Min Pool Size=1", _

                        Me.Context.Parameters.Item("server"), Me.Context.Parameters.Item("dbname"), Me.Context.Parameters.Item("user"), Me.Context.Parameters.Item("pwd"))

                        FoundIt = True

                    End If

                End If

            Next Node

            If Not FoundIt Then

                Throw New InstallException("web.Config 文件没有包含connString连接字符串设置")

            End If

            XmlDocument.Save(FileInfo.FullName)

        Catch ex As Exception

            Throw ex

        End Try

    End Sub

End Class最后编译生成!

 安装界面: 添加评论 | 固定链接 | 引用通告 (0) | 写入日志 | 计算机与 Internet

在B/S开发中常用的javaScript技术

一、验证类
1、数字验证内
  1.1 整数
  1.2 大于0的整数 (用于传来的ID的验证)
  1.3 负整数的验证
  1.4 整数不能大于iMax
  1.5 整数不能小于iMin
2、时间类
  2.1 短时间,形如 (13:04:06)
  2.2 短日期,形如 (2003-12-05)
  2.3 长时间,形如 (2003-12-05 13:04:06)
  2.4 只有年和月。形如(2003-05,或者2003-5)
  2.5 只有小时和分钟,形如(12:03)
3、表单类
  3.1 所有的表单的值都不能为空
  3.2 多行文本框的值不能为空。
  3.3 多行文本框的值不能超过sMaxStrleng
  3.4 多行文本框的值不能少于sMixStrleng
  3.5 判断单选框是否选择。
  3.6 判断复选框是否选择.
  3.7 复选框的全选,多选,全不选,反选
  3.8 文件上传过程中判断文件类型
4、字符类
  4.1 判断字符全部由a-Z或者是A-Z的字字母组成
  4.2 判断字符由字母和数字组成。
  4.3 判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母
  4.4 字符串替换函数.Replace();
5、浏览器类
  5.1 判断浏览器的类型
  5.2 判断ie的版本
  5.3 判断客户端的分辨率
  
6、结合类
  6.1 email的判断。
  6.2 手机号码的验证
  6.3 身份证的验证
   二、功能类 1、时间与相关控件类
  1.1 日历
  1.2 时间控件
  1.3 万年历
  1.4 显示动态显示时钟效果(文本,如OA中时间)
  1.5 显示动态显示时钟效果 (图像,像手表) 
2、表单类
  2.1 自动生成表单
  2.2 动态添加,修改,删除下拉框中的元素
  2.3 可以输入内容的下拉框
  2.4 多行文本框中只能输入iMax文字。如果多输入了,自动减少到iMax个文字(多用于短信发送)
  
3、打印类
  3.1 打印控件
4、事件类
  4.1 屏蔽右键
  4.2 屏蔽所有功能键
  4.3 --> 和<-- F5 F11,F9,F1
  4.4 屏蔽组合键ctrl+N
5、网页设计类
  5.1 连续滚动的文字,图片(注意是连续的,两段文字和图片中没有空白出现)
  5.2 html编辑控件类
  5.3 颜色选取框控件
  5.4 下拉菜单
  5.5 两层或多层次的下拉菜单
  5.6 仿IE菜单的按钮。(效果如rongshuxa.com的导航栏目)
  5.7 状态栏,title栏的动态效果(例子很多,可以研究一下)
  5.8 双击后,网页自动滚屏
6、树型结构。
  6.1 asp+SQL版
  6.2 asp+xml+sql版
  6.3 java+sql或者java+sql+xml
7、无边框效果的制作
8、连动下拉框技术
9、文本排序
一、验证类
1、数字验证内
  1.1 整数
      /^(-|\+)?\d+$/.test(str)
  1.2 大于0的整数 (用于传来的ID的验证)
      /^\d+$/.test(str)
  1.3 负整数的验证
      /^-\d+$/.test(str)
2、时间类
  2.1 短时间,形如 (13:04:06)
      function isTime(str)
      {
        var a = str.match(/^(\d{1,2})(:)?(\d{1,2})\2(\d{1,2})$/);
        if (a == null) {alert('输入的参数不是时间格式'); return false;}
        if (a[1]>24 || a[3]>60 || a[4]>60)
        {
          alert("时间格式不对");
          return false
        }
        return true;
      }
  2.2 短日期,形如 (2003-12-05)
      function strDateTime(str)
      {
         var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/); 
         if(r==null)return false; 
         var d= new Date(r[1], r[3]-1, r[4]); 
         return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]);
      }
  2.3 长时间,形如 (2003-12-05 13:04:06)
      function strDateTime(str)
      {
        var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/; 
        var r = str.match(reg); 
        if(r==null)return false; 
        var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]); 
        return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]&&d.getHours()==r[5]&&d.getMinutes()==r[6]&&d.getSeconds()==r[7]);
      }
  2.4 只有年和月。形如(2003-05,或者2003-5)
  2.5 只有小时和分钟,形如(12:03)
3、表单类
  3.1 所有的表单的值都不能为空
     
  3.2 多行文本框的值不能为空。
  3.3 多行文本框的值不能超过sMaxStrleng
  3.4 多行文本框的值不能少于sMixStrleng
  3.5 判断单选框是否选择。
  3.6 判断复选框是否选择.
  3.7 复选框的全选,多选,全不选,反选
  3.8 文件上传过程中判断文件类型
4、字符类
  4.1 判断字符全部由a-Z或者是A-Z的字字母组成
     
  4.2 判断字符由字母和数字组成。
     
  4.3 判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母
      /^([a-zA-z_]{1})([\w]*)$/g.test(str)
  4.4 字符串替换函数.Replace();
5、浏览器类
  5.1 判断浏览器的类型
      window.navigat or.appName
  5.2 判断ie的版本
      window.navigat or.appVersion
  5.3 判断客户端的分辨率
      window.screen.height;  window.screen.width;
  
6、结合类
  6.1 email的判断。
      function ismail(mail)
      {
        return(new RegExp(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(mail));
      }
  6.2 手机号码的验证
  6.3 身份证的验证
      function isIdCardNo(num)
      {
        if (isNaN(num)) {alert("输入的不是数字!"); return false;}
        var len = num.length, re; 
        if (len == 15)
          re = new RegExp(/^(\d{6})()?(\d{2})(\d{2})(\d{2})(\d{3})$/);
        else if (len == 18)
          re = new RegExp(/^(\d{6})()?(\d{4})(\d{2})(\d{2})(\d{3})(\d)$/);
        else {alert("输入的数字位数不对!"); return false;}
        var a = num.match(re);
        if (a != null)
        {
          if (len==15)
          {
            var D = new Date("19"+a[3]+"/"+a[4]+"/"+a[5]);
            var B = D.getYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
          }
          else
          {
            var D = new Date(a[3]+"/"+a[4]+"/"+a[5]);
            var B = D.getFullYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
          }
          if (!B) {alert("输入的身份证号 "+ a[0] +" 里出生日期不对!"); return false;}
        }
        return true;
      } 3.7 复选框的全选,多选,全不选,反选
全选












全选










3.8 文件上传过程中判断文件类型
画图:
id=S 
style="LEFT: 0px; WIDTH: 392px; TOP: 0px; HEIGHT: 240px" 
height=240 
width=392 
classid="clsid:369303C2-D7AC-11D0-89D5-00A0C90833E6">

写注册表:
TABLAE相关(客户端动态增加行列)







    
    
    


  1.身份证严格验证: 2.验证IP地址
  3.加sp1后还能用的无边框窗口!!



Chromeless Window
电话号码的验证 要求:
  (1)电话号码由数字、"("、")"和"-"构成
  (2)电话号码为3到8位
  (3)如果电话号码中包含有区号,那么区号为三位或四位
  (4)区号用"("、")"或"-"和其他部分隔开
  (5)移动电话号码为11或12位,如果为12位,那么第一位为0
  (6)11位移动电话号码的第一位和第二位为"13"
  (7)12位移动电话号码的第二位和第三位为"13"
  根据这几条规则,可以与出以下正则表达式:
  (^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)


具有在输入非数字字符不回显的效果,即对非数字字符的输入不作反应。
function numbersonly(field,event){
 var key,keychar;
 if(window.event){
  key = window.event.keyCode;
 }
 else if (event){
  key = event.which;
 }
 else{
  return true
 }
 keychar = String.fromCharCode(key);
 if((key == null)||(key == 0)||(key == 8)||(key == 9)||(key == 13)||(key == 27)){
  return true;
 }
 else if(("0123456789.").indexOf(keychar)>-1){
  window.status = "";
  return true;
 }
 else {
  window.status = "Field excepts numbers only";
  return false;
 }
} 验证ip  str=document.RegExpDemo.txtIP.value;
if(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.test(str)==false)
{
 window.alert('错误的IP地址格式');
 document.RegExpDemo.txtIP.select();
 document.RegExpDemo.txtIP.focus();
 return;
}
if(RegExp.$1<1 || RegExp.$1>254||RegExp.$2<0||RegExp.$2>254||RegExp.$3<0||RegExp.$3>254||RegExp.$4<1||RegExp.$4>254)
{
 window.alert('错误的IP地址');
 document.RegExpDemo.txtIP.select();
 document.RegExpDemo.txtIP.focus();
 return;
}
//剔除 如  010.020.020.03 前面 的0 
var str=str.replace(/0(\d)/g,"$1");
str=str.replace(/0(\d)/g,"$1");
window.alert(str);
//一下是取数据的类
//Obj参数指定数据的来源(限定Table),默认第一行为字段名称行
//GetTableData类提供MoveNext方法,参数是表的行向上或向下移动的位数,正数向下移动,负数向上.
//GetFieldData方法获得指定的列名的数据
//S ort_desc方法对指定的列按降序排列
//S ort_asc方法对指定的列按升序排列
//GetData方法返回字段值为特定值的数据数组,提供数据,可以在外部进行其他处理
//Delete方法删除当前记录,数组减少一行
//初始化,Obj:table的名字,Leftlen:左面多余数据长度,Rightlen:右面多余数据长度,
function GetTableData(Obj,LeftLen,RightLen){
var MyObj=document.all(Obj);
var iRow=MyObj.rows.length;
var iLen=MyObj.rows[0].cells.length;
var i,j; TableData=new Array();
  f or (i=0;i< iRow;i++){
   TableData[i]=new Array();
   f or (j=0;j   TableStr=MyObj.rows(i).cells(j).innerText;
   TableStr=TableStr.substring(LeftLen, TableStr.length-RightLen).Trim();
   TableStr=TableStr.replace(/ /gi,"").replace(/\r\n/ig,"");
   TableData[i][j]=TableStr;
   }
   }
  
  this.TableData=TableData; 
  this.cols=this.TableData[0].length;
  this.rows=this.TableData.length;
  this.rowindex=0;
}
function movenext(Step){
if (this.rowindex>=this.rows){
return
} if (Step=="" || typeof(Step)=="undefined") {
 if (this.rowindex this.rowindex++;
 return; }
 else{
  if (this.rowindex + Step<=this.rows-1 && this.rowindex + Step>=0 ){
  this.rowindex=this.rowindex + Step;
  }
  else
  {
  if (this.rowindex + Step<0){
   this.rowindex= 0;
   return;
   }
  if (this.rowindex + Step>this.rows-1){
   this.rowindex= this.rows-1;
   return;
   }
  }
 }
}
function getfielddata(Field){
var colindex=-1;
var i=0;
 if (typeof(Field) == "number"){
   colindex=Field;
  }
 else
 {
 f or (i=0;i   if (this.TableData[0][i]==Field){
   colindex=i;
   break;
   }  
  }
 }
  if (colindex!=-1) {
  return this.TableData[this.rowindex][colindex];
  } }   function s ort_desc(){//降序
 var colindex=-1;
 var highindex=-1;
 desc_array=new Array();
 var i,j;
f or (n=0; n Field=arguments[arguments.length-1-n];
 f or (i=0;i  if (this.TableData[0][i]==Field){
  colindex=i;
  break;
  }  
 }
   if ( colindex==-1 )
  return;
   else
  {
  desc_array[0]=this.TableData[0];
  f or(i=1;i  desc_array[i]=this.TableData[1];
  highindex=1;
   f or(j=1;j      if  (desc_array[i][colindex]      desc_array[i]=this.TableData[j];   
      highindex=j;
    }
    
   }
     if (highindex!=-1)
     this.TableData=this.TableData.slice(0,highindex).concat(this.TableData.slice(highindex+1,this.TableData.length));                      
  }
 }  
 this.TableData=desc_array;
}
 return;
}   function s ort_asc(){//升序
 var colindex=-1;
 var highindex=-1;
 var i,j;
f or (n=0; n   asc_array=new Array();
   Field=arguments[arguments.length-1-n];
   f or (i=0;i    if (this.TableData[0][i]==Field){
    colindex=i;
    break;
    }  
   }
   if ( colindex==-1 )
     return;
   else
     {
     asc_array[0]=this.TableData[0];
     f or(i=1;i     asc_array[i]=this.TableData[1];
     highindex=1;
      f or(j=1;j         if  (asc_array[i][colindex]>this.TableData[j][colindex]){ 
         asc_array[i]=this.TableData[j];   
         highindex=j;
          
        }
          
       }
         if (highindex!=-1)
         this.TableData=this.TableData.slice(0,highindex).concat(this.TableData.slice(highindex+1,this.TableData.length));                      
         
      }
     }  
    this.TableData=asc_array;
 }
 return;
}   function getData(Field,FieldValue){
var colindex=-1;
var i,j; GetData=new Array();
  if (typeof(Field)=="undefined" || typeof(FieldValue)=="undefined" ){
  return this.TableData;
  }
  
   f or(j=0;j      if  (this.TableData[0][j]==Field){
     colindex=j;
     }
   }
   if (colindex!=-1){
   
   f or(i=1;i      if  (this.TableData[i][colindex]==FieldValue){
     GetData[i]=new Array();
     GetData[i]=this.TableData[i]; 
     }
   }
   }
   return GetData;
}
function DeletE(){
this.TableData=this.TableData.slice(0,this.rowindex).concat(this.TableData.slice(this.rowindex+1,this.TableData.length));                      
this.rows=this.TableData.length;
return;
}
function updateField(Field,FieldValue){
var colindex=-1;
var i=0;
 if (typeof(Field) == "number"){
   colindex=Field;
  }
 else
 {
 f or (i=0;i   if (this.TableData[0][i]==Field){
   colindex=i;
   break;
   }  
  }
 }
 if (colindex!=-1) {
  this.TableData[this.rowindex][colindex]=FieldValue;
  }
}
function movefirst(){
this.rowindex=0;
}
function movelast(){
this.rowindex=this.rows-1;
}
function String.prototype.Trim() {return this.replace(/(^\s*)|(\s*$)/g,"");}
GetTableData.prototype.MoveNext = movenext;
GetTableData.prototype.GetFieldData = getfielddata;
GetTableData.prototype.S ort_asc = s ort_asc;
GetTableData.prototype.S ort_desc = s ort_desc;
GetTableData.prototype.GetData = getData;
GetTableData.prototype.Delete = DeletE;
GetTableData.prototype.UpdateField = updateField;
GetTableData.prototype.MoveFirst = movefirst; 具体的例子:http://202.119.73.208/NetEAn/com/test/jsprint.htm 在每个文本框的onblur事件中调用校验代码,并且每个文本框中onKeyDown事件中写一个enter转tab函数 //回车键换为tab
function enterToTab()
{
    if(event.srcElement.type != 'button' && event.srcElement.type != 'textarea'
       && event.keyCode == 13)
    {
        event.keyCode = 9;
    }
} 有时候还需要自由编辑表格---
给大家一个自由编辑表格的小例子,写的有点乱,呵呵:) //===============================start================================



测试修改表格




    editer_table','no_editer')">  
   
    
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
   
   
 
  
自由编辑表格
单击开始编辑按钮,然后点击各单元格编辑 2 3
4 5 6
one two three
four five six

  
 


请单击某个单元格进行编辑!
 

添加评论 | 固定链接 | 引用通告 (0) | 写入日志 | 计算机与 Internet

showModalDialog和showModelessDialog使用心得

 
一、showModalDialog和showModelessDialog有什么不同?
  showModalDialog:被打开后就会始终保持输入焦点。除非对话框被关闭,否则用户无法切换到主窗口。类似alert的运行效果。
  showModelessDialog:被打开后,用户可以随机切换输入焦点。对主窗口没有任何影响(最多是被挡住一下而以。:P)

二、怎样才让在showModalDialog和showModelessDialog的超连接不弹出新窗口?
  在被打开的网页里加上就可以了。这句话一般是放在和之间的。

三、怎样才刷新showModalDialog和showModelessDialog里的内容?
  在showModalDialog和showModelessDialog里是不能按F5刷新的,又不能弹出菜单。这个只能依靠javascript了,以下是相关代码:


reload...

  将filename.htm替换成网页的名字然后将它放到你打开的网页里,按F5就可以刷新了,注意,这个要配合使用,不然你按下F5会弹出新窗口的。

四、如何用javascript关掉showModalDialog(或showModelessDialog)打开的窗口。
  
  也要配合,不然会打开一个新的IE窗口,然后再关掉的。

五、showModalDialog和showModelessDialog数据传递技巧。
  (作者语:本来想用一问一答形式来写的,但是我想不出这个怎么问,所以只好这样了。)
  这个东西比较麻烦,我改了好几次了不是没办法说明白(语文水平越来越差了),只好用个例子说明了。
  例子:
    现在需要在一个showModalDialog(或showModelessDialog)里读取或设置一个变量var_name

      一般的传递方式:
        window.showModalDialog("filename.htm",var_name)
        //传递var_name变量
      在showModalDialog(或showModelessDialog)读取和设置时:
        alert(window.dialogArguments)//读取var_name变量
        window.dialogArguments="oyiboy"//设置var_name变量
    这种方式是可以满足的,但是当你想在操作var_name同时再操作第二个变理var_id时呢?就无法再进行操作了。这就是这种传递方式的局限性。
    
      以下是我建议使用的传递方式:
        window.showModalDialog("filename.htm",window)
        //不管要操作什么变量,只直传递主窗口的window对象
      在showModalDialog(或showModelessDialog)读取和设置时:
        alert(window.dialogArguments.var_name)//读取var_name变量
        window.dialogArguments.var_name="oyiboy"//设置var_name变量

        同时我也可以操作var_id变量
        alert(window.dialogArguments.var_id)//读取var_id变量
        window.dialogArguments.var_id="001"//设置var_id变量

        同样还可以对主窗口的任何对象进行操作,如form对象里的元素。
        window.dialogArguments.form1.index1.value="这是在设置index1元素的值"

六、多个showModelessDialog的相互操作。
  因为光说很费劲,我就偷点懒,直接用代码来说了,如果不明白的话那就直接来信(oyiboy#163.net(使用时请将#改成@))问我吧。

  以下代码的主要作用是在一个showModelessDialog里移动别一个showModelessDialog的位置。

  主文件的部份js代码。
  var s1=showModelessDialog('控制.htm',window,"dialogTop:1px;dialogLeft:1px") //打开控制窗口
  var s2=showModelessDialog('about:blank',window,"dialogTop:200px;dialogLeft:300px")  //打开被控制窗口

  控制.htm的部份代码。
  
  
  
  
  

  以上关键部份是:
    窗口命名方式:var s1=showModelessDialog('控制.htm',window,"dialogTop:1px;dialogLeft:1px")
    变量访问方式:window.dialogArguments.s2.dialogTop

  这个例子只是现实showModelessDialog与showModelessDialog之间的位置操作功能,通过这个原理,在showModelessDialog之间相互控制各自的显示页面,传递变量和数据等。这要看各位的发挥了.

添加评论 | 阅读评论 (1) | 固定链接 | 引用通告 (0) | 写入日志 | 计算机与 Internet

showModelessDialog()使用详解

Javascript有许多内建的方法来产生对话框,如:window.alert(), window.confirm(),window.prompt().等。 然而IE提供更多的方法支持对话框。如:

    showModalDialog() (IE 4+ 支持)
   showModelessDialog() (IE 5+ 支持)

    window.showModalDialog()方法用来创建一个显示HTML内容的模态对话框,由于是对话框,因此它并没有一般用window.open()打开的窗口的所有属性。

    window.showModelessDialog()方法用来创建一个显示HTML内容的非模态对话框。

    当我们用showModelessDialog()打开窗口时,不必用window.close()去关闭它,当以非模态方式[IE5]打开时, 打开对话框的窗口仍可以进行其他的操作,即对话框不总是最上面的焦点,当打开它的窗口URL改变时,它自动关闭。而模态[IE4]方式的对话框始终有焦点(焦点不可移走,直到它关闭)。模态对话框和打开它的窗口相联系,因此我们打开另外的窗口时,他们的链接关系依然保存,并且隐藏在活动窗口的下面。

使用方法如下:
    vReturnValue = window.showModalDialog(sURL [, vArguments] [, sFeatures])
    vReturnValue = window.showModelessDialog(sURL [, vArguments] [, sFeatures])

如:window.showModelessDialog('2.htm','','scroll:1;status:1;help:1;toolbar=1;resizable:1;dialogWidth:0px;dialogHeight:0px')

参数说明:
    sURL
   必选参数,类型:字符串。用来指定对话框要显示的文档的URL。
    vArguments
   可选参数,类型:变体。用来向对话框传递参数。传递的参数类型不限,包括数组等。对话框通过window.dialogArguments来取得传递进来的参数。
    sFeatures
   可选参数,类型:字符串。用来描述对话框的外观等信息,可以使用以下的一个或几个,用分号“;”隔开。
    dialogHeight 对话框高度,不小于100px,IE4中dialogHeight 和 dialogWidth 默认的单位是em,而IE5中是px,为方便其见,在定义modal方式的对话框时,用px做单位。
   dialogWidth: 对话框宽度。
   dialogLeft: 距离桌面左的距离。
   dialogTop: 离桌面上的距离。
   center: {yes | no | 1 | 0 }:窗口是否居中,默认yes,但仍可以指定高度和宽度。
   help: {yes | no | 1 | 0 }:是否显示帮助按钮,默认yes。
   resizable: {yes | no | 1 | 0 } [IE5+]:是否可被改变大小。默认no。
   status: {yes | no | 1 | 0 } [IE5+]:是否显示状态栏。默认为yes[ Modeless]或no[Modal]。
    scroll:{ yes | no | 1 | 0 | on | off }:指明对话框是否显示滚动条。默认为yes。

还有几个属性是用在HTA中的,在一般的网页中一般不使用。
    dialogHide:{ yes | no | 1 | 0 | on | off }:在打印或者打印预览时对话框是否隐藏。默认为no。
    edge:{ sunken | raised }:指明对话框的边框样式。默认为raised。
    unadorned:{ yes | no | 1 | 0 | on | off }:默认为no。

传入参数:
    要想对话框传递参数,是通过vArguments来进行传递的。类型不限制,对于字符串类型,最大为4096个字符。也可以传递对象,例如:

test1.htm
test2.htm
 
test3.htm

 可以通过window.returnValue向打开对话框的窗口返回信息,当然也可以是对象。例如:

test4.htm
test5.htm
 
 
 


  
 

常见问题:
1,如何在模态对话框中进行提交而不新开窗口?
   如果你 的 浏览器是IE5.5+,可以在对话框中使用带name属性的iframe,提交时可以制定target为该iframe的name。对于IE4+,你可以用高度为0的frame来作。例如:

 test6.htm
 test7.htm
if(window.location.search) alert(window.location.search)
 
  
  
  test8.htm


 
 
 
 
 

2,可以通过http://servername/virtualdirname/test.htm?name=mxh方式直接向对话框传递参数吗?
 答案是不能。但在frame里是可以的。

添加评论 | 固定链接 | 引用通告 (0) | 写入日志 | 计算机与 Internet

听一曲天簌之音,让劳累一天后浮躁的心平静下来

夜莺,出自雅尼在紫禁城专辑,浓郁的中国风格,淡淡的忧伤。“我创作音乐的目的是可以和人能有感情的沟通。我摄取我的人生经历并把他们翻译成音乐,我希望我的音乐可以给听众一种心灵的冲击。”

喜欢在夜里静静地听那首《夜莺》。黑夜那特有的静谧流淌于空气中,你仿佛置身于广阔的草原中。蓝的天,白的云,绿得逼人眼的草。你可以躺在地上,听那从遥远的天际传来的夜莺的歌唱。它是清脆明朗的,像母亲的细语振荡着你的耳膜,温暖着你的心房。世俗带给你的躁动与不安,在夜莺的歌声中慢慢离去,那些所谓的不快,所谓的愤愤不平,都不再重要。此刻,你什么也不会想,也懒得去想,只想躲在雅尼为你营造的氛围里不出来。

西洋萧吹出的声音应该是忧郁而悲凉的,但《夜莺》整首曲子的节奏却是明朗的,现代的电子乐冲淡了悲凉的气氛。在雅尼的音乐里,你可以找到古典与时尚最完美的结合,自然、娴熟,没有一丝一毫做作的痕迹。《夜莺》的前半段是平和安静的,那是一种可以让你忘记所有忧伤的音乐。当你还沉浸在一个安静的世界里的时候,音乐却渐渐升高,重金属乐器敲击着你敏感的神经,让刚才的平静一扫而光,变得激昂奋进。激昂奋进的部分是《夜莺》中最美的,它激励着所有听过这首曲子的人做人生路上的“追梦鼓手”。终了,音乐又在平缓中结束。

没有歌词的音乐是最打动人的,因为那是只有用听觉、用心才能体会到的东西。