一个将datagrid控件内容输出到excel文件的demo. 生成EXCEL文件复制代码 代码如下:public void setToExcel() { // Response.Clear(); // Response.Buffer= true; // Response.Charset="utf-8";   if (eformsn.Text=="") { DataGrid1.Visible=false; Label1.Text="要汇入EXCEL,请先输入申请单号!"; Label1.Visible=true; } else { dl.DataSource=DB("query", "select * from msi_eol_list_line where eformsn="+eformsn.Text+" order by eformsn").Tables[0].DefaultView; dl.DataBind(); //下面这行很重要,attachment 参数表示作为附件下载,您可以改成online在线打开 //filename=FileFlow.xls 指定输出文件的名称,注意其扩展名和指定文件类型相符,可以为:.doc .xls .txt .htm   Response.AppendHeader("Content-Disposition","attachment;filename=EOL_"+eformsn.Text+".xls"); Response.ContentEncoding=System.Text.Encoding.GetEncoding("utf-8");  //Response.ContentType指定文件类型 可以为application/ms-excel,application/ms-word ,application/ms-txt,application/ms-html或其他浏览器可直接支持文档  Response.ContentType = "application/ms-excel"; dl.EnableViewState = false;  System.IO.StringWriter oStringWriter = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter); //将目标数据绑定到输入流输出   //this 表示输出本页,你也可以绑定datagrid,

然而手机客户端又不支持Session和Cookie传值,其他方法给页面赋值再传值显得太麻烦了,而且还不易维护,容易弄丢出错,于是想到了用HttpModule来把cid参数赋在Url地址上,让url把cid参数每页自动传递下去,需要用cid时只要通过Requet["cid"]获取,这样就不用为传值而烦恼了。 以下是配置方法和源码。 1)在web.config配置文件中添加以下节点 复制代码 代码如下: <httpModules> <add name="HttpModule" type="ThreeHegemony.Utility.AutoAddCid"/> </httpModules> 2)通过继承IHttpModule来实现url传值。 代码 复制代码 代码如下: using System; using System.Text; using System.Web; using System.IO; using System.Text.RegularExpressions; namespace ThreeHegemony.Utility { /// <summary> /// Auther: Jess.zou /// Create data: 2009-08-06 /// Description: 该类作用在Url地址后自动添加(cid) /// </summary> public class AutoAddCid : System.Web.IHttpModule { public void Init(HttpApplication context) { context.PostRequestHandlerExecute += new EventHandler(this.OnPreSendRequestContent); } protected void OnPreSendRequestContent(Object sender, EventArgs e) { System.Web.HttpApplication myContext = (System.Web.HttpApplication)sender; myContext.Response.Filter = new AppendSIDFilter(myContext.Response.Filter); } private void ReUrl_BeginRequest(object sender, EventArgs e) { string cid = ""; string url = ""; HttpContext context = ((HttpApplication)sender).Context; if (string.IsNullOrEmpty(context.Request.QueryString["cid"])) { if (context.Request.QueryString.Count == 0) { url = string.Format("{0}?cid={1}", context.Request.RawUrl, cid); } else { url = string.Format("{0}&cid={1}", context.Request.RawUrl, cid); } } context.RewritePath(url); } public void Dispose() { } public class AppendSIDFilter : Stream { private Stream Sink { get; set; } private long _position; private System.Text.StringBuilder oOutput = new StringBuilder(); public AppendSIDFilter(Stream sink) { Sink = sink; } public override bool CanRead { get { return true; } } public override bool CanSeek { get { return true; } } public override bool CanWrite { get { return true; } } public override long Length { get { return 0; } } public override long Position { get { return _position; } set { _position = value; } } public override long Seek(long offset, System.IO.SeekOrigin direction) { return Sink.Seek(offset, direction); } public override void SetLength(long length) { Sink.SetLength(length); } public override void Close() { Sink.Close(); } public override void Flush() { Sink.Flush(); } public override int Read(byte[] buffer, int offset, int count) { return Sink.Read(buffer, offset, count); } public override void Write(byte[] buffer, int offset, int count) { if (string.IsNullOrEmpty(HttpContext.Current.Request["cid"])) { Sink.Write(buffer, 0, buffer.Length); return; } string content = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count); Regex regex = new Regex(RegexResource.HREF, RegexOptions.IgnoreCase); Regex action_regex = new Regex(RegexResource.ACTION, RegexOptions.IgnoreCase); if (regex.IsMatch(content)) { content = Regex.Replace(content, RegexResource.HREF, new MatchEvaluator(ReplaceSID), RegexOptions.Compiled | RegexOptions.IgnoreCase); } if (action_regex.IsMatch(content)) { content = Regex.Replace(content, RegexResource.ACTION, new MatchEvaluator(ReplaceSID), RegexOptions.Compiled | RegexOptions.IgnoreCase); } byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(content); Sink.Write(data, 0, data.Length); } public static string ReplaceSID(Match match) { if (match.Value.IndexOf("cid=") != -1) { return match.Value; } string result; if (match.Value.IndexOf('?') == -1) { result = match.Value.Insert(match.Value.Length - 1, "?cid=" + HttpContext.Current.Request["cid"]); } else { result = match.Value.Insert(match.Value.Length - 1,

在网上搜了一下事件执行顺序,并经过测试在有分页的情况下是不正确的。事件执行顺序: 一、GridView 显示绑定的数据(默认为5行): 复制代码 代码如下: DataBinding RowCreated:Header[0] RowDataBound RowCreated:DataRow[1] RowDataBound RowCreated:DataRow[2] RowDataBound RowCreated:DataRow[3] RowDataBound RowCreated:DataRow[4] RowDataBound RowCreated:DataRow[5] RowDataBound RowCreated:Footer[6] //不管有没有页角行,该事件都会发生 RowDataBound RowCreated:Pager[7] RowDataBound DataBound 顺序如下: DataBinding RowCreated RowDataBound ...... DataBound 二、GridView 点击分页按钮时的事件发生顺序: 复制代码 代码如下: RowCommand PageIndexChanging PageIndexChanged DataBinding RowCreated:Header[8] RowDataBound RowCreated:DataRow[9] RowDataBound RowCreated:DataRow[10] RowDataBound RowCreated:DataRow[11] RowDataBound RowCreated:DataRow[12] RowDataBound RowCreated:DataRow[13] RowDataBound RowCreated:Footer[14] RowDataBound RowCreated:Pager[15] RowDataBound DataBound 理解也就是在点跳页按钮的时候,只会绑定要显示的页的资料,如上,因此在RowDataBound中不会绑定所有的资料,此时去统计,只能统计出当前页的加总(如上9-13笔的资料) 目前想来,也只有对要绑定的资料进行统计了。不能在GridView中的事件中去处理。

一、先讲最基本的 DataSet绑定操作,GridView为例。 当操作查询得一个 DataSet ds 后,可以进行一些数据的格式化,如: 复制代码 代码如下: foreach (DataRow dr in ds.Tables[0].Rows) { if (dr["Depth"].ToString() != "1") { dr["ColumnName"] = StringHelper.StringOfChar(Convert.ToInt32(dr["Depth"]) - 1, " ") + "├ " + dr["ColumnName"]; } } GridView1.DataSource = ds; GridView1.DataBind(); 复制代码 代码如下: public static class StringHelper { /// <summary> /// 生成指定长度的字符串,即生成strLong个str字符串 /// </summary> /// <param name="strLong">生成的长度</param> /// <param name="str">以str生成字符串</param> /// <returns></returns> public static string StringOfChar(int strLong, string str) { string ReturnStr = ""; for (int i = 0; i < strLong; i++) { ReturnStr += str; } return ReturnStr; } /// <summary> /// 生成日期随机码 /// </summary> /// <returns></returns> public static string GetRamCode() { #region return DateTime.Now.ToString("yyyyMMddHHmmssffff"); #endregion } } 像这样很快就能进行一些数据的格式化并绑定到控件了。 二、现在讲下我主要想讲的内容,如果我们用Ilist 查询得数据后,想格式化一些字符串,以达到自己想要的显示效果,我们该怎么办呢?先看下效果图再给您答案。  比如我们在做无限分类的时候 往往想让数据如上图所显示,我们又该怎么做呢。 刚上让面的DataSet写了些格式化代码,现在相信大家都想知道Ilist又该怎么操作对吧? 泛型的功能 强大我在这里就不说了,现在说重点,主要有两种方法实现, 一,把Ilist得的数据转为 DataSet的,这样你又可以重新回到熟悉的操作了 IList 转 DataSet 类(这个是我引用别人的 ^ ^) 复制代码 代码如下: public static DataSet ConvertToDataSet<T>(IList<T> list) { if (list == null || list.Count <= 0) { return null; } DataSet ds = new DataSet(); DataTable dt = new DataTable(typeof(T).Name); DataColumn column; DataRow row; System.Reflection.PropertyInfo[] myPropertyInfo = typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); foreach (T t in list) { if (t == null) { continue; } row = dt.NewRow(); for (int i = 0, j = myPropertyInfo.Length; i < j; i++) { System.Reflection.PropertyInfo pi = myPropertyInfo[i]; string name = pi.Name; if (dt.Columns[name] == null) { column = new DataColumn(name, pi.PropertyType); dt.Columns.Add(column); } row[name] = pi.GetValue(t, null); } dt.Rows.Add(row); } ds.Tables.Add(dt); return ds; } 然后 复制代码 代码如下: DataSet ds = ConvertToDataSet(b.ListColumn()); 看,又回来熟悉的操作了吧,但是,这样做我们启不是走弯路了,为啥不直接用 DataSet就得了?没错,我们走弯路了............我想用 IList啊,不想转来转去的,难道就没有好的办法? 哈哈,答案肯定是有的,也是最简单的,往往是初学的朋友不懂解IList才现在种种疑惑, 现在讲IList 对象类的操作 还是上面的例子 比如当查询得一个 复制代码 代码如下: BLL b = new BLL(); b.ListColumn(); 我们要绑定上图所示的只需这样做 复制代码 代码如下: IList<Qzzm.Model.ColumnInfo> list = new List<Qzzm.Model.ColumnInfo>(); foreach (Qzzm.Model.ColumnInfo m in b.ListColumn()) { if (m.Depth.ToString() != "1") { m.ColumnName = StringHelper.StringOfChar(Convert.ToInt32(m.Depth) - 1, " ") + "├ " + m.ColumnName + "<br>"; } list.Add(m); } DataList1.DataSource = list; DataList1.DataBind(); StringHelper还是上面的那个。经过这样的简单处理,我们就可以格式化 栏目名称了再分下DataList的绑定效果图,完毕!算是菜鸟与菜鸟之间的交流吧。

一、进程进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。Process 类,用来操作进程。命名空间:using System.Diagnostics;Process.Start("calc");   //打开计算器Process.Start("mspaint");   //打开画图Process.Start("iexplore" , "http://www.baidu.com");  //打开浏览器并指定地址(一)通过一个进程,打开指定的文件:1.创建进程对象Process p = new Process();2.创建一个StartInfo对象,是指定带盘符的路径。ProcessStartInfo psi = new ProcessStartInfo(@"C:\user\.....);3.进程指定及开始p.StartInfo = psi; //指定路径p.Start(); //开始进程(二)通过文件选择框让用户自己选择所需要打开的程序并打开:private void button1_Click(object sender, EventArgs e){//这是选择文件的类型openFileDialog1.Filter = "应用程序|*.exe";//显示对话框并且判断用户有没有选中文件if (openFileDialog1.ShowDialog() == DialogResult.OK){//取文件路径string path = openFileDialog1.FileName;//创建一个新的进程Process p = new Process();//制造进程的启动信息ProcessStartInfo psf = new ProcessStartInfo(path);//设置该进程的执行信息p.StartInfo = psf;//启动进程p.Start();} } 例子:注销//这个path就是你要调用的exe程序的绝对路径string path = Application.StartupPath;//获取自身exe或dll的文件名路径string s = System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName;private void button2_Click(object sender, EventArgs e){//打开该程序//取该程序文件的路径//string path = Application.StartupPath;string path = System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName;//造一个进程Process p = new Process();//造一个进程的启动信息ProcessStartInfo ps = new ProcessStartInfo(path);//设置进程启动信息p.StartInfo = ps;//启动进程p.Start();//关闭程序this.Close();} 例:窗口实现鼠标拖动private int x;private int y;private void pictureBox1_MouseDown(object sender, MouseEventArgs e){//鼠标点击时的XY坐标x = e.X;y = e.Y;}private void pictureBox1_MouseMove(object sender, MouseEventArgs e){//判断鼠标按下的是左键if (e.Button == System.Windows.Forms.MouseButtons.Left){//边距=当前的距离+移动的距离this.Left = this.Left+(e.X - x);this.Top = this.Top +(e.Y - y);}} 二、线程线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。区别:进程有自己独立的资源,线程共用资源。Thread类, 命名空间:using System.Threading ;程序默认只有一个主线程,如果做复杂处理,则会出现假死状态,因为一条线程同时只能做一件事。多线程的作用:同时做多件事情,节约时间,后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况。创建线程:开启新的线程执行哪个函数 Thread th = new Thread( 里面写线程要操作的方法,方法名不含括号 ); 标记这个线程准备就绪了,可以随时执行,CPU决定执行时间  th.Start();线程分为两种:前台线程 - 只有所有的前台线程都关闭才能完成程序关闭。后台线程 - 只要所有的前台线程都结束,后台线程则会自动结束。两者的区别:应用程序必须运行完所有的前台线程才可以退出;     而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。设置th线程为后台线程 th . IsBackground = true ;控件由主线程创建,新线程想要访问主线程资源,程序默认是不允许跨线程访问的。取消跨线程访问限制在界面Load事件里  Control.CheckForIllegalCrossThreadCalls = false;FormClosing 事件中: //判断新线程是否为null,如果为null,那就自动关闭了  if(th != null)  {    //立即结束线程,但是结束后就不能再被重新Start了    th.Abort();   }执行带参数的函数:如果线程执行的方法需要参数,那么要求这个参数必须是object类型!Thread th = new Thread(Test); //参数名不需要带括号  th . IsBackground = true;  th.Start("123");         //在这里传入Test函数所需要的参数这样函数中就需要强转: private void Test (object s)  {    string ss = (string) s ;    ......  }以上所述是小编给大家介绍的WinForm 进程、线程及区别介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

分类:其它

时间:2016-03-08 12:29:54