Winform项目开发心得

合集下载

C# WinForm学习总结

C# WinForm学习总结

C# WinForm学习总结目录窗体为什么会假死为什么子线程不能直接更新UI界面Control执行Invoke/BeginInvoke假死WinForm解决假死窗体事件生命周期DevExpress常用控件技术交流群:。

窗体为什么会假死1.在客户端应用程序中,主线程负责接收输入、处理事件和呈现屏幕。

2.为了让主线程及时响应,开发过程中会创建一个或多个子线程来完成一些耗时的操作,比如大量数据的循环操作,后台会生成多个文件。

3.为了保证UI线程渲染屏幕的一致性,都是采用单线程的模式,这个UI线程就是主线程。

为什么子线程不能直接更新UI界面1.这是因为在.Net2.0以后微软加强了安全机制,保障主线程也就是UI线程的安全性,不允许在WinFrom 或者WPF 中直接跨线程访问控件的属性。

2.其实还是为了保证UI线程渲染屏幕的一致性。

Control执行Invoke/BeginInvoke假死1.WinForm中Control的Invoke和BeginInvoke都是在UI线程上面执行的。

2.如果委托方法用来获取花费时间较长的数据,然后更新界面,如果在UI线程上调用Control.Invoke 和Control.BeginInvoke,它们依然阻塞UI线程,造成界面的假死。

3.异步是指相对于调用BeginInvoke线程的异步,而不是相对于UI线程的异步。

WinForm解决假死1.可以设置Control.CheckForIllegalCrossThreadCall的属性为False。

使用这种方式当有多个线程尝试对UI 线程进行读取时,容易造成线程争夺资源带来的死锁。

CLR 默认不允许非UI线程直接访问控件。

2.可以把耗时操作放到Task类型启动的线程里面去执行,然后调用该控件的Invoke方法,在Invoke方法的内部对该控件的属性赋值。

3.4.还可以考虑使用async和await来进行异步编程,使用await关键字来确保所有的异步操作都是在调用另一个方法之前完成的。

程序员项目开发心得体会

程序员项目开发心得体会

程序员项目开发心得体会作为一名程序员,在参与了众多项目开发后,我积累了不少宝贵的经验和深刻的体会。

在这个过程中,我经历了从初出茅庐的新手到逐渐成熟的开发者的转变,也深刻理解了项目开发的复杂性和挑战性。

项目开发,就像是一场充满未知的冒险。

在出发之前,你需要做好充分的准备。

需求分析就是这场冒险的地图,它指引着我们前进的方向。

很多时候,客户提出的需求可能是模糊的、不完整的,这就需要我们通过深入的沟通和细致的调研来挖掘真正的需求。

记得有一次,客户只是简单地说需要一个电商平台,但对于具体的功能、用户体验、后台管理等方面并没有明确的想法。

我们团队通过多次与客户交流,分析市场上类似平台的优缺点,最终梳理出了一份详细的需求文档。

这让我们在后续的开发中少走了很多弯路。

设计阶段则是搭建冒险的框架。

架构设计就如同房屋的结构,决定了整个项目的稳定性和可扩展性。

合理的架构能够让项目在未来的发展中轻松应对功能的增加和业务的变化。

在一个大型企业管理系统的项目中,我们一开始采用了传统的单体架构,但随着业务的不断扩展,系统变得越来越臃肿,维护成本也越来越高。

后来,经过研究和讨论,我们果断地将其重构为微服务架构,这极大地提高了系统的灵活性和可维护性。

编码实现是将设计转化为现实的过程。

这需要我们具备扎实的编程基础和良好的代码规范。

清晰、简洁、高效的代码不仅能够提高开发效率,还便于后续的维护和优化。

在编写代码时,要注重注释的添加,让其他人能够轻松理解你的思路。

同时,要避免重复代码,尽量将通用的功能提取为函数或类,提高代码的复用性。

测试环节就像是对冒险成果的检验。

单元测试、集成测试、系统测试等,每一个环节都不可或缺。

只有通过严格的测试,才能保证项目的质量和稳定性。

有一次,由于时间紧迫,我们在测试环节有所疏忽,导致项目上线后出现了一些严重的 bug,给用户带来了不好的体验,也给公司造成了损失。

从那以后,我们更加重视测试工作,确保每一个功能都经过充分的测试。

Winform开发框架之客户关系管理系统(CRM)的开发总结

