现在很多的javascript控件,非常的不错,其中step就是一个,如下图所示:那么如何用C#来实现一个step控件呢?先定义一个StepEntity类来存储步骤条节点的信息:public class StepEntity { public string Id { get; set; } public string StepName { get; set; } public int StepOrder { get; set; } public eumStepState StepState { get; set; } public string StepDesc { get; set; } public object StepTag { get; set; } //public Image StepCompletedImage { get; set; } //public Image StepDoingImage { get; set; } public StepEntity(string id,string stepname,int steporder,string stepdesc, eumStepState stepstate,object tag) { this.Id = id; this.StepName = stepname; this.StepOrder = steporder; this.StepDesc = stepdesc; this.StepTag = tag; this.StepState = stepstate; } }定义一个名为StepViewer 的用户控件。public partial class StepViewer : UserControl { public StepViewer() { InitializeComponent(); this.Height = 68; }}在StepViewer 的用户控件中定义一个ListDataSource的属性,如下:private List<StepEntity> _dataSourceList = null; [Browsable(true), Category("StepViewer")] public List<StepEntity> ListDataSource { get { return _dataSourceList; } set { if (_dataSourceList != value) { _dataSourceList = value; Invalidate(); } } }在此控件的paint方法中,进行步骤条的绘制:private void StepViewer_Paint(object sender, PaintEventArgs e) { if(this.ListDataSource!=null) { int CenterY = this.Height / 2; int index = 1; int count = ListDataSource.Count; int lineWidth = 120; int StepNodeWH = 28; //this.Width = 32 * count + lineWidth * (count - 1) + 6+300; //defalut pen & brush e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; Brush brush = new SolidBrush(_Gray); Pen p = new Pen(brush, 1f); Brush brushNode = new SolidBrush(_DarkGray); Pen penNode = new Pen(brushNode, 1f); Brush brushNodeCompleted = new SolidBrush(_Blue); Pen penNodeCompleted = new Pen(brushNodeCompleted, 1f); int initX = 6; //string Font nFont = new Font("微软雅黑", 12); Font stepFont = new Font("微软雅黑", 11,FontStyle.Bold); int NodeNameWidth = 0; foreach (var item in ListDataSource) { //round Rectangle rec = new Rectangle(initX, CenterY - StepNodeWH / 2, StepNodeWH, StepNodeWH); if (CurrentStep == item.StepOrder) { if (item.StepState == eumStepState.OutTime) { e.Graphics.DrawEllipse(new Pen(_Red,1f), rec); e.Graphics.FillEllipse(new SolidBrush(_Red), rec); } else { e.Graphics.DrawEllipse(penNodeCompleted, rec); e.Graphics.FillEllipse(brushNodeCompleted, rec); } //白色字体 SizeF fTitle = e.Graphics.MeasureString(index.ToString(), stepFont); Point pTitle = new Point(initX + StepNodeWH / 2 - (int)Math.Round(fTitle.Width) / 2, CenterY - (int)Math.Round(fTitle.Height / 2)); e.Graphics.DrawString(index.ToString(), stepFont, Brushes.White, pTitle); //nodeName SizeF sNode = e.Graphics.MeasureString(item.StepName, nFont); Point pNode = new Point(initX + StepNodeWH, CenterY - (int)Math.Round(sNode.Height / 2) + 2); e.Graphics.DrawString(item.StepName,new Font( nFont,FontStyle.Bold), brushNode, pNode); NodeNameWidth = (int)Math.Round(sNode.Width); if (index < count) { e.Graphics.DrawLine(p, initX + StepNodeWH + NodeNameWidth, CenterY, initX + StepNodeWH + NodeNameWidth + lineWidth, CenterY); } } else if (item.StepOrder < CurrentStep) { //completed e.Graphics.DrawEllipse(penNodeCompleted, rec); //image RectangleF recRF = new RectangleF(rec.X + 6, rec.Y + 6, rec.Width - 12, rec.Height - 12); e.Graphics.DrawImage(ControlsResource.check_lightblue, recRF); //nodeName SizeF sNode = e.Graphics.MeasureString(item.StepName, nFont); Point pNode = new Point(initX + StepNodeWH, CenterY - (int)Math.Round(sNode.Height / 2) + 2); e.Graphics.DrawString(item.StepName, nFont, brushNode, pNode); NodeNameWidth = (int)Math.Round(sNode.Width); if (index < count) { e.Graphics.DrawLine(penNodeCompleted, initX + StepNodeWH + NodeNameWidth, CenterY, initX + StepNodeWH + NodeNameWidth + lineWidth, CenterY); } } else { e.Graphics.DrawEllipse(p, rec); // SizeF fTitle = e.Graphics.MeasureString(index.ToString(), stepFont); Point pTitle = new Point(initX + StepNodeWH / 2 - (int)Math.Round(fTitle.Width) / 2, CenterY - (int)Math.Round(fTitle.Height / 2)); e.Graphics.DrawString(index.ToString(), stepFont, brush, pTitle); //nodeName SizeF sNode = e.Graphics.MeasureString(item.StepName, nFont); Point pNode = new Point(initX + StepNodeWH, CenterY - (int)Math.Round(sNode.Height / 2) + 2); e.Graphics.DrawString(item.StepName, nFont, brushNode, pNode); NodeNameWidth = (int)Math.Round(sNode.Width); if (index < count) { //line e.Graphics.DrawLine(p, initX + StepNodeWH + NodeNameWidth, CenterY, initX + StepNodeWH + NodeNameWidth + lineWidth, CenterY); } } //描述信息 if (item.StepDesc != "") { Point pNode = new Point(initX + StepNodeWH, CenterY+10); e.Graphics.DrawString(item.StepDesc,new Font(nFont.FontFamily,10),brush, pNode); } index++; //8 is space width initX = initX + lineWidth + StepNodeWH+ NodeNameWidth+8; } } }控件的使用:List<StepEntity> list = new List<StepEntity>(); list.Add(new StepEntity("1", "新开单", 1, "这里是该步骤的描述信息", eumStepState.Completed, null)); list.Add(new StepEntity("2", "主管审批", 2, "这里是该步骤的描述信息", eumStepState.Waiting, null)); list.Add(new StepEntity("3", "总经理审批", 3, "这里是该步骤的描述信息", eumStepState.OutTime, null)); list.Add(new StepEntity("2", "完成", 4, "这里是该步骤的描述信息", eumStepState.Waiting, null)); this.stepViewer1.CurrentStep = 3; this.stepViewer1.ListDataSource = list;同样的,我们可以实现如下的timeline控件。以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

本文实例讲述了C#提示:“在证书存储区中找不到清单签名证书”的解决方法。分享给大家供大家参考。具体分析如下:一、问题:程序重新生成,提示错误:在证书存储区中找不到清单签名证书。二、解决方法:可能是之前部署的程序证书被我删掉了或是证书过期了,结果出现这个问题。解决方案如下:方案1:右击项目属性—>签名—>为ClickOnce清单签名,将勾掉的选项去掉。方案2:在签名中创建一个新的签名。方案3:记事本打开相应的csproj文件,调整节点值。<SignManifests>true</SignManifests>将true修改为false。以上解决方案任选其一,我选了方案一,简单嘛,重新生成,问题搞定!希望本文所述对大家的C#程序设计有所帮助。

枚举、结构枚举的类型有限(short、byte...)且是相同的,在MSDN上找到枚举的一些示例,觉得这个还不错:复制代码 代码如下:enum myWeekDay { Monday = 1, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };int i = 3;myWeekDay today = (myWeekDay)i;枚举是需要先声明的,然后再通过新建一个变量(today)为枚举类型来使用。枚举默认的基本类型值从0开始,递增1,这叫等差数列。枚举声明时,建议放在命名空间,当然,也可以放在类或结构中。将其它变量赋值给枚举类型时,需要强制转换,例如:today = (myWeekDay)myByte。当然,还有Enum.Parse(typeof(),)命令,就不具体研究了,用时再来看。而结构(struct)就比较好用了,一个结构内支持不同基础数据类型。同样需要先声明结构,然后再声明变量为该结构类型,从而使用:复制代码 代码如下:enum orientation : byte { north = 1, south = 2, east = 3, west = 4};struct route{    public orientation direction;    public double distance;}使用public:让调用该结构的代码可以访问该结构的成员。具体应用:复制代码 代码如下:route myRoute;int myDirection = -1;double myDistance;Console.WriteLine("1) North\n2) South\n3) East\n4) West");do{    Console.WriteLine("请选择一个行驶方向:");    myDirection = Convert.ToInt32(Console.ReadLine());} while (myDirection < 1 || myDirection > 4);Console.WriteLine("请输入一个距离:");myDistance = Convert.ToDouble(Console.ReadLine());myRoute.direction = (orientation)myDirection;myRoute.distance = myDistance;Console.WriteLine("指定方向 {0} 的距离是 {1}", myRoute.direction, myRoute.distance);注意myRoute.direction = (orientation)myDirection这一行代码,应该是枚举的应用场景:只需要指明枚举值中的基本类型值i,再通过(enumName)i的方式,即可取得对应的字符串。声明一个结构:route(创建的结构名) myRoute,再通过 myRoute.属性 的方式访问结构中的成员。数组印象中的数组总是比较复杂的东东。一个不错的例子:需要存储10个同学的姓名,使用数组即可简单解决,首先声明数组:复制代码 代码如下:string[] friendNames = new string [arrayCount];string[] friendNames = {"张三","李四","王五","谢六","陈七"};第一行只初始化数组大小,可选 常数 或 常量,初始化后,才可使用friendNames[0]的方式为数组元素赋值。第二行直接声明数组,并且初始化了数组的内容。可使用for循环,配合friendNames.Length的大小,来访问数组值,注意第1个元素的位置是0。也可使用foreach,并且不担心超出数组范围。foreach与for的区别在于,foreach是只读访问。复制代码 代码如下:foreach (string myStr in friendNames){    Console.WriteLine(myStr);}多维数组分为矩形数组(多行的每行元素个数相同)、锯齿数组(多行的每行元素个数不同,并可能存在 {列1{行1{层1,层2},行2},列2...}),当然,同样可以使用foreach的方式,取出所有元素的内容,多嵌套一个foreach即可:复制代码 代码如下:int[][] jaggedIntArray = { new int[] { 1, 2, 3 }, new int[] { 4, 5 }, new int[] { 6, 7, 8, 9 }, new int[] {10, 11} };foreach(int[] topArray in jaggedIntArray){    foreach (int bottomArray in topArray)    {        Console.Write("{0} ", bottomArray);    }    Console.Write("\n");}注意:这儿用的都是[]或{},没有用()的方式哈,不要总写错括号,很低级。字符串处理这个就有意思多了。可以通过myString[1]的方式访问字符串中的每个字符,第1个字符位是0:复制代码 代码如下:String myString = "  HeLlO WoRlD ";char myChar = myString[1];使用ToCharArray(),获取一个分解myString每个字符后的char数组:复制代码 代码如下:char[] myChars = myString.ToCharArray();还可以使用myString.Length获取字符串的数量,使用myString.ToLower()转为大写,myString.ToUpper()转为小写。注意:ToLower()、ToUpper()并不会改变变量本身的值的大小写,还需要用myString = myString.ToLower()才能修改变量本身的值。myString.Trim()可以去掉字符串前、后的空格,还有TrimStart()和TrimEnd(),分别去掉前面和后面的空格。还可以使用Trim(myChar[])的方式,指定去除前后的内容不限于空格(char[] myChar = {' ','s'}):复制代码 代码如下:myString = "  sfrost/110110200010101100-13090909880 ";char mykg = ' ';char[] myxhx = {'-','/'};String[] myStrings = myString.Trim(mykg).Split(myxhx);Console.WriteLine("myStrings[0] = {0}", myStrings[0]);Console.WriteLine("myStrings[1] = {0}", myStrings[1]);Console.WriteLine("myStrings[2] = {0}", myStrings[2]);最近刚好在搞微信开发,在C#中,上面这个例子,就可以实现以一个(些)关键字分解用户输入的个人信息。例子中使用的Split()方法,同样的可以使用char数组来指明分解的标识。强调一下,Split分解字符串的位置可以是多个不同标记的位置。结语从这章开始,很多内容都可以马上做一些小的课题了,呵呵。不管是枚举(同类型)、结构(成员不同类型)、数组(一维、矩形[二维]、锯齿[不规则多维])、以及字符串处理,还有枚举与普通变量之间的值如何转换,数组如何声明、初始化和访问等等。而字符串的处理就太有意思了,特别是split,还有replace,再应用char数组,可以说是锦上添花啊。附:习题案例编写一个控制台应用程序,接收用户输入的字符串,将字符串的顺序以输入时相反的方向输出:复制代码 代码如下:Console.WriteLine("请输入需要交换位置的字符串:");String myString = Console.ReadLine().Trim();Console.WriteLine("{0}", myString.Length);String tmpStr = "";for (int i = myString.Length; i > 0; i--){    tmpStr += myString[i-1];}Console.WriteLine(tmpStr);编写一个控制台应用程序,接收用户输入的字符串,用yes替换字符串中的所有no:复制代码 代码如下:Console.WriteLine("请输入带有no的字符串:");myString = Console.ReadLine().ToLower().Trim();Console.WriteLine("用 yes 替换掉 {0} 中的 no 后:{1}", myString, myString.Replace("no", "yes"));编写一个控制台应用程序,给字符串的每个单词加上引号(我以为,单词间肯定有空格):复制代码 代码如下:Console.WriteLine("请输入带有空格的单词:");String myWord = Console.ReadLine().Trim();String[] myWords = myWord.Split(' ');myWord = "";foreach(String tmpWord in myWords){    myWord += "\"" + tmpWord + "\" ";}Console.WriteLine("添加引号后的句子:{0}",

本文实例讲述了C#中异步回调函数用法。分享给大家供大家参考。具体如下:static void Main(string[] args){ Func<string,string> showMessage = ShowMessage; //设置了回调函数Completed,不能有返回值 IAsyncResult result = showMessage.BeginInvoke("测试异步委托",new AsyncCallback(Completed),null); //半段异步是否结束 while(!result.IsCompleted) { Console.WriteLine("主线程可以进行其它的操作!"); } Console.ReadLine();}static string ShowMessage(string x){ string current = string.Format("当前线程id为{0}",Thread.CurrentThread.ManagedThreadId); Thread.Sleep(3000); return string.Format("{0},输入为{1}", current, x);}static void Completed(IAsyncResult result){ Console.WriteLine("异步完成!"); //获取委托对象,并用EndInvoke方法获取返回结果 AsyncResult _result = (AsyncResult) result; Func<string, string> showMessage = (Func<string, string>) _result.AsyncDelegate; //结束异步操作并输出 Console.WriteLine(showMessage.EndInvoke(_result));}希望本文所述对大家的C#程序设计有所帮助。

1.数据  数据(Data)是外部世界信息的载体, 是能够被计算机识别,加工,存储的。在现实生活中也就是我们的产品原材料。  计算机中的数据包括数值数据,图片,影音资料等.2. 数据元素和数据项  数据元素(Data Element)是数据的基本单位,在计算机处理的过程中通常是作为一个整体来作为处理的。  数据项(Data Item):一个数据元素通常由一个或多个数据项组成。  比如数据库表:(Student),它有Id,Name,Sex,Age,Address等字段,而这张表又有多行数据。我们通常将这些字段就叫做数据项,每行数据  就叫做数据元素。在某些情况下数据元素又称为元素,节点,纪录等。  数据项分为两种:(1)初等项;(2)组合项[也就是可以分为更小的项,比如人可以再分为欧洲人,亚洲人,非洲人]3.数据结构  数据结构(Data Structure) 是在相互之间存在的一种或多种特定关系的数据元素集合.  众所周知,在计算机中任何数据元素都不可能是单一或孤立存在的,它们之间都存在着一定的关系。就和人类体系结构一样,人不可能是孤立而与外界没有关系的。  数据结构分为四种:  (1)集合[Set]  (2)线性结构[Linear Structure] (常见的线性结构数据,数据库存储数据)  (3)树形结构[Tree Structure]    (树状结构,就好像人类的继承关系,在计算机中xml文件存储数据最为典型)  (4)图形结构[Graphic Structure] (图形结构也是相对比较复杂的,因为存在多对多的关系,计算机网络拓扑)4.数据对象  数据对象(Data Object),性质相同的数据元素的集合,是数据(Data) 的一个子集。{“aa”,"bb","cc","dd"} 我们就可以将其看做是一个数据对象,都是字符长度的集合。5.数据类型  数据类型(Data Type) ,从上面的数据对象我们可以引申出数据类型这个概念,很多时间数据类型在C#,Java 等高级程序语言中说的比较多  数据类型分为两种:    (1) 非结构的原子类型 (在C#也就是基本数据类型,如int,string,long 等)    (2)结构类型,可以由多个结构类型组成,并可以分解。而结构类型可以包含结构类型和非结构的原子类型6.算法  算法: 一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。  一个算法的优劣可以使用空间复杂度和时间复杂度来衡量。其中算法有五个特征:  (1)有穷性: 算法中每条指令的执行次数有限,执行每条指令的时间有限  (2)确切性: 算法的每一步骤必须有确切的定义  (3)输入:    一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件  (4)输出:   一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的  (5)可行性:算法中执行的任何计算步都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成  算法分类: 基本算法,数据结构算法,数论与代数算法,计算几何算法,图论算法,动态规则与数据分析,加密算法,排序算法,检索算法,随机化算法,并行算法7. 复杂度  算法的复杂度可以使用 时间复杂度 和 空间复杂度 来衡量。  时间复杂度:算法的时间复杂度是指算法需要消耗的时间资源  空间复杂度: 算法的空间复杂度是指算法需要消耗的空间资源8.数据的物理结构  数据的物理结构(Physical Structure) 又称为 存储结构,是数据在计算机中的表示和存储,包括数据元素的表示和存储以及数据元素关系的表示和存储。  数据结构存储分为:(1)顺序存储结构.(2)链式存储结构  顺序存储结构:通过数据元素在计算机存储器上的相对位置来表示数据元素的逻辑关系,一般把逻辑相邻的数据元素存储在物理位置相邻的存储单元中。  C# 中的数组结构就是典型的顺序存储结构方式。  链式存储结构:相邻元素不需要在物理存储位置单元相邻,它们而是通过存储相邻数据元素的地址来维护关系。地址我们通常称之为为引用(Reference)备注:此篇文章只是总结了数据结构方面的一些概念,我们在学习编程的时候经常说数据,复杂度等等这些概念,至于这数据,复杂度等等到底是什么东西我们也没有去研究过,这里总结了一些知识点可以帮助大家理解这些概念。以上这篇C#常用数据结构和算法总结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

分类:36salon手机版

时间:2016-05-08 15:32:37