Winform分页控件重大更新,并实现普通版、DotNetBar、DevExpress三大版本整合更新(附各种例子源码)

合集下载

winform自动升级方案

winform自动升级方案

winform⾃动升级⽅案未涉及过winform升级,研究⼀阵,⼤致出来个不成熟的⽅案。

我的解决⽅案(判断升级,升级程序下载安装包的压缩包,解压,⾃动安装,重新启动程序)。

1、⾸先根据服务器中软件版本号和本地软件版本号是否⼀致,来确认程序是否需要升级。

1)本地可以⽤现成AssemblyInfo.cs⽂件中assembly: AssemblyVersion("1.0.0.0")来记录,通过反射来获取版本号:System.Reflection.Assembly.GetExecutingAssembly().GetName().Version。

2)需要升级启动升级程序Update.exe,并关闭主程序。

Process p = new Process(); eShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.FileName = fileName; p.StartInfo.CreateNoWindow = true; p.StartInfo.Arguments = versionInfo.Url;//判断是否需要升级时返回VersionInfo类型,包括新版本号和下载链接,传值给升级程序 p.Start(); System.Environment.Exit(System.Environment.ExitCode);2、升级程序。

执⾏下载及解压,覆盖安装。

缺点:代码有待优化; 完全安装,耗时; 对⽹络有要求;、 本地数据库不能保留原有数据。

//升级程序接收参数 static class Program {///<summary>///应⽤程序的主⼊⼝点。

///</summary>[STAThread]static void Main(string[] args){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new FMUpdate(args));} } private string _url; public FMUpdate(string[] args) { InitializeComponent(); _url = args[0]; } private void FMUpdate_Load(object sender, EventArgs e) { WebClient wc = new WebClient(); wc.DownloadProgressChanged += wc_DownloadProgressChanged; wc.DownloadFileAsync(new Uri(_url), @"c:\update.rar"); }private void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) {Action act = () =>{this.progressBar1.Value = e.ProgressPercentage;this.lblTip.Text = "正在下载...";//bel1.Text = e.ProgressPercentage + "%";};this.Invoke(act);if (e.ProgressPercentage == 100){//下载完成之后开始覆盖this.lblTip.Text = "正在解压...";try{var result = CompressHelper.Uncompress(@"c:\update.rar", “解压路径”);if (result){progressBar1.Value = 110;this.lblTip.Text = "准备安装...";//备份之前数据库var dbFile = Application.StartupPath + "/db/数据库⽂件.db";if (File.Exists(dbFile)){var bakFile = Application.StartupPath + "/backup/" + DateTime.Now.ToString("yyyyMMddHHmmssms") + ".bak";var bakDirectory = Path.GetDirectoryName(bakFile);DirectoryInfo directoryInfo = new DirectoryInfo(bakDirectory);if (!directoryInfo.Exists){directoryInfo.Create();}else{//删除7天前的备份⽂件var files = directoryInfo.GetFiles();if (files != null && files.Length > 0){foreach (var file in files){if (file.CreationTime.AddDays(7) < DateTime.Now){file.Delete();}}}}//备份⽂件File.Move(dbFile, bakFile);}this.lblTip.Text = "准备安装";Install();this.lblTip.Text = "安装完成";var mainFile = Application.StartupPath + @"\Main.exe";Process p = new Process();eShellExecute = false;p.StartInfo.RedirectStandardOutput = true;p.StartInfo.FileName = mainFile;p.StartInfo.CreateNoWindow = true;p.Start();this.Close();}else{MessageBox.Show("更新失败");this.Close();}}catch (Exception ex){MessageBox.Show("更新失败", ex.Message);this.Close();}} } private void Install() {try{Process p = new Process();p.StartInfo.FileName = "msiexec.exe";p.StartInfo.Arguments = $"/i {_temp}利万嘉收银系统安装⽂件.msi /qb-!";// /qb显⽰基本界⾯ /qb-!或者/qb!- 基本界⾯⽆取消按钮 eShellExecute = false;p.StartInfo.RedirectStandardInput = true;p.StartInfo.RedirectStandardOutput = true;p.StartInfo.RedirectStandardError = true;p.StartInfo.CreateNoWindow = true;p.Start();p.WaitForExit();p.Close();}catch (Exception ex){MessageBox.Show("更新失败:" + ex.Message);} }View Code再说下关于增量升级。

winform实现多线程更新UI控件的方法

