mikebai.com

  • Home
  • dev
  • DotNET
  • M365
  • 搞笑
  • 杂七杂八
  • FocusDict
個人BLOG
it developer
DotNET

C#中实现文件下载的四种方法总结

  using System;  using System.Data;  using System.Configuration;  using System.Web;  using System.Web.Security;  using System.Web.UI;  using System.Web.UI.WebControls;  using System.Web.UI.WebControls.WebParts;  using System.Web.UI.HtmlControls;  using System.IO;   public partial class _Default : System.Web.UI.Page  {  protected void Page_Load(object sender, EventArgs e)  {   }  //TransmitFile实现下载 protected void Button1_Click(object sender, EventArgs e)  {    Response.ContentType = "application/x-zip-compressed";  Response.AddHeader("Content-Disposition", "attachment;filename=z.zip");  string filename = Server.MapPath("DownLoad/z.zip");  Response.TransmitFile(filename);  }     //WriteFile实现下载 protected void Button2_Click(object sender, EventArgs e)  {    string fileName ="asd.txt";//客户端保存的文件名  string filePath=Server.MapPath("DownLoad/aaa.txt");//路径   FileInfo fileInfo = new FileInfo(filePath);  Response.Clear();  Response.ClearContent();  Response.ClearHeaders();  Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);  Response.AddHeader("Content-Length", fileInfo.Length.ToString());  Response.AddHeader(

2010-03-10 0comments 100hotness 0likes mikebai Read all
dev

报表制作利器—Reporting Services

如何快捷,简单地做一份好的报表一直是广大程序员所盼望的。在日常开发中,每当讲到做报表,一般有以下两种方法:1)将数据转变为EXCEL,WORD等形式,之后进行打印。2)使用第三方报表工具,如著名的水晶报表,activereport等,但随之而来的问题是,要深入掌握这些报表工具,有一定的难度,需要一定的经验。今年,微软公司终于推出了一个新一代的报表解决方案------Microsoft Reporting Service。它是一个完整的基于服务器的平台,可以建立、管理、发布传统的基于纸张的报表或者交互的、基于Web的报表。而且最大的特色是,它采用基于XML的RDL报表描述语言来定制报表,可以用于给第三方定制开发符合接口标准的报表工具,使得软件开发人员和企业可以将报表集成到已有的系统或第三方的应用中。Reporting Services包括:· 用来建立管理以及浏览报表的一组完整的工具· 用来存放、处理报表的一个引擎· 可扩展的体系结构和开发的接口,可将报表嵌入或者集成到各种不同的IT环境的解决方案中从上图可以看出,Reporting Service可以连接到不同的数据库,如SQL Server,Oracle,DB2等,也可以将报表导出到pdf,html.,txt,excel等多种格式。而且,Reporting Server还可以将报表以XML WebService的形式对外发布,很容易地与企业的其他系统进行集成,而且,对于报表的使用者,制作者和管理者,都可以很方便地管理报表。 一:报表制作功能Reporting Services 提供了开始创建传统报表或交互式报表所需要的工具,其中包括带有报表设计向导的图形报表设计器工具。下表描述了其中许多功能:报作制作功能 详细信息 支持广泛的数据源 Microsoft SQL Server Oracle 数据库任何与ODBC 或 OLE DB 兼容的数据源 开放式报表制作选项 Report Designer (使用 Visual Studio .net)基于 XML 的报表定义语言 (RDL)生成 RDL 的第三方工具 灵活的报表设计 自由格式表格矩阵图表使用运行时过滤的参数化报表向下挖掘链接报表 二:报表管理功能Reporting Services 提供了可以在各种不同环境中管理报表的综合功能。 Reporting Services 中包括了 Report Manager,它是一种基于 Web 的报表管理工具。您也可以使用 Reporting Services 的 Web 服务 API 来通过其他工具创建接口。下表描述了其中许多功能。报表管理功能 详细信息 报表信息和元数据 名称描述 数据源和连接信息 数据源类型连接字符串凭证 参数化报表的参数 (默认值、提示值) 管理参数化报表的提示值和默认值 执行属性 按需设定 (实时)多用户共享高速缓存快照 (静态)报表计划 与 SQL Server Agent 集成 报表历史记录 已处理报表的档案副本,用于检查和审核 基于角色的灵活的安全模型可以保护报表和资源,并支持所有这些功能。可以对安全性进行灵活设计,以满足各种广泛的需求;例如,用户有权用自己的参数根据要求运行报表,或有针对性地设计个人的报表订阅。管理员可以将不同报表的内容管理功能分配给特定的人员。三:报表发布功能可以将报表发布到门户网站、用电子邮件发送给用户,或是授予用户 Web 应用程序的访问权,以检索报表。导航和搜索功能可帮助用户查找和运行所需报表。个性化订阅可让用户选择他们喜好的转换格式及时间日程。下表描述了其中许多功能。报表交付功能 详细信息 报表转换选项的范围 Web 格式 (HTML)打印格式 (PDF、TIFF)数据 (Excel、XML、CSV)通过开放式 API 实现的其他格式 灵活的交付选项 日程交付或事件驱动交付个人订阅转换报表或链接的交付数据驱动的订阅 Reporting Service 分为企业版,开发人员版,标准版等不同版本,其中,安装所需要的环境配置,至少为Windows 2000 SP4以上,SQL Server 2000 SP3,MDAC 2.6以上,详细的安装要求参见Reporting Service的安装说明。本文以Microsot Reporting Service 为例,安装在WINDOWS 2000 SP4,VisualStudio 2003 .net,sql server 2000 sp4上,简单介绍如何用Reporting Service制作报表。1) 在安装好Reporting Service后,打开Visual studio .net ,选择新建项目,选择建立商业智能项目,选择新建一个报表项目,命名为reportservice1,再选确定,如下图:2)之后,在解决方案资源管理器中,鼠标右键点选共享数据源,选择"添加新数据源",再选择SQL server服务器所在的位置,并选择使用Northwind数据库,按确定,这样,将建立一个新的共享数据源northwind.rds(当然,可以为该数据源改名),创建共享数据源的目的是为了在今后的报表设计中方便地引用该数据连接。3)在"解决方案资源管理器"中右键单击"报表",指向"添加",然后单击"添加新项"。 在"添加新项"中,单击"报表"。 在"名称"框中,键入"report1.rdl",然后单击"打开"。将打开一个视图,其中包含"数据"、"布局"和"预览"选项卡。如下图所示:4)为了能让报表和数据库连接,必须新建一个数据集。在顶部的"数据集"下拉列表框中,,点选该下拉列表框,选择"新建数据集",此时将显示"数据集"对话框,由于之前我们已经建立了共享数据源,因此,在弹出的窗口中,我们看到已经存在的数据源northwind,也可以对该数据集重新命名,这里我们保持数据集的名dataset1不变,同时看到,可以选择要查询的命令类型是文本还是存储过程,可以在下面的查询字符串中输入SQL语句或者存贮过程。这里我们不做选择,直接按确定,如下图:5)之后,会出现下图的数据设计窗口,我们可以直接输入sql 查询语句:select * from orders,之后按!号按钮,执行该sql 语句。则可以马上看到查询的结果,再按保存,保存该数据集。6)再切换到布局视图,在这里,我们可以看到在左边的面版中,有工具选项面版和字段选择面版。在工具面版中,有各种制作报表的常用工具,如画线,图象,文本框对象等,在字段面版中,列出了当前数据集下的各字段。在中间的布局区域,可以看到中间的矩形区域就是绘制报表的地方,在这个例子中,我们只需要将字段面版中的几个字段,如orderid,customerid,orderdate,拖拉到设计区域矩形框的第二行(第一行是表头,第三行是表尾),并将表头改成适当的文字,如下图:

2010-03-10 0comments 105hotness 0likes mikebai Read all
DotNET

excel note

http://forums.asp.net/p/1222903/2189537.aspxhttp://www.experts-exchange.com/Programming/Languages/.NET/Visual_CSharp/Q_23209358.html   http://www.eggheadcafe.com/community/aspnet/2/10052679/how-to-export-treeview-da.aspx http://swik.net/XML/del.icio.us%2Ftag%2Fxml/C%23+-+TreeView+Export+To+Xml+OR+Import+from+XMl/dq8zdhttp://forums.asp.net/t/1214938.aspx   http://aspalliance.com/articleViewer.aspx?aId=1http://steveorr.net/articles/ExportPanel.aspx http://dflorence25.blogspot.com/ http://www.codeproject.com/KB/cpp/treeviewtoxml.aspx   pa3kx32sa   http://www.codeproject.com/KB/tree/DropDownTreeView.aspx http://www.codeproject.com/KB/cpp/TreeView_Serializer.aspx     http://www.winu.cn/space-14160-do-blog-id-7119.html  

2010-03-08 0comments 108hotness 0likes mikebai Read all
DotNET

浅谈水晶报表在ASP.NET中的一种灵活应用

浅谈水晶报表在ASP.NET中的一种灵活应用 使用水晶报表的强大功能来实现应用程序的统计分析及打印导出等功能,是微软平台上进行.NET应用程序开发报表的一种不错的选择。水晶报表在设计、开发、配置以及部署上,还是会给初学者带来一定的困扰的。那么,是否存在一种相对比较简单而且易用的方式来进行水晶报表的设计、开发、配置以及部署呢?本文将提供一种比较简单且相对灵活的方法。 本文将包含以下内容: Crystal Reports的另类非对象模式数据绑定 水晶报表的简单模式部署 P.S. 本文中描述到的Crystal Reports为Crystal Reports for Visual Studio .NET,原则上该版本是runtime free授权,for unlimited user的。VS IDE版本为2008,Crystal Reports版本为10 Crystal Reports的另类非对象模式数据绑定水晶报表绑定数据的模式有很多种,其中包括使用DataSet、DataReader及ObjectCollection等。在某个特定的系统项目中,我们多数通过指定的业务数据库来提供对报表数据的支持。本文将主要描述一种非数据库数据绑定的变通模式,通过这种模式进行绑定的报表,可以不用设置其数据库验证参数(DBLogon)的相关信息,具体的数据源可以来源于数据库,也可以来源于xml文件等其他半结构化数据。 在VS IDE项目的Solution Explorer中,建立存放报表文件的文件夹,如ReprotFilesFolder 用鼠标右键点击新建的文件夹,选择添加新项(Add New Item...) 选择“XML Schema”,将文件命名为Demo.xsd 用DataSet Editor打开该Schema文件,点击“Ctrl+Alt+S”,打开“Server Explorer”,找到当前项目使用的数据库连接,将报表展示涉及到的数据表拖拽到设计区域 推拽的表可以是存在键值关系的表,也可以是毫无关系的表,甚至通过存储过程建立的临时表,保存该xsd文件 用鼠标右键点击新建的文件夹,选择添加新项(Add New Item...) 选择Crystal Report,将报表文件命名为Demo.rpt,点击添加(Add) 在打开的水晶报表向导窗口中选择“使用报表向导”,点击确定 在报表向导的数据向导页中,选择“创建新连接-数据库文件” 点击数据库文件前的“+”,将弹出选择数据文件窗口,找到刚才创建的Demo.xsd文件,并点击“打开” 此时,我们刚添加到Demo.xsd中的两个数据表将出现在“数据文件”节点的子节点下,选中数据表,点击“>”按钮,将表添加到“已选择表”列表中 点击“下一步”,可以为表之间添加隐式的键值关系 点击完成,将生成一张空白的报表 根据实际的业务情况设计符合要求的报表,并保存报表文件,例如下图 设计工作到此告一段落,下面将进行数据的绑定。 新建一个WebForm页面,将CrystalReportViewer添加到页面中,如下图所示 在后台页面中首先引用Crystal Reports的程序集using CrystalDecisions.CrystalReports.Engine;using CrystalDecisions.Shared; 定义变量private ReportDocument reportDocument; 添加自定义方法 /// <summary>/// 初始化报表/// </summary>private void ConfigureCrystalReports(){//当前业务的报表打印文件string RPTFile = "";//当前业务的报表打印数据集DataSet ds = null; #region 获取报表打印文件if (Session["rf"] == null){RPTFile = Server.MapPath("Demo.rpt");Session["rf"] = RPTFile;}elseRPTFile = Session["rf"].ToString();#endregion #region 获取当前业务的报表打印数据if (Session["pd"] == null){ds = new DataSet();string sql = "";sql = "select * from SalesMaster where BItemSerialNumber='0802280001'";DataSet masterDs = 填充主表数据//将主表添加到报表数据集中ds.Merge(masterDs);//利用同样的方法添加子表或其他的表,甚至可以添加表和表之间的关系//上述方法也可以从其他数据源读入数据,包括Access数据库、xml数据等Session["pd"] = ds;}elseds = (DataSet)Session["pd"];#endregion if (Session["reportDocument"] == null){reportDocument = new ReportDocument();reportDocument.Load(RPTFile);reportDocument.SetDataSource(ds);Session["reportDocument"] = reportDocument;}elsereportDocument = (ReportDocument)Session["reportDocument"];ReportViewer.ReportSource = reportDocument;} 在页面的Page_Load方法中添加Response.Expires = -1; 添加页面初始化方法 /// <summary>/// 页面初始化事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>protected void Page_Init(object sender, EventArgs e){ConfigureCrystalReports();} 至此,报表的数据绑定及显示工作完成。编译项目后,在浏览器中可以查看报表效果。此种方法的灵活性在于 完成后,完全可以删除.xsd的Schema文件而运行,或将.xsd文件移出项目。 数据的读入,不论来自SQL Server、Access还