Winform开发框架之客户关系管理系统(CRM)的开发总结

Winform开发框架之客户关系管理系统(CRM)的开发总结近年来,客户关系管理系统已逐渐成为企业必备的关键系统之一,本文主要介绍了一种基于Winform的CRM系统开发框架,以供开发人员研究参考。

一、需求分析对于开发一个CRM系统,需求分析是关键和基础性的工作。

为确保开发顺利进行和最终产品的质量,需要全面清晰地排列出各种需求。

基于面向对象的软件设计思想,我们首先需要定义“客户”-“机会”-“联系人”-“合同”等实体对象。

在对象的基础上,我们需要考虑以下需求:①客户信息维护:包括客户基本信息、联系人信息、客户分类、客户状态、客户评级等信息。

另外,还需提供简单、直观的可视化操作界面。

②机会管理:能够对所有潜在业务机会按照阶段、概率等指标进行跟踪和管理,以及定期汇总和分析机会数据。

③销售管理:能够跟踪和管理销售团队的业绩、业务目标制定、销售任务等信息。

④统计报表:按月度、季度、年度等时间周期,以及不同的维度和角度,提供多种关键分类指标的统计报表,以提供领导层更全面的决策支持。

二、技术分析本CRM系统采用C# Winform 和 SQL Server数据库技术,借助Visual Studio进行开发。

技术层面上,本系统重点涉及的技术有:①Winform界面布局设计:方便用户的界面交互操作,符合用户体验的前端设计。

②技术:能够高效、可靠地完成数据访问和操作,实现系统与数据库的信息交互。

③多线程技术:充分利用多核处理器能力,实现快速处理和响应请求。

④网络通信技术:实现远程协同工作(尤其在疫情时期,远程协作更受推崇)。

三、开发总结本系统采用了自定义控件和扩展类的方式,简化了开发人员的编程复杂度和工作量,大大提升了开发效率。

在开发过程中,根据业务对象的功能特点,我们采用代码抽象和类继承的原则,实现了各个业务对象的复用和扩展。

另外,在系统的调试和测试过程中,我们利用第三方测试工具对系统进行了充分测试,对系统可能出现的各种异常情况进行了充分的预判和处理,保证了系统的健壮性和鲁棒性。

Winform不规则窗体的实现心得

Winform不规则窗体的实现心得

Winform不规则窗体的实现心得 Winform窗体通常都是矩形的,而本人在需要将一幅图片作为窗体背景,并且窗体边框呈现为图片外轮廓的不规则边缘时,却发现Framework并没有提供直接的实现。

经过一通百度、Google和查阅 MSDN 后,发现实现的途径主要有以下几种:1.覆盖 Form 本身的绘制,自己用代码重绘。

2.设置窗体的 TransparencyKey 为窗体设置背景图片边缘要成为不规则边框的部分的颜色。

3.根据图片或者其它的方式创建不规则的 GraphicPath 生成 Region,指定给窗体的 Region 属性。

这三种方法各有优劣:第1种最麻烦,因为要靠代码一点点抠,要达到良好效果不容易,也不易于以后的修改。

第2种最简单,但有制约条件:a、图片的边缘部以外必须是TransparencyKey指定的颜色,并且图片的其它部分不能有这种颜色,否则会被不加区分的变为透明,而导致窗体出现镂空。

b、系统必须运行在 24 位色下。

因此,这种方法并不实用。

第3种的复杂程度介于1、2之间,并且控制也比较灵活。

故本人选择了这种实现方式。

对于第3种方法,网上大多数的文章都只是介绍了实现的原理和一些简单的 Demo 代码。

直接照做可能会遇到以下的一些问题而影响显示效果:窗体的边缘和作为背景的图片外轮廓不重叠,出现错位。

界面上的控件布局时不容易定位于背景图片的相对位置。

解决这两个问题很简单,是要注意一些操作的细节。