winform实现多线程更新UI控件的方法

winform实现多线程更新UI控件的⽅法1①2 Control.CheckForIllegalCrossThreadCalls = false;//关闭安全检查,为了安全⼀般不采⽤此代码3 =============================================================================================================================45②6⼀般多线程代码:不能实现跨线程数据交互:7 Thread thread = new Thread(new ThreadStart(Test));8 thread.IsBackground = true;9 thread.Start();1011 =============================================================================================================================== 12③13通过UI控件的Invoke/BeginInvoke⽅法更新,实现后台线程和UI线程数据交换14151.定义⼀个委托16delegate void delegate1(string text); //设置这个委托⽀持异步调⽤⽂本框控件的⽂本属性。

不同控件可能需要不同参数17182.定义控件更新⽅法SetText //这个是实现线程数据交换的关键19private void SetText(string text)20 {2122if (this.textBox1.InvokeRequired) //如果调⽤控件的线程和创建创建控件的线程不是同⼀个则为True23 {24while (!this.textBox1.IsHandleCreated)25 {26//解决窗体关闭时出现“访问已释放句柄“的异常27if (this.textBox1.Disposing || this.textBox1.IsDisposed)28return;29 }30 delegate1 d = new delegate1(SetText); //委托实例化31this.textBox1.Invoke(d, new object[] { text });32 }33else34 {35this.textBox1.Text = text;36 }37 }38393.次线程运⾏的主要代码40private void test()41 {42int i;43for (i = 1; i <= 10; i++)44 {45 Thread.Sleep(1000);46this.SetText(i.ToString()); //此处需要和UI线程实时交换数据,我们引⽤上门定义的⽅法SetText来实现,这⼀步是关键47 }48 MessageBox.Show("运⾏完毕");4950 }514.控件事件代码52private void button1_Click(object sender, EventArgs e)53 {54 Thread thread = new Thread(new ThreadStart(test)); //创建新线程55 thread.IsBackground = true; //设定线程为后台线程56 thread.Start(); //启动新线程5758 }。

winform中DataGridView实现分页功能

winform中DataGridView实现分页功能

winform中DataGridView实现分页功能转载⾄以前都是做web开发,最近接触了下WinForm,发现WinForm分页控件好像都没有,⽹上搜索了⼀下,发现有很多⽹友写的分页控件,分页效果应该都能实现吧,只是其风格都不是很符合我想要的。

做web的时候,我习惯了Extjs的Grid分页效果,所以也想在WinForm中做个类似的效果,所以咬咬⽛,做个⼭寨版本的吧,虽然⾃⼰写费时费⼒,在项⽬进度考虑中不是很可取,但是还是特别想⼭寨⼀回,做⾃⼰喜欢的风格。

按照惯例,还是先看看实现效果图吧(有图有真像,才好继续下⽂呀)应⽤效果:(效果有点难看,因为我是刚装的xp系统,还是经典主题,如果换成Win7系统或其他主题,效果还是会很不错的)我们要做的就是上图显⽰的⼀个⾃定义控件,这个效果参考⾃我做web开发使⽤的Extjs之Grid的分页效果(如下图)Extjs的动画效果我们暂时就不实现了,这⾥只做个外观看起来想像即可,完全⼀样就脱离“⼭寨”概念了,总要⽐⼈家差点吧,谁让咱是模仿呢!⾔归正传,我们现在就看看具体怎么实现吧:第⼀步:先布局注:我们创建的是⽤户⾃定义控件,⽽不是WinForm窗体就是先做出个显⽰效果,这个布局很简单,在这就不多说,重点就是“⾸页、前⼀页、后⼀页、末页”图标,每个图标分两种,⼀是能点击的⾼亮效果,⼀个是灰⾊不不能点击。

以下是套图:(⼤家如果不喜欢,可以去做成⾃⼰喜欢的风格图⽚)第⼆步:编写分页代码布局好了,那么第⼆步我们就要代码实现正确显⽰⽂字信息,分页事件,每页条数选择事件,公开属性和事件。