2010-03-08 0comments 100hotness 0likes mikebai Read all
dev

SQL Server : Convert 的格式与结果

select '101', convert(varchar,getutcdate(),101) from user_info --Result: '05/20/2008'                select '102', convert(varchar,getutcdate(),102) from user_info --Result: '2008.05.20'                select '103', convert(varchar,getutcdate(),103) from user_info --Result: '20/05/2008'                select '104', convert(varchar,getutcdate(),104) from user_info --Result: '20.05.2008'                select '105', convert(varchar,getutcdate(),105) from user_info --Result: '20-05-2008'               

2010-03-08 0comments 112hotness 0likes mikebai Read all
DotNET

小议SQL Server主键和自动编号问题

小议SQL Server主键和自动编号问题  所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。  当然,其它字段可以辅助我们在执行这些操作时消除共享冲突,不过就不在这里讨论了。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。所以数据库在设计时,主键起到了很重要的作用。  常见的数据库主键选取方式有:  ◆自动增长字段  ◆手动增长字段  ◆UniqueIdentifier  ◆“COMB(Combine)”类型  一、自动增长型字段  很多数据库设计者喜欢使用自动增长型字段,因为它使用简单。自动增长型字段允许我们在向数据库添加数据时,不考虑主键的取值,记录插入后,数据库系统会自动为其分配一个值,确保绝对不会出现重复。如果使用SQL Server数据库的话,我们还可以在记录插入后使用@@IDENTITY全局变量获取系统分配的主键键值。  尽管自动增长型字段会省掉我们很多繁琐的工作,但使用它也存在潜在的问题,那就是在数据缓冲模式下,很难预先填写主键与外键的值。假设有两张表:  Order(OrderID, OrderDate)  OrderDetial(OrderID, LineNum, ProductID, Price)  Order 表中的OrderID是自动增长型的字段。现在需要我们录入一张订单,包括在Order表中插入一条记录以及在OrderDetail表中插入若干条记录。因为Order表中的OrderID是自动增长型的字段,那么我们在记录正式插入到数据库之前无法事先得知它的取值,只有在更新后才能知道数据库为它分配的是什么值。这会造成以下矛盾发生:  首先,为了能在 OrderDetail的OrderID字段中添入正确的值,必须先更新Order表以获取到系统为其分配的OrderID值,然后再用这个 OrderID填充OrderDetail表。最后更新OderDetail表。但是,为了确保数据的一致性,Order与OrderDetail在更新时必须在事务保护下同时进行,即确保两表同时更行成功。  听棠.NET指出:主档放在事务中提交时,通过@@IDENTITY 就可以取到生成值的,因此可以传给明细当外键用,而且在事务发生错误回滚时,主档记录也会被回滚取消的。  吕震宇补充:使用自动增长字段会增加网络的roundTrip。尽管可以使用@@IDENTITY取得主键的值,但在更新过程中,不得不增加一次数据往返(以C/S结构为例):  1、客户端发送开始事务命令  2、客户端提交主表更新  3、服务器返回@@IDENTITY  4、客户端根据返回的主键更新从表缓冲  5、客户端将从表提交服务器更新  6、客户端提交事务  在这里多了一次往返就会增加了事务处理的时间。降低并发性能。  如果不用自动增长型字段,将是以下情景:  1、客户端发送开始事务命令  2、客户端提交主表更新  3、客户端提交从表更新  4、客户端提交事务  因此我不赞成使用自动增长型字段作为主键与外键链接的纽带。  除此之外,当我们需要在多个数据库间进行数据的复制时(SQL Server的数据分发、订阅机制允许我们进行库间的数据复制操作),自动增长型字段可能造成数据合并时的主键冲突。设想一个数据库中的Order表向另一个库中的Order表复制数据库时,OrderID到底该不该自动增长呢?  ADO.NET允许我们在 DataSet中将某一个字段设置为自动增长型字段,但千万记住,这个自动增长字段仅仅是个占位符而已,当数据库进行更新时,数据库生成的值会自动取代 ADO.NET分配的值。所以为了防止用户产生误解,建议大家将ADO.NET中的自动增长初始值以及增量都设置成-1。此外,在ADO.NET中,我们可以为两张表建立DataRelation,这样存在级联关系的两张表更新时,一张表更新后另外一张表对应键的值也会自动发生变化,这会大大减少了我们对存在级联关系的两表间更新时自动增长型字段带来的麻烦。  二、手动增长型字段  既然自动增长型字段会带来如此的麻烦,我们不妨考虑使用手动增长型的字段,也就是说主键的值需要自己维护,通常情况下需要建立一张单独的表存储当前主键键值。还用上面的例子来说,这次我们新建一张表叫IntKey,包含两个字段,KeyName以及KeyValue。就像一个HashTable,给一个 KeyName,就可以知道目前的KeyValue是什么,然后手工实现键值数据递增。在SQL Server中可以编写这样一个存储过程,让取键值的过程自动进行。代码如下:CREATE PROCEDURE [GetKey]  @KeyName char(10), @KeyValue int OUTPUT AS UPDATE IntKey SET @KeyValue = KeyValue = KeyValue + 1 WHERE KeyName = @KeyName GO  这样,通过调用存储过程,我们可以获得最新键值,确保不会出现重复。若将OrderID字段设置为手动增长型字段,我们的程序可以由以下几步来实现:首先调用存储过程,获得一个OrderID,然后使用这个OrderID填充Order表与OrderDetail表,最后在事务保护下对两表进行更新。  使用手动增长型字段作为主键在进行数据库间数据复制时,可以确保数据合并过程中不会出现键值冲突,只要我们为不同的数据库分配不同的主键取值段就行了。但是,使用手动增长型字段会增加网络的RoundTrip,我们必须通过增加一次数据库访问来获取当前主键键值,这会增加网络和数据库的负载,当处于一个低速或断开的网络环境中时,这种做法会有很大的弊端。同时,手工维护主键还要考虑并发冲突等种种因素,这更会增加系统的复杂程度。  三、使用UniqueIdentifier  SQL Server为我们提供了UniqueIdentifier数据类型,并提供了一个生成函数NEWID( ),使用NEWID( )可以生成一个唯一的UniqueIdentifier。UniqueIdentifier在数据库中占用16个字节,出现重复的概率非常小,以至于可以认为是0。我们经常从注册表中看到类似{45F0EB02-0727-4F2E-AAB5-E8AEDEE0CEC5}的东西实际上就是一个UniqueIdentifier,Windows用它来做COM组件以及接口的标识,防止出现重复。在.NET里管UniqueIdentifier称之为GUID(Global Unique Identifier)。在C#中可以使用如下命令生成一个GUID:Guid u = System.Guid.NewGuid();   对于上面提到的Order与OrderDetail的程序,如果选用UniqueIdentifier作为主键的话,我们完全可以避免上面提到的增加网络 RoundTrip的问题。通过程序直接生成GUID填充主键,不用考虑是否会出现重复。  UniqueIdentifier 字段也存在严重的缺陷:首先,它的长度是16字节,是整数的4倍长,会占用大量存储空间。更为严重的是,UniqueIdentifier的生成毫无规律可言,要想在上面建立索引(绝大多数数据库在主键上都有索引)是一个非常耗时的操作。有人做过实验,插入同样的数据量,使用 UniqueIdentifier型数据做主键要比使用Integer型数据慢,所以,出于效率考虑,尽可能避免使用UniqueIdentifier型数据库作为主键键值。  四、使用“COMB(Combine)”类型  既然上面三种主键类型选取策略都存在各自的缺点,那么到底有没有好的办法加以解决呢?答案是肯定的。通过使用COMB类型(数据库中没有COMB类型,它是Jimmy Nilsson在他的“The Cost of GUIDs as Primary Keys”一文中设计出来的),可以在三者之间找到一个很好的平衡点。  COMB 数据类型的基本设计思路是这样的:既然UniqueIdentifier数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么我们能不能通过组合的方式,保留UniqueIdentifier的前10个字节,用后6个字节表示GUID生成的时间(DateTime),这样我们将时间信息与 UniqueIdentifier组合起来,在保留UniqueIdentifier的唯一性的同时增加了有序性,以此来提高索引效率。也许有人会担心 UniqueIdentifier减少到10字节会造成数据出现重复,其实不用担心,后6字节的时间精度可以达到1/300秒,两个COMB类型数据完全相同的可能性是在这1/300秒内生成的两个GUID前10个字节完全相同,这几乎是不可能的!在SQL Server中用SQL命令将这一思路实现出来便是:DECLARE @aGuid UNIQUEIDENTIFI

