• ADO.NET学习笔记


     在DataSet中DataRow是其所有数据的基本存放位置,它主要是由一个值数组组成,代表DataTable单独一行。
        DataRow中主要包括一下几种信息:1、行中每一列的当前值,2、行中每一列的原始值,3、行状态,4、父行与子行间的链接
        初始化一个DataRow:
        DataTable dataTable=dataSet.Tables[0];
        DataRow newRow=dataTable.NewRow(); //用dataTable生成DataRow可以利用dataTable里面的模式
        dataTable.Rows.Add(newRow);
        删除行:
        DataTable.Rows.Remove(行实例);
        DataTable.Rows.RemoveAt(行号);
        DataRow.Delete(); //行自身移除
        读写DataRow的值:
        row["列名"],row[列号]均可引用其中的一个属性
        DataColumn a=dataTable.Columns("列名"; //可以获得一个列
        对行进行批处理更改:
        BeginEdit()开始更改,EndEdit()结束更改,同时将更改结果写入DataSet,CancelEdit(),取消更改
        例如:
        row.BeginEdit();
        对row进行更改
        row.EndEdit();
        将数据批量加载到DataTable
        dataTable.BeginLoadData();
        dataTable.LoadDataRow(row1,false); //第二个参数为true时,调用dataTable.AcceptChanges()时接受更改,为false直接添加
        ……
        dataTable.EndLoadData();
        使用这种数据加载方式可以在数据加载期间屏蔽所有的数据约束,索引也不会予以维护,极大的加快了数据加载速度
        行的版本:
        current:当前值
        default:根据操作的不同决定行的default值
        original:最后一次调用AcceptChanges()之后的值
        proposed:调用AcceptChanges()之前被更改的值
        例如要获得行的original值:
        String oldString=row("FirstName",DataRowVersion.original);
        行的状态:
        row.RowState获得行的状态,例如删除后变成Deleted,数据存储更新后变为unchanged
        六、DataSet导航
        在ADO.NET中每个表都保持其相对独立性,允许在行级上导航不同表之间的相关行(向下导航到子行,向上导航的父行)
        如DataRow[] invoiceRows=custRow.GetChildRows("Customer_invoice"; //通过关系导航到子行
        七、DataView
        DataView就时数据视图,为数据库结构提供了外模式的实现。
        同时DataView也可以为窗体控件和Web控件提供数据绑定功能,在每一个DataTable中内建了一个DataView为:DataTable.DefaultView();
        创建DataView
        DataView sortedView=new DataView(dataTable);
        对DataView进行排序
        dataTable.DefaultView.sort="lastName";
        dataTable.DefaultView.sort="lastName,FirstName DESC";
        对DataView进行筛选:
        1、通过对其中的RowFilter属性设置可以实现筛选
        dataTable.DefaultView.RowFilter="Vendor='Rawlings'";
        不过筛选表达式只能设置成比较简单的表达式,功能有限,不过可以满足基本的要求。
        同样在DataTable里面也可以进行简单的搜索,返回一个DataRow数组,例:
        DataRow[] compoundRows=dataTable.select("Vendor='wilson' AND price>20.00)
        2、通过RowState来筛选
        dataTable.DefaultView.RowStateFilter="DataViewRowState.originalRows"可以筛选出符合要求状态的row
        对DataView进行搜索:
        相对于DataView使用RowFilter进行筛选得到一个矩形数据集,使用Find、FindRows可以更准确的查找到与特定键相匹配的行
        搜索的时候必须首先设置DataView的sort属性:
        int found=dataTable.DefaultView.Find("wilson"; //获得行的位置
        DataRowView[] rows=dataTable.DefaultView.FindRows("Rawlings" //过得一个row数组
        八、更新DB
        在DataSet中,每一个DataTable对应着一个DataAdapter,DataAdapter.Update()时,DataTable自动更新。
        更新的时候可以使用CommandBuilder自动根据DataSet的变化生成更新的SQL命令
        SqlCommandBuilder bldr=new SqlCommandBuilder(dataAdapter);
        dataAdapter.Update(custTable);
        不过Update接受DataSet参数并不更新DataSet而是更新DataSet中的一个叫"Table"的表
        使用CommandBuilder进行更新的时候要注意一下几点:
        1、SelectCommand必须有效
        2、必须有主码
        3、若SelectCommand填充DataTable后架构发生改变,应该在Update()之前调用CommandBuilder.RefreshSchema();
        4、更新DB时不受关系、约束或者DataSet中其他表的影响
        虽然使用CommandBuilder比较方便,不用自己写更新命令,但自动生成的命令性能不高,这时可以考虑自己编写存储过程或直接使用带参数的sql语句,例如:
        String insQry="Insert into Customer(CustomerID) Values (@Customer)";
        SqlCommand insCmd=conn.CreateCommand();
        insCmd.CommandText=insQry;
        SqlParameterCollection insParams=insCmd.Parameters;
        insParams.Add("@CustomerID",SqlDbType.UniqueIdentifier,0,"CustomerID";
        dataAdapter.InsertCommand=insCmd;
        dataAdapter.Update();
        在dataAdapter.Update()更新时还可以控制更新的范围:
        dataAdapter.Update(invTable.GetChanges(DataRowState.Deleted); //只更新被删除的部分
        九、事务
        tx=conn.BeginTransaction(IsolationLevel.Serializable);
        invDA.SelectCommand.Transaction=tx;
        事务操作
        tx.Commit();提交 //tx.Rollback();事务回滚
        十、数据绑定
        简单版本:(对文本框、标签等)
        {Controls}.DataBindings.Add("{Property}",{dataSource},"{dataMember}";
        其中Property为待绑定的属性,dataSource为DataView或DataTable,dataMember为dataSource其中的某个属性
        复杂版本:(对ListBox、ComboBox等)
        要分别设置各个属性实现绑定:
        DataSource=支持IList的一个对象(DataTable或DataView)
        DisplayMember:待显示的DataSource中的一个属性
        ValueMember:确定在DataSource中引用哪一个数据行,即实现与DisplayMember的名值对应
        DataGrid绑定:
        1、可以设置DataSource属性实现静态绑定
        2、可以使用SetDataBinding函数实现动态绑定
        同时DataGrid支持主控/详细表显示
        masterGrid.setDataBinding(customerTable,"";
        detailGrid.setDataBinding(customerTable,"Customer_Invoices" //第二个属性要设置成关系约束
        这样在主表中选择一行,在子表中就根据主表行中外码在子表中找到相应行
        绑定之后,绑定项中就有一个CurrencyManager属性实现游标功能
        BindingContext[CustomerTable]返回一个CurrencyManager对象,其中的Position属性可以更改,实现游标的移动。
        
        loading...
        
        
        2006-3-22
        SQL 和C#里面出现奇怪的错误处理
        今天编程 的时候出现了如下的错误:
        在此上下文中不允许使用 此处只允许使用常量、表达式或变量。不允许使用列名。
        查找发现,连接数据库的类,里面没有任何的错误,我把异常处理关闭掉,也发现无法显示我需要的信息,知道后来调试该存储过程的时候,把sql语句print出来,发现是没有使用“”所至!!!!!!
        晕
        loading...
        
        
        2006-3-20
        ASP.NET将EXCEL导入SQL SERVER数据库的代码
        private void Button1_Click(object sender, System.EventArgs e)
        {
        CreateTable();
        //先将EXCEL导入到数据库,一:先把EXCEL导入dateView,二:然后将dateView里的数据导入到数据库里面
        //EXCEL 的连接串
        string sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
        "Data Source=" + File1.PostedFile.FileName.ToString() + ";" +
        "Extended Properties=Excel 8.0;";
        //建立EXCEL的连接
        OleDbConnection objConn = new OleDbConnection(sConnectionString);
        objConn.Open();
        OleDbCommand objCmdSelect =new OleDbCommand("SELECT * FROM [Sheet1$]", objConn);
        OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
        objAdapter1.SelectCommand = objCmdSelect;
        DataSet objDataset1 = new DataSet();
        objAdapter1.Fill(objDataset1, "XLData";
        // DataGrid1.DataSource = objDataset1.Tables[0].DefaultView; //测试代码,用来测试是否能读出EXCEL上面的数据
        // DataGrid1.DataBind();
        DataTable dt = objDataset1.Tables[0];
        DataView myView = new DataView(dt);
        //SQL SERVER的数据库连接
        SqlConnection conn;
        string dns =System.Configuration.ConfigurationSettings.AppSettings["ConStr"];//连接串
        conn=new SqlConnection(dns);
        SqlCommand cmd =conn.CreateCommand();
        cmd.CommandType =CommandType.StoredProcedure;
        cmd.CommandText="Proc_Address";
        int count=0;//用来记录出错的条数
        try
        {
        foreach (DataRowView myDrv in myView)
        {
        count++;
        //要关闭上一次的SQL Server的连接
        if (conn.State.ToString()!="Closed"
        conn.Close();
        //每一次都要清空所有的CMD的参数
        cmd.Parameters.Clear();
        //执行存储过程
        //首先获得参数 共 3个
        //@CardNo,@ToAddress,@CCAddress
        SqlParameter paraCardNo =cmd.Parameters.Add("@CardNo",SqlDbType.Char);
        SqlParameter paraToAddress =cmd.Parameters.Add("@ToAddress",SqlDbType.Char);
        SqlParameter paraCCAddress =cmd.Parameters.Add("@CCAddress",SqlDbType.Char);
        SqlParameter paraYYYYMM =cmd.Parameters.Add("@YYYYMM",SqlDbType.Char);
        //表示是输出参数
        paraCardNo.Direction = ParameterDirection.Input;
        paraToAddress.Direction = ParameterDirection.Input;
        paraCCAddress.Direction = ParameterDirection.Input;
        paraYYYYMM.Direction = ParameterDirection.Input;
        //参数赋值
        paraCardNo.Value = myDrv[0].ToString().Trim();
        paraToAddress.Value = myDrv[1].ToString().Trim();
        paraCCAddress.Value = myDrv[2].ToString().Trim();
        paraYYYYMM.Value = ddlYear.Items[ddlYear.SelectedIndex].Value + ddlMonth.Items[ddlMonth.SelectedIndex].Value;
        conn.Open();
        cmd.ExecuteNonQuery();//写入SQL数据库
        }
        }
        catch
        {
        Page.Response.Write("alert('第"+count.ToString()+"条数据出错!');";
        objConn.Close();//关闭EXCEL的连接
        }
        objConn.Close();//关闭EXCEL的连接
        loading...
        
        
        2006-2-20
        在Web上使用信使服务
        前段时间开发一个Web项目,客户要求有即时消息提示功能:
        1. 客户端不能安装软件;
        2. 客户端不需要打开网页就可以收到即时消息
        3. 无论客户端在使用任何软件的时候即时消息都要能被客户马上看到
        考虑到客户的网络环境是简单的对等网,通过工作组来分配单位的各个部门,因此采用即时消息服务来解决。
        以下是代码,望大家提供意见和建议
        using System;
        using System.Runtime.InteropServices;
        namespace test
        {
         /// <summary>
         /// NetSend 的摘要说明。
         /// </summary>
         public class NetSend
         {
         public NetSend()
         {
         //
         // TODO: 在此处添加构造函数逻辑
         //
         }
         public int SendMessage(string sFrom,string sTo,string sMessage)
         {
         byte[] bBuffer = System.Text.Encoding.Unicode.GetBytes(sMessage);
         int nRet = NetMessageBufferSend(null,sTo,null,sMessage,sMessage.Length*2+2);
         return nRet;
         }
         [DllImport ("Netapi32", CharSet=CharSet.Unicode)]
         public static extern int NetMessageBufferSend( string servername, string msgname, string fromname, string buf, int buflen);
         }
        }
        补充NET SEND的语法:
        NET SEND {name | * | /DOMAIN[:name] | /USERS} message
        
        loading...
        
        
        2006-2-7
        自动更新的原理
        
         需要自动更新的时候,客户端软件提交更新请求给固定的网址,然后网址返回最新版本的版本号。客户端软件和自己的版本号对比,如果发现服务器的版本和自己的 版本不一样,那么就请求下载升级补丁。服务器响应请求,提供补丁下载;下载成功后,手动或自动安装一下就可以了。
         安装补丁的时候,客户端的主程序一般是要关闭的,除非采用动态卸载、调入组件的技术,比如网络游戏,就是尽量让玩家边玩游戏边更新。
         如果更新的是主程序,那么就必须关闭主程序了。可是主程序关闭了之后,谁来调用安装补丁呢?为了解决这个问题,人们把主程序和自动更新程序分开来做。当需 要校验版本的时候,主程序调用自动更新程序。自动更新程序如果发现主程序需要更新,在下载了升级补丁之后,就会要求关闭主程序。主程序关闭之后,自动更新 程序调用升级补丁进行安装,安装完成后再重新启动主程序。自动更新程序自动退出,完成更新任务。这和你刚才关闭电脑后再插网卡的原理是一模一样的。其实生 活中有很多现象可以借鉴到软件设计中。
         人们嫌这样的升级仍然太麻烦,后来出现了B/S结构,大家像抓住了救命稻草一样的追捧至今,希望能从这些劳动中解脱出来。B/S结构就是浏览器/服务器结 构,它所有的功能,都是在浏览器里完成。程序升级的时候,只需要在服务端升级一下就可以了,浏览器再次访问服务器的时候,得到的就是新版本。你可以把它理 解成一个纯粹的网站。是不是站长更新的时候,你打开网站就看到最新的页面?
         但是B/S结构有天生的弱点,因为它是基于网页浏览的,所以安全性是首要的难题,你能浏览的东西,原则上别人也能浏览。而且出于安全考虑,B/S访问本地资源,比如串口,必须借助于其他技术实现。B/S也不是万能的,必须考虑实际应用。
        附录:Winform的自动更新
        winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个通过软件实现自动升级技术方案,弥补了这一缺陷,有较好的参考价值。
        一、升级的好处。
        长期以来,广大程序员为到底是使用Client/Server,还是使用Browser/Server结构争论不休,在这些争论当中,C/S结构 的程序的可维护性差,布置困难,升级不方便,维护成本高就是一个相当重要的因素,也是那些B/S的支持者们将Client/Server结构打入地狱的一 个重要原因。
        现在好了,我们就在最新的基于Microsoft 的 WinForm上用WebServices来实现软件的自动升级功能。
        二、升级的技术原理。
        升级的原理有好几个,首先无非是将现有版本与最新版本作比较,发现最新的则提示用户是否升级。当然也有人用其它属性比较的,例如:文件大小。 或者更新日期。
        而实现的方法呢?在VB时代,我使用的是XmlHTTP+INet控件。用XmlHTTP获取信息,用INET传输升级文件,而用一个简单的BAT文件来实现升级。
        Public Sub CheckUpdate()
        On Error Resume Next
        Dim b As Boolean
        Dim XmlHttp As Object
        Set XmlHttp = CreateObject("Microsoft.XMLHttp"
        XmlHttp.Open "GET", "Http://mu.5inet.net/MuAdmin/update.xml", False
        XmlHttp.Send
        Dim vs As String
        vs = XmlHttp.responseText
        If Err.Number > 0 Then
        Exit Sub
        End If
        Dim Xml As Object
        Set Xml = CreateObject("Microsoft.XmlDom"
        Xml.LoadXml vs
        Dim Version As String
        Dim downAddr As String
        Dim FSize As Long
        Dim fInfo As String
        Version = Xml.DocumentElement.ChildNodes(0).Text
        downAddr = Xml.DocumentElement.ChildNodes(1).Text
        FSize = CLng(Xml.DocumentElement.ChildNodes(2).Text)
        fInfo = Xml.DocumentElement.ChildNodes(3).Text
        Set Xml = Nothing
        Set XmlHttp = Nothing
        Dim Major As Long
        Dim Minor As Long
        Dim Revision As Long
        Dim C() As String
        C = Split(Version, "."
        Major = CLng(C(0))
        Minor = CLng(C(1))
        Revision = CLng(C(2))
        If Major > App.Major Then
        b = True
        ElseIf Minor > App.Minor Then
        b = True
        ElseIf Revision > App.Revision Then
        b = True
        Else
        b = False
        End If
        If (b) Then
        Dim result As VbMsgBoxResult
        result = MsgBox("发现程序新版本。当前版本为:" & App.Major & "." & App.Minor & "." & App.Revision & ",目前最新版本为:" & Version & ",是否进行更新?", vbQuestion Or vbYesNo, "自动更新"
        If result = vbYes Then
        Dim frm As New Update
        frm.DownloadAddress = downAddr
        frm.size = FSize
        frm.InfoPage = fInfo
        frm.Version = Version
        frm.Show vbModal
        End If
        End If
        End Sub
        
        而BAT文件有个特性,是可以删除自己本身。下面是BAT文件的内容.
        @echo off
        echo
        echo echo 欢迎使用无垠奇迹管理器升级向导。
        echo 本次升级版本为:1.1.0。
        echo 请按任意键开始升级无垠奇迹管理器... echo
        echo
        pause
        del SQLSrvBrowser.Exe
        ren ~update.tmp SQLSrvBrowser.Exe
        echo 升级成功,按任意键重新启动应用程序。
        pause
        start http://mu.5inet.net/
        start SQLSrvBrowser.Exe
        del update.bat
        
        三、在.Net时代的实现。
        在.Net时代,我们就有了更多的选择,可以使用WebRequest,也可以使用WebServices。在这里我们将用WebServices来实现软件的自动升级。
        实现原理:在WebServices中实现一个GetVer的WebMethod方法,其作用是获取当前的最新版本。
          然后将现在版本与最新版本比较,如果有新版本,则进行升级。
          步骤:
            1、准备一个XML文件 (Update.xml)。
        <?xml version="1.0" encoding="utf-8" ?>
        <product>
        <version>1.0.1818.42821</version>
        <description>修正一些Bug</description>
        <filelist count="4" sourcepath="./update/">
        <item name="City.xml" size="">
        <value />
        </item>
        <item name="CustomerApplication.exe" size="">
        <value />
        </item>
        <item name="Interop.SHDocVw.dll" size="">
        <value />
        </item>
        <item name="Citys.xml" size="">
        <value />
        </item>
        </filelist>
        </product>
        作用是作为一个升级用的模板。
            2、WebServices的GetVer方法。
        
        [WebMethod(Description="取得更新版本"]
        public string GetVer()
        {
        XmlDocument doc = new XmlDocument();
        doc.Load(Server.MapPath("update.xml");
        XmlElement root = doc.DocumentElement;
        return root.SelectSingleNode("version".InnerText;
        }
             3、WebServices的GetUpdateData方法。
        [WebMethod(Description="在线更新软件"]
        [SoapHeader("sHeader"]
        public System.Xml.XmlDocument GetUpdateData()
        {
        //验证用户是否登陆
        if(sHeader==null)
        return null;
        if(!DataProvider.GetInstance.CheckLogin(sHeader.Username,sHeader.Password))
        return null;
        //取得更新的xml模板内容
        XmlDocument doc = new XmlDocument();
        doc.Load(Server.MapPath("update.xml");
        XmlElement root = doc.DocumentElement;
        //看看有几个文件需要更新
        XmlNode updateNode = root.SelectSingleNode("filelist";
        string path = updateNode.Attributes["sourcepath"].Value;
        int count = int.Parse(updateNode.Attributes["count"].Value);
        //将xml中的value用实际内容替换
        for(int i=0;i<count;i++)
        {
        XmlNode itemNode = updateNode.ChildNodes[i];
        string fileName = path + itemNode.Attributes["name"].Value;
        FileStream fs = File.OpenRead(Server.MapPath(fileName));
        itemNode.Attributes["size"].Value = fs.Length.ToString();
        BinaryReader br = new BinaryReader(fs);
        //这里是文件的实际内容,使用了Base64String编码
        itemNode.SelectSingleNode("value".InnerText = Convert.ToBase64String(br.ReadBytes((int)fs.Length),0,(int)fs.Length);
        br.Close();
        fs.Close();
        }
        return doc;
        }
            4、在客户端进行的工作。
              首先引用此WebServices,例如命名为:WebSvs,
        string nVer = Start.GetService.GetVer(); 
        if(Application.ProductVersion.CompareTo(nVer)<=0)
        update();
        在本代码中 Start.GetService是WebSvs的一个Static 实例。首先检查版本,将结果与当前版本进行比较,如果为新版本则执行UpDate方法。 void update()
        {
        this.statusBarPanel1.Text = "正在下载...";
        System.Xml.XmlDocument doc = ((System.Xml.XmlDocument)Start.GetService.GetUpdateData());
        doc.Save(Application.StartupPath + @""update.xml";
        System.Diagnostics.Process.Start(Application.StartupPath + @""update.exe";
        Close();
        Application.Exit();
        }这里为了简单起见,没有使用异步方法,当然使用异步方法能更好的提高客户体验,这个需要读者们自己去添加。:) update的作用是将升级的XML文件下载下来,保存为执行文件目录下的一个Update.xml文件。任务完成,退出程序,等待Update.Exe 来进行升级。     5、Update.Exe 的内容。 private void Form1_Load(object sender, System.EventArgs e)
        {
        System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcesses();
        foreach(System.Diagnostics.Process p in ps)
        {
        //MessageBox.Show(p.ProcessName);
        if(p.ProcessName.ToLower()=="customerapplication"
        {
        p.Kill();
        break;
        }
        }
        XmlDocument doc = new XmlDocument();
        doc.Load(Application.StartupPath + @""update.xml";
        XmlElement root = doc.DocumentElement;
        XmlNode updateNode = root.SelectSingleNode("filelist";
        string path = updateNode.Attributes["sourcepath"].Value;
        int count = int.Parse(updateNode.Attributes["count"].Value);
        for(int i=0;i<count;i++)
        {
        XmlNode itemNode = updateNode.ChildNodes[i];
        string fileName = itemNode.Attributes["name"].Value;
        FileInfo fi = new FileInfo(fileName);
        fi.Delete();
        //File.Delete(Application.StartupPath + @""" + fileName);
        this.label1.Text = "正在更新: " + fileName + " (" + itemNode.Attributes["size"].Value + " ...";
        FileStream fs = File.Open(fileName,FileMode.Create,FileAccess.Write);
        fs.Write(System.Convert.FromBase64String(itemNode.SelectSingleNode("value".InnerText),0,int.Parse(itemNode.Attributes["size"].Value));
        fs.Close();
        }
        label1.Text = "更新完成";
        File.Delete(Application.StartupPath + @""update.xml";
        label1.Text = "正在重新启动应用程序...";
        System.Diagnostics.Process.Start("CustomerApplication.exe";
        Close();
        Application.Exit();
        } 这个代码也很容易懂,首先就是找到主进程,如果没有关闭,则用Process.Kill()来关闭主程序。然后则用一个XmlDocument来Load 程序生成的update.xml文件。用xml文件里指定的路径和文件名来生成指定的文件,在这之前先前已经存在的文件删除。更新完毕后,则重新启动主应 用程序。这样更新就完成了。
        
        loading...
        
        
        2006-2-6
        摘要:c#.net常用函数列表
        1、DateTime 数字型
        System.DateTime currentTime=new System.DateTime();
        1.1 取当前年月日时分秒
        currentTime=System.DateTime.Now;
        1.2 取当前年
        int 年=currentTime.Year;
        1.3 取当前月
        int 月=currentTime.Month;
        1.4 取当前日
        int 日=currentTime.Day;
        1.5 取当前时
        int 时=currentTime.Hour;
        1.6 取当前分
        int 分=currentTime.Minute;
        1.7 取当前秒
        int 秒=currentTime.Second;
        1.8 取当前毫秒
        int 毫秒=currentTime.Millisecond;
        (变量可用中文)
        1.9 取中文日期显示——年月日时分
        string strY=currentTime.ToString("f"; //不显示秒
        1.10 取中文日期显示_年月
        string strYM=currentTime.ToString("y";
        1.11 取中文日期显示_月日
        string strMD=currentTime.ToString("m";
        1.12 取当前年月日,格式为:2003-9-23
        string strYMD=currentTime.ToString("d";
        1.13 取当前时分,格式为:14:24
        string strT=currentTime.ToString("t";
        2、Int32.Parse(变量) Int32.Parse("常量"
        字符型转换 转为32位数字型
        3、 变量.ToString()
        字符型转换 转为字符串
        12345.ToString("n"; //生成 12,345.00
        12345.ToString("C"; //生成 ¥12,345.00
        12345.ToString("e"; //生成 1.234500e+004
        12345.ToString("f4"; //生成 12345.0000
        12345.ToString("x"; //生成 3039 (16进制)
        12345.ToString("p"; //生成 1,234,500.00%
        
        4、变量.Length 数字型
        取字串长度:
        如: string str="中国";
        int Len = str.Length ; //Len是自定义变量, str是求测的字串的变量名
        5、System.Text.Encoding.Default.GetBytes(变量)
        字码转换 转为比特码
        如:byte[] bytStr = System.Text.Encoding.Default.GetBytes(str);
        然后可得到比特长度:
        len = bytStr.Length;
        6、System.Text.StringBuilder(""
        字符串相加,(+号是不是也一样?)
        如:System.Text.StringBuilder sb = new System.Text.StringBuilder("";
        sb.Append("中华";
        sb.Append("人民";
        sb.Append("共和国";
        7、变量.Substring(参数1,参数2);
        截取字串的一部分,参数1为左起始位数,参数2为截取几位。
        如:string s1 = str.Substring(0,2);
        8、String user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString();
        取远程用户IP地址
        9、穿过代理服务器取远程用户真实IP地址:
        if(Request.ServerVariables["HTTP_VIA"]!=null){
        string user_IP=Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
        }else{
        string user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString();
        }
        10、 Session["变量"];
        存取Session值;
        如,赋值: Session["username"]="小布什";
        取值: Object objName=Session["username"];
        String strName=objName.ToString();
        清空: Session.RemoveAll();
        11、String str=Request.QueryString["变量"];
        用超链接传送变量。
        如在任一页中建超链接:<a href=Edit.aspx?fbid=23>点击</a>
        在Edit.aspx页中取值:String str=Request.QueryString["fdid"];
        12、DOC对象.CreateElement("新建节点名";
        创建XML文档新节点
        13、父节点.AppendChild(子节点);
        将新建的子节点加到XML文档父节点下
        14、 父节点.RemoveChild(节点);
        删除节点
        15、Response
        Response.Write("字串";
        Response.Write(变量);
        向页面输出。
        Response.Redirect("URL地址");
        跳转到URL指定的页面
        16、char.IsWhiteSpce(字串变量,位数)——逻辑型
        查指定位置是否空字符;
        如:
        string str="中国 人民";
        Response.Write(char.IsWhiteSpace(str,2)); //结果为:True, 第一个字符是0位,2是第三个字符。
        17、char.IsPunctuation(''字符'') --逻辑型
        查字符是否是标点符号
        如:Response.Write(char.IsPunctuation(''A'')); //返回:False
        18、(int)''字符''
        把字符转为数字,查代码点,注意是单引号。
        如:
        Response.Write((int)''中''); //结果为中字的代码:20013
        19、(char)代码
        把数字转为字符,查代码代表的字符。
        如:
        Response.Write((char)22269); //返回“国”字。
        20、 Trim()
        清除字串前后空格
        21 、字串变量.Replace("子字串","替换为"
        字串替换
        如:
        string str="中国";
        str=str.Replace("国","央"; //将国字换为央字
        Response.Write(str); //输出结果为“中央”
        再如:(这个非常实用)
        string str="这是脚本";
        str=str.Replace("<","<font><</font>"; //将左尖括号替换为<font> 与 < 与 </font> (或换为<,但估计经XML存诸后,再提出仍会还原)
        Response.Write(str); //显示为:“这是脚本”
        如果不替换,将不显示,如果是一段脚本,将运行;而替换后,脚本将不运行。
        这段代码的价值在于:你可以让一个文本中的所有HTML标签失效,全部显示出来,保护你的具有交互性的站点。
        具体实现:将你的表单提交按钮脚本加上下面代码:
        string strSubmit=label1.Text; //label1是你让用户提交数据的控件ID。
        strSubmit=strSubmit.Replace("<","<font><</font>";
        然后保存或输出strSubmit。
        用此方法还可以简单实现UBB代码。
        22、Math.Max(i,j)
        取i与j中的最大值
        如 int x=Math.Max(5,10); // x将取值 10
        23、字串对比一般都用: if(str1==str2){ } , 但还有别的方法:
        (1)、
        string str1; str2
        //语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如:
        if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"; }
        (2)、
        //语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.
        (3)、
        //语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.
        24、IndexOf() 、LastIndexOf()
        查找字串中指定字符或字串首次(最后一次)出现的位置,返回索引值,如:
        str1.IndexOf("字"; //查找“字”在str1中的索引值(位置)
        str1.IndexOf("字串";//查找“字串”的第一个字符在str1中的索引值(位置)
        str1.IndexOf("字串",3,2);//从str1第4个字符起,查找2个字符,查找“字串”的第一个字符在str1中的索引值(位置)
        25、Insert()
        在字串中指定索引位插入指定字符。如:
        str1.Insert(1,"字";在str1的第二个字符处插入“字”,如果str1="中国",插入后为“中字国”;
        26、PadLeft()、PadRight()
        在字串左(或右)加空格或指定char字符,使字串达到指定长度,如:
        <%
        string str1="中国人";
        str1=str1.PadLeft(10,''1''); //无第二参数为加空格
        Response.Write(str1); //结果为“1111111中国人” , 字串长为10
        %>
        27、Remove()
        从指定位置开始删除指定数的字符
        字串对比一般都用: if(str1==str2){ } , 但还有别的方法:
        1、
        string str1; str2
        //语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如:
        if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"; }
        2、
        //语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.
        3、
        //语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.
        IndexOf()
        查找字串中指定字符或字串首次出现的位置,返首索引值,如:
        str1.IndexOf("字"; //查找“字”在str1中的索引值(位置)
        str1.IndexOf("字串";//查找“字串”的第一个字符在str1中的索引值(位置)
        str1.IndexOf("字串",3,2);//从str1第4个字符起,查找2个字符,查找“字串”的第一个字符在str1中的索引值(位置)
        loading...
        
        
        2006-2-2
        .NET开发中的一些小技巧
        
        这篇文章来自是Mukund Pujari的《Some Cool Tips for .NET》,本人给大家翻译总结一下,我英语水平也就那么回事,不合适的地方还是请大家提出来。
        1. 如何创建一个可改变大小没有标题栏的窗体?(How to create a form with resizing borders and no title bar?)
        form1.Text = string. Empty;
        form1.ControlBox = false;
        
        2. 如何在.NET的Windows窗体上启用XP主题集?(How to use XP Themes with Windows Forms using the .NET?)
        确认你的控件中FlatStyle属性已经修改为System,再修改Main方法。
        static void Main()
        {
         Application.EnableVisualStyles();
         Application.DoEvents();
         Application. Run(new Form1());
        }
        
        3. 如何为一个窗体设置一个默认按钮?(How to set the default button for a form?)
        form1.AcceptButton = button1;
        4. 如何为一个窗体设置一个取消按钮?(How to set the Cancel button for a form?)
        form1.CancelButton = button1;
        5. 如何阻止一个窗体标题显示在任务栏上?(How to prevent a form from being shown in the taskbar?)
        设置窗体的ShowIntaskbar属性为False
        6. 如何用现有可用字体绑定到ComboBox控件?(How to fill a ComboBox with the available fonts?)
        comboBox1.Items.AddRange (FontFamily.Families);
        7. 如何禁止TextBox控件默认的邮件菜单?(How to disable the default ContextMenu of a TextBox?)
        textBox1.ContextMenu = new ContextMenu ();
        8. 如何获取“我的文档”等一些系统文件夹路径?(How to get the path for "My Documents" and other system folders?)
        Environment.SpecialFolder中包含了一些系统文件夹信息
        MessageBox.Show(Environment.GetFolderPath( Environment.SpecialFolder.Personal );
        9. 如何获取应用程序当前执行的路径?(How to get the path to my running EXE?)
        string appPath = Application.ExecutablePath;
        10. 如何确定当前运行的系统?(How to determine which operating system is running?)
        OperatingSystem os = Environment.OSVersion;
        MessageBox.Show(os.Version.ToString());
        MessageBox.Show(os.Platform.ToString());
        11. 如何从完整的路径中获取文件名?(How to get a file's name from the complete path string?)
        用System.IO.Path.GetFileName 和 System.IO.Path.GetFileNameWithoutExtension(无扩展名)的方法
        12. 如何从完整的路径中获取文件扩展名?(How to get a file's extension from the complete path string?)
        用System.IO.Path.GetExtension方法
        13. 如何使没有选择日期的DateTimePicker控件为空文本?(How to make the DateTimePicker show empty text if no date is selected?)
        dateTimePicker1.CustomFormat = " ";
        dateTimePicker1.Format = DateTimePickerFormat.Custom;
        14. 如何在Report Viewer中隐藏Crystal Report的状态栏?(How to hide the status bar of Crystal Report in Report Viewer?)
        foreach(object obj in this.crystalReportViewer1.Controls)
        {
         if( obj.GetType()== typeof(System.Windows.Forms.StatusBar))
         {
         StatusBar sBar=(StatusBar)obj;
         sBar.Visible=false;
         }
        }
        
        15. 如何利用Crystal Report程序来生成PDF版本?(How to generate PDF version of Crystal Report programmatically?)
        ReportDocument O_Report=new ReportDocument();
        ExportOptions exportOpts = new ExportOptions();
        PdfRtfWordFormatOptions pdfFormatOpts = new PdfRtfWordFormatOptions ();
        DiskFileDestinationOptions diskOpts = new DiskFileDestinationOptions();
        exportOpts = O_Report.ExportOptions;
        // 设置PDF格式
        exportOpts.ExportFormatType = ExportFormatType.PortableDocFormat;
        exportOpts.FormatOptions = pdfFormatOpts;
        // 设置文件选项和导出
        exportOpts.ExportDestinationType = ExportDestinationType.DiskFile;
        diskOpts.DiskFileName = "C://Trial.pdf"; //设置PDF导出路径
        exportOpts.DestinationOptions = diskOpts;
        O_Report.Export ();
        
        16.通过代码如何输入多行文本?(How to enter multiline text in textbox through code? )
        利用TextBox控件的LINES属性
        string [] strAddress = {"Mukund Pujari","Global Transformation Technologies","Pune, India"};
        textBox1.MultiLine=true;
        textBox1.Lines=strAddress;
        或者
        textBox1.Text="Line 1"r"nLine2"r"nLine3.";
        或者
        用"System.Environment.NewLine"来替代换行符号
        17. 如何在DataGrid中去掉CheckBox不确定状态?(How to remove the indeterminate status of checkbox in datagrid?)
        DataGridTableStyle ts1 = new DataGridTableStyle(); //创建Table样式
        ts1.MappingName = "Items"; //分配要应用样式的Data Table
        DataGridColumnStyle boolCol = new DataGridBoolColumn(); // 创建CheckBox列
        boolCol.MappingName = "ch"; //分配数据列名称
        boolCol.AllowNull=false; // 修改AllowNull属性
        18. 如何在用一个数据源DataTable绑定两个控件,确保变化不反映在两个控件中?( How to bind two controls to the same DataTable without having changes in one control also change the other control?)
        我们在一个Form中放置一个ListBox和一个ComboBox控件,当数据源是一个DataTable而且绑定的ValueMember一 致的时候我们选择ListBox中的一个Item时,ComboBox控件中的相同的Item也会被自动选中,我们可以采取建立新的上下文绑定对象来拒绝 这样的同步操作
        comboBox1.DataSource = dataset.Tables[ "Items" ];
        comboBox1.ValueMember = "CustomerID";
        comboBox1.DisplayMember = "CustomerID";
        listBox1.BindingContext = new BindingContext(); // 设置新的上下文绑定对象
        listBox1.DataSource = dataset.Tables[ "Items" ];
        listBox1.ValueMember = "CustomerID";
        listBox1.DisplayMember = "CustomerID";
        19. 一个简单的创建链接字符串的方法。(An easy way to build connection string.)
        记事本创建一个New.udl的文件,一个Microsoft 数据链接文件
        双击打开,熟悉吧
        按照向导创建完成一个数据库链接,测试成功
        确定后,链接字符串写入这个文件,用记事本打开就看到了
        20. 如何打开客户端E-Mail程序,Windows应用和Web应用?( How to open default E-mail client on your system with all parameters entered in it,like Outlook Express or Eudora, from your .NET windows or Web Application? )
        Web Application:
        A href="mailto:email@address1.com,email@address2.com?cc=email@address3.com&Subject=Hello&body=Happy New Year"
        Windows Application:
        引用System.Diagnostics.Process 命名空间
        Process process = new Process();
        process.StartInfo.FileName = "mailto:email@address1.com,email@address2.com?subject=Hello&cc=email@address3.com
        &bcc=email@address4.com&body=Happy New Year" ;
        process.Start();
        21. VB.NET和C#有什么不同?( What is difference beween VB.NET and C#.NET? )
        去微软下载一个文档吧,http://download.microsoft.com/download/6/3/5/6354bf47-c597-4029-89e9-2495e7539ab9/vbcsharpwp.exe
        22. How to find whether your system has mouse or the number of buttons, whether it has wheel, or whether the mouse buttons are swapped or size of your monitor and many such information?
        23. 如何使Windows Form上的Panel或者Label控件半透明?(How to make a Panel or Label semi-transparent on a Windows Form? )
        通过设置控件背景色的alpha值
        panel1.BackColor = Color.FromArgb(65, 204, 212, 230);
        注意:在设计时手动输入这些值,不要用颜色选取
        24. C#程序的主函数写[STA Thread] 属性是什么目的?(What is the purpose of the [STA Thread] attribute for the Main method of a C# program? )
        http://community.csdn.net/Expert/topic/4132/4132313.xml?temp=.2285272
        
        25. 如何触发Button的Click事件?(How to trigger a button click event? )
        button1.PerformClick();
        
        loading...
        
        
        2006-1-17
        ASP.NET程式中常用的三十三種代碼二
        18.日期格式化
          【aspx頁面內:<%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date"%>
          顯示為: 2004-8-11 19:44:28
          我只想要:2004-8-11 】
        <%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date","{0:yyyy-M-d}"%>
          應該如何改?
          【格式化日期】
          取出來,一般是object((DateTime)objectFromDB).ToString("yyyy-MM-dd";
          【日期的驗證運算式】
          A.以下正確的輸入格式: [2004-2-29], [2004-02-29 10:29:39 pm], [2004/12/31]
        ^(("d{2}(([02468][048])|([13579][26]))["-"/"s]?((((0?[13578])| (1[02]))["-"/"s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))["- "/"s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2["-"/"s]?((0?[1-9])|([1-2] [0-9])))))|("d{2}(([02468][1235679])|([13579][01345789]))["-"/"s]?((((0? [13578])|(1[02]))["-"/"s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])| (11))["-"/"s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2["-"/"s]?((0?[1-9])| (1[0-9])|(2[0-8]))))))("s(((0?[1-9])|(1[0-2]))"[0-5][0-9])(("s)|("[0-5] [0-9])"s))([AM|PM|am|pm]{2,2})))?$
          B.以下正確的輸入格式:[0001-12-31], [9999 09 30], [2002/03/03]
        ^"d{4}["-"/"s]?((((0[13578])|(1[02]))["-"/"s]?(([0-2][0-9])| (3[01])))|(((0[469])|(11))["-"/"s]?(([0-2][0-9])|(30)))|(02["-"/"s]? [0-2][0-9]))$
          【大小寫轉換】
        HttpUtility.HtmlEncode(string);
        HttpUtility.HtmlDecode(string)
          
        19.如何設定全局變數
          Global.asax中
          Application_Start()事件中
          添加Application[屬性名] = xxx;
          就是你的全局變數
        20.怎樣作到HyperLinkColumn生成的連接後,點擊連接,打開新窗口?
          HyperLinkColumn有個屬性Target,將器值設置成"_blank"即可.(Target="_blank"
          【ASPNETMENU】點擊功能表項彈出新窗口
          在你的menuData.xml文件的功能表項中加入URLTarget="_blank",如:
        <?xml version="1.0" encoding="GB2312"?>
        <MenuData ImagesBaseURL="images/">
        <MenuGroup>
        <MenuItem Label="內參資訊" URL="Infomation.aspx" >
        <MenuGroup ID="BBC">
        <MenuItem Label="公告資訊" URL="Infomation.aspx" URLTarget="_blank" LeftIcon="file.gif"/>
        <MenuItem Label="編制資訊簡報" URL="NewInfo.aspx" LeftIcon="file.gif" />
        ......
          最好將你的aspnetmenu升級到1.2版
        21.讀取DataGrid控件TextBox值
        foreach(DataGrid dgi in yourDataGrid.Items)
        {
         TextBox tb = (TextBox)dgi.FindControl("yourTextBoxId";
         tb.Text....
        }
          23.在DataGrid中有3個模板列包含Textbox分別為 DG_ShuLiang (數量) DG_DanJian(單價) DG_JinE(金額)分別在5.6.7列,要求在錄入數量及單價的時候自動算出金額即:數量*單價=金額還要求錄入時限制為 數值型.我如何用客戶端腳本實現這個功能?
          〖思歸〗
        <asp:TemplateColumn HeaderText="數量">
        <ItemTemplate>
        <asp:TextBox id="ShuLiang" runat=’server’ Text=’<%# DataBinder.Eval(Container.DataItem,"DG_ShuLiang"%>’
        onkeyup="javascriptoCal()"
        />
        <asp:RegularExpressionValidator id="revS" runat="server" ControlToValidate="ShuLiang" ErrorMessage="must be integer" ValidationExpression="^"d+$" />
        </ItemTemplate>
        </asp:TemplateColumn>
        <asp:TemplateColumn HeaderText="單價">
        <ItemTemplate>
        <asp:TextBox id="DanJian" runat=’server’ Text=’<%# DataBinder.Eval(Container.DataItem,"DG_DanJian"%>’
        onkeyup="javascriptoCal()"
        />
        <asp:RegularExpressionValidator id="revS2" runat="server" ControlToValidate="DanJian" ErrorMessage="must be numeric" ValidationExpression="^"d+("."d*)?$" />
        </ItemTemplate>
        </asp:TemplateColumn>
        <asp:TemplateColumn HeaderText="金額">
        <ItemTemplate>
        <asp:TextBox id="JinE" runat=’server’ Text=’<%# DataBinder.Eval(Container.DataItem,"DG_JinE"%>’ />
        </ItemTemplate>
        </asp:TemplateColumn><script language="javascript">
        function DoCal()
        {
         var e = event.srcElement;
         var row = e.parentNode.parentNode;
         var txts = row.all.tags("INPUT";
         if (!txts.length || txts.length < 3)
          return;
         var q = txts[txts.length-3].value;
         var p = txts[txts.length-2].value;
         if (isNaN(q) || isNaN(p))
          return;
         q = parseInt(q);
         p = parseFloat(p);
         txts[txts.length-1].value = (q * p).toFixed(2);
        }
        </script>
        24.datagrid選定比較底下的行時,為什麼總是刷新一下,然後就滾動到了最上面,剛才選定的行因螢幕的關係就看不到了。
        page_load
        page.smartNavigation=true
        25.在Datagrid中修改數據,當點擊編輯鍵時,數據出現在文本框中,怎麼控制文本框的大小 ?
        private void DataGrid1_ItemDataBound(obj sender,DataGridItemEventArgs e)
        {
         for(int i=0;i<e.Item.Cells.Count-1;i++)
          if(e.Item.ItemType==ListItemType.EditType)
          {
           e.Item.Cells[i].Attributes.Add("Width", "80px"
          }
        }
          
        26.對話方塊
        private static string ScriptBegin = "<script language=""JavaScript"">";
        private static string ScriptEnd = "</script>";
        public static void ConfirmMessageBox(string PageTarget,string Content)
        {
         string ConfirmContent="var retValue=window.confirm(’"+Content+"’);"+"if(retValue){window.location=’"+PageTarget+"’;}";
         ConfirmContent=ScriptBegin + ConfirmContent + ScriptEnd;
         Page ParameterPage = (Page)System.Web.HttpContext.Current.Handler;
         ParameterPage.RegisterStartupScript("confirm",ConfirmContent);
         //Response.Write(strScript);
        }
        27. 將時間格式化:string aa=DateTime.Now.ToString("yyyy年MM月dd日";
          1.1 取當前年月日時分秒
        currentTime=System.DateTime.Now;
          1.2 取當前年
        int 年= DateTime.Now.Year;
          1.3 取當前月
        int 月= DateTime.Now.Month;
          1.4 取當前日
        int 日= DateTime.Now.Day;
          1.5 取當前時
        int 時= DateTime.Now.Hour;
          1.6 取當前分
        int 分= DateTime.Now.Minute;
          1.7 取當前秒
        int 秒= DateTime.Now.Second;
          1.8 取當前毫秒
        int 毫秒= DateTime.Now.Millisecond;
          
        28.自定義分頁代碼:
          先定義變數 :
        public static int pageCount; //總頁面數
        public static int curPageIndex=1; //當前頁面
          下一頁:
        if(DataGrid1.CurrentPageIndex < (DataGrid1.PageCount - 1))
        {
         DataGrid1.CurrentPageIndex += 1;
         curPageIndex+=1;
        }
        bind(); // DataGrid1數據綁定函數
          上一頁:
        if(DataGrid1.CurrentPageIndex >0)
        {
         DataGrid1.CurrentPageIndex += 1;
         curPageIndex-=1;
        }
        bind(); // DataGrid1數據綁定函數
          直接頁面跳轉:
        int a=int.Parse(JumpPage.Value.Trim());//JumpPage.Value.Trim()為跳轉值
        if(a<DataGrid1.PageCount)
        {
         this.DataGrid1.CurrentPageIndex=a;
        }
        bind();
        29.DataGrid使用:
          添加刪除確認:
        private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
        {
         foreach(DataGridItem di in this.DataGrid1.Items)
         {
          if(di.ItemType==ListItemType.Item||di.ItemType==ListItemType.AlternatingItem)
          {
           ((LinkButton)di.Cells[8].Controls[0]).Attributes.Add("onclick","return confirm(’確認刪除此項嗎?’);";
          }
         }
        }
          樣式交替:
        ListItemType itemType = e.Item.ItemType;
        if (itemType == ListItemType.Item
        {
         e.Item.Attributes["onmouseout"] = "javascript:this.style.backgroundColor=’#FFFFFF’;";
         e.Item.Attributes["onmouseover"] = "javascript:this.style.backgroundColor=’#d9ece1’;cursor=’hand’;" ;
        }
        else if( itemType == ListItemType.AlternatingItem)
        {
         e.Item.Attributes["onmouseout"] = "javascript:this.style.backgroundColor=’#a0d7c4’;";
         e.Item.Attributes["onmouseover"] = "javascript:this.style.backgroundColor=’#d9ece1’;cursor=’hand’;" ;
        }
          添加一個編號列:
        DataTable dt= c.ExecuteRtnTableForAccess(sqltxt); //執行sql返回的DataTable
        DataColumn dc=dt.Columns.Add("number",System.Type.GetType("System.String");
        for(int i=0;i<dt.Rows.Count;i++)
        {
         dt.Rows[i]["number"]=(i+1).ToString();
        }
        DataGrid1.DataSource=dt;
        DataGrid1.DataBind();
          DataGrid1中添加一個CheckBox,頁面中添加一個全選框
        private void CheckBox2_CheckedChanged(object sender, System.EventArgs e)
        {
         foreach(DataGridItem thisitem in DataGrid1.Items)
         {
          ((CheckBox)thisitem.Cells[0].Controls[1]).Checked=CheckBox2.Checked;
         }
        }
          將當前頁面中DataGrid1顯示的數據全部刪除
        foreach(DataGridItem thisitem in DataGrid1.Items)
        {
         if(((CheckBox)thisitem.Cells[0].Controls[1]).Checked)
         {
          string strloginid= DataGrid1.DataKeys[thisitem.ItemIndex].ToString();
          Del (strloginid); //刪除函數
         }
        }
          
        30.當文件在不同目錄下,需要獲取數據庫連接字符串(如果連接字符串放在Web.config,然後在Global.asax中初始化)
          在Application_Start中添加以下代碼:
        Application["ConnStr"]=this.Context.Request.PhysicalApplicationPath+ConfigurationSettings.
           AppSettings["ConnStr"].ToString();
          
        31. 變數.ToString()
          字符型轉換 轉為字符串
        12345.ToString("n"; //生成 12,345.00
        12345.ToString("C"; //生成 ¥12,345.00
        12345.ToString("e"; //生成 1.234500e+004
        12345.ToString("f4"; //生成 12345.0000
        12345.ToString("x"; //生成 3039 (16進制)
        12345.ToString("p"; //生成 1,234,500.00%
          
        32、變數.Substring(參數1,參數2);
          截取字串的一部分,參數1為左起始位數,參數2為截取幾位。 如:string s1 = str.Substring(0,2);
          
        33.在自己的網站上登陸其他網站:(如果你的頁面是通過嵌套方式的話,因為一個頁面只能有一個FORM,這時可以導向另外一個頁面再提交登陸資訊)
        <SCRIPT language="javascript">
        <!--
         function gook(pws)
         {
          frm.submit();
         }
        //-->
        </SCRIPT> <body leftMargin="0" topMargin="0" onload="javascript:gook()" marginwidth="0" marginheight="0">
        <form name="frm" action=" http://220.194.55.68:6080/login.php?retid=7259 " method="post">
        <tr>
        <td>
        <input id="f_user" type="hidden" size="1" name="f_user" runat="server">
        <input id="f_domain" type="hidden" size="1" name="f_domain" runat="server">
        <input class="box" id="f_pass" type="hidden" size="1" name="pwshow" runat="server">
        <INPUT id="lng" type="hidden" maxLength="20" size="1" value="5" name="lng">
        <INPUT id="tem" type="hidden" size="1" value="2" name="tem">
        </td>
        </tr>
        </form>
          文本框的名稱必須是你要登陸的網頁上的名稱,如果源碼不行可以用vsniffer 看看。
          下面是獲取用戶輸入的登陸資訊的代碼:
        string name;
        name=Request.QueryString["EmailName"];
        try
        {
         int a=name.IndexOf("@",0,name.Length);
         f_user.Value=name.Substring(0,a);
         f_domain.Value=name.Substring(a+1,name.Length-(a+1));
         f_pass.Value=Request.QueryString["Psw"];
        }
        catch
        {
         Script.Alert("錯誤的郵箱!";
         Server.Transfer("index.aspx";
        }
        loading...
        
        
        2006-1-17
        ASP.NET程式中常用的三十三種代碼一
        1. 打開新的窗口並傳送參數:
          傳送參數:
        response.write("<script>window.open(’*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"’)</script>"
          接收參數:
        string a = Request.QueryString("id";
        string b = Request.QueryString("id1";
        2.為按鈕添加對話方塊
        Button1.Attributes.Add("onclick","return confirm(’確認?’)";
        button.attributes.add("onclick","if(confirm(’are you sure...?’)){return true;}else{return false;}"
        3.刪除表格選定記錄
        int intEmpID = (int)MyDataGrid.DataKeys[e.Item.ItemIndex];
        string deleteCmd = "DELETE from Employee where emp_id = " + intEmpID.ToString()
        4.刪除表格記錄警告
        private void DataGrid_ItemCreated(Object sender,DataGridItemEventArgs e)
        {
         switch(e.Item.ItemType)
         {
          case ListItemType.Item :
          case ListItemType.AlternatingItem :
          case ListItemType.EditItem:
           TableCell myTableCell;
           myTableCell = e.Item.Cells[14];
           LinkButton myDeleteButton ;
           myDeleteButton = (LinkButton)myTableCell.Controls[0];
           myDeleteButton.Attributes.Add("onclick","return confirm(’您是否確定要刪除這條資訊’);";
           break;
          default:
           break;
         }
        }
        5.點擊表格行鏈結另一頁
        private void grdCustomer_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
        {
         //點擊表格打開
         if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
          e.Item.Attributes.Add("onclick","window.open(’Default.aspx?id=" + e.Item.Cells[0].Text + "’);";
        }
          雙擊表格連接到另一頁
          在itemDataBind事件中
        if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
         string OrderItemID =e.item.cells[1].Text;
         ...
         e.item.Attributes.Add("ondblclick", "location.href=’../ShippedGrid.aspx?id=" + OrderItemID + "’";
        }
          雙擊表格打開新一頁
        if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
         string OrderItemID =e.item.cells[1].Text;
         ...
         e.item.Attributes.Add("ondblclick", "open(’../ShippedGrid.aspx?id=" + OrderItemID + "’)";
        }
        6.表格超連接列傳遞參數
        <asp:HyperLinkColumn Target="_blank" headertext="ID號" DataTextField="id" NavigateUrl="aaa.aspx?id=’
         <%# DataBinder.Eval(Container.DataItem, "數據字段1"%>’ & name=’<%# DataBinder.Eval(Container.DataItem, "數據字段2"%>’ />
        7.表格點擊改變顏色
        if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)
        {
         e.Item.Attributes.Add("onclick","this.style.backgroundColor=’#99cc00’;
            this.style.color=’buttontext’;this.style.cursor=’default’;";
        }
          寫在DataGrid的_ItemDataBound裏
        if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)
        {
        e.Item.Attributes.Add("onmouseover","this.style.backgroundColor=’#99cc00’;
           this.style.color=’buttontext’;this.style.cursor=’default’;";
        e.Item.Attributes.Add("onmouseout","this.style.backgroundColor=’’;this.style.color=’’;";
        }
        8.關於日期格式
          日期格式設定
        DataFormatString="{0:yyyy-MM-dd}"
          我覺得應該在itembound事件中
        e.items.cell["你的列"].text=DateTime.Parse(e.items.cell["你的列"].text.ToString("yyyy-MM-dd")
          
        9.獲取錯誤資訊並到指定頁面
          不要使用Response.Redirect,而應該使用Server.Transfer
          e.g
        // in global.asax
        protected void Application_Error(Object sender, EventArgs e) {
        if (Server.GetLastError() is HttpUnhandledException)
        Server.Transfer("MyErrorPage.aspx";
        //其餘的非HttpUnhandledException異常交給ASP.NET自己處理就okay了
        }
          Redirect會導致post-back的產生從而丟失了錯誤資訊,所以頁面導向應該直接在伺服器端執行,這樣就可以在錯誤處理頁面得到出錯資訊並進行相應的處理
        10.清空Cookie
        Cookie.Expires=[DateTime];
        Response.Cookies("UserName".Expires = 0
          
        11.自定義異常處理
        //自定義異常處理類
        using System;
        using System.Diagnostics;
        namespace MyAppException
        {
         /// <summary>
         /// 從系統異常類ApplicationException繼承的應用程式異常處理類。
         /// 自動將異常內容記錄到Windows NT/2000的應用程式日誌
         /// </summary>
         public class AppException:System.ApplicationException
         {
          public AppException()
          {
           if (ApplicationConfiguration.EventLogEnabled)LogEvent("出現一個未知錯誤。";
          }
         public AppException(string message)
         {
          LogEvent(message);
         }
         public AppException(string message,Exception innerException)
         {
          LogEvent(message);
          if (innerException != null)
          {
           LogEvent(innerException.Message);
          }
         }
         //日誌記錄類
         using System;
         using System.Configuration;
         using System.Diagnostics;
         using System.IO;
         using System.Text;
         using System.Threading;
         namespace MyEventLog
         {
          /// <summary>
          /// 事件日誌記錄類,提供事件日誌記錄支援
          /// <remarks>
          /// 定義了4個日誌記錄方法 (error, warning, info, trace)
          /// </remarks>
          /// </summary>
          public class ApplicationLog
          {
           /// <summary>
           /// 將錯誤資訊記錄到Win2000/NT事件日誌中
           /// <param name="message">需要記錄的文本資訊</param>
           /// </summary>
           public static void WriteError(String message)
           {
            WriteLog(TraceLevel.Error, message);
           }
           /// <summary>
           /// 將警告資訊記錄到Win2000/NT事件日誌中
           /// <param name="message">需要記錄的文本資訊</param>
           /// </summary>
           public static void WriteWarning(String message)
           {
            WriteLog(TraceLevel.Warning, message);  
           }
           /// <summary>
           /// 將提示資訊記錄到Win2000/NT事件日誌中
           /// <param name="message">需要記錄的文本資訊</param>
           /// </summary>
           public static void WriteInfo(String message)
           {
            WriteLog(TraceLevel.Info, message);
           }
           /// <summary>
           /// 將跟蹤資訊記錄到Win2000/NT事件日誌中
           /// <param name="message">需要記錄的文本資訊</param>
           /// </summary>
           public static void WriteTrace(String message)
           {
            WriteLog(TraceLevel.Verbose, message);
           }
           /// <summary>
           /// 格式化記錄到事件日誌的文本資訊格式
           /// <param name="ex">需要格式化的異常對象</param>
           /// <param name="catchInfo">異常資訊標題字符串.</param>
           /// <retvalue>
           /// <para>格式後的異常資訊字符串,包括異常內容和跟蹤堆棧.</para>
           /// </retvalue>
           /// </summary>
           public static String FormatException(Exception ex, String catchInfo)
           {
            StringBuilder strBuilder = new StringBuilder();
            if (catchInfo != String.Empty)
            {
             strBuilder.Append(catchInfo).Append(""r"n";
            }
            strBuilder.Append(ex.Message).Append(""r"n".Append(ex.StackTrace);
            return strBuilder.ToString();
           }
           /// <summary>
           /// 實際事件日誌寫入方法
           /// <param name="level">要記錄資訊的級別(error,warning,info,trace).</param>
           /// <param name="messageText">要記錄的文本.</param>
           /// </summary>
           private static void WriteLog(TraceLevel level, String messageText)
           {
            try
            {
             EventLogEntryType LogEntryType;
             switch (level)
             {
              case TraceLevel.Error:
               LogEntryType = EventLogEntryType.Error;
               break;
              case TraceLevel.Warning:
               LogEntryType = EventLogEntryType.Warning;
               break;
              case TraceLevel.Info:
               LogEntryType = EventLogEntryType.Information;
               break;
              case TraceLevel.Verbose:
               LogEntryType = EventLogEntryType.SuccessAudit;
               break;
              default:
               LogEntryType = EventLogEntryType.SuccessAudit;
               break;
             }
             EventLog eventLog = new EventLog("Application", ApplicationConfiguration.EventLogMachineName, ApplicationConfiguration.EventLogSourceName ;
             //寫入事件日誌
             eventLog.WriteEntry(messageText, LogEntryType);
            }
           catch {} //忽略任何異常
          }
         } //class ApplicationLog
        }
         12.Panel 橫向滾動,縱向自動擴展
        <aspanel style="overflow-x:scroll;overflow-y:auto;"></aspanel>
          
        13.回車轉換成Tab
        <script language="javascript" for="document" event="onkeydown">
         if(event.keyCode==13 && event.srcElement.type!=’button’ && event.srcElement.type!=’submit’ &&     event.srcElement.type!=’reset’ && event.srcElement.type!=’’&& event.srcElement.type!=’textarea’);
           event.keyCode=9;
        </script>
        onkeydown="if(event.keyCode==13) event.keyCode=9"
          
        14.DataGrid超級連接列
        DataNavigateUrlField="字段名" DataNavigateUrlFormatString="http://xx/inc/delete.aspx?ID={0}"
          
        15.DataGrid行隨滑鼠變色
        private void DGzf_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
        {
         if (e.Item.ItemType!=ListItemType.Header)
         {
          e.Item.Attributes.Add( "onmouseout","this.style.backgroundColor="""+e.Item.Style["BACKGROUND-COLOR"]+"""";
          e.Item.Attributes.Add( "onmouseover","this.style.backgroundColor="""+ "#EFF3F7"+"""";
         }
        }
        16.模板列
        <ASP:TEMPLATECOLUMN visible="False" sortexpression="demo" headertext="ID">
        <ITEMTEMPLATE>
        <ASP:LABEL text=’<%# DataBinder.Eval(Container.DataItem, "ArticleID"%>’ runat="server" width="80%" id="lblColumn" />
        </ITEMTEMPLATE>
        </ASP:TEMPLATECOLUMN>
        <ASP:TEMPLATECOLUMN headertext="選中">
        <HEADERSTYLE wrap="False" horizontalalign="Center"></HEADERSTYLE>
        <ITEMTEMPLATE>
        <ASP:CHECKBOX id="chkExport" runat="server" />
        </ITEMTEMPLATE>
        <EDITITEMTEMPLATE>
        <ASP:CHECKBOX id="chkExportON" runat="server" enabled="true" />
        </EDITITEMTEMPLATE>
        </ASP:TEMPLATECOLUMN>
          後臺代碼
        protected void CheckAll_CheckedChanged(object sender, System.EventArgs e)
        {
         //改變列的選定,實現全選或全不選。
         CheckBox chkExport ;
         if( CheckAll.Checked)
         {
          foreach(DataGridItem oDataGridItem in MyDataGrid.Items)
          {
           chkExport = (CheckBox)oDataGridItem.FindControl("chkExport";
           chkExport.Checked = true;
          }
         }
         else
         {
          foreach(DataGridItem oDataGridItem in MyDataGrid.Items)
          {
           chkExport = (CheckBox)oDataGridItem.FindControl("chkExport";
           chkExport.Checked = false;
          }
         }
        }
          
        17.數字格式化
          【<%#Container.DataItem("price"%>的結果是500.0000,怎樣格式化為500.00?】
        <%#Container.DataItem("price","{0:¥#,##0.00}"%>
        int i=123456;
        string s=i.ToString("###,###.00";
        
        loading...
        
        
        2006-1-17
        ASP.NET中調用存儲過程方法
          在使用.NET的過程中,數據庫訪問是一個很重要的部分,特別是在B/S系統的構建過程中,數據庫操作幾乎成為了一個必不可少的操作。調用存 儲過程實現數據庫操作使很多程式員使用的方法,而且大多數的程式員都是能使用存儲過程就使用存儲過程,很少直接使用SQL語句,所以存儲過程是很有用而且 很重要的。
          存儲過程簡介
          簡單的說,存儲過程是由一些SQL語句和控制語句組成的被封裝起來的過程,它駐留在數據庫中,可以被客戶應用程式調用,也可以從另一個過程或 觸發器調用。它的參數可以被傳遞和返回。與應用程式中的函數過程類似,存儲過程可以通過名字來調用,而且它們同樣有輸入參數和輸出參數。
          根據返回值類型的不同,我們可以將存儲過程分為三類:返回記錄集的存儲過程, 返回數值的存儲過程(也可以稱為標量存儲過程),以及行為存儲過程。顧名思義,返回記錄集的存儲過程的執行結果是一個記錄集,典型的例子是從數據庫中檢索 出符合某一個或幾個條件的記錄;返回數值的存儲過程執行完以後返回一個值,例如在數據庫中執行一個有返回值的函數或命令;最後,行為存儲過程僅僅是用來實 現數據庫的某個功能,而沒有返回值,例如在數據庫中的更新和刪除操作。
          使用存儲過程的好處
          相對於直接使用SQL語句,在應用程式中直接調用存儲過程有以下好處:
          (1)減少網路通信量。調用一個行數不多的存儲過程與直接調用SQL語句的網路通信量可能不會有很大的差別,可是如果存儲過程包含上百行SQL語句,那麼其性能絕對比一條一條的調用SQL語句要高得多。
          (2)執行速度更快。有兩個原因:首先,在存儲過程創建的時候,數據庫已經對其進行了一次解析和優化。其次,存儲過程一旦執行,在內存中就會保留一份這個存儲過程,這樣下次再執行同樣的存儲過程時,可以從內存中直接調用。
          (3)更強的適應性:由於存儲過程對數據庫的訪問是通過存儲過程來進行的,因此數據庫開發人員可以在不改動存儲過程接口的情況下對數據庫進行任何改動,而這些改動不會對應用程式造成影響。
          (4) 布式工作:應用程式和數據庫的編碼工作可以分別獨立進行,而不會相互壓制。
          由以上的分析可以看到,在應用程式中使用存儲過程是很有必要的。
          兩種不同的存儲過程調用方法
          為了突出新方法的優點,首先介紹一下在.NET中調用存儲過程的“官方”方法。另外,本文的所有示例程式均工作于SqlServer數據庫上,其他情況類似,以後不再一一說明。本文所有例子均採用C#語言。
          要在應用程式中訪問數據庫,一般性的步驟是:首先聲明一個數據庫連接SqlConnection,然後聲明一個數據庫命令 SqlCommand,用來執行SQL語句和存儲過程。有了這兩個對象後,就可以根據自己的需要採用不同的執行方式達到目的。需要補充的是,不要忘記在頁 面上添加如下的引用語句:using System.Data.SqlClient。
          就執行存儲過程來說,如果執行的是第一類存儲過程,那麼就要用一個DataAdapter將結果填充到一個DataSet中,然後就可以使用 數據網格控件將結果呈現在頁面上了;如果執行的是第二和第三種存儲過程,則不需要此過程,只需要根據特定的返回判定操作是否成功完成即可。
          (1)執行一個沒有參數的存儲過程的代碼如下:
        SqlConnection conn=new SqlConnection(“connectionString”);
        SqlDataAdapter da = new SqlDataAdapter();
        da.SelectCommand = new SqlCommand();
        da.SelectCommand.Connection = conn;
        da.SelectCommand.CommandText = "NameOfProcedure";
        da.SelectCommand.CommandType = CommandType.StoredProcedure;
          然後只要選擇適當的方式執行此處過程,用於不同的目的即可。
          (2)執行一個有參數的存儲過程的代碼如下(我們可以將調用存儲過程的函數聲明為ExeProcedure(string inputdate)):
        SqlConnection conn=new SqlConnection(“connectionString”);
        SqlDataAdapter da = new SqlDataAdapter();
        da.SelectCommand = new SqlCommand();
        da.SelectCommand.Connection = conn;
        da.SelectCommand.CommandText = "NameOfProcedure";
        da.SelectCommand.CommandType = CommandType.StoredProcedure;
        (以上代碼相同,以下為要添加的代碼)
        param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
        param.Direction = ParameterDirection.Input;
        param.Value = Convert.ToDateTime(inputdate);
        da.SelectCommand.Parameters.Add(param);
          這樣就添加了一個輸入參數。若需要添加輸出參數:
        param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
        param.Direction = ParameterDirection.Output;
        param.Value = Convert.ToDateTime(inputdate);
        da.SelectCommand.Parameters.Add(param);
          若要獲得參儲過程的返回值:
        param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
        param.Direction = ParameterDirection.ReturnValue;
        param.Value = Convert.ToDateTime(inputdate);
        da.SelectCommand.Parameters.Add(param);
          從上面的代碼我們可以看出,當存儲過程比較多或者存儲過程的參數比較多時,這種方法會大大影響開發的速度;另外一方面,如果項目比較大,那麼 這些用於數據庫邏輯的函數在以後的維護中也是一個很大的負擔。那麼,有沒有一種改進的方法可以解決這個問題呢?想到在執行沒有參數的存儲過程時只需要傳入 一個存儲過程的名字就可以調用相應的存儲過程,而且在SqlServer數據庫中我們可以直接在查詢分析器中敲入“存儲過程名(參數列表)”樣的字符串就 可以執行存儲過程,那麼,是否可以把這種思想應用到應用程式中呢?
          於是在編譯器中鍵入相應代碼。這些代碼是在調用不帶參數的存儲過程的代碼的基礎上改的。具體代碼如下:
        SqlConnection conn=new SqlConnection(“connectionString”);
        SqlDataAdapter da = new SqlDataAdapter();
        da.SelectCommand = new SqlCommand();
        da.SelectCommand.Connection = conn;
        da.SelectCommand.CommandText = "NameOfProcedure(’para1’,’para2’,para3)";
        da.SelectCommand.CommandType = CommandType.StoredProcedure;
          為了使代碼更具有代表性,要調用的存儲過程的第一個和第二個參數都為字符串類型,第三個參數為整型。執行以後發現,完全可以達到預期的效果!
          兩種調用方法的比較
          
          通過比較我們可以看到,第二種方法具有一個很明顯的優點,那就是可以提高開發速度,節省開發時間,而且代碼容易維護,在一定程度上也減少了系 統大小。但是,由於對存儲過程參數的處理比較籠統,如果要獲取輸出參數或者得到存儲過程的返回值,這種方法就不能滿足需要了。雖然如此,但是,這種方法畢 竟可以讓開發人員少些很大一部分的代碼。如果不需要獲取輸出參數和返回值,那麼幾乎可以做到“一勞永逸”。因此在實際的程式開發中,這種方法還是具有一定 的實用價值的。
        loading...
        
        
        2006-1-17
        C#:字符串操作
        从字符串中的数字提取出来,组成一个数组(用正则实现)
         using System.Text.RegularExpressions ; //文件头
         string b = "$1$$2$$3$$42$$51$$150$";
         string[] array = Regex.Split (b, @""$*";
         得到的数组为:
             array[0]=1
         array[1]=2
         array[2]=3
         ..........
        
        loading...
        
        
        2006-1-17
        用Asp.Net 来发送E-mail
        用Asp.Net 来发送E-mail
         在这篇文章中,我们将演示如何编写asp.net来发送emails。这将要讨论到诸如email 格式,优先级别,附件和邮件加密。
         Asp.net通过使用SmtpMail对象来发送邮件。SmtpMail对象发送邮件是通过以下几步来完成的。
         # 导入与mail相关的名称空间。
         # 建立一个message对象并设置属性。
         # 通过SmtpMail对象实例的'Send'方法来发送邮件。
         现在让我们一步步的来了解从asp.net页面发送邮件的过程。
        一. 导入名称空间
         在asp.net页面中导入System.Web.Util名称空间,这个名称空间包含了所有发送邮件所必须的对象。这些对象是:
        对象 简介
        SmtpMail 声明邮件系统(mail system)来发送邮件。
        MailMessage 声明一个消息(message),包含发送地址,接收地址等属性。
        MailFormat 声明消息的格式-Html,Text 等等。
        MailAttachment 声明邮件的附件。
        MailEncoding enum 声明加密方式:Base64 or UUencode.
        MailPriority enum 设置邮件的优先级别:值:高,底,一般
        
        <% @Import Namespace = "System.Web.Util" %>
        二。初始化MailMessage 对象
         使用以下语句可以实现初始化MailMessage对象。
         Dim mailObj AS new MailMessage
         MailMessage对象具有以下属性。
        属性 描述
        From 发送方的email地址
        To 接收方的email地址
        Subject Email的主题
        Body Email的内容
        CC List of recipients copied on the email
        BCC List of recipients blind-copied on the email
        Priority 邮件的优先级别:高,底,一般
        BodyEncoding 加密邮件的内容:Base64 或 UUencode
        BodyFormat 内容的格式:Html 或文本
        Attachments 附件列表
        
        以下几行代码演示了如何使用MailMessage对象的属性的方法。他描述了我们将要创建的消息Message, 而这个消息(message)是用SmtpMail对象来发送的。在我们的这个例子中,mailObj就是MailMeessage对象的实例。
        mailObj.From = "abc@mydomain.com"
        mailObj.To = Request.Form ("to"
        mailObj.Subject = "subject of the mail"
        mailObj.Body = "Message of the mail"
        三。发送邮件
         最后通过SmtpMail对象的'send'方法来发送邮件。下面的代码就是用来发送邮件的。
        SmtpMail.Send(mailObj)
        最后我们把以上的这些应用到一个完整的例子当中来。
        下面是用Asp.net+C#编写的。
        <%@page language="C#" %>
        <%@Import Namespace="System.Web.Util" %>
        <HTML><BODY>
        <SCRIPT LANGUAGE="C#" RUNAT="server">
        // This method is called on the server when the submit
        // button is clicked on the client and when the page
        // posts back to itself
        public void SendMail (Object Obj, EventArgs E)
        {
        
         MailMessage mailObj = new MailMessage();
         // 设置email的'from'和'to'的地址
         mailObj.From = Request.Form("From";
         mailObj.To = Request.Form("To";
         mailObj.Subject = "Subject Of the Mail";
         mailObj.Body = "Body of the Mail";
         // 可选: 使用html格式的Email
         mailObj.BodyFormat = MailFormat.Html;
         // 可选: 对邮件进行加密
         mailObj.BodyEncoding = MailFormat.Base64;
         // 可选: 设置邮件的优先级别为高
         mailObj.Priority = MailPriority.High;
         // 可选: 附件
         // 注意这里我们创建了一个MailAttachment对象来附加一个文件到email。
         mailObj.Attachments.Add(new MailAttachment("c:""test.doc");
         // 使用SmtpMail对象来发送邮件。
         SmtpMail.Send(mailObj);
        }
        </SCRIPT>
        <asp:label ID="Headingmsg" Text="Enter Your Email Address:" RUNAT="server"/>
        <FORM METHOD="post" RUNAT="server">
        Email Recipient: <INPUT TYPE="text" NAME="to"> <br>
        Email Sender: <INPUT TYPE="text" NAME="from">
        <INPUT TYPE="submit" NAME="Submit" VALUE="Send Mail" RUNAT="server" OnServerClick="SendMail">
        </FORM>
        </BODY>
         本人的翻译水平不高,有些地方自己懂,但是要翻译过来还真难,希望大家指正。括号中的英文是自己觉得翻译不准的地方。
        
        loading...
        
        
        2006-1-17
        C与C#读取中文文本文件
        #include "stdlib.h"
        #include "stdio.h"
        #include "dos.h"
        main()
        {
        FILE *fp;
        char filename[20],ch[20];
        int i;
        clrscr();
        printf("Please input a filename "n";
        scanf("%s",filename);
        fp=fopen(filename,"r";
        if (fp==NULL)
         {
         printf("Can not open this file,please check."n";
         sleep(2);
         exit(0);
         }
        while (!feof(fp))
         {
         for (i=0;i<20;i++)
         { ch[i]=fgetc(fp);
         putch(ch[i]);
         }
         }
        getch();
        clrscr();
        }
        ----------------------------------------------------------------
        C#
        using (StreamReader sr = new StreamReader( "c:""info.txt",System.Text.Encoding.GetEncoding("GB2312"))
         {
         // Read and display lines from the file until the end of
         // the file is reached.
         while ((line = sr.ReadLine()) != null)
         {
         //......
         }
         }
        
        loading...
        
        
        2006-1-16
        SQLServer的日期处理--(1)
        1.首先获取日期
         “开始”-〉“所有程序”-〉“MircoSoft SQLServer”-〉“查询分析器”
         在查询分析器里面输入:Select GetDate()
         可以获得当前数据库的时间.
        2.使其格式化输出
         例如你只想获得年份:可以用函数YEAR() PS --大小写不要紧
         Select YEAR(GetDate()) as year PS--跟在as后面是列名
         例如你只想获得月份:可以用函数month()
         Select month(GetDate()) as month
         例如你只想获得某日期:可以用函数day()
         Select day(GetDate()) as day
        如果你使用的是DELPHI 则用Adoquery1.FieldByNae("day" .AsString就可以获得今天是什么日子
        如果你使用的是C# 则用.DataRow("day" .ToString()就可以获得今天是什么日子,在程序上面显示出来
        
        loading...
        
        
        2006-1-12
        ADO记录集和水晶报表
        在使用水晶报表时,经常会感到数据不是很好控制,最后只好使用这个终极绝招咯。那就是使用数据定义文件(TTX),把得到的ADO记录集传送给水晶报表。
        通常情况下,水晶报表是从物理的数据库上创建出来的,但是现在有了32位的Active Data Driver-- P2smon.dll,水晶就可以不用再事先连接到一个数据库上咯。
        首先,需要创建一个TTX文件,进入数据源选择窗体后,如下图选中
        再单击了前面的“+”后弹出数据源窗体
        此时,我们使用“New”按钮创建一个新的数据定义文件(TTX),格式如下
        保存后,我们打开这个文本文件,就会发现TTX文件的格式,原来中间是TAB分割符来的。
        接着,我们就按照水晶报表的老套路画式样,剩下的就是传递记录机集了。
        下面,我们要声明好传递ADO记录集需要的Api,
        Public Declare Function PEOpenEngine Lib "crpe32.dll" () As Integer
        Public Declare Function PEGetErrorCode Lib "crpe32.dll" (ByVal printJob As Integer) As Integer
        Public Declare Function PEOpenPrintJob Lib "crpe32.dll" (ByVal RptName As String) As Integer
        Public Declare Function PEOutputToWindow Lib "crpe32.dll" ( _
        ByVal printJob As Integer, _
        ByVal Title As String, _
        ByVal Left As Long, _
        ByVal Top As Long, _
        ByVal Width As Long, _
        ByVal Height As Long, _
        ByVal style As Long, _
        ByVal PWindow As Long) As Integer
        Public Declare Function PEOutputToPrinter Lib "crpe32.dll" ( _
        ByVal printJob As Integer, _
        ByVal nCopies As Integer) As Integer
        Public Declare Function PEStartPrintJob Lib "crpe32.dll" ( _
        ByVal printJob As Integer, _
        ByVal WaitOrNot As Integer) As Integer
        Public Declare Function PEClosePrintJob Lib "crpe32.dll" (ByVal printJob As Integer) As Integer
        Public Declare Sub PECloseEngine Lib "crpe32.dll" ()
        Public Declare Function CreateFieldDefFile Lib "p2smon.dll" ( _
        lpUnk As Object, ByVal _
        fileName As String, _
        ByVal bOverWriteExistingFile As Long) As Long
        Public Declare Function vbEncodelPtr Lib "p2smon.dll" (x As Object) As String
        Public Declare Function SetActiveDataSource Lib "p2smon.dll" ( _
        ByVal printJob As Integer, _
        ByVal tableNum As Integer, _
        x As Object) As Long
        最后给出的是报表的打印代码
        Dim Job As Integer
        Dim Handle As Integer
        '打开打印引擎
        Handle = PEOpenEngine
        '水晶的错误处理
        If Handle = 0 Then
        ErrorNum = PEGetErrorCode(Handle)
        MsgBox "打印引擎出错!"
        MsgBox "错误代号:" & ErrorNum
        End If
        '打开打印作业
        Job = PEOpenPrintJob(App.Path & ""New.rpt"
        '水晶的错误处理
        If Job = 0 Then
        ErrorNum = PEGetErrorCode(Job)
        MsgBox "打开作业New.rpt 失败!"
        MsgBox "错误代号:" & ErrorNum
        End If
        '给水晶报表传送ADO记录集,AdoRecordset的生成就不再多说了
        Handle = SetActiveDataSource(Job, 0, ADOrs)
        '输出到打印预览窗口
        Handle = PEOutputToWindow(Job, "New.rpt", 0, 0, 520, 520, WS_MAXIMIZE, 0)
        ‘直接输出到打印机
        Handle = PEOutputToPrinter(Job,1)
        '水晶的错误处理
        If Handle <> 0 Then
        Handle = PEStartPrintJob(Job, True)
        If Handle <> 0 Then
        MsgBox "打印完毕"
        Else
        ErrorNum = PEGetErrorCode(Job)
        MsgBox "打印失败!"
        MsgBox "错误代号:" & ErrorNum
        End If
        Else
        ErrorNum = PEGetErrorCode(Job)
        MsgBox "无法输出到窗体或打印机"
        MsgBox "错误代号:" & ErrorNum
        End If
        '关闭打印作业
        PEClosePrintJob (Job)
        '关闭打印引擎
        PECloseEngine
        我使用的是VB6+水晶报表8.5,感觉这种方式比较灵活好用,同时解决了水晶报表补空行的问题。

    3、  变量.ToString() 
    字符型转换  转为字符串 
    12345.ToString("n");  //生成  12,345.00 
    12345.ToString("C");  //生成  ¥12,345.00 
    12345.ToString("e");  //生成  1.234500e+004 
    12345.ToString("f4");  //生成  12345.0000 
    12345.ToString("x");  //生成  3039  (16进制) 
    12345.ToString("p");  //生成  1,234,500.00%

    1.9  取中文日期显示——年月日时分 
    string  strY=currentTime.ToString("f");  //不显示秒 

    1.10  取中文日期显示_年月 
    string  strYM=currentTime.ToString("y"); 

    1.11  取中文日期显示_月日 
    string  strMD=currentTime.ToString("m"); 

    1.12  取中文年月日 
    string  strYMD=currentTime.ToString("D"); 

    1.13  取当前时分,格式为:14:24 
    string  strT=currentTime.ToString("t"); 

    1.14  取当前时间,格式为:2003-09-23T14:46:48 
    string  strT=currentTime.ToString("s"); 

    1.15  取当前时间,格式为:2003-09-23  14:48:30Z 
    string  strT=currentTime.ToString("u"); 

    1.16  取当前时间,格式为:2003-09-23  14:48 
    string  strT=currentTime.ToString("g"); 

    1.17  取当前时间,格式为:Tue,  23  Sep  2003  14:52:40  GMT 
    string  strT=currentTime.ToString("r"); 

    1.18获得当前时间  n  天后的日期时间 
    DateTime  newDay  =  DateTime.Now.AddDays(100); 


    字串变量.Replace("子字串","替换为") 
    字串替换 
    如: 
    string  str="中国"; 
    str=str.Replace("国","央");  //将国字换为央字 
    Response.Write(str);  //输出结果为“中央”

     
        loading...

  • 相关阅读:
    Apache 安装及常用参数设置
    Apache 开启压缩传输
    在 CentOS 上编写 init.d service script [转]
    学习资源
    IO流(10)复制多级文件夹
    IO流(9)复制指定文件夹下指定文件到目的文件夹,并改名
    IO流(8)递归删除带文件的目录
    IO流(7)获取指定文件夹下的所有文件
    IO流(6)获取功能
    IO流(5)判断功能
  • 原文地址:https://www.cnblogs.com/leeolevis/p/1426251.html
Copyright © 2020-2023  润新知