以下是完整代码:1///<summary>2///声明委托3///</summary>4///<param name="e"></param>5public delegate void EventPagingHandler (EventArgs e);6public partial class Paging : UserControl7 {8public Paging()9 {10 InitializeComponent();11 }12public event EventPagingHandler EventPaging;13#region公开属性14private int _pageSize = 50;15///<summary>16///每页显⽰记录数(默认50)17///</summary>18public int PageSize19 {20get21 {22return _pageSize;23 }24set25 {26if (value > 0)27 {28 _pageSize = value;29 }30else31 {32 _pageSize = 50;33 }boPageSize.Text = _pageSize.ToString();35 }36 }37private int _currentPage = 1;38///<summary>39///当前页40///</summary>41public int CurrentPage42 {43get44 {45return _currentPage;46 }47set48 {49if (value > 0)50 {51 _currentPage = value;52 }53else54 {55 _currentPage = 1;56 }5758 }59 }60private int _totalCount = 0;61///<summary>62///总记录数63///</summary>64public int TotalCount65 {66get67 {68return _totalCount;69 }70set71 {72if (value >= 0)73 {74 _totalCount = value;75 }76else77 {78 _totalCount = 0;79 }80this.lblTotalCount.Text = this._totalCount.ToString();81 CalculatePageCount();82this.lblRecordRegion.Text = GetRecordRegion();83 }84 }8586private int _pageCount = 0;87///<summary>88///页数89///</summary>90public int PageCount91 {92get93 {94return _pageCount;95 }96set97 {98if (value >= 0)99 {100 _pageCount = value;101 }102else103 {104 _pageCount = 0;105 }106this.lblPageCount.Text = _pageCount + "";107 }108 }109#endregion110111///<summary>112///计算页数113///</summary>114private void CalculatePageCount()115 {116if (this.TotalCount > 0)117 {118this.PageCount = Convert.ToInt32 (Math.Ceiling (Convert.ToDouble (this.TotalCount) / Convert.ToDouble (this.PageSize) ) ); 119 }120else121 {122this.PageCount = 0;123 }124 }125126///<summary>127///获取显⽰记录区间(格式如:1-50)128///</summary>129///<returns></returns>130private string GetRecordRegion()131 {132if (this.PageCount == 1) //只有⼀页133 {134return"1-" + this.TotalCount.ToString();135 }136else//有多页137 {138if (this.CurrentPage == 1) //当前显⽰为第⼀页139 {140return"1-" + this.PageSize;141 }142else if (this.CurrentPage == this.PageCount) //当前显⽰为最后⼀页143 {144return ( (this.CurrentPage - 1) * this.PageSize + 1) + "-" + this.TotalCount;145 }146else//中间页147 {148return ( (this.CurrentPage - 1) * this.PageSize + 1) + "-" + this.CurrentPage * this.PageSize;149 }150 }151 }152153///<summary>154///数据绑定155///</summary>156public void Bind()157 {158if (this.EventPaging != null)159 {160this.EventPaging (new EventArgs() );161 }162if (this.CurrentPage > this.PageCount)163 {164this.CurrentPage = this.PageCount;165 }166this.txtBoxCurPage.Text = this.CurrentPage + "";167this.lblTotalCount.Text = this.TotalCount + "";168this.lblPageCount.Text = this.PageCount + "";169this.lblRecordRegion.Text = GetRecordRegion();170if (this.CurrentPage == 1)171 {172this.btnFirst.Enabled = false;173this.btnPrev.Enabled = false;174this.btnFirst.Image = global::CHVM.Properties.Resources.page_first_disabled; 175this.btnPrev.Image = global::CHVM.Properties.Resources.page_prev_disabled; 176 }177else178 {179this.btnFirst.Enabled = true;180this.btnPrev.Enabled = true;181this.btnFirst.Image = global::CHVM.Properties.Resources.page_first;182this.btnPrev.Image = global::CHVM.Properties.Resources.page_prev;183 }184if (this.CurrentPage == this.PageCount)185 {186this.btnNext.Enabled = false;187this.btnLast.Enabled = false;188this.btnNext.Image = global::CHVM.Properties.Resources.page_next_disabled; 189this.btnLast.Image = global::CHVM.Properties.Resources.page_last_disabled; 190 }191else192 {193this.btnNext.Enabled = true;194this.btnLast.Enabled = true;195this.btnNext.Image = global::CHVM.Properties.Resources.page_next;196this.btnLast.Image = global::CHVM.Properties.Resources.page_last;197 }198if (this.TotalCount == 0)199 {200this.btnFirst.Enabled = false;201this.btnPrev.Enabled = false;202this.btnNext.Enabled = false;203this.btnLast.Enabled = false;204this.btnFirst.Image = global::CHVM.Properties.Resources.page_first_disabled; 205this.btnPrev.Image = global::CHVM.Properties.Resources.page_prev_disabled; 206this.btnNext.Image = global::CHVM.Properties.Resources.page_next_disabled; 207this.btnLast.Image = global::CHVM.Properties.Resources.page_last_disabled; 208 }209 }210211private void btnFirst_Click (object sender, EventArgs e)212 {213this.CurrentPage = 1;214this.Bind();215 }216217private void btnPrev_Click (object sender, EventArgs e)218 {219this.CurrentPage -= 1;220this.Bind();221 }222223private void btnNext_Click (object sender, EventArgs e)224 {225this.CurrentPage += 1;226this.Bind();227 }228229private void btnLast_Click (object sender, EventArgs e)230 {231this.CurrentPage = this.PageCount;232this.Bind();233 }234235///<summary>236///改变每页条数237///</summary>238///<param name="sender"></param>239///<param name="e"></param>240private void comboPageSize_SelectedIndexChanged (object sender, EventArgs e) 241 {242this.PageSize = Convert.ToInt32 (comboPageSize.Text);243this.Bind();244 }245 }246247这⾥重点提两点:⼀是图⽚切换:248this.btnFirst.Image = global::CHVM.Properties.Resources.page_first_disabled;249 Image对象是在Properties.Resource.resx中⾃动⽣成的,代码如下:250internal static System.Drawing.Bitmap page_first251 {252get {253object obj = ResourceManager.GetObject ("page-first", resourceCulture);254return ( (System.Drawing.Bitmap) (obj) );255 }256 }257258internal static System.Drawing.Bitmap page_first_disabled259 {260get {261object obj = ResourceManager.GetObject ("page_first_disabled", resourceCulture);262return ( (System.Drawing.Bitmap) (obj) );263 }264 }265⼆是应⽤了委托事件:我们在这定义了⼀个分页事件266public event EventPagingHandler EventPaging;267在数据绑定⽅法中实现它:268///<summary>269///数据绑定270///</summary>271public void Bind()272 {273if (this.EventPaging != null)274 {275this.EventPaging (new EventArgs() );276 }277//… 以下省略278 }279这⾥需要⼤家对C#的委托和事件有⼀定的了解,不清楚的可以直接使⽤,或者先去查阅相关参考资料,这⾥我们就不谈委托机制了。