2010-03-02 0comments 99hotness 0likes mikebai Read all
DotNET

C#判断文件编码的类(仅常用的几种)

public class EncodingType    //编码问题目前为止,基本上没人解决,就连windows的IE的自动识别有时还识别错编码呢。--yongfa365    //如果文件有BOM则判断,如果没有就用系统默认编码,缺点:没有BOM的非系统编码文件会显示乱码。    //调用方法: EncodingType.GetType(filename)    //来源:http://blog.csdn.net/listlofusage/archive/2007/02/10/1506900.aspx    {        public static System.Text.Encoding GetType(string FILE_NAME)        {            FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);            System.Text.Encoding r = GetType(fs);            fs.Close();            return r;        }        public static System.Text.Encoding GetType(FileStream fs)        {            /*byte[] Unicode=new byte[]{0xFF,0xFE};           byte[] UnicodeBIG=new byte[]{0xFE,0xFF};           byte[] UTF8=new byte[]{0xEF,0xBB,0xBF};*/              BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default);            byte[] ss = r.ReadBytes(3);            r.Close();            //编码类型 Coding=编码类型.ASCII;            if (ss[0] >= 0xEF)            {                if (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF)                {                   &

2010-02-26 0comments 107hotness 0likes mikebai Read all
DotNET

我的笔记

  年龄检查: <asp:RegularExpressionValidator ID="RegularExpressionValidator1" ControlToValidate="txtAge"                    runat="server" ErrorMessage="无效年龄" ValidationExpression="^[0]{1}[1-9]{1}|[1-9]{1}[0-9]{0,1}$"></asp:RegularExpressionValidator>

