2010年7月15日

转载winform实现单进程

原文地址:https://bbs.et8.net/bbs/archive/index.php/t-399247.html

 

ex:
if(SingleInstance.SingleApplication.Run("Fish"))
System.Windows.Forms.Application.Run(
new fish.Forms());
}

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Text;
using System.Diagnostics;

namespace SingleInstance
{
/// <summary>
/// Summary description for SingleApp.
/// </summary>
public class SingleApplication
{
private SingleApplication()
{

}
/// <summary>
/// Imports 
/// </summary>

[DllImport(
"user32.Dll")]
private static extern int EnumWindows(EnumWinCallBack callBackFunc, int lParam); 

[DllImport(
"User32.Dll")]
private static extern void GetWindowText(int hWnd, StringBuilder str, int nMaxCount);

[DllImport(
"user32.dll",EntryPoint="SetForegroundWindow")]
private static extern bool SetForegroundWindow(IntPtr hWnd);

[DllImport(
"user32.dll")]
private static extern Boolean ShowWindow(IntPtr hWnd,Int32 nCmdShow);

/// <summary>
/// EnumWindowCallBack
/// </summary>
/// <param name="hwnd"></param>
/// <param name="lParam"></param>
/// <returns></returns>
private static bool EnumWindowCallBack(int hwnd, int lParam) 

windowHandle 
= (IntPtr)hwnd;

StringBuilder sbuilder 
= new StringBuilder(256);
GetWindowText((
int)windowHandle, sbuilder, sbuilder.Capacity);
string strTitle = sbuilder.ToString();

if(strTitle == sTitle)
{
ShowWindow(windowHandle, SW_RESTORE); 
SetForegroundWindow(windowHandle);
return false;
}
return true;
}
//EnumWindowCallBack

/// <summary>
/// Execute a form base application if another instance already running on
/// the system activate previous one
/// </summary>
/// <param name="frmMain">main form</param>
/// <returns>true if no previous instance is running</returns>
public static bool Run(System.Windows.Forms.Form frmMain)
{
sTitle 
= frmMain.Text;

if( EnumWindows (new EnumWinCallBack(EnumWindowCallBack), 0== 0)
{
return false;
}
Application.Run(frmMain);
return true;
}

public static bool Run(string frmText)
{
sTitle 
= frmText;

if( EnumWindows (new EnumWinCallBack(EnumWindowCallBack), 0== 0)
{
return false;
}
return true;
}

/// <summary>
/// 
/// </summary>
/// <returns></returns>
public static bool Run()
{
Process pr 
= Process.GetCurrentProcess();
string strProcessName = pr.ProcessName;
if(System.Diagnostics.Process.GetProcessesByName(strProcessName).Length > 1
{
return false;
}
return true;
}

const int SW_RESTORE = 9;
static string sTitle;
static IntPtr windowHandle;
delegate bool EnumWinCallBack(int hwnd, int lParam);
}
}

 

 

posted @ 2010-07-15 10:39 阅读(152) 评论(0) 编辑

2010年7月12日

使用Cookies保存网站历史浏览记录实例

摘要: 代码Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-t...阅读全文

posted @ 2010-07-12 21:27 阅读(234) 评论(0) 编辑

OLEDB方式读取Excel丢失数据的原因和解决方法

OLEDB方式读取Excel丢失数据的原因我到网上找到的解决方法

以下为互联网原文 原文地址:http://www.douban.com/note/18510346/

 

正文

1 引言
  在应用程序的设计中,经常需要读取Excel数据或将Excel数据导入转换到其他数据载体中,例如将Excel数据通过应用程序导入SQL Sever等数据库中以备使用。笔者在开发“汽车产业链ASP协同商务平台”中遇到了类似需求。某汽车整车生产企业需要将其车辆发车信息发布到汽车产业链平台上去,其数据为内部ERP系统生成的Excel数据表,用户首先将该数据表上传至汽车产业链平台,平台将此Excel数据读取导入到平台内部的SQL Sever数据库中,以供其它应用使用。汽车产业链平台的开发使用的开发工具为VS.NET,使用的语言是C#,在开发的过程中发现使用Microsoft.Jet.OLEDB.4.0读取数据会出现当某一字段内分别含有文本和数字的混合数据时,某一类型的数据会产生丢失。本文就对此问题产生的根源进行了分析并给出了相应的解决方法。
  
  2 问题描述
  Excel是Microsoft公司的电子表格处理软件,在现代办公及企业信息化的应用中使用非常广泛,正因如此,在程序设计中我们经常要通过访问Excel文件来获得数据,但Excel文件不是标准数据库[1]。
  ASP.NET也是Microsoft公司的产品,作为.NET FrameWork框架中的一个重要组成部分,其主要用于Web设计。我们在.NET中访问读取Excel数据时一般采用Microsoft.Jet.OLEDB.4.0[2]。现以读取一个Excel文件auto.xls中sheet1工作表为例,工作表的内容如表1所示。
  表1 sheet1表的数据内容
  现将该表的数据内容读取并显示到到DataGrid中,简化的代码如下:
  String ConnStr = " Provider = Microsoft.Jet.OLEDB.4.0; DataSource=c:/auto.xls;Extended Properties='Excel 8.0;HDR=YES';";
  OleDbConnection Conn=new OleDbConnection(ConnStr);
  Conn.Open();
  string SQL="select * from [sheet1$]";
  OleDbDataAdapter da=new OleDbDataAdapter(SQL,ConnStr);
  DataSet ds=new DataSet();
  da.Fill(ds);
  DataGrid1.DataSource=ds;
  DataGrid1.DataBind();
  Conn.Close();
  但是运行以上代码的结果并不是期望的,它将显示为表2所示的内容。可以发现第一个字段中为“1042”的两个数据项变为空。
  表2 DataGrid1所显示的数据内容
  有程序设计人员将以上代码OleDbConnection连接字符串中的Extended Properties一项作了如下改动,Extended Properties='Excel 8.0;HDR=NO;IMEX=1’,认为可以解决此问题。由于在开发“汽车产业链协同商务平台”中碰到过类似问题,作了大量的测试后发现,添加IMEX=1后并未实质上解决此问题。表现为:如果某字段前8条记录中全部为纯数字的话,那么在该字段随后的记录中含有字母或汉字的项将仍然变为空,但是如果该字段前8条记录中有一条不为纯数字,将能得到预期想要的结果。
  
  3 问题分析
  产生这种问题的根源与Excel ISAM[3](Indexed Sequential Access Method,即索引顺序存取方法)驱动程序的限制有关,Excel ISAM 驱动程序通过检查前几行中实际值确定一个 Excel 列的类型,然后选择能够代表其样本中大部分值的数据类型[4]。也即Excel ISAM查找某列前几行(默认情况下是8行),把占多的类型作为其处理类型。例如如果数字占多,那么其它含有字母等文本的数据项就会置空;相反如果文本居多,纯数字的数据项就会被置空。
  现具体分析在第1节程序代码Extended Properties项中的HDR和IMEX所代表的含义。HDR用来设置是否将Excel表中第一行作为字段名,“YES”代表是,“NO”代表不是即也为数据内容;IMEX是用来告诉驱动程序使用Excel文件的模式,其值有0、1、2三种,分别代表导出、导入、混合模式。当我们设置IMEX=1时将强制混合数据转换为文本,但仅仅这种设置并不可靠,IMEX=1只确保在某列前8行数据至少有一个是文本项的时候才起作用,它只是把查找前8行数据中数据类型占优选择的行为作了略微的改变。例如某列前8行数据全为纯数字,那么它仍然以数字类型作为该列的数据类型,随后行里的含有文本的数据仍然变空。
  另一个改进的措施是IMEX=1与注册表值TypeGuessRows配合使用,TypeGuessRows 值决定了ISAM 驱动程序从前几条数据采样确定数据类型,默认为“8”。可以通过修改“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel”下的该注册表值来更改采样行数。但是这种改进还是没有根本上解决问题,即使我们把IMEX设为“1”, TypeGuessRows设得再大,例如1000,假设数据表有1001行,某列前1000行全为纯数字,该列的第1001行又是一个文本,ISAM驱动的这种机制还是让这列的数据变成空。
  
  4 解决方法
  从以上的分析中可以得知,当某列数据中含有混合类型时,在.NET中使用Microsoft.Jet.OLEDB.4.0来读取Excel文件造成数据丢失是不可避免的,要解决这个问题只能考虑采用其它数据读取方法。
  在.NET中读取Excel文件的另外一种方法是回到使用传统COM组件,这种方法在很多技术文章或论文中都有涉及,本文不作赘述。需要指出的是,使用COM组件来读取Excel文件数据的效率较低,在作释放的时候有可能碰到不可预知的错误,特别开发Web应用的程序应该慎重使用。 

本文提出另外一种利用读取CSV纯文本格式解决此问题的方法。
  (1)在读取Excel的.xls类型的文本数据之前,先将其转换为.csv格式,在Excel中直接另存为这种格式就可以达到转换的目的。CSV文件又称为逗号分隔的文件,是一种纯文本文件,它以“,”分隔数据列,本文表1的数据表用CSV格式存储后用纯文本编辑器打开的表现形式如表3所示。
  表3 采用CSV格式保存的表1数据
  需要指出的是,CSV文件也可以用Ole DB或ODBC的方式读取,但是如果采用这些方式读取其数据又会回到丢失数据的老路上,ISAM机制同样会发挥作用。
  (2)采用普通的读取文本文件的方法打开文件,读取第一行,用“,”作为分隔符获得各字段名,在DataTable中创建对应的各字段,字段的类型可以统一创建成“String”。
  
本文原文
  (3)逐行读取数据行, 用“,”作为分隔符获得某行各列的数据并填入DataTable相应的字段中。
  实现的简化代码如下:
  String line;
  String [] split = null;
  DataTable table=new DataTable("auto");
  DataRow row=null;
  StreamReader sr=new StreamReader("c:/auto.csv",System.Text.Encoding.Default);
  //创建与数据源对应的数据列
  line = sr.ReadLine();
  split=line.Split(',');
  foreach(String colname in split){
  table.Columns.Add(colname,System.Type.GetType("System.String")); }
  //将数据填入数据表
  int j=0;
  while((line=sr.ReadLine())!=null){
   j=0;
   row = table.NewRow();
   split=line.Split(',');
   foreach(String colname in split){
   row[j]=colname;
   j++;}
   table.Rows.Add(row);}
   sr.Close();
  //显示数据
  dataGrid1.DataSource=table.DefaultView;
  dataGrid1.DataBind();
  
  5 结语
  在应用程序的设计中,需要访问Excel数据的情况非常普遍,本文以在.NET中对访问含有混合类型数据的Excel表格拟采取的方法进行探讨。当然,如果不存在混合类型的数据使用Microsoft.Jet.OLEDB为较佳方案。对于不是使用.NET开发的情况,本论文的分析和所提供的方法亦可参考。
  参考文献:
  [1]Linuxmine.利用ASP.NET来访问Excel文档[EB/OL]. http://www.linuxmine.com/77726.html,2007-1-22.
  [2]刘洪成.C#高级编程[M]. 北京:清华大学出版社,2003. 187-200.
  [3]肖正宏,曹元大,韩秋风.数据访问技术——DAO、ADO、RDO的比较[J].电脑与信息技术,2001,(1):31-32.
  [4]PBR.Excel使用DAO OpenRecordset NULL作为返回值[EB/OL].http://support.microsoft.com/kb/194124,2004-6-24.

 

说明:按照上面这篇文章分析当某列数据中含有混合类型时,在.NET中使用Microsoft.Jet.OLEDB.4.0来读取Excel文件造成数据丢失是不可避免的

当IMEX=1与注册表值TypeGuessRows配合使用,TypeGuessRows 值决定了ISAM 驱动程序从前几条数据采样确定数据类型,默认为“8”。可以通过修改“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel”下的该注册表值来更改采样行数。但是这种改进还是没有根本上解决问题,即使我们把IMEX设为“1”, TypeGuessRows设得再大,例如1000,假设数据表有1001行,某列前1000行全为纯数字,该列的第1001行又是一个文本,ISAM驱动的这种机制还是让这列的数据变成空。

经过我的测试原文的对这个解决方法的分析有误。

当修改TypeGuessRows 值为0时可以彻底解决这个问题

估计TypeGuessRows =0,程序就会默认行数为最大

 


 

 


 

posted @ 2010-07-12 21:22 阅读(1042) 评论(0) 编辑

2010年6月3日

利用OleDb方式对DataSet 和 Excel 数据快速导入导出

一:DataSet 导入到Excel

 

       /// <summary>
        
/// 导出数据到Excel
        
/// </summary>
        
/// <param name="Path">需要导入的Excel地址</param>
        
/// <param name="oldds">需要导入的数据</param>
        
/// <param name="TableName">表名</param>
        public static void DSToExcel2003(string Path, DataSet oldds, string TableName)
        {
            
//Excel2003的连接字符串
            string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + Path + ";Extended Properties=Excel 8.0";
            
//执行导入
            ExcuteSQL(oldds, TableName, strCon);


        }

        
/// <summary>
        
/// 导出数据到Excel
        
/// </summary>
        
/// <param name="Path">需要导入的Excel地址</param>
        
/// <param name="oldds">需要导入的数据</param>
        
/// <param name="TableName">表名</param>
        public static void DSToExcel2007(string Path, DataSet oldds, string TableName)
        {
            
//Excel2007的连接字符串  
            string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + Path + ";" + "Extended Properties=\"Excel 12.0 Xml;HDR=YES;\"";
            
//执行导入
            ExcuteSQL(oldds, TableName, strConn);


        }
        
/// <summary>
        
/// 执行
        
/// </summary>
        
/// <param name="oldds">需要导入的数据</param>
        
/// <param name="TableName">表名</param>
        
/// <param name="strCon">连接字符串</param>
        private static void ExcuteSQL(DataSet oldds, string TableName, string strCon)
        {
            
//连接
            OleDbConnection myConn = new OleDbConnection(strCon);

            
string strCom = "select * from [" + TableName + "$]";

            
try
            {
                myConn.Open();
                OleDbDataAdapter myCommand 
= new OleDbDataAdapter(strCom, myConn);

                System.Data.OleDb.OleDbCommandBuilder builder 
= new OleDbCommandBuilder(myCommand);

                
//QuotePrefix和QuoteSuffix主要是对builder生成InsertComment命令时使用。   
                
//获取insert语句中保留字符(起始位置)  
                builder.QuotePrefix = "[";
                
                
//获取insert语句中保留字符(结束位置)   
                builder.QuoteSuffix = "]";
                
                DataSet newds 
= new DataSet();
                
//获得表结构
                DataTable ndt = oldds.Tables[0].Clone();
                
//清空数据
                
//ndt.Rows.Clear();

                ndt.TableName 
= TableName;
                newds.Tables.Add(ndt);

                
//myCommand.Fill(newds, TableName);

                
for (int i = 0; i < oldds.Tables[0].Rows.Count; i++)
                {
                    
//在这里不能使用ImportRow方法将一行导入到news中,
                    
//因为ImportRow将保留原来DataRow的所有设置(DataRowState状态不变)。
                    
//在使用ImportRow后newds内有值,但不能更新到Excel中因为所有导入行的DataRowState!=Added     
                    DataRow nrow = newds.Tables[0].NewRow();
                    
for (int j = 0; j < oldds.Tables[0].Columns.Count; j++)
                    {
                        nrow[j] 
= oldds.Tables[0].Rows[i][j];
                    }
                    newds.Tables[
0].Rows.Add(nrow);
                }
                
//插入数据
                myCommand.Update(newds, TableName);
            }
            
finally
            {
                myConn.Close();
            }
        }

 

 


 

使用实例

 

        /// <summary>
        
/// 导出数据
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void btnExport_Click(object sender, EventArgs e)
        {

            
//string connString = "server=localhost;uid=sa;pwd=123456;database=MYDB";
            string excelModlePath = @"G:\Study\ExcelOper\Model\学籍表.xls";

            
//文件保存对话框
            System.Windows.Forms.SaveFileDialog fd = new SaveFileDialog();

            fd.DefaultExt 
= ".xls";
   

            
//string savefilepath = @"G:\Study\ExcelOper\SaveFolder\study.xls";

            
if (fd.ShowDialog() == DialogResult.OK)
            {
                
using (ExcelHelper excel = new ExcelHelper())
                {
                    excel.Open(excelModlePath);
                    
//保存数据到用户指定的文件夹
                    excel.SaveFile(fd.FileName);
                }

                
string connString = "server=localhost;uid=sa;pwd=123456;database=MYDB";


                DataSet ds 
= SqlHelper.ExecuteDataSet(connString, CommandType.Text, "select * from study");

                ds.Tables[
0].TableName = "study";

                ExcelHelper.DSToExcel2003(fd.FileName, ds, 
"study");
            }
        }

 

二 Excel导出到DataSet

 

       /// <summary>
        
/// 查询Excle2007的数据
        
/// </summary>
        
/// <param name="Path"></param>
        
/// <returns></returns>
        public static DataSet Excel2007ToDS(string Path, string SheetName)
        {
            
//Excel2007链接字符串
            string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + Path + ";" + "Extended Properties=\"Excel 12.0 Xml;HDR=YES;\"";
            
return ExcuteQuery(strConn, SheetName);
        }

        
/// <summary>
        
/// 查询Excle2003的数据
        
/// </summary>
        
/// <param name="Path"></param>
        
/// <returns></returns>
        public static DataSet Excel2003ToDS(string Path, string SheetName)
        {
            
//Excel2003链接字符串
            string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";

            
return ExcuteQuery(strConn, SheetName);
        }

        
/// <summary>
        
/// 执行查询
        
/// </summary>
        
/// <param name="strConn"></param>
        
/// <returns></returns>
        private static DataSet ExcuteQuery(string strConn, string SheetName)
        {
            
//默认sheet名
            if (string.IsNullOrEmpty(SheetName))
            {
                SheetName 
= "Sheet1";
            }

            
//链接
            OleDbConnection conn = new OleDbConnection(strConn);
            DataSet ds 
= null;
            
try
            {
                conn.Open();
                
string strExcel = "";
                OleDbDataAdapter myCommand 
= null;
                
                strExcel 
= "select * from [" + SheetName + "$]";
                myCommand 
= new OleDbDataAdapter(strExcel, strConn);
                ds 
= new DataSet();
                
//查询数据
                myCommand.Fill(ds, SheetName);
            }
            
finally
            {
                conn.Close();
            }
            
//

            
return ds;
        }

 

使用实例

        private void btnImport_Click(object sender, EventArgs e)
        {
            
//openFileDialog1.ShowDialog();

            
//if (openFileDialog1.RestoreDirectory)
            
//{

            
//}


            
string connString = "server=localhost;uid=sa;pwd=123456;database=MYDB";
            System.Windows.Forms.OpenFileDialog fd 
= new OpenFileDialog();
            
if (fd.ShowDialog() == DialogResult.OK)
            {
                TransferData(fd.FileName, 
"study", connString);

                DataSet ds 
= SqlHelper.ExecuteDataSet(connString, CommandType.Text, "select * from study");

                dataGridView1.DataSource 
= ds.Tables[0];
            }

        }

 

 注意事项:

       一:DataSet导入到Excel时 导入的Excel的文件的Sheet名要和要导入的DataTable名一致,

Sheet的数据列名也要和DataTable列名一致放在Sheet的第一排

如下图:

二:Excel导出数据到DataSet的SheetName 需要和实际的Sheet名一致

 

总结:和直接使用office内核访问Excel数据的方式相比相信这种方式的读写速度上会占有很大优势

并且不用担心非托管资源的释放

posted @ 2010-06-03 12:49 阅读(814) 评论(0) 编辑

2010年5月26日

使用js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色

使用js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色

 

后台代码

 

 

代码
       /// <summary>
        
/// 数据行绑定事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        protected void gvProduct_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            
try
            {
                
if (e.Row.RowType == DataControlRowType.DataRow )
                {
                    GridViewRow row 
= e.Row;
                    CheckBox ckb 
= row.Cells[0].FindControl("ckb"as CheckBox;
                    Label ProductID 
= row.Cells[0].FindControl("lblProductID"as Label;

                    
//当鼠标停留时更改背景色
                    row.Attributes.Add("onmouseover""this.style.backgroundColor='#00A9FF'");
                    
//当鼠标移开时还原背景色
                    row.Attributes.Add("onmouseout""gvProducts_onmouseout('" + gvProducts.ClientID + "','" + ckb.ClientID + "',this) ");
                    
//当鼠标移开时还原背景色
                    row.Attributes.Add("onclick""SelectRadio('" + gvProducts.ClientID + "','" + ckb.ClientID + "','" + ProductID.Text + "',this) ");

                    ckb.Attributes.Add(
"onclick""SelectRadio('" + gvProducts.ClientID + "','" + ckb.ClientID + "','" + ProductID.Text + "',document.getElementById('" + row.ClientID + "')) ");

            }
            
catch (Exception ex)
            {
           
 }

        }

 

 

 

 

前台代码

 

 

代码
        /****************************************************/
        
//功能:鼠标移出时设置行颜色
        //说明:onmouseout事件时使用  
        //作者:XXXXX
        //日期:2010年5月26日
        /****************************************************/
        
function gvUsers_onmouseout(listId, SelectRadioID, row) {
            
var SelectRadio = document.getElementById(SelectRadioID);
            
//找到控制范围   
            var GridViewtableSearchList = document.getElementById(listId);
            
//找到控制范围下所有input   
            var objs = GridViewtableSearchList.getElementsByTagName("input");
            
//找到控制范围下所有checkbox并都变为false
            for (var i = 0; i < objs.length; i++) {
                
if (objs[i].type.toLowerCase() == "checkbox" && objs[i] == SelectRadio) {
                    
if (SelectRadio.checked) {
                        
//设置选中行的颜色
                        row.style.backgroundColor = '#33A922'
                    }
                    
else {
                        
//设置交替行的颜色
                        if (i % 2 == 0) {
                            row.style.backgroundColor 
= '#FFFFFF'
                        }
                        
else {
                            row.style.backgroundColor 
= '#F4FAFD'
                        }
                    }
                }
            }

        }

        
/****************************************************/
        
//功能:鼠标单击时使用
        //说明:onmouseout事件时使用  
        //作者:XXXXXX
        //日期:2010年5月26日
        /****************************************************/
        
function SelectRadio(listId, SelectRadioID, rv, row) {

            
var SelectRadio = document.getElementById(SelectRadioID);

            
//找到控制范围   
            var GridViewtableSearchList = document.getElementById(listId);
            
//找到控制范围下所有input   
            var objs = GridViewtableSearchList.getElementsByTagName("input");
            
//找到控制范围下所有checkbox并都变为false
            for (var i = 0; i < objs.length; i++) {

                
//设置除当前选择行外其它行的背景色
                if (objs[i].type.toLowerCase() == "checkbox" && objs[i] != SelectRadio) {
                    objs[i].checked 
= false;
                    
//设置交替行的背景色
                    if (i % 2 == 0) {
                        objs[i].parentElement.parentElement.style.backgroundColor 
= '#FFFFFF'
                    }
                    
else {
                        objs[i].parentElement.parentElement.style.backgroundColor 
= '#F4FAFD'
                    }
                }
            }
            
var SelectRadioSelectRadioID = SelectRadio.id;

            SelectRadio.checked 
= !SelectRadio.checked
            
//设置当前选择行的背景色和返回选择行的主键
            if (SelectRadio.checked) {
                row.style.backgroundColor 
= '#33A922'
                window.returnValue 
= rv;
            }
            
else {
                
                window.returnValue 
= ""
            }
        } 

 

 

 

 注:由于火狐不支持parentElement 属性 使用parentNode代替可以兼容火狐
 
 

 



 
 

posted @ 2010-05-26 10:29 阅读(291) 评论(0) 编辑

使用js过滤非法字符

项目中如果需要过滤非法字符(你不想用户输入的任何字符)的话

在前台可以使用js过滤,同样可以提高用户体验

代码一:keypress事件时使用

代码
/****************************************************/
//功能:过滤非法字符
//
说明:keypress事件时使用
//
作者:XXXXXXX
//
日期:2010年5月7日
/*
***************************************************/
function surnam_keypress(event) {
    
//非法字符集
    var codes = '<>/@#%';
    
//事件
    var e = event || window.event
    
//打印字符码
    var code = e.charCode || e.keyCode;
    
//功能按键时直接返回
    if (e.charCode == 0return true;
    
//ctr和alt直接返回
    if (e.ctrlKey || e.altKey) return true;
    
//ASCII字符
    if (code < 32return true;
    
//字符码转为字符
    var c = String.fromCharCode(code);
    
//如果有非法字符则不打印
    if (codes.indexOf(c) != -1) {
        
return false;
    }
    
else {
        
return true;
    }

}

 

代码二onchage(主要是用户粘贴时处理用),keyup事件时

 

代码
/****************************************************/
//功能:过滤非法字符
//
说明:onchange、keyup事件时使用
//
作者:XXXXX
//
日期:2010年5月7日
/*
***************************************************/
function surnam_keyup(text) {
    
//控件值
    var textvalue = text.value;
    
//非法字符集
    var codes = '<>/@#%';
    
//非法字符数组
    var codearray = codes.split('');
    
//循环替换非法字符
    for (i = 0; i < codearray.length; i++) {
        
while (textvalue.indexOf(codearray[i]) != -1) {
            textvalue 
= textvalue.replace(codearray[i], '');
        }
    }
    
//重新给控件赋值
    text.value = textvalue;

}

 

使用实例:

 

代码
        /// <summary>
        
/// 给控件添加字符过滤js
        
/// </summary>
        
/// <param name="text"></param>
        public void CharIllegalFilting(System.Web.UI.WebControls.TextBox text)
        {
            
//控件内容改变
            text.Attributes["onchange"= "surnam_keyup(this);";
            
//键盘弹出事件
            text.Attributes["onkeyup"= "surnam_keyup(this);";
            
//键盘按下事件
            text.Attributes["onkeypress"= "return surnam_keypress();";

        }


        
protected void Page_Load(object sender, EventArgs e)
        {
            
//添加非法字符过滤
            CharIllegalFilting(epNametext);
        }

 

 

posted @ 2010-05-26 10:05 阅读(809) 评论(1) 编辑

2009年11月17日

NET格式化小结

日期格式化

     DateTime.Parse("2009-10-10").ToString("yyyy\\/MM\\/dd")

     结果:      2009/10/10

     yyyy     年

     MM       月

     dd        日

     hh        时

     mm      分

     ss        秒

String.Format 格式化

 

Code

 

 

 

  

 

posted @ 2009-11-17 10:59 阅读(85) 评论(0) 编辑

2009年8月8日

多表删除 多表更新 使用示例

摘要: 关于update delete 的使用一般情况只涉及到单表但是如果是多表关联的呢?比如删除表A 在表B中出现的记录的情况一:关于多表关联更新 错误示例: update T_Paper set A.TestID=B.TestID from T_Paper A join T_Test B on A.TestID=B.TestID 正确示例: update A set A.TestID=B.Test...阅读全文

posted @ 2009-08-08 15:27 阅读(66) 评论(0) 编辑

2009年5月17日

SQL 2005 随机数据的抽取

摘要: 随机数据的抽取set @SQL='select top ' + @MultipleNum + ' * 'set@SQL= @SQL + ' from T_Choice'set@SQL= @SQL + ' where'set@SQL= @SQL + ' CourseID=' +@CourseIDset@SQL= @SQL + ' and ChoiceType=3 'set@SQL= @SQL + '...阅读全文

posted @ 2009-05-17 23:24 阅读(125) 评论(0) 编辑

2008年12月19日

转: 如何用.NET创建Windows服务

摘要: 我们将研究如何创建一个作为Windows服务的应用程序。内容包含什么是Windows服务,如何创建、安装和调试它们。会用到System.ServiceProcess.ServiceBase命名空间的类。 什么是Windows服务?  Windows服务应用程序是一种需要长期运行的应用程序,它对于服务器环境特别适合。它没有用户界面,并且也不会产生任何可视输出。任何用户消息都会被写进Windows事件...阅读全文

posted @ 2008-12-19 11:30 阅读(104) 评论(0) 编辑

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

导航

统计

公告

昵称:<夜风>
园龄:3年1个月
粉丝:1
关注:0

搜索

 
 

常用链接

我的标签

随笔分类

随笔档案

数据库连接大全

最新评论

阅读排行榜

评论排行榜

推荐排行榜