c#Winform程序自动更新实现方法

c#Winform程序自动更新实现方法

c#Winform程序⾃动更新实现⽅法Winform程序⾃动更新我也是第⼀次做,⽹上找了⾃动更新的源码,后来⼜根据在⽹上看到的⼀些⽅法,⾃⼰试了很久,最终还是有写错误,所以花了钱让别⼈帮忙调试成功的,下⾯是我⾃⼰捣腾出来的,⽅便⼤家借鉴,如果有什么错误的地⽅欢迎指正.1、由于我是通过服务器的IIS发布⾃动更新的,更新之前先⼿动把程序复制到IIS服务器的⽬录下⾯,做⼀些更改,客户端才能正常⾃动更新。

所以第⼀步是不熟IIS服务器(本⼈系统windows8):按照上⾯的⽅式,选了之后点确定,系统会⾃动添加这些内容,然后:⽹站建⽴好了之后,把写好的需要更新的⽂件放⼊你选的物理路径对应的⽂件⽬录下⾯就OK。

2、⽹站建⽴好了,那么下⾯就是要想办法搞更新了,也就是从服务器更新⽂件到客户端,⾄于具体的过程和中⼼思想我就不赘述了,⽹上很多。

3、⾃动源码下载地址找不着了,如果有需要的,请留邮箱,我再发.4、把⾃动源码⽣成类库,然后在你的主程序引⽤该类库,把下图的两个⽂件和你的主程序放在同⼀个⽂件夹下⾯:5、主程序的调⽤,在主程序⾥⾯调⽤我是放到登录窗体之前的,由于我没办法控制程序是否需要更新,所以我需要建⽴⼀个过程,就是在数据库建⽴⼀个表,包括两个字段如上图,New字段是保存最新的版本,Old是保存前⼀次的版本.。