2010-02-25 0comments 98hotness 0likes mikebai Read all
DotNET

VS2005中BackgroundWorker组件的使用经验

    在VS2005中添加了BackgroundWorker组件,该组件在多线程编程方面使用起来非常方便,然而在开始时由于没有搞清楚它的使用机制,走了不少的弯路,现在把我在使用它的过程中的经验与诸位分享一下。    BackgroundWorker类中主要用到的有这列属性、方法和事件:    重要属性:    1、CancellationPending             获取一个值,指示应用程序是否已请求取消后台操作。通过在DoWork事件中判断CancellationPending属性可以认定是否需要取消后台操作(也就是结束线程);    2、IsBusy                          获取一个值,指示 BackgroundWorker 是否正在运行异步操作。程序中使用IsBusy属性用来确定后台操作是否正在使用中;    3、WorkerReportsProgress           获取或设置一个值,该值指示BackgroundWorker能否报告进度更新    4、WorkerSupportsCancellation      获取或设置一个值,该值指示 BackgroundWorker 是否支持异步取消。设置WorkerSupportsCancellation为true使得程序可以调用CancelAsync方法提交终止挂起的后台操作的请求;    重要方法:    1、CancelAsync         请求取消挂起的后台操作    2、RunWorkerAsync      开始执行后台操作    3、ReportProgress      引发ProgressChanged事件      重要事件:    1、DoWork              调用 RunWorkerAsync 时发生    2、ProgressChanged     调用 ReportProgress 时发生    3、RunWorkerCompleted  当后台操作已完成、被取消或引发异常时发生    另外还有三个重要的参数是RunWorkerCompletedEventArgs以及DoWorkEventArgs、ProgressChangedEventArgs。    BackgroundWorker的各属性、方法、事件的调用机制和顺序:    从上图可见在整个生活周期内发生了3次重要的参数传递过程:    参数传递1:此次的参数传递是将RunWorkerAsync(Object)中的Object传递到DoWork事件的DoWorkEventArgs.Argument,由于在这里只有一个参数可以传递,所以在实际应用往封装一个类,将整个实例化的类作为RunWorkerAsync的Object传递到DoWorkEventArgs.Argument;    参数传递2:此次是将程序运行进度传递给ProgressChanged事件,实际使用中往往使用给方法和事件更新进度条或者日志信息;    参数传递3:在DoWork事件结束之前,将后台线程产生的结果数据赋给DoWorkEventArgs.Result一边在RunWorkerCompleted事件中调用RunWorkerCompletedEventArgs.Result属性取得后台线程产生的结果。    另外从上图可以看到DoWork事件是在后台线程中运行的,所以在该事件中不能够操作用户界面的内容,如果需要更新用户界面,可以使用ProgressChanged事件及RunWorkCompleted事件来实现。     明白了BagkgroundWorker的事件调用顺序和参数传递机制之后在使用该组件用于多线程编程的时候就可以轻松许多了。详细的实例可以在我写的天涯离线浏览器中看到。