先看实现代码:不规则窗体的实现1 //从指定的位图中获取透明度大于 10 的区域;2 Bitmap img = (Bitmap)pictbox.Image;3 GraphicsPath grapth = BitmapUtil.GetNoneTransparentRegion(img, 10);4 this.Region = new Region(grapth);56 //要显示的图片设置为窗体背景;7 this.BackgroundImage = pictbox.Image;8 this.BackgroundImageLayout = ImageLayout.Zoom;910 //在修改窗体尺寸之前设置窗体为无边框样式;11 this.FormBorderStyle = FormBorderStyle.None;12 this.Width = pictbox.Image.Width;13 this.Height = pictbox.Image.Height;BitmapUtil.GetNoneTransparentRegion 方法的实现如下:读取位图的非透明区域1 /// <summary>2 /// 返回指定图片中的非透明区域;3 /// </summary>4 /// <param name="img">位图</param>5 /// <param name="alpha">alpha 小于等于该值的为透明</param>6 /// <returns></returns>7 public static GraphicsPath GetNoneTransparentRegion(Bitmap img, byte alpha)8 {9 int height = img.Height;10 int width = img.Width;1112 int xStart, xEnd;13 GraphicsPath grpPath = new GraphicsPath();14 for (int y = 0; y < height; y++)15 {16 //逐行扫描;17 for (int x = 0; x < width; x++)18 {19 //略过连续透明的部分;20 while (x < width && img.GetPixel(x, y).A <= alpha)21 {22 x++;23 }24 //不透明部分;25 xStart = x;26 while (x < width && img.GetPixel(x, y).A > alpha)27 {28 x++;29 }30 xEnd = x;31 if (img.GetPixel(x - 1, y).A > alpha)32 {33 grpPath.AddRectangle(new Rectangle(xStart, y, xEnd - xStart, 1));34 }35 }36 }37 return grpPath;38 }以上的代码中,解决边框与背景出现错误的办法是“在修改窗体尺寸之前设置窗体为无边框样式”,因为,窗体的长宽是包含在窗体标题栏的尺寸的,而背景显示图片的工作区是除去窗体标题栏的。

Winform开发框架之权限管理系统改进的经验总结(4)-一行代码实现表操作日志记录

Winform开发框架之权限管理系统改进的经验总结(4)-一行代码实现表操作日志记录

Winform开发框架之权限管理系统改进的经验总结(4)-⼀⾏代码实现表操作⽇志记录在前⾯介绍了⼏篇关于我的权限系统改进的⼀些经验总结,本篇继续这⼀系列主体,介绍如何⼀⾏代码实现重要表的操作⽇志记录。

我们知道,在很多业务系统⾥⾯,数据是很敏感的,特别对于⼀些增加、修改、删除等关键的操作,如果能在框架层⾯的⽀持基础上,以最少的代码实现重要表的⽇志记录,那么是⼀件⾮常值得庆贺的事情,也能够为我们客户的数据提供重要的⽇志跟踪,甚⾄是数据恢复的参考。

1、数据访问层的对象继承关系⾸先,为了减少重复代码的编写,合理的继承关系是必要的,我们需要在数据访问层上建⽴合理的继承关系,如下是我的Winform开发框架的继承关系。

每个数据访问对象(如ItemDetail数据访问对象)都继承⼀个抽象基类AbstractBaseDAL和⼀个IBaseDAL基类接⼝,同时它也有⾃⼰特殊的业务接⼝,如IItemDetail,关系如下所⽰。

有了上⾯的继承关系,我们就可以把常规的数据库重要操作(增删改)放到⼀个⾼⼀级的层次上去解决这个问题,⽽不需要在每个数据访问层的业务类来实现。

2、操作⽇志记录事件的定义和使⽤为了更好实现数据操作⽇志的记录,我们以事件⽅式来触发操作⽇志的记录,事件的具体记录实现,可以交给外部来记录处理。

如果事件被外部赋值了,那么就可以在底层触发这个事件记录,记录事件的定义代码在抽象基类进⾏定义,如下所⽰。

///定义⼀个记录操作⽇志的事件处理///</summary>///<param name="userId">操作的⽤户ID</param>///<param name="tableName">操作表名称</param>///<param name="operationType">操作类型:增加、修改、删除</param>///<param name="note">操作的详细记录信息</param>///<returns></returns>public delegate bool OperationLogEventHandler(string userId, string tableName, string operationType, string note, DbTransaction trans = null);///<summary>///数据访问层的超级基类,所有数据库的数据访问基类都继承⾃这个超级基类,包括Oracle、SqlServer、Sqlite、MySql、Access等///</summary>public abstract class AbstractBaseDAL<T> where T : BaseEntity, new(){#region构造函数protected string dbConfigName = ""; //数据库配置名称protected string parameterPrefix = "@";//数据库参数化访问的占位符protected string safeFieldFormat = "[{0}]";//防⽌和保留字、关键字同名的字段格式,如[value]protected string tableName;//需要初始化的对象表名protected string primaryKey;//数据库的主键字段名protected string sortField;//排序字段protected bool isDescending = true;//是否为降序protected string selectedFields = " * ";//选择的字段,默认为所有(*)public event OperationLogEventHandler OnOperationLog;//定义⼀个操作记录的事件处理.....................以上是抽象基类AbstractBaseDAL的部分代码,上⾯代码定义了⼀个操作记录的委托和事件对象来处理操作⽇志的记录,通过委托的定义,我们可以规定具体的事件接⼝定义,并在抽象基类的底层构造这些参数的数值,传递给外部的对象进⾏处理。

Winform项目开发心得

Winform项目开发心得

Winform项目开发心得Posted on 2009-08-07 23:50 Charles Chen阅读(947) 评论(0)编辑收藏所属分类: RFID(Radio Frequency Identification), Projects前段时间在开发一个关于RFID的winform程序, 其实关键还是winform项目(其实关于RFID的牵涉到很少),花了2个星期左右完成了。

在项目的过程中随便也回忆了关于winform的开发模式。

平时一直都在做B/S的,很少接触winform的开发。

(一些小的工具倒还是用winform来做).总的做下来,感觉最大的问题就是在前端表现起来很不容易控制,不像B/S结构那样有JavaScript和CSS 来实现。

改一个javascript或CSS,整个系统的样式都随之更改。

总之不管怎样,还是通过查找以前实训项目的代码和在网上寻找相关的解决方案最终还是完成了。

为了便于以后在做winform程序收集资源。

现把相关的开发过程中一些细节知识点的解决方案记录下来:一、登录界面验证成功后进入主界面,否则则退出应用程序。

假设登录窗体frmLogin.cs和主界面frmMain.cs在程序的Main入口这样来实现:frmLogin login = new frmLogin();login.ShowDialog();if (frmLogin.blCanLogin == true){Application.Run(new frmMain());}因此在frmLogin窗体中增加一个静态变量public static bool blCanLogin = false;//记录能否检验是否通在登录事件中:if(登录成功){blCanLogin = true;this.Close();}Else{..//to do}二、MDI父窗体中弹出子窗体if (this.CheckChildFormExit("frmQuery") == true)return;else{frmQuery query = new frmQuery();query.MdiParent = this;query.Show();}//-----------------查询一个子窗体是否存在----------------private bool CheckChildFormExit(string childFrmName){foreach (Form childfrm in this.MdiChildren){//用子窗体的Name进行判断,如果已经存在则将他激活if ( == childFrmName){if (childfrm.WindowState == FormWindowState.Minim ized)childfrm.WindowState = FormWindowState.Normal; childfrm.Activate();return true;}}return false;}三、设置DataGridView中行的背景颜色哦字体颜色(隔行变色)在DataGridView的DataBindingComplete事件中实现:private void dataGridView1_DataBindingComplete(object sender, DataGr idViewBindingCompleteEventArgs e){this.dataGridView1.Rows[i].DefaultCellStyle.BackColor= System.Drawing. ;//背景颜色this.dataGridView1.Rows[i].DefaultCellStyle.ForeColor = System.Drawin g.Color.Green;//字体颜色this.dataGridView1.Rows[i].DefaultCellStyle.SelectionBackColor = Syst em.Drawing.Color.Green;//选择行的颜色}四、DataGridView控件的打印在网上找了一个DataGridView打印类,然后在它的基础上进行了部门修改,以满足项目的实际需要。

C# Winform程序的项目经验

1、能用简单、基础的数据类型就绝对不用复杂、高级的2、一定要每天花一定的时间去重构你的代码,多多实践你在书中看到的“设计模式”3、团队内部的沟通是至关重要的,一定需要建立一种便捷、高效的沟通渠道4遵守一定的编码规范,比如:单个函数不要超过150行等,详细请参考《C#编程规范》。

还有就是程序中的路径必须用相对路径5 、I/O的次数越少越好(没有办法,文件读写真的很慢)6 、C#的内存泄露问题,这个问题比较复杂,请参见下一个专题7、程序的编写过程中,new 对象,操作越少越好,即使您及时的Dispose了,这个创建和删除的过程也是相当消耗资源的,会使程序变慢。