using Mulaolao.Forms;using Mulaolao.Procedure;using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;using Mulaolao.Other;using System.Threading;using StudentMgr;using System.Data;using System.Data.Sql;using System.Data.SqlClient;namespace Mulaolao{static class Program{//private static Mutex mutex;/// <summary>/// 应⽤程序的主⼊⼝点。

Winform分页控件最新版本发布,并提供基于DotNetBar界面的版本

Winform分页控件最新版本发布,并提供基于DotNetBar界面的版本

Winform分页控件最新版本发布,并提供基于DotNetBar界⾯的版本该Winform分页控件很早就开发了,⼀直在我所有的共享软件项⽬中使⽤,并得到很多Winform开发者的热爱和⽀持,其中逐步完善了⼀些功能及优化。

从较早时期的随笔《》中的评论可见该控件是⼤家在Winform开发中常⽤到的⼀个控件。

本⽂主要介绍该分页控件的重要特性,并发布相关最新的版本供⽤户下载,该控件提供免费版本供⼤家使⽤,如果要正式使⽤到产品中,可以和我联系获得正式授权。

在Winform程序开发中,分页是永恒的话题,因为需要显⽰的数据总是很多很多,分页展⽰在程序性能和数据查看感官⽅⾯得到很好的平衡,是⼀种良好的编程习惯和UI设计。

Winform中的分页控件可能没有世界中的分页控件那么丰富多彩,不过也有不少的分页控件可以采⽤,各个⼈的可能都有⼀些不同的东西,⼀些好的东西。

就我⽽⾔,我希望控件能够尽可能的多⼀些功能,耦合性低⼀些,例如我不想是基于存储过程的,因为我很多程序需要使⽤Access作为数据库,⼀般来说,我还希望有导出Excel数据的功能,还有打印预览功能,由于我的数据源表头,如实体类集合、表格内容绑定的时候,表头是英⽂的,我需要变为中⽂的,其他的功能有则更好。

该控件是在我的共享软件中⼤量使⽤的分页控件,如WInform开发框架、酒店管理系统、备件仓库管理系统、送⽔管理系统软件、病⼈资料管理软件等等。

在软件开发过程中,为了节省开发时间,提⾼开发效率,统⼀⽤户处理界⾯,尽可能使⽤成熟、功能强⼤的分页控件,这款Winform环境下的分页控件,集成了数据分页、内容提⽰、数据打印、数据导出、表头中⽂转义等很多功能,由于集成性很好,省却很多功夫,专注客户的业务及变化即可,否则⼀项表头的中⽂转换就够呛,还不说数据的分页,由于整合性、⼀致性、稳定性等特点,客户使⽤感觉⽐较好。

该分页控件主要特性如下所⽰:(1)控件集成除了基本的分页外,还有其他功能,如导出当前页、导出全部页、打印列表、以及相关功能操作的菜单(只要实现了相关的接⼝,则呈现相同的菜单),另外还有⼀些⼩地⽅,也是很常⽤关键的地⽅,就是间隔⾏的颜⾊变化,表头的中⽂化,⾏提⽰内容等等。

Winform分页控件重大更新,并实现普通版、DotNetBar、DevExpress三大版本整合更新(附各种例子源码)

Winform分页控件重大更新,并实现普通版、DotNetBar、DevExpress三大版本整合更新(附各种例子源码)

Winform分页控件重大更新,并实现普通版、DotNetBar、DevExpress三大版本整合更新(附各种例子源码)在Winform开发中,一直离不开分页处理,好的分页控件封装,能为开发节省很多时间和繁琐工作,对分页控件一直的改进和完善,也是我的兴趣之一。

本次主要实现对分页控件的全面重构,优化功能及界面的处理,并统一完成普通版、基于DotNetbar界面控件版本、DevExpress界面控件版本三大版本的发布,这几个界面版本,除了界面表现效果不一样外,所有的功能展示及使用代码完全一致,保证用户的知识投资及给客户良好的使用操作。

本次主要增加的功能有:可通过界面设置列表显示的列,可复制选定的行信息,可设置显示的行号、可设置显示间隔行的颜色等功能。

下面分别对几个例子的截图进行总体介绍,然后在详细介绍1)普通版(即不引用任何第三方界面控件)效果图上图中,红色的菜单是分页控件内置的菜单项,其他程序附加是扩展菜单项目,其中复制选定行信息、设置表格显示列、打印列表是对表格基本的操作功能。

下面两个版本的控件右键菜单均表现一致。

2)基于DotNetbar界面控件版本3)基于DevExpress界面控件版本使用分页控件的基础代码,在所有以上版本中,代码均一致,只是一些特殊的操作,需要利用到不同的控件,有所差异而已。

初始化分页控件代码如下所示。

private void FrmCustomer_Load(object sender, EventArgs e){this.winGridViewPager1.ProgressBar = this.toolStripProgressBar1.Pro gressBar;this.winGridViewPager1.OnPageChanged += new EventHandler(winG ridViewPager1_OnPageChanged);this.winGridViewPager1.OnStartExport += new EventHandler(winGrid ViewPager1_OnStartExport);this.winGridViewPager1.OnEditSelected += new EventHandler(winGri dViewPager1_OnEditSelected);this.winGridViewPager1.OnDeleteSelected += new EventHandler(win GridViewPager1_OnDeleteSelected);this.winGridViewPager1.OnRefresh += new EventHandler(winGridVie wPager1_OnRefresh);this.winGridViewPager1.OnAddNew += new EventHandler(winGridViewPager1_OnAddNew);this.winGridViewPager1.AppendedMenu = this.contextMenuStrip1;//追加额外菜单项目this.winGridViewPager1.ShowLineNumber = true;//显示行号this.winGridViewPager1.PagerInfo.PageSize = 30;//页面大小this.winGridViewPager1.EventRowBackColor = Color.LightCyan;//间隔颜色BindData();}以上是对分页控件的相关事件进行处理,如果实现了相关的事件,那么相应的菜单(如新增、编辑、删除等)就会在右键菜单中出现,否则不会出现,相应的事件就是具体对应操作的处理菜单操作。

winform增删改查简单案例

winform增删改查简单案例

winform增删改查简单案例WinForm是一种用于开发Windows桌面应用程序的框架,它提供了丰富的界面控件和功能,使程序开发变得更加简单和高效。

本文将以一个简单的增删改查案例来介绍WinForm的基本使用。

1. 案例背景假设我们要开发一个学生信息管理系统,需要实现对学生信息的增加、删除、修改和查询功能。

我们使用WinForm来设计和实现界面,使用数据库来存储学生信息。

2. 界面设计我们需要设计一个界面来展示学生信息和操作按钮。

可以使用DataGridView控件来展示学生信息表格,使用TextBox控件来输入和修改学生信息,使用Button控件来执行相应的操作。

3. 数据库设计为了存储学生信息,我们需要设计一个数据库表。

可以创建一个名为"Students"的表,包含学生的姓名、年龄、性别等字段。

4. 增加学生信息在界面上,我们可以提供一个"添加"按钮,点击该按钮后弹出一个对话框,要求用户输入学生的姓名、年龄、性别等信息。

用户输入完毕后,我们可以将这些信息插入到数据库的"Students"表中。

5. 删除学生信息在界面上,我们可以提供一个"删除"按钮和一个选择框,用户可以通过选择框来选择要删除的学生,然后点击"删除"按钮来删除选中的学生信息。

删除操作会将选中的学生从数据库的"Students"表中删除。

6. 修改学生信息在界面上,我们可以提供一个"修改"按钮和一个选择框,用户可以通过选择框来选择要修改的学生,然后点击"修改"按钮来修改选中的学生信息。

修改操作会将选中的学生的信息更新到数据库的"Students"表中。

7. 查询学生信息在界面上,我们可以提供一个"查询"按钮和一个输入框,用户可以在输入框中输入要查询的学生姓名或其他关键字,然后点击"查询"按钮来查询符合条件的学生信息。

Winform开发中常见界面的DevExpress处理操作

Winform开发中常见界面的DevExpress处理操作

Winform开发中常见界⾯的DevExpress处理操作我们在开发Winform程序的时候,需要经常性的对界⾯的⼀些控件进⾏初始化,或者经常简单的封装,以⽅便我们在界⾯设计过程中反复使⽤。

本⽂主要介绍在我的⼀些项⽬中经常性的界⾯处理操作和代码,以便为⼤家开发的时候提供必要的参考。

1、选择⽤户的控件封装操作在⼀些系统模块⾥⾯,我们需要选择系统⼈员作为经办⼈员的操作,如下⾯⼏个界⾯场景所⽰。

我们注意到,⼀般在我们选择的时候,界⾯会弹出⼀个新的层给我们选择,⾥⾯通过列表详细展⽰相关的信息,还可以⽀持搜索,⾮常⽅便。

当我们完成选择的时候,我们看到界⾯会只有⼀个⼈员名称的显⽰,不占⽤额外的地⽅显⽰。

这种界⾯效果是如何实现的呢?下⾯进⾏详细的介绍。

1)⾸先我们定义⼀个⾃定义控件,让其继承⾃XtraUserControl 即可。