2010-02-18 0comments 98hotness 0likes mikebai Read all
DotNET

多控件dock设置为fill后 被覆盖处理

控件1.dock   =   DockStyle.Top;   控件2.dock   =   DockStyle.Fill;   容器.controls.add(控件1);   容器.controls.add(控件2);   使用上面的代码会导致控件2填充了整个容器,控件1被覆盖掉而无法显示的情况 处理方法1: 将设置了DockStyle.Fill的控件在最前面添加即 控件1.dock   =   DockStyle.Top;   控件2.dock   =   DockStyle.Fill;   容器.controls.add(控件2);  容器.controls.add(控件1);   处理方法2:在代码的最后添加下面的语句容器.Controls.SetChildIndex(控件2,   0); 注:在.Designer.cs文件中使用方法2 会在调整页面布局时 自动更替为方法1的代码  

2010-02-17 0comments 107hotness 0likes mikebai Read all
1…4243444546…62

Recent Posts

  • c# winform适配高dpi
  • com.microsoft.sqlserver.jdbc.SQLServerException “trustServerCertificate”属性设置为“false”,但驱动程序无法使用安全套接字层 (SSL) 加密与 SQL Server建立安全连接
  • java -cp 用法介绍
  • HTML 容器元素
  • MVC的cshtml的介绍

Recent Comments

No comments to show.

COPYRIGHT © 2025 mikebai.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang