- Web.Config里面保存Access数据库的连接
- .Zmx331 { display:none; } 如果你使用Web.Config来保存数据库的连接那无疑是最好的形式,便于数据库的移植以及变动等一些不定性因素,便于维护就是了。可是,你可以在网络上找到保存SQL等一些数据库的连接,如果是ACCESS连接,就没有那样的方便了。不过,可以使用下面的措施来保证ACCESS的连接。1.在Web.Config添加:
注意,数据名字是digestdb.config(为了安全更改后缀名),放在目录DataBase下面。2.在数据库操作的类或者在代码里面就是如下引用了:private static string connString = String.Format( System.Configuration.ConfigurationSettings.AppSettings[ "ConnString" ], System.Web.HttpContext.Current.Server.MapPath("."));3.在代码中直接使用数据库连接比如在一个单独的类里面:private static string connString = String.Format( System.Configuration.ConfigurationSettings.AppSettings[ "ConnString" ], System.Web.HttpContext.Current.Server.MapPath("."));... - 作者:佚名发表于:2010-06-30 查阅全文...
- 如何使用C#自定义属性
- .Qji554 { display:none; } 在.NET框架中,经常用到属性,从定义哪些类是可序列化到选择某个Web服务应用中的哪些方法是可以公开的都会用到属性。使用属性可以在设计时对类、properties和方法添加说明,然后在运行时通过反射信息来检查它们。本文为我们介绍了在开发应用时如何利用C#自定义属性。 本文可以从技术文章下载出获得,其中包含了一个使用定制属性的Visual Studio项目示例文件。 属性类是设计时可应用于类、properties和方法的特殊文类。属性类提供描述元素某些方面属性的方式或决定依附于该元素的其它类的行为,进而在运行时可以访问和检验这些描述与行为。你可以将属性类看作为类成员添加特殊修改器的一种方式。 例如,如果你曾经写过Web服务,那肯定知道要使得方法在整个服务中是公开的,必须要使用WebMethod属性。这是一个演示属性应用的很好的例 子,因为我们要用WebMethod属性扩展编程模型。C#中没有内建的方式来指定某个方法通过Web服务是可见的(因为内建有表明一个方法是私有的方 式),因此需要添加WebMethod属性来满足这一需要。 设计自定义属性 设计自定义属性的过程十分简单,在设计属性前只需要考虑以下几个方面: 使用属性的目的是什么? 属性可以以很多方式使用。你需要定义属性到底要完成什么功能并确保这些特定功能没有内建在.NET框架集中。使用.NET修改器要比使用属性好,因为这将简化同其它装配件的集成过程。 属性必须储存什么信息? 属性是打算用来指示某个功能的简单标志吗?或者属性是否要储存信息?一个属性可以拥有设计时赋予的一组信息,并在运行时查看这些信息。例如,看一下示例应用中的别名属性。 属性应该驻留在哪个装配件中? 大多数情况下,可以将属性包含在使用该属性的装配件中。不过也有这样的例子,将属性驻留在公共的、轻量级的、共享装配件中会更好些。这种类型的配置允许客户使用属性时不必引用不需要的装配件。 哪些装配件将会识别属性? 如果没有模块读取属性,那么它将一文不值。你很可能将读取属性的类放在属性驻留的同一个装配件中。然而,正像前面提到的,也有这样的例子,你想将读取属性的方法与属性自身分别放在不同的装配件中。 使用属性 在我们深入了解如何设计自定义属性之前,我们需要先看一下它们是如何使用的。例如,假 定我们有一个称为“Hide”的属性它能够有效地隐藏Properties,因此它们不会显示在屏幕上。如果我们将这个属性应用于“SSN”property,那么代码将会如列表A所示。 软件开发网 www.mscto.com 列表 A [Hide ()]public string SSN{get { return _ssn; }set { _ssn = value; }} 软件开发网 www.mscto.com 作为更复杂一点的例子,假设我们将有一个属性称为“Alias”。该属性的任务是检查一个property可能拥有别名。这将允许将一个property值映射给另一个property即使批roperty的名字不匹配。这个属性接受一系列字符串值作为映射名。(列表B) 列表 B [Alias ("FirstName", "First")]public string FName{get { return _fName; }set { _fName = value; }} 在这个例子中,property“FName”被映射到“FirstName”和“First”,请查看示例应用以更详细的了解这种应用。 创建属性 创建属性是一个简单的过程。你可以定义继承自System.Attribute类的一个包含你想要储存的数据的类。列表C的前半部分显示了如何创建一个名为“Alias”的属性。 列表 C Class Alias : System.Attribute{string[] _names;public Alias(params string[] names){this.Names = names;}public string[] Names{get { return _names; }set { _names = value; }}} 正如你所看到的,这就是一个普通的类,唯一的例外就是继承自System.Attribute类。我们不需要作任何特别的事情使它成为一个类。我们只是简单的定义了一个需要使用的构造函数并创建了一个property和一个存储数据的私有成员。 列表D是个更简单的属性——“Hide”属性。这个属性不需要构造函数(使用默认的构建函数),也不储存数据。因为这个属性只是一个简单的标志类型的属性。 列表 D Class Hide : System.Attribute{//This is a simple attribute, that only requires// the default constructor.} 从代码中读取属性 读取属性并检查其中的数据比使用属性或创建属性显著地更加复杂。读取属性要求开发人员要对如何使用一个对象的反射信息有个基本了解。如果你不熟悉反射机制,可以阅读“应用反射”系列文章。 假设我们正在查看一个类,我们想知道该类的那个properties使用了Alias属性以及都有哪些别名。列表E实现了这个功能。 列表 E Private Dictionary
GetAliasListing(Type destinationType){//Get all the properties that are in the// destination type.PropertyInfo[] destinationProperties = destinationType.GetProperties();Di... - 作者:佚名发表于:2010-06-30 查阅全文...
- 用格式分类符正确地表示数字
- .Fkz627 { display:none; } 在你的代码里操作数据可能需要各种步骤,但是不到将它们输出给用户的时候,你就不用担心将数据格式化的问题。.NET框架为正确地显示数据提供了各种选择。现在让我们更进一步地看一下数值数据的格式化。 格式化的格式是可选的,但是所有的基本数据类型(双精度型、整形、浮点型等等)都包括了标准的ToString方法。你可以使用这个方法来显示数据as-is,这是缺省的格式。例如,下面的C#代码创建了一个双精度变量,然后填充并显示了内容: double dbl = 4.003333; System.Console.WriteLine("The value is " + dbl.ToString()); 输出结果是: 软件开发网 www.mscto.com The value is 4.003333 ToString方法允许你很容易地显示变量的内容,但是它无法让你控制数据出现的方式。现在让我们更进一步看一下显示一个数值变量的各种方法。 指定你的格式 可以用来正确显示数字值的格式分类符有很多种。下面的列表把可用的分类符单独列出来了: C —货币D —小数E或者e —指数F —定点G —普通N —数值X或者x —十六进制P —百分数分类符可以包括一个(附加的)数字,用来控制数值显示的精度。如果要使用格式分类符就需要将它附加给变量/数字,你要紧接着(字符串里的)变量占位符放一个冒号,再在冒号后面放格式分类符。下面C#代码的例子显示了这是如何进行的: 软件开发网 www.mscto.com inttst = 550000; System.Console.WriteLine("", tst); System.Console.WriteLine("", tst); System.Console.WriteLine("", tst); System.Console.WriteLine("", tst); System.Console.WriteLine("", tst); System.Console.WriteLine("", tst); System.Console.WriteLine("", tst); System.Console.WriteLine("", tst); System.Console.WriteLine("", tst); System.Console.WriteLine("", tst); System.Console.WriteLine("", tst); System.Console.WriteLine("", tst); System.Console.WriteLine("", tst); System.Console.WriteLine("", tst); System.Console.WriteLine("", tst); System.Console.WriteLine("", tst); System.Console.WriteLine("", tst); 生成的输入如下: 软件开发网 www.mscto.com 0,000.00 550000 5.500000E+005 5.500000e+005 550000.00 550000 550,000.00 86470 86470 0,000.000 000550000 5.500000000000E+005 550000.0000000 5.5E+05 550,000.0000000000 00086470 正如上面例子所示,根据所指定的数据类型,(不同)精度导致了不同的结果。下面的列表描述了在和指定类型一起使用的时候,精度标识符的结果: C, E, e, F, N:小数点右边所显示的数位的数量D, G, x, X:小数点左边所显示的数位的总量使用了这些格式分类符,数字就能够根据用户的需要来正确地显示。 自定义格式另一个你可以用来格式化数字的方法叫做图片格式分类符。下面的列表说明了各种图片分类符,你可以用它们来根据用户的需要创建自己的数值格式。 0 —如果正在被格式化的值有一个数位(digit)所处的位置正是0出现在格式字符串里的位置,那么该数位就会被复制到输出字符串里。. —显示正在被格式化的值的小数。原始值里只有一个小数点会被接受。, —这个分组分隔符被用作千分符(出现在两个数字中间以及小数点的左边)。此外,如果原始值在其小数点的左边紧接着就有一个或者多个分组分隔符,那么该数值就会被数值分开,然后在被格式化之前乘以1,000。# -如果正在被格式化的值有一个数位所处的位置正是#出现在格式字符串里的位置,那么该数位就会被复制到输出字符串里。% —如果把这个百分号放在字符串里指定的位置,那么该值在被显示之前会乘以100。E+0、e+0、e-0、E-0 —将值作为正确的指数格式化。—字符引用'abc'或者"abc" -字符串值; —分段分隔符你可以把以上各项组合起来,创建你项目所需要的任何输出。使用各种不同的组合并看到你所完成的东西是很酷的。更强大的特性之一是分段分隔符(即分 号)。它能够让你显示一个字符串表示,如果数值是正数、负数或者零的话。此外,这个列表以外的所有值都可以直接放到输出里。这也就是说,你可以将它正确地 放在值里,从轻易地显示一个美元标志($)。下面的VB.NET代码段就是一个实际使用的自定义格式: Dim tst As Integer = 550000 System.Console.WriteLine("", tst) System.Console.WriteLine("%", tst) System.Console.WriteLine("{0:$#.00 dollars is a lot of money!}", tst) System.Console.WriteLine("", tst) System.Console.WriteLine("", tst) tst = -125000 System.Console.WriteLine("{0:#0;(#0);
}", tst) tst = 0 System.Console.Write... - 作者:佚名发表于:2010-06-30 查阅全文...
- C#语言中的异步方法调用
- .Eho764 { display:none; } .NET框架基类库(BCL)中有好几种类都可以提供同步和异步的方法调用。不过,因为同步方法调用会导致程序流程中途等待,所以采用同步方法的情 况下往往会导致程序执行的延迟,相比来说,在某些条件下选择异步方法调用就可能更好一些,例如,有的时候程序需要给多个Web服务发出请求,这时就最好采 用异步方法。这篇文章的主旨就是向读者阐述如何用C#在.NET开发中采取异步方法调用。 异步和同步同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果;而异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务的同时执行其它操作。 为了说明异步方法调用所具有的优点,现在就让我们首先看一个例子,在这个例子中采用同步解决方案并不是最佳选择。这个例子要用到System.Net.Dns类。 同步版本的Resolve方法代码是如下定义的: public static IPHostEntry Resolve( string hostName ); Resolve方法只接受一个参数hostName,hostName既可以是DNS名字(比如www.mydomain.com)也可以是点分十进制格式的IP地址(例如10.10.14.2)。Resolve方法只返回一个IPHostEntry对象。你可以通过IPHostEntry对象的成员来检索主机名、IP地址以及其他同特定主机有关的信息。 你能在自己的程序中使用Resolve同步方法,代码如下: IPHostEntry host = Dns.Resolve(“10.10.14.2”); Console.WriteLine(host.HostName); 软件开发网 www.mscto.com 这里有个问题,一旦调用了Dns.Resolve,你的程序就会被阻塞执行直到Resolve方法完成其名称解析任务并且返回一个IPHostEntry对象,这个过程可能会用去若干秒的时间。由于DNS 解析涉及到网络访问,所以这种方法调用完全可能受到包括网络延迟在内得推迟操作完成的因素的影响,所以在以上的情况下更适合于采用异步方法来获得同样的结果。 异步设计部 件之间的异步通讯要采取以下的设计模式:程序必须能确定被调用方法已经完成任务的时刻或者能对其操作状态进行判断。这种设计模式允许程序获得方法返回的任 何结果。所以说,在用到Web服务的时候,因为你的程序能在程序继续执行之前给多个Web服务同时发送请求然后等待各个方法返回各自的结果,所以异步设计 在以上情况下特别有用。 在这种情形下,具有不同程度延迟的网络、各类公司通过因特网等等都可以提供程序用到的Web服务。因而,完成请求所需要的时间长度只受程序控制以外的若干因素影响。 在 .NET 框架内采用异步设计模式通常具有以下的特点,那就是要用到BeginXXXX和EndXXXX字样的方法,XXXX 在此表示该方法的同步版本的名字。现在就让我们仔细考察一下异步方法调用。 BeginResolve方法和IAsyncResult为了不阻塞程序的执行(就像第一个例子那样),你可以选择使用Resolve方法的异步版本:BeginResolve。这个方法的用法如下: public static IAsyncResultBeginResolve( string hostName, AsyncCallbackrequestCallback, object stateObject ); BeginResolve方法和其同步版本一样接受同样的参数hostName,不过增加了异步设计模式下所需要的另两个参数: requestCallback和stateObject参数。我们很快就会讨论到这两个参数,但是首先让我们注意一下返回值:一个 IAsyncResult接口。 当 你异步调用某个方法的时候,在被调用方法有机会完成任务以前(甚至有时在刚调用的时候)方法调用就会很快地返回程序。按照定义,BeginResolve 方法不会返回IPHostEntry对象,相反,它会返回一个等待对象,这就是IAsyncResult接口,之后可以使用它来检索方法调用的结果。 软件开发网 www.mscto.com IAsyncResult 接口的定义如下: public interface IAsyncResult { object AsyncState WaitHandleAsyncWaitHandle boolCompletedSynchronously boolIsCompleted } 该接口的第一个属性是AsyncState,它会返回传递给BeginResolve方法的stateObject参数同样的对象。这个参数值没有受到任何限制。它可以是程序想用来追踪这个特定方法调用的任何东西。被调用方法无论在什么方式下都不会使用或操作它。 IAsyncResult 接口的第二个属性是AsyncWaitHandle,你的程序可以用它来等待方法完成其任务,具体做法是把它传递给WaitHandle类的方法 WaitAll、WaitOne或WaitAny之一即可。如果你正在平行发送若干异步方法调用、希望它们都能保证在继续你自己程序的工作之前完成,那么 这个属性就会非常管用,如果程序的继续操作依赖于以上这些调用中的一个或者多个结果,这个属性的用处就更大了。 该接口的第3个属性是CompletedSynchronously,它返回一个布尔值,表示方法是否能在BeginResolve方法返回的时候完成任务。 第4个属性是IsCompleted,它也返回一个布尔值,表示方法所要完成的任务是否已经完成了。如果你正在使用一种查询机制来确定异步调用是否完成其任务,那么这个属性此刻就能派上用?...
- 作者:佚名发表于:2010-06-30 查阅全文...
- 一个用C#过滤HTML代码的函数
- .Bqs646 { display:none; } 正好有时间所以用C#写了一段正则表达式,作用是删除 Page 里面Code 中的 HTML标签,这在做采集信息,消除其中的HTML很有用处。以下是引用片段:public string checkStr(string html) { System.Text.RegularExpressions.Regex regex1 = new System.Text.RegularExpressions.Regex(@"标记 html = regex2.Replace(html, ""); //过滤href=javascript: () 属性 html = regex3.Replace(html, " _disibledevent="); //过滤其它控件的on...事件 html = regex4.Replace(html, ""); //过滤iframe html = regex5.Replace(html, ""); //过滤frameset html = regex6.Replace(html, ""); //过滤frameset html = regex7.Replace(html, ""); //过滤frameset html = regex8.Replace(html, ""); //过滤frameset html = regex9.Replace(html, ""); html = html.Replace(" ", ""); html = html.Replace("", ""); html = html.Replace("", ""); return html;}...
- 作者:佚名发表于:2010-06-30 查阅全文...
- 在C#中如何实现Form与Form之间的通信
- .Uwj938 { display:none; } 今天在该网站看到这么一篇文章: "C#如何实现两个WINFORM之间的访问". 把写的代码考下来的确能实现,不过大家不知道有没有发现一个问题. 写这篇文章的人把问题搞的更糟了. 为什么这么说呢. 请看我对这个问题的解决方法.大家知道面向对象程序设计的一个特点是多态.,一个是封装,还一个是继承,最后这个我们这么不做多余的说明.实现方法如下:1. 从Form 继承一个 Form1类.2. 从Form 继承一个 Form2类.3.在Form2类中加一个成员变量:frmParent4.在Form2 类中加入一个重载的构造方法:public form2(Form1 Parent){frmParent=Parent}; 5.在Form1中添加一个Button对象. 对应的事件代码为:{ Form2 frm=new Form2(this); frm.Show(); }6.在Form2中添一个Button对象,对应事件代码为:{frmParent.Text="成败改写";}就这么简单就完成了Form与Form之间的通信. 多么简单,是吧! 希望能通过这片文章认识一些C#的高手.我也是做C#程序设计师,因为看到这那篇文章会把大家引导向误区,故而写了这么一篇.还请那位仁兄(弟)看到之后不要见怪....
- 作者:佚名发表于:2010-06-30 查阅全文...
- 设计模式编程之抽象工厂模式新解
- .Mbb576 { display:none; } 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式。 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 模型图 逻辑模型:物理模型:生活中的例子 抽象工厂的目的是要提供一个创建一系列相关或相互依赖对象的接口,而不需要指定它们具体的类。这种模式可以汽车制造厂所使用的金属冲压设备中找到。这种冲压设备可以制造汽车车身部件。同样的机械用于冲压不同的车型的右边车门、左边车门、右前挡泥板、左前挡泥板和引擎罩等等。通过使用转轮来改变冲压盘,这个机械产生的具体类可以在三分钟内改变。 抽象工厂之新解 虚拟案例 中国企业需要一项简单的财务计算:每月月底,财务人员要计算员工的工资。 员工的工资 = (基本工资 + 奖金 - 个人所得税)。这是一个放之四海皆准的运算法则。 为了简化系统,我们假设员工基本工资总是4000美金。 中国企业奖金和个人所得税的计算规则是: 奖金 = 基本工资(4000) * 10% 个人所得税 = (基本工资 + 奖金) * 40% 我们现在要为此构建一个软件系统(代号叫Softo),满足中国企业的需求。 案例分析 奖金(Bonus)、个人所得税(Tax)的计算是Softo系统的业务规则(Service)。 工资的计算(Calculator)则调用业务规则(Service)来计算员工的实际工资。 工资的计算作为业务规则的前端(或者客户端Client)将提供给最终使用该系统的用户(财务人员)使用。 针对中国企业为系统建模 根据上面的分析,为Softo系统建模如下:则业务规则Service类的代码如下: 1using System;23namespace ChineseSalary4{5 /**//// <summary>6 /// 公用的常量7 /// </summary>8 public class Constant9 {10 public static double BASE_SALARY = 4000;11 }12}1using System;23namespace ChineseSalary4{5 /**//// <summary>6 /// 计算中国个人奖金7 /// </summary>8 public class ChineseBonus9 {10 public double Calculate()11 {12 return Constant.BASE_SALARY * 0.1;13 }14 }15}16 客户端的调用代码:1using System;23namespace ChineseSalary4{ 5 /**//// <summary>6 /// 计算中国个人所得税7 /// </summary>8 public class ChineseTax9 {10 public double Calculate()11 {12 return (Constant.BASE_SALARY + (Constant.BASE_SALARY * 0.1)) * 0.4;13 }14 }15}16 运行程序,输入的结果如下: Chinese Salary is:2640 针对美国企业为系统建模 为了拓展国际市场,我们要把该系统移植给美国公司使用。 美国企业的工资计算同样是: 员工的工资 = 基本工资 + 奖金 - 个人所得税。 但是他们的奖金和个人所得税的计算规则不同于中国企业: 美国企业奖金和个人所得税的计算规则是: 奖金 = 基本工资 * 15 % 个人所得税 = (基本工资 * 5% + 奖金 * 25%) 根据前面为中国企业建模经验,我们仅仅将ChineseTax、ChineseBonus修改为AmericanTax、AmericanBonus。 修改后的模型如下:则业务规则Service类的代码如下:1using System;23namespace AmericanSalary4{5 /**//// <summary>6 /// 公用的常量7 /// </summary>8 public class Constant9 {10 public static double BASE_SALARY = 4000;11 } 12}131using System;23namespace AmericanSalary4{5 /**//// <summary>6 /// 计算美国个人奖金7 /// </summary>8 public class AmericanBonus9 {10 public double Calculate()11 {12 return Constant.BASE_SALARY * 0.1;13 }14 }15}161using System;23namespace AmericanSalary4{ 5 /**//// <summary>6 /// 计算美国个人所得税7 /// </summary>8 public class AmericanTax9 {10 public double Calculate()11 {12 return (Constant.BASE_SALARY + (Constant.BASE_SALARY * 0.1)) * 0.4;13 }14 }15}16 客户端的调用代码:12using System;34namespace AmericanSalary5{6 /**//// <summary>7 /// 客户端程序调用8 /// </summary>9 public class Calculator 10 {11 public static void Main(string[] args) 12 {13 AmericanBonus bonus = new AmericanBonus();14 double bonusValue = bonus.Calculate();15 16 AmericanTax tax = new AmericanTax();17 double taxValue = tax.Calculate();18 19 double salary = 4000 + bonusValue - taxValue; 2021 Console.WriteLine("American Salary is:" + salary);22 Console.ReadLine();23 }24 }25}26 软件开发网 www.mscto.com 运行程序,输入的结果如下: American Salary is:2640 整合成通用系?...
- 作者:佚名发表于:2010-06-30 查阅全文...
- C#编程尽量使用接口来编程
- .Bfh123 { display:none; } .NET框架包括类和接口,在编写程序的时候,你可能知道正在用.NET的哪个类。然而,在这种情况下如果你用.NET支持的接口而不是它的类来编程时,代码会变得更加稳定、可用性会更高。请分析下面的代码: private void LoadList (object [] items, ListBox l) { for (int i = 0; i < items.Length;i++) l.Items.Add (items[i].ToString ()); } 这个函数从一个可为任何对象的数组中加载ListBox,这段代码被限定为只能使用数组。假想过些时候你发现那些对象存在数据库中,或别的集合中。那么你需要修改程序来使用不同的集合类型。如果你用ICollection接口来写那段程序,你就不用修改那段程序了,对于任何实现ICollection接口的类型它都能很好的工作: private void LoadList (ICollection items,ListBox l) { foreach (object o in items) l.Items.Add (o.ToString ()); } ICollection被数组和所有System.Collection中的集合实现。此外,多维数组也支持ICollection接口。如果那还不够的话,数据库.NET类同样支持ICollection接口。用接口写的这个函数不用需改就可以才许多中情况下使用。...
- 作者:佚名发表于:2010-06-30 查阅全文...
- C#中get和set访问器的解释
- .Sul414 { display:none; } 属性的访问器包含与获取(读取或计算)或设置(写)属性有关的可执行语句。访问器声明可以包含 get 访问器或 set 访问器,或者两者均包含。声明采用下列形式之一,get {} set {} get 访问器 get 访问器体与方法体相似。它必须返回属性类型的值。执行 get 访问器相当于读取字段的值。以下是返回私有字段 name 的值的 get 访问器: private string name; // the name field public string Name // the Name property { get { return name; } } 当引用属性时,除非该属性为赋值目标,否则将调用 get 访问器读取该属性的值。例如: Employee e1 = new Employee(); ... Console.Write(e1.Name); // The get accessor is invoked here get 访问器必须在 return 或 throw 语句中终止,并且控制不能超出访问器体。 set 访问器 set 访问器与返回 void 的方法类似。它使用称为 value 的隐式参数,此参数的类型是属性的类型。在下例中,set 访问器被添加到 Name 属性: public string Name { get { return name; } set { name = value; } } 当对属性赋值时,用提供新值的参数调用 set 访问器。例如: e1.Name = "Joe"; // The set accessor is invoked here 在 set 访问器中对局部变量声明使用隐式参数名 (value) 是错误的。 备注 属性按如下方式,根据所使用的访问器进行分类: 只带有 get 访问器的属性称为只读属性。无法对只读属性赋值。 只带有 set 访问器的属性称为只写属性。只写属性除作为赋值的目标外,无法对其进行引用。 同时带有 get 和 set 访问器的属性为读写属性。 在属性声明中,get 和 set 访问器都必须在属性体的内部声明。 ...
- 作者:佚名发表于:2010-06-30 查阅全文...
- 深入解析C#编程中的事件
- .Stj984 { display:none; } 一个事件是一个使对象或类可以提供公告的成员。用户可以通过提供事件句柄来为事件添加可执行代码。事件使用事件声明来声明: 一个事件声明既可以是一个事件域声明也可以是事件属性声明。在每种情况中,声明都可以由属性集合, new 修饰符, 四个访问修饰符的有效组合 和一个静态修饰符组成。 一个事件声明的类型必须是一个代表类型, 而那个代表类型必须至少同事件本身一样可访问。 一个事件域声明与一个声明了一个或多个代表类型域的域声明相应。在一个事件域声明中不允许有readonly 修饰符。 一个事件属性声明与声明了一个代表类型属性的属性声明相应。除了同时包含get访问符和set访问符的事件属性声明,成员名称和访问符声明对于那些属性声明来说都是相同的,并且不允许包含virtual、 override和abstract 修饰符。 在包含一个事件成员声明的类或结构的程序文字中,事件成员与代表类型的私有域或属性相关,而这个成员可以用于任何允许使用域或属性的上下文中。 如果一个类或结构的程序文字外面包含一个事件成员声明,这个事件成员就只能被作为+= 和 -= 操作符 (§的右手操作数使用。这些操作符被用来为事件成员附加或去掉事件句柄,而这个事件成员的访问操作符控制操作在其中被执行的上下文。 由于+= 和 -= 是唯一可以在声明了事件成员的类型外的事件上使用的操作,外部代码可以为一个事件添加或去掉句柄,但是不能通过任何其他途径获得或修改基本事件域或事件属性的数值。 在例子中 public delegate void EventHandler(object sender, Event e);public class Button: Control{ public event EventHandler Click; protected void OnClick(Event e) { if (Click != null) Click(this, e); } public void Reset() { Click = null; }} 对使用Button类中的Click事件域没有限制。作为演示的例子,这个域可以在代表调用表达式中被检验、修改和使用。类Button中的OnClick方法"引起"Click事件。引起一个事件的概念与调用由事件成员表示的代表正好相同-因此,对于引起事件没有特殊的语言构造。注意代表的调用是通过检查保证代表是非空后才进行的。 在类Button的声明外面,成员Click只能被用在+= 和 -= 操作符右手边,如下 b.Click += new EventHandler(...); 它把一个代表附加到事件Click的调用列表中,并且 b.Click -= new EventHandler(...); 它把一个代表从Click事件的调用列表中删除。 在一个形式为x += y 或 x -= y的操作中,当x是一个事件成员而引用在包含x的声明的类型外面发生时,操作的结果就是void(在赋值后与x的数值相反)。这个规则禁止外部代码直接检查事件成员的基本代表。下面的例子介绍了事件句柄如何附加到上面的类Button的实例中: public class LoginDialog: Form{ Button OkButton; Button CancelButton; public LoginDialog() { OkButton = new Button(...); OkButton.Click += new EventHandler(OkButtonClick); CancelButton = new Button(...); CancelButton.Click += new EventHandler(CancelButtonClick); } void OkButtonClick(object sender, Event e) { // Handle OkButton.Click event } void CancelButtonClick(object sender, Event e) { // Handle CancelButton.Click event }} 这里,构造函数LoginDialog创建了两个Button实例,并且把事件句柄附加到事件Click中。 事件成员是典型域,就像上面的Button例子中所示。在每个事件消耗一个域存储的情况是不可接受的,一个类可以声明事件属性来替代事件域,并且使用私有机制来存储基本的代表。(设想在某种情况下,大多数事件都是未处理的,每个事件使用一个域就不能被接受。使用属性而不是域的能力允许开发人员在空间和时间上面取得一个折中方案。) 在例子中 软件开发网 www.mscto.com class Control: Component{ // Unique keys for events static readonly object mouseDownEventKey = new object(); static readonly object mouseUpEventKey = new object(); // Return event handler associated with key protected Delegate GetEventHandler(object key) {...} // Set event handler associated with key protected void SetEventHandler(object key, Delegate handler) {...} // MouseDown event property public event MouseEventHandler MouseDown { get { return (MouseEventHandler)GetEventHandler(mouseDownEventKey); } set { SetEventHandler(mouseDownEventKey, value); } } // MouseUp event property public event MouseEventHandler MouseUp { get { return (MouseEventHandler)GetEventHandler(mouseUpEventKey); } set { SetEventHandler(mouseUpEventKey, value); }}} 类Control为事件提供了一种内部存储机制。方法SetEventHandler用一个key...
- 作者:佚名发表于:2010-06-30 查阅全文...
- C#中ArrayList.CopyTo()运行错误的解决方法
- .Tbh734 { display:none; } 在开始讲解C#中ArrayList.CopyTo()运行错误的解决方法之前,先给大家看一段代码: 以下是引用片段:ArrayList list = new ArrayList(); list.Add(1); list.Add(2); byte[] buf = new byte[2]; list.CopyTo(buf); 这段代码看上去,好正常,编译也很顺利通过,不过执行的时候出错了,为什么? 解剖ArrayList,其内部是用一个object 数组实现的,作为一切元素的容器,值类型必须转换成引用类型来储存,不然就不需要2.0的Generic出现了。 而CopyTo函数内部是用Array.Copy()来实现的,问题就出在它身上。当我们添加常量值到list里面,例如 list.Add(1),这里的1被看成是int,box储存在object后再unbox回int,于是就变成高精度向低精度复制了 int[]->byte[],就出错了,相当于如下代码: 以下是引用片段: int[] a1 = new int[2]{1,2}; byte[] a2 = new byte[2]; Array.Copy( a1, a2, 2 ); 软件开发网 www.mscto.com 回过头来,原来的代码要修改也很简单,只要box之前把它变成小精度类型就可以了,修改后的代码如下: 以下是引用片段: ArrayList list = new ArrayList(); list.Add((byte)1); list.Add((byte)2); byte[] buf = new byte[2]; list.CopyTo(buf); ...
- 作者:佚名发表于:2010-06-30 查阅全文...
- C#中启动另一个程序的实现方法
- .Sgg466 { display:none; } 一段实例代码,程序的目的是使用C#实现启动另一程序的方法。技术总监給出了我们这样一个有效的启动程序的有效方法,現在和大家分享下: 以下是引用片段: private void btnCreate_Click(object sender, EventArgs e) ...{ int hWnd = FindWindow(null, "test");//窗體的名稱 //check if PowerReuse is launched or not //if yes, pass path of project to PowerReuse //or, launch PowerReuse with specified parameter if (hWnd > 0) ...{ MessageBox.Show("powerReuse has been launched already." + " " + hWnd.ToString()); //SendMessage to PowerReuse return; } try ...{ Process Main_P = new Process(); //this path should be retrieved from Windows ReGIStry, //the loaction is written by Installter during process of installation. Main_P.StartInfo.FileName = @"C: est.exe";//運行的exe路徑 //This URL is passed to PowerReuse to open Main_P.StartInfo.Arguments = @"C:Tempabc.prj";//運行時的參數 Main_P.StartInfo.UseShellExecute = true; Main_P.Start(); // //we have to wait for a while until UI has been initialized // Main_P.WaitForInputIdle(10000); //although UI has been initialzied, //it does not mean main form of application has been completed. //we may wait for another 10 seconds for (int i = 0; i < 100; i++) ...{ hWnd = FindWindow(null, "PowerReuse (Beta)"); //hWnd = Main_P.MainWindowHandle.ToInt32() ; if (hWnd > 0) break; Thread.Sleep(100); } //Here, we check if PowerReuse is fully launched if (hWnd == 0) ...{ //Handle exception MessageBox.Show("We cannot find window handle of PowerReuse"); } else ...{ //other handling // MessageBox.Show(hWnd.ToString() + " " + Main_P.MainWindowHandle.ToString() + " " + Main_P.MainWindowTitle); } } catch (Exception ex) ...{ MessageBox.Show(ex.Message); } } ...
- 作者:佚名发表于:2010-06-30 查阅全文...
- C#+ASP.NET开发基于Web的RSS阅读器
- .Rcw801 { display:none; } 最近我一直在寻找如何在web页面上显示RSS Feed的方法,我选择 C#和ASP.NET作为工具。我创建了一个简单的处理函数来处理从一个URL获得的RSS Feed。你可以直接使用这个简单的函数,或者改造成你想要的功能。 这个函数使用一个字符串rssURL作为它的参数。这个字符串包含了RSS的URL。它使用rssURL的值建立了一个WebRequest项:System.Net.WebRequest myRequest = System.Net.WebRequest.Create(rssURL); 这个请求的响应将会被放到一个WebResponse对象里:System.Net.WebResponse myResponse = myRequest.GetResponse(); 然后这个WebResponse对象被用来建立一个流来取出XML的值:System.IO.Stream rssStream = myResponse.GetResponseStream(); 然后可以使用一个XmlDocument对象来存储流中的XML内容。XmlDocument对象用来调入XML的内容:System.Xml.XmlDocument rssDoc = new System.Xml.XmlDocument();rssDoc.Load(rssStream); 因为RSS Feed不只是一个XML文件,我们可以假设里面包含了一些RSS标准的规定。这里,我们假设使用了RSS 2.0。你可以从http://blogs.law.harvard.edu/tech/rss里得到规范的详细内容。 软件开发网 www.mscto.com 具体的来说,每个项应该在rss/channel/里。使用XPath表达,一个项节点列表可以如下方式创建: System.Xml.XmlNodeList rssItems = rssDoc.SelectNodes("rss/channel/item"); rssItems存储了从RSS里获得所有项节点的信息。这样就可取得内部所需要的信息了。这里,标题、链接和每个项的描述将会被显示。在rssItems中存储的每个项,每个标记(tag)元素都可以用SelectSingleNode方法提取出来。返回的值将被赋给一个XMLNode对象。以下代码获取了一个标题节点:System.Xml.XmlNode rssDetail;rssDetail = rssItems.Item(i).SelectSingleNode("title"); 现在标记需要被提取出来,使用InnerText完成这项工作。在调用SelectSingleNode之后,可以用rssDetail来测试格式化的RSS XML是否包含某些标记:if (rssDetail != null) { title = rssDetail.InnerText; } else { title = ""; } 这样,你就完成了从一个Feed里获取RSS内容的工作。剩下的工作就是调用这个方法来显示Feed的内容了。以下是一个使用ASP.NET完成的完整的例子:<%@ Page Language="C#" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server">public void ProcessRSSItem(string rssURL){ System.Net.WebRequest myRequest = System.Net.WebRequest.Create(rssURL); System.Net.WebResponse myResponse = myRequest.GetResponse(); System.IO.Stream rssStream = myResponse.GetResponseStream(); System.Xml.XmlDocument rssDoc = new System.Xml.XmlDocument(); rssDoc.Load(rssStream); System.Xml.XmlNodeList rssItems = rssDoc.SelectNodes("rss/channel/item"); string title = ""; string link = ""; string description = ""; for (int i = 0; i < rssItems.Count; i++) { System.Xml.XmlNode rssDetail; rssDetail = rssItems.Item(i).SelectSingleNode("title"); if (rssDetail != null) { title = rssDetail.InnerText; } else { title = ""; } rssDetail = rssItems.Item(i).SelectSingleNode("link"); if (rssDetail != null) { link = rssDetail.InnerText; } else { link = ""; }rssDetail = rssItems.Item(i).SelectSingleNode("link");if (rssDetail != null){link = rssDetail.InnerText;}else{link = "";}rssDetail = rssItems.Item(i).SelectSingleNode("description");if (rssDetail != null){description = rssDetail.InnerText;}else{description = "";}Response.Write("<p><b><a href='" + link + "' target='new'>" + title + "</a></b><br/>");Response.Write(description + "</p>");}}</script><html xmlns="http://www.w3.org/1999/xhtml"> 软件开发网 www.mscto.com <head runat="server"><title>Untitled Page</title></head><body><form id="form1" runat="server"><div><%string rssURL = "http://www.codeguru.com/icom_includes/feeds/codeguru/rss-all.xml";Response.Write("<font size=5><b>Site: " + rssURL + "</b></font><Br />");ProcessRSSItem(rssURL);Response.Write("<hr />");rssURL = "http://www.developer.com/icom_includes/feeds/special/dev-5.xml";Response.Write("<font size=5><b>Site: " + rssURL + "</b></font><Br />");ProcessRSSItem(rssURL);%></div></form></body>...
- 作者:佚名发表于:2010-06-30 查阅全文...
- C#委托、事件、自定义事件的理解
- .Jzd195 { display:none; } 一、委托委托类似于函数指针,但函数指针只能引用静态方法,而委托既能引用静态方法,也能引用实例方法。委托使用分三步:1、委托声明。2、委托实例化。3、委托调用。例程一: using System;namespace 委托{ delegate int NumOpe(int a,int b); //委托声明 class Class1 { static void Main(string[] args) { Class1 c1 = new Class1(); NumOpe p1 = new NumOpe(c1.Add); //委托实例化 Console.WriteLine(p1(1,2)); //委托调用 Console.ReadLine(); } private int Add(int num1,int num2) { return(num1+num2); } }}例中,委托NumOpe引用了方法Add。委托声明了以后,就可以象类一样进行实例化,实例化时把要引用的方法(如:Add)做为参数,这样委托和方法就关联了起来,就可以用委托来引用方法了。 委托和所引用的方法必须保持一致:1、参数个数、类型、顺序必须完全一致。2、返回值必须一致。二、事件事件有很多,比如说鼠标的事件:MouserMove,MouserDown等,键盘的事件:KeyUp,KeyDown,KeyPress。有事件,就会有对事件进行处理的方法,而事件和处理方法之间是怎么联系起来的呢?委托就是他们中间的桥梁,事件发生时,委托会知道,然后将事件传递给处理方法,处理方法进行相应处理。比如在WinForm中最常见的是按钮的Click事件,它是这样委托的:this.button1.Click += new System.EventHandler(this.button1_Click);按按钮后就会出发button1_Click方法进行处理。EventHandler就是系统类库里已经声明的一个委托。三、自定义事件及其处理EventHandler以及其它自定义的事件委托都是一类特殊的委托,他们有相同的形式:delegate void 事件委托名(object sender,EventArgs e);object用来传递事件的发生者,比如二中的Button控件就是一个事件发生者;EventArgs用来传递事件的细节。例程二: using System;namespace 最简单的自定义事件{ ///
/// 事件发送类 /// class Class1 { public delegate void UserRequest(object sender,EventArgs e); //定义委托 public event UserRequest OnUserRequest; //定义一个委托类型的事件 public void run() { while(true) { if(Console.ReadLine()=="a") {//事件监听 OnUserRequest(this,new EventArgs()); //产生事件 } } } } ////// 事件接收类 /// class Class2 { static void Main(string[] args) { Class1 c1 = new Class1(); c1.OnUserRequest += new Class1.UserRequest(c1_OnUserRequest); //委托实例化后绑定到事件 c1.run(); } private static void c1_OnUserRequest(object sender, EventArgs e) {//事件处理方法 Console.WriteLine("\t你触发了事件!"); } }}例程三: using System;namespace 带事件数据的事件{ ////// 带事件数据的事件类,从EventArgs继承 /// class OnUserRequestEventArgs:EventArgs { private string inputText; public string InputText { get { return inputText; } set { inputText = value; } } } ////// 事件发送类 /// class Class1 { public delegate void UserRequest(object sender,OnUserRequestEventArgs e); public event UserRequest OnUserRequest; public void run() { while(true) { Console.WriteLine("请输入内容:"); string a=Console.ReadLine();... - 作者:佚名发表于:2010-06-30 查阅全文...
- C#中将Big5繁体转换简体GB2312的程序
- .Ogb606 { display:none; } using System; using System.IO; using System.Text; using System.Runtime.InteropServices; //big5繁体转换简体的程序 public class EncodeTool { [DllImport("kernel32.dll", EntryPoint = "LCMapStringA")] public static extern int LCMapString(int Locale, int dwMapFlags, byte[] lpSrcStr, int cchSrc, byte[] lpDestStr, int cchDest); const int LCMAP_SIMPLIFIED_CHINESE = 0x02000000; const int LCMAP_TRADITIONAL_CHINESE = 0x04000000; public static void Main (String[] args) { if (args.Length<1) { Console.WriteLine("请指定路径!"); } String[] files=Directory.GetFiles(args[0]); if(args.Length==2) files=Directory.GetFiles(args[0],args[1]); String dir=args[0]+"\\conv"; if(!Directory.Exists(dir)){ Directory.CreateDirectory(dir); } for(int i=0;i StreamReader sr = new StreamReader(files[i],Encoding.GetEncoding("big5")); String lines=sr.ReadToEnd(); sr.Close(); lines=ConvertString(lines); //Console.WriteLine(lines); StreamWriter sw = new StreamWriter(dir+"\\"+files[i],false,Encoding.GetEncoding("gb2312")); sw.WriteLine(lines); sw.Close(); Console.WriteLine("转换 {0} ok!",files[i]); } } public static String ConvertString(String lines){ Encoding gb2312 = Encoding.GetEncoding(936); byte[] src=gb2312.GetBytes(lines); byte[] dest = new byte[src.Length]; LCMapString(0x0804, LCMAP_SIMPLIFIED_CHINESE, src, -1, dest, src.Length); return gb2312.GetString(dest); } }...
- 作者:佚名发表于:2010-06-30 查阅全文...
- C#编程 忘记密码功能的实现方法
- .Vbu601 { display:none; } 本文将给出通过c#编程来实现 忘记密码 功能的方法和代码,大家可以参照本文的思路自己写出这个功能代码…… 以下是引用片段:以下是引用片段:int result = user.GetBackPassword(LoginName.Text.Trim(), Question.Text.Trim(), Answer.Text.Trim(), Email.Text); if (result == 1) { Message.Text = "您的密码已发送,请到邮箱查收"; //user.ChangePassword( } else { Message.Text = "您的输入信息有误!"; } public int GetBackPassword(string userName, string question, string answer, string email) { object m_DBNull = Convert.DBNull; //获得新的随机密码 string newPassword = MakePassword(6); //定义存储过程参数 SqlParameter[] para = { new SqlParameter("@userName", userName), new SqlParameter("@question", question), new SqlParameter("@answer", answer), new SqlParameter("@newPassword", newPassword), new SqlParameter("@result", SqlDbType.Int, 8, ParameterDirection.Output, true, 0, 0, "", DataRowVersion.Default, m_DBNull) }; //执行存储过程 try { DAL.SQLHelper.ExecuteNonQuery(DAL.SQLHelper.CONN_STRING, CommandType.StoredProcedure, "GetBackPwd", para); } catch { throw new Exception("邮件无法发送!"); } //获得输出参数的值 int result = Convert.ToInt32(para[4].Value); //如果密码保护资料填写正确 if (result == 1) { //从Web.config获取发信人地址、邮件标题、邮件用户名和密码以及SmtpServer string sender = System.Configuration.ConfigurationSettings.AppSettings["mainSender"]; string title = System.Configuration.ConfigurationSettings. AppSettings["mailTitle"]; string mailUser = System.Configuration.ConfigurationSettings.AppSettings["mailUser"]; string mailPwd = System.Configuration.ConfigurationSettings.AppSettings["mailPwd"]; string smtpServer = System.Configuration.ConfigurationSettings.AppSettings["mailSmtpServer"]; //发信 try { Mail.CDOsendmail(sender, email, title, "您在eshop的密码已找回,新密码为"+newPassword , mailUser, mailPwd, smtpServer); } catch(Exception ex) { throw new Exception(ex.Message); } } return result; } //随机生成密码 private static string MakePassword(int pwdLength) { //声明要返回的字符串 string tmpstr = ""; //密码中包含的字符数组 string pwdchars="abcdefghijklmnopqrstuvwxyz0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //数组索引随机数 int iRandNum; //随机数生成器 Random rnd = new Random(); for(int i=0;i
... - 作者:佚名发表于:2010-06-30 查阅全文...
- TreeView [ 回车展开节点, 鼠标右键,禁止闪屏....]
- .Lyt418 { display:none; } using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Data.SqlClient;namespace ksClient{ public partial class DGM : Form { //获取当前选定的节点值 public int CurrentVal = 0; //获取控件树的深度 public int pubDeep = 0; // 获取子树节点的个数 public int pubChildNum = 0; //获取当前节点对象 public TreeNode CurrentNode = null; //设置 对话框 public DialogResult dr; 软件开发网 www.mscto.com public DataSet ds1 = null; public DataSet ds2 = null; public DataSet ds3 = null; public DataSet ds4 = null; public DGM() { InitializeComponent(); } private DataSet Bind(string sql) { SqlConnection conn = new SqlConnection("Server=.;database=model;Integrated Security=SSPI"); SqlDataAdapter da = new SqlDataAdapter(sql,conn); DataSet ds = new DataSet(); da.Fill(ds); return ds; } private void KK(string sql) { SqlConnection conn = new SqlConnection("Server=.;database=model;Integrated Security=SSPI"); SqlCommand cmd = new SqlCommand(sql, conn); try { conn.Open(); cmd.ExecuteNonQuery(); } catch (Exception ex) { throw ex; } } protected void inittree() { tvShow.Nodes.Clear(); DataView dv = Bind("select *from series").Tables[0].DefaultView; ds1 = Bind("select * from groups"); ds2 = Bind("select *from subject"); ds3 = Bind("select * from chapter"); ds4 = ds3.Copy(); // ds4 = Bind("select * from chapter"); if (dv.Table.Rows.Count > 0) { foreach (DataRowView dr in dv)...
- 作者:佚名发表于:2010-06-30 查阅全文...
- C#生成中文汉字验证码源码
- .Zgt569 { display:none; } using System; using System.Data; using System.Configuration; using System.Collections; 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.Drawing; using System.Text; public partial class Admin_ValidCode : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { this.CreateCheckCodeImage(GenerateCheckCode()); } private string GenerateCheckCode() { int number; //char code; string checkCode = String.Empty; System.Random random = new Random(); Encoding gb = Encoding.GetEncoding("gb2312"); //调用函数产生4个随机中文汉字编码 object[] bytes = CreateRegionCode(6); //根据汉字编码的字节数组解码出中文汉字 string str1 = gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[]))); string str2 = gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[]))); string str3 = gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[]))); string str4 = gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[]))); //输出的控制台 checkCode = str1 + str2 + str3 + str4; //for (int i = 0; i < 5; i++) //{ // number = random.Next(); // if (number % 2 == 0) // code = (char)('0' + (char)(number % 10)); // else // code = (char)('A' + (char)(number % 26)); 软件开发网 www.mscto.com // checkCode += code.ToString(); //} Response.Cookies.Add(new HttpCookie("ValidCode",LjfLib.Encrypt.AES.EncryptAes(checkCode))); //Session["ValidCode"] = checkCode; return checkCode; } #region 产生波形滤镜效果 软件开发网 www.mscto.com private static object[] CreateRegionCode(int strlength) { //定义一个字符串数组储存汉字编码的组成元素 string[] rBase = new String[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; Random rnd = new Random(); //定义一个object数组用来 object[] bytes = new object[strlength]; /*每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中 每个汉字有四个区位码组成 区位码第1位和区位码第2位作为字节数组第一个元素 区位码第3位和区位码第4位作为字节数组第二个元素 */ for (int i = 0; i < strlength; i++) { //区位码第1位 int r1 = rnd.Next(11, 14); string str_r1 = rBase[r1].Trim(); //区位码第2位 rnd = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i);//更换随机数发生器的 //种子避免产生重复值 int r2; if (r1 == 13) { r2 = rnd.Next(0, 7); } else { r2 = rnd.Next(0, 16); } string str_r2 = rBase[r2].Trim(); //区位码第3位 rnd = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i); int r3 = rnd.Next(10, 16); string str_r3 = rBase[r3].Trim(); 软件开发网 www.mscto.com //区位码第4位 rnd = new Random(r3 * unchecked((int)DateTime.Now.Ticks) + i); int r4; if (r3 == 10) { r4 = rnd.Next(1, 16); } else if (r3 == 15) { r4 = rnd.Next(0, 15); } else { r4 = rnd.Next(0, 16); } string str_r4 = rBase[r4].Trim(); //定义两个字节变量存储产生的随机汉字区位码 byte byte1 = Convert.ToByte(str_r1 + str_r2, 16); byte byte2 = Convert.ToByte(str_r3 + str_r4, 16); //将两个字节变量存储在字节数组中 byte[] str_r = new byte[] { byte1, byte2 }; //将产生的一个汉字的字节数组放入object数组中 bytes.SetValue(str_r, i); } return bytes; } 软件开发网 www.mscto.com private const double PI = 3.1415926535897932384626433832795; private const double PI2 = 6.283185307179586476925286766559; private System.Drawing.Bitmap TwistImage(Bitmap srcBmp, bool bXDir, double dMultValue, double dPhase) { System.Drawing.Bitmap destBmp = new Bitmap(srcBmp.Width, srcBmp.Height); // 将位图背景填充为白色 System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(destBmp); graph.FillRectangle(new SolidBrush(System.Drawing.Color.White), 0, 0, destBmp.Width, destBmp.Height); graph.Dispose(); double dBaseAxisLen = bXDir ? (double)destBmp.Height : (double)destBmp.Width; for (int i = 0; i < destBmp.Width; i++) { for (int j = 0; j < destBmp.Height; j++) { double dx = 0; dx = bXDir ? (PI2 * (double)j) / dBaseAxisLen : (PI2 * (double)i) / dBaseA...
- 作者:佚名发表于:2010-06-30 查阅全文...
- 用C#实现C/S模式下软件自动在线升级
- .Lso908 { display:none; } 1 前言 长期以来,广大程序员为到底是使用Client/Server,还是使用Browser/Server结构争论不休,在这些争论当中,C/S结构的程序可维护性差,布置困难,升级不方便,维护成本高就是一个相当重要的因素。有很多企业用户就是因为这个原因而放弃使用C/S。然而当一个应用必须要使用C/S结构才能很好的实现其功能的时候,我们该如何解决客户端的部署与自动升级问题?部署很简单,只要点击安装程序即可,难的在于每当有新版本发布时,能够实现自动升级。现在好了,我们的目标很简单,我们希望开发一个与具体应用无关的能够复用的自动升级系统。下面我为大家提供了一套可复用的用C#编写的自动升级系统。 2 实现软件的自动升级存在的困难 第一,为了查找远程服务器上的更新,应用程序必须有查询网络的途径,这需要网络编程、简单的应用程序与服务器通讯的协议。 第二是下载。下载看起来不需要考虑联网的问题,但要考虑下载用户请求的文件,以及在没有用户同意时下载大文件。友好的自动更新应用程序将使用剩余的带宽下载更新。这听起来简单,但却是一个技术难题,幸运的是已经有了解决方法。 第三个考虑因素是使用新版应用程序更换原应用程序的过程。这个问题比较有趣,因为它要求代码运行时将自己从系统删除,有多种办法可以实现该功能[5],本文程序主要通过比较新旧版本的日期号来实现替换新版本应用程序的功能。 3 实现软件自动在线升级的原理 写两个程序,一个是主程序;一个是升级程序;所有升级任务都由升级程序完成。 1.启动升级程序,升级程序连接到网站,下载新的主程序(当然还包括支持的库文件、XML配置文档等)到临时文件夹; 2.升级程序获取服务器端XML配置文件中新版本程序的更新日期或版本号或文件大小; 3.升级程序获取原有客户端应用程序的最近一次更新日期或版本号或文件大小,两者进行比较;如果发现升级程序的日期大于原有程序的最新日期,则提示用户是否升级;或者是采用将现有版本与最新版本作比较,发现最新的则提示用户是否升级;也有人用其它属性如文件大小进行比较,发现升级程序的文件大小大于旧版本的程序的大小则提示用户升级。本文主要采用比较新旧版本更新日期号来提示用户升级。 4.如果用户选择升级,则获取下载文件列表,开始进行批量下载文档; 5.升级程序检测旧的主程序是否活动,若活动则关闭旧的主程序; 6.删除旧的主程序,拷贝临时文件夹中的文件到相应的位置; 7.检查主程序的状态,若状态为活动的,则启动新的主程序; 8.关闭升级程序,升级完成[4]。 软件开发网 www.mscto.com 4 用C#实现在线升级的关键步骤 这里我主要使用日期信息来检测是否需要下载升级版本。 4.1 准备一个XML配置文件 名称为AutoUpdater.xml,作用是作为一个升级用的模板,显示需要升级的信息。 <?xml version="1.0"?> //xml版本号 <AutoUpdater> <URLAddres URL="http://192.168.198.113/vbroker/log/"/>//升级文件所在服务器端的网址 <UpdateInfo> <UpdateTime Date = "2005-02-02"/> //升级文件的更新日期 <Version Num = "1.0.0.1"/> //升级文件的版本号 </UpdateInfo> <UpdateFileList> //升级文件列表 <UpdateFile FileName = "aa.txt"/> //共有三个文件需升级 <UpdateFile FileName = "VB40.rar"/> <UpdateFile FileName = "VB4-1.CAB"/> </UpdateFileList> <RestartApp> <ReStart Allow = "Yes"/> //允许重新启动应用程序 <AppName Name = "TIMS.exe"/> //启动的应用程序名 </RestartApp> </AutoUpdater> 从以上XML文档中可以得知升级文档所在服务器端的地址、升级文档的更新日期、需要升级的文件列表,其中共有三个文件需升级:aa.txt、VB40.rar、VB4-1.CAB。以及是否允许重新启动应用程序和重新启动的应用程序名。 4.2 获取客户端应用程序及服务器端升级程序的最近一次更新日期 通过GetTheLastUpdateTime()函数来实现。private string GetTheLastUpdateTime(string Dir) { string LastUpdateTime = ""; string AutoUpdaterFileName = Dir + @"\AutoUpdater.xml"; if(!File.Exists(AutoUpdaterFileName)) return LastUpdateTime; //打开xml文件 FileStream myFile = new FileStream(AutoUpdaterFileName,FileMode.Open); //xml文件阅读器 XmlTextReader xml = new XmlTextReader(myFile); while(xml.Read()) { if(xml.Name == "UpdateTime") { //获取升级文档的最后一次更新日期 LastUpdateTime = xml.GetAttribute("Date"); break; } } xml.Close(); myFile.Close(); return LastUpdateTime; } 通过XmlTextReader打开XML文档,读取更新时间从而获取Date对应的值,即服务器端升级文件的最近一次更新时间。 函数调用实现: //获取客户端指定路径下的应用程序最近一次更新时间 string thePreUpdateDate = GetTheLastUpdateTime(Applicatio...
- 作者:佚名发表于:2010-06-30 查阅全文...
- ASP.NET简单多文件上传方法
- .Zeo913 { display:none; } 前台文件<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
Untitled Page 后台文件using System;using System.IO;using System.Data;using System.Configuration;using System.Collections;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; public partial class _Default : System.Web.UI.Page{ protected void Page_Load(object sender, EventArgs e) { } protected void Upload_Click1(object sender, EventArgs e) { HttpFileCollection _files = System.Web.HttpContext.Current.Request.Files;//上传文件的集合 if (_files != null) { for (int i = 0; i < _files.Count; i++) { //HttpPostedFile postedFile = _files[i];//上传文件的单独访问 string fileName = Path.GetFileName(_files[i].FileName);//得到文件的名称 if (fileName != "") { _files[i].SaveAs(Server.MapPath("~/Update/") + fileName); } } } }} ... - 作者:佚名发表于:2010-06-30 查阅全文...