///<summary>///经办⼈员、操作⼈员的选择控件封装///</summary>public partial class OperatorSelectControl : XtraUserControl{2)然后在DevExpress的界⾯⼯具箱上拖动⼀个SearchLookUpEdit 控件到我们新的⽤户控件OperatorSelectControl 上。

调整好⽤户界⾯控件的排版相关属性,就会得到下⾯的界⾯所⽰。

3)在设计视图⾥⾯,我们为这个SearchLookUpEdit控件的GridView设置它的显⽰字段,如下所⽰,每个字段主要绑定FieldName(属性或者字段)和Caption(显⽰名称)。

这些必备的处理操作完成后,我们可以通过代码或者设计器把这个控件的显⽰内容和存储内容进⾏设定,并绑定它的数据源即可(根据需要调⽤⾃⼰的函数),如下所⽰。

private void OperatorSelectControl_Load(object sender, EventArgs e){if (!this.DesignMode){txtOperator.Properties.ValueMember = "ID";txtOperator.Properties.DisplayMember = "FullName";txtOperator.Properties.DataSource = SecurityHelper.GetSimpleUsers();}}4)我们为了⽅便,还可以进⼀步处理控件的显⽰内容和返回的值内容,我们希望绑定值或者获取值的时候,使⽤Text属性就可以了,那么我们重载⼀下这个⾃定义控件的Text属性即可。

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

Winform分页控件重大更新,并实现普通版、DotNetBar、DevExpress三大版本整合更新(附各种例子源码)在Winform开发中,一直离不开分页处理,好的分页控件封装,能为开发节省很多时间和繁琐工作,对分页控件一直的改进和完善,也是我的兴趣之一。

本次主要实现对分页控件的全面重构,优化功能及界面的处理,并统一完成普通版、基于DotNetbar界面控件版本、DevExpress界面控件版本三大版本的发布,这几个界面版本,除了界面表现效果不一样外,所有的功能展示及使用代码完全一致,保证用户的知识投资及给客户良好的使用操作。

本次主要增加的功能有:可通过界面设置列表显示的列,可复制选定的行信息,可设置显示的行号、可设置显示间隔行的颜色等功能。

下面分别对几个例子的截图进行总体介绍,然后在详细介绍1)普通版(即不引用任何第三方界面控件)效果图上图中,红色的菜单是分页控件内置的菜单项,其他程序附加是扩展菜单项目,其中复制选定行信息、设置表格显示列、打印列表是对表格基本的操作功能。

下面两个版本的控件右键菜单均表现一致。

2)基于DotNetbar界面控件版本3)基于DevExpress界面控件版本使用分页控件的基础代码,在所有以上版本中,代码均一致,只是一些特殊的操作,需要利用到不同的控件,有所差异而已。

初始化分页控件代码如下所示。

private void FrmCustomer_Load(object sender, EventArgs e){this.winGridViewPager1.ProgressBar = this.toolStripProgressBar1.Pro gressBar;this.winGridViewPager1.OnPageChanged += new EventHandler(winG ridViewPager1_OnPageChanged);this.winGridViewPager1.OnStartExport += new EventHandler(winGrid ViewPager1_OnStartExport);this.winGridViewPager1.OnEditSelected += new EventHandler(winGri dViewPager1_OnEditSelected);this.winGridViewPager1.OnDeleteSelected += new EventHandler(win GridViewPager1_OnDeleteSelected);this.winGridViewPager1.OnRefresh += new EventHandler(winGridVie wPager1_OnRefresh);this.winGridViewPager1.OnAddNew += new EventHandler(winGridViewPager1_OnAddNew);this.winGridViewPager1.AppendedMenu = this.contextMenuStrip1;//追加额外菜单项目this.winGridViewPager1.ShowLineNumber = true;//显示行号this.winGridViewPager1.PagerInfo.PageSize = 30;//页面大小this.winGridViewPager1.EventRowBackColor = Color.LightCyan;//间隔颜色BindData();}以上是对分页控件的相关事件进行处理,如果实现了相关的事件,那么相应的菜单(如新增、编辑、删除等)就会在右键菜单中出现,否则不会出现,相应的事件就是具体对应操作的处理菜单操作。

另外,分页控件的一些属性,如是否显示行号、页面显示记录大小、间隔颜色等属性也可以在这里设置。

这些初始化设置完成后,一般查询界面都会有一个条件的组合,然后通过组合条件查询数据库记录并显示,显示的时候,分页控件可以设置对应字段的中文显示名称,显示的字段列,显示顺序等。

显示字段的顺序就是列表的显示顺序,这个特性也是新版本增加的功能之一。

private void winGridViewPager1_OnPageChanged(object sender, EventA rgs e){BindData();}///<summary>///根据查询条件构造查询语句///</summary>///<returns></returns>private string GetSearchSql(){SearchCondition condition = new SearchCondition();condition.AddCondition("Number", this.txtNumber.Text, SqlOperator. Like).AddCondition("Name", this.txtName.Text, SqlOperator.Like).AddCondition("Type", this.cmbType.Text, SqlOperator.Like).AddCondition("Area", this.cmbArea.Text, SqlOperator.Like).AddCondition("Address", this.txtAddress.Text, SqlOperator.Like).AddCondition("Company", this.txtCompany.Text, SqlOperator.Like) .AddCondition("Note", this.txtNote.Text, SqlOperator.Like).AddCondition("Telephone1", this.txtTelephone.Text, SqlOperator.L ike, true, "Telephone").AddCondition("Telephone2", this.txtTelephone.Text, SqlOperator.L ike, true, "Telephone").AddCondition("Telephone3", this.txtTelephone.Text, SqlOperator.L ike, true, "Telephone").AddCondition("Telephone4", this.txtTelephone.Text, SqlOperator.L ike, true, "Telephone").AddCondition("Telephone5", this.txtTelephone.Text, SqlOperator.L ike, true, "Telephone");if (chkUseDate.Checked){condition.AddCondition("CreateDate", dateTimePicker1.Value.ToStr ing("yyyy-MM-dd"), SqlOperator.MoreThanOrEqual, true).AddCondition("CreateDate", dateTimePicker2.Value.AddDays(1 ).ToString("yyyy-MM-dd"), SqlOperator.LessThanOrEqual, true);}string where = condition.BuildConditionSql().Replace("Where", "");return where;}private void BindData(){#region添加别名解析//DisplayColumns与显示的字段名或者实体属性一致,大小写不敏感,顺序代表显示顺序,用逗号或者|分开this.winGridViewPager1.DisplayColumns = "Number,NAME,type,Area, Company,Address,Telephone1,Telephone2,Telephone3,Telephone4,Telephone5,CreateDate,Note,LastUpdated";this.winGridViewPager1.AddColumnAlias("ID", "编号");this.winGridViewPager1.AddColumnAlias("Number", "客户编号");this.winGridViewPager1.AddColumnAlias("Name", "客户名称");this.winGridViewPager1.AddColumnAlias("Type", "客户类型");this.winGridViewPager1.AddColumnAlias("Area", "客户地区");this.winGridViewPager1.AddColumnAlias("Company", "客户单位");this.winGridViewPager1.AddColumnAlias("Address", "客户地址");this.winGridViewPager1.AddColumnAlias("Telephone1", "电话1");this.winGridViewPager1.AddColumnAlias("Telephone2", "电话2");this.winGridViewPager1.AddColumnAlias("Telephone3", "电话3");this.winGridViewPager1.AddColumnAlias("Telephone4", "电话4");this.winGridViewPager1.AddColumnAlias("Telephone5", "电话5");this.winGridViewPager1.AddColumnAlias("CreateDate", "开户日期");this.winGridViewPager1.AddColumnAlias("Shop_ID", "分店ID");this.winGridViewPager1.AddColumnAlias("Note", "备注");this.winGridViewPager1.AddColumnAlias("LastUpdated", "更新日期");#endregionstring where = GetSearchSql();this.winGridViewPager1.DataSource = BLLFactory<Customer>.Instan ce.Find(where, this.winGridViewPager1.PagerInfo);}private void btnSearch_Click(object sender, EventArgs e){BindData();}很多人以前看过我介绍分页控件的用法的时候,总会觉得上面的数据绑定方式看似简单,实际操作可能绑定数据总是有问题,因为不知道Find函数里面需要实现那些操作,因为这些是基于我框架的应用逻辑。

相关文档
最新文档