1.1 因为越是简单的数据类型就越是偏底层,越是偏底层的数据类型所占用的内存就越少,效率就越高。

复杂、高级、功能强大的数据类型,一定被别人封装了什么,这其中必然损失了效率。

当一个项目作到后期时,项目会很大,许许多多的地方都丧失了一点点的效率,这一积累起来就成了致命的问题。

1.2 在一个项目的开始,你可能认为项目的进度比较重要,就没有太多的考虑到内存、性能、重构等问题,但是到一个项目的后期,其弊端就会凸显出来,在大多数情况下,弊端积累的多了,就会带来灾难性的结果。

比如,我们的ROSE项目,在刚开始时,我们定义了大量的List<>数据类型,因为这个数据类型支持泛型,可以直接Add,不会像像数组一样,在定义的时候需要指定大小。

到后来,我们的系统在打开比较大的产品的时候,其速度还是比较慢的,总是不能让我十分满意,其实我们可以更快,做的更好。

如果可以重新开始的话,我会强烈要求,把所有的List都换成数组,摒弃Dictionary累,我相信我们的系统会快很多的。

2.1 每天花一点时间去重构你的代码,看看函数的功能是不是可以更加单纯,是不是可以更加的短(最好不要超过100行),函数与函数之间,类与类之间,层与层之间的依赖性和耦合度能不能更低。

是不是可以把多处用到一个功能的地方,封装成为一个公用的函数。

winform项目工作总结

winform项目工作总结
Winform项目工作总结。

在过去的一段时间里,我有幸参与了一个Winform项目的开发工作,通过这次经历,我收获了很多。

在这篇文章中,我将对这次项目工作进行总结,分享我的心得体会。

首先,Winform项目的开发需要我们具备扎实的C#编程基础和对Winform框架的熟悉程度。

在项目初期,我花了大量的时间学习和研究Winform框架的相关知识,包括界面设计、控件的使用和事件处理等。

通过不断的实践和总结,我逐渐掌握了Winform项目的开发技巧,提高了自己的编程水平。

其次,Winform项目的开发需要我们具备良好的团队合作能力。

在项目中,我和团队成员紧密合作,共同解决了许多技术难题和项目中的各种问题。

通过团队合作,我们相互学习、相互帮助,最终完成了项目的开发任务。

在这个过程中,我学会了倾听他人的意见,主动分享自己的经验,提高了自己的团队合作能力。

最后,Winform项目的开发需要我们具备良好的沟通能力和解决问题的能力。

在项目中,我和产品经理、UI设计师、测试工程师等不同岗位的同事进行了频繁的沟通和协作,共同解决了项目中的各种问题。

通过这次项目,我学会了如何与不同岗位的同事进行有效的沟通,如何快速解决问题,提高了自己的沟通和解决问题的能力。

总的来说,这次Winform项目的开发经历让我收获颇丰。

我不仅提高了自己的编程水平,还学会了团队合作和沟通解决问题的能力。

我相信这些经验和能力将对我的未来职业发展产生积极的影响。

希望在未来的工作中,我能够继续努力,不断提高自己的技术能力和团队合作能力,为公司的发展做出更大的贡献。

桂林电子科技大学学生学习WINFORM以及WPF心得

.NET的学习体会这个工具主要是方便调用屏幕键盘以及快捷的打开一些应用程序。

并拥有托盘以及可以设置开机是否启动功能。

主模块Setting模块托盘功能以及能打开指定路径程序(osk.exe 和多点触控程序)是比较早完成的任务,其中打开程序是调用Process.Open(uri)函数打开程序进程。

之后进行扩展,比如拥有设置功能。

在没有设置功能之前,因为知道软键盘以及多点触控的进程名,可以通过查询是否存在进程来判断,如果存在进程,就把进程窗口设置为Normal 否则打开。

在拥有设置功能之后,由于很多用户很难知道自己想打开的程序的进程名称,所以就只拥有打开程序的功能,因为他们需要的就是这个功能而已,并且不用设置进程名等那么复杂的操作。

由于点击菜单项,可以打开菜单项设定的相应进程。

而菜单项没有地方可以存储诸如:进程名称,进程路径,进程打开模式等信息,我自己创建了一个继承菜单项的类,并在里面加入一些可以存储信息的变量,这样有利于设定菜单项的点击事件。

用户可以通过添加程序,来实现快速打开程序的功能。

在添加过程中,用户可以在设置中打开文件夹,然后选择相应的程序,也可以直接把想要的程序拖拽进来,其中拖拽感觉比较方便,它就是监听DragDrop以及DragEnter事件。

之后是做一个屏幕键盘,我个人感觉,键盘每个键都是一样的,所以我就自己写了一个继承Button的按钮组件。

把按下就会让按钮缓慢变色的功能,以及圆角风格,并创建了四个保存SHIFT、CTRL、AL T、CAPSLOCK是否按下的静态bool型变量。

以及一个数组(第一个元素是用来保存默认按下的键,第二个元素是保存按Shift键下输出的内容)。

并重写了点击事件,分别通过数组以及SHIFT、CTRL等信息模拟应当按下的键。

其中调用的方法是Sendkey.Send(输出内容);后面接到了一个在WPF嵌入了FLASH任务,先建立一个WINFORM USERCONTROL 在里面调用axShockwaveFlash控件,然后在WPF USERCONTROL中调用WINFORM USERCONTROL,从而实现嵌入FLASH的功能。

winform程序设计实训心得300字

winform程序设计实训心得300字
1、熟悉程序开发环境、学习计算机系统的操作方法
一个c语言程序从编辑,编译,连接到运行,都要在一定的外部操作环境下才能进行。

所谓"环境"就是所用的计算机系统硬件、软件条件,只有学会使用这些环境,才能进行程序开发工作。

通过上机实验,熟练地掌握C语言开发环境,为以后真正编写计算机程序解决实际问题打下基础。

同时,在今后遇到其它开发环境时就会触类旁通,很快掌握新系统的使用。

2、学习上机调试程序
完成程序的编写,决不意味着万事大吉。

你认为万无一失的程序,实际上机运行时可能不断出现麻烦。

如编译程序检测出一大堆错误。

有时程序本身不存在语法错误,也能够顺利运行,但是运行结果显然是错误的。

开发环境所提供的编译系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Winform项目开发心得Posted on 2009-08-07 23:50 Charles Chen阅读(947) 评论(0)编辑收藏所属分类: RFID(Radio Frequency Identification), Projects前段时间在开发一个关于RFID的winform程序, 其实关键还是winform项目(其实关于RFID的牵涉到很少),花了2个星期左右完成了。

在项目的过程中随便也回忆了关于winform的开发模式。

平时一直都在做B/S的,很少接触winform的开发。

(一些小的工具倒还是用winform来做).总的做下来,感觉最大的问题就是在前端表现起来很不容易控制,不像B/S结构那样有JavaScript和CSS 来实现。

改一个javascript或CSS,整个系统的样式都随之更改。

总之不管怎样,还是通过查找以前实训项目的代码和在网上寻找相关的解决方案最终还是完成了。

为了便于以后在做winform程序收集资源。

现把相关的开发过程中一些细节知识点的解决方案记录下来:一、登录界面验证成功后进入主界面,否则则退出应用程序。

假设登录窗体frmLogin.cs和主界面frmMain.cs在程序的Main入口这样来实现:frmLogin login = new frmLogin();login.ShowDialog();if (frmLogin.blCanLogin == true){Application.Run(new frmMain());}因此在frmLogin窗体中增加一个静态变量public static bool blCanLogin = false;//记录能否检验是否通在登录事件中:if(登录成功){blCanLogin = true;this.Close();}Else{..//to do}二、MDI父窗体中弹出子窗体if (this.CheckChildFormExit("frmQuery") == true)return;else{frmQuery query = new frmQuery();query.MdiParent = this;query.Show();}//-----------------查询一个子窗体是否存在----------------private bool CheckChildFormExit(string childFrmName){foreach (Form childfrm in this.MdiChildren){//用子窗体的Name进行判断,如果已经存在则将他激活if ( == childFrmName){if (childfrm.WindowState == FormWindowState.Minim ized)childfrm.WindowState = FormWindowState.Normal; childfrm.Activate();return true;}}return false;}三、设置DataGridView中行的背景颜色哦字体颜色(隔行变色)在DataGridView的DataBindingComplete事件中实现:private void dataGridView1_DataBindingComplete(object sender, DataGr idViewBindingCompleteEventArgs e){this.dataGridView1.Rows[i].DefaultCellStyle.BackColor= System.Drawing. ;//背景颜色this.dataGridView1.Rows[i].DefaultCellStyle.ForeColor = System.Drawin g.Color.Green;//字体颜色this.dataGridView1.Rows[i].DefaultCellStyle.SelectionBackColor = Syst em.Drawing.Color.Green;//选择行的颜色}四、DataGridView控件的打印在网上找了一个DataGridView打印类,然后在它的基础上进行了部门修改,以满足项目的实际需要。

/bdhseaside/blog/item/f7db602443ed13054d088d02.html五、日期时间的计算在牵涉到查询功能的时候需要显示不同的日期:包括今天、本周、本月、本年、最近一周、最近本月、最近一月、最近一年///根据日期获取当周星期一///</summary>///<param name="dt"></param>///<returns></returns>public static DateTime StartOfTheWeek(DateTime dt){return dt.AddDays(-(Convert.ToInt16(dt.DayOfWeek)-1));}///<summary>///根据日期获取当周末///</summary>///<param name="dt"></param>///<returns></returns>public static DateTime EndOfTheWeek(DateTime dt){return StartOfTheWeek(dt).AddDays(6);}///<summary>///根据日期获取月初日期///</summary>///<param name="dt"></param>///<returns></returns>public static DateTime StartOfTheMonth(DateTime dt){return new DateTime(dt.Year, dt.Month, 1);}///<summary>///根据日期获取月底日期///</summary>///<param name="dt"></param>///<returns></returns>public static DateTime EndOfTheMonth(DateTime dt){return StartOfTheMonth(dt).AddMonths(1).AddDays(-1); }///<summary>///感觉日期年初日期///</summary>///<param name="dt"></param>///<returns></returns>public static DateTime StartOfTheYear(DateTime dt){return new DateTime(dt.Year, 1, 1);}///<summary>///根据日期获取年底日期///</summary>///<param name="dt"></param>///<returns></returns>public static DateTime EndOfTheYear(DateTime dt){return StartOfTheYear(dt).AddYears(1).AddDays(-1);}六、DataGridView几个重要属性DataGridView.AutoGeneralColumn----¬是否自动生成列DataGridView.ColumnHeadersVisible------指定是否显示列标题行。

DataGridView.RowHeadersVisible-----指定是否显示行标题列。

DataGridView.SelectionMode-----知道DataGridView选择单元格的模式(单元格,行) DataGridView.AllowUserToResizeColumns----指定是否可以手动改变列的宽度。

DataGridView.AllowUserToResizeRows----指定是否可以手动改变行的高度。

七、DataGridView控件导出到Excel文件主要用了2种方式来实现:1.格式不做限制,普通列表显示:///<summary>///常用方法,列之间加\t,一行一行输出,此文件其实是csv文件,不过默认可以当成Excel打开。

///</summary>///<remarks>/// using System.IO;///</remarks>///<param name="dgv"></param>private void DataGridViewToExcel(DataGridView dgv) {SaveFileDialog dlg = new SaveFileDialog();dlg.Filter = "Execl files (*.xls)|*.xls";dlg.FilterIndex = 0;dlg.RestoreDirectory = true;dlg.CreatePrompt = true;dlg.Title = "保存为Excel文件";if (dlg.ShowDialog() == DialogResult.OK){Stream myStream;myStream = dlg.OpenFile();StreamWriter sw = new StreamWriter(myStream, System.Tex t.Encoding.GetEncoding(-0));string columnTitle = "";try{//写入列标题for (int i = 0; i < dgv.ColumnCount; i++) {if (i > 0){columnTitle += "\t";}columnTitle += dgv.Columns[i].HeaderText;}sw.WriteLine(columnTitle);//写入列内容for (int j = 0; j < dgv.Rows.Count; j++) {string columnValue = "";for (int k = 0; k < dgv.Columns.Count; k++) {if (k > 0){columnValue += "\t";}if (dgv.Rows[j].Cells[k].Value == null)columnValue += "";elsecolumnValue += dgv.Rows[j].Cells[k].Val ue.ToString().Trim();}sw.WriteLine(columnValue);}sw.Close();myStream.Close();}catch (Exception e){MessageBox.Show(e.ToString());}finally{sw.Close();myStream.Close();}}}对于复杂的,对于导出的excel有格式限制,可以考虑用Excel模板(XML支持)来实现。

相关文档
最新文档