WinForm应用实战开发指南 - 如何用自定义控件丰富界面效果处理?
Winform界面开发部分往往也用到了自定义的用户控件对应一些特殊的界面或者常用到的一些局部界面内容我们可以使用自定义的用户控件来提高界面的统一性同时也增强了使用的便利性。如我们Winform界面中用到的分页控件、附件显示内容、以及一些公司、部门、菜单的下拉框列表等等由于重复多处使用因此一处封装多处收益。PS给大家推荐一个C#开发可以用到的界面组件——DevExpress WinForms它能完美构建流畅、美观且易于使用的应用程序无论是Office风格的界面还是分析处理大批量的业务数据它都能轻松胜任DevExpress新旧版本帮助文档获取可点击这篇文章查看——《界面控件DevExpress v26.1帮助文档大全CHM版本》回顾Winform界面中自定义的用户控件处理场景之前介绍了不少的控件使用、以及自定义控件的使用例子如模仿牙医管家的软件界面的部分来创建一些自定义部分的内容。根据其中显示的内容部分制作了一个用户控件在其中添加一个LayoutControl方便控制布局添加一些标签以及设置了一些图标得到下图所示。其中定义的用户控件的源码部分继承自XtraUserControl用户控件基类如果是传统样式的Winform界面可以继承自UserControl修改其中源码增加对应的属性方便动态设置用户控件的相关属性如颜色块、项目背景色以及绑定的对象信息等内容。然后通过自定义控件的事件或者方法对界面内容进行更新处理即可完成后我们看界面的效果如下所示较为符合实际的效果即可。一般来说一个窗体用户控件不多的情况下Winform界面的效果还是挺好的如果界面的用户控件很多如超过几千个那么可能会有性能问题。动态展现大量历史号码信息的自定义控件的时候就会出现一些句柄创建错误的问题。控件集合可以通过布局TableLayoutPanel表格布局或者FlowLayoutPanel顺序流布局来添加即可如果利用TableLayoutPanel来展示那么需要设置好每列的宽度或者比例如下界面所示。表格的行列定义如下所示。由于自定义控件我们需要跟踪用户的单击处理并且需要把这个逻辑逐步推动到顶级界面上去进行处理因此需要定义一个事件信息如下所示。/// summary /// 事件处理 /// /summary public EventHandlerClickEventData ClickEventHandler { get; set; }控件的动态添加处理可以同时指定它的匿名事件的处理逻辑从而对控件的事件进行更新。var controlList new ListLotteryItemControl2(); foreach (var info in list) { var control new LotteryItemControl2(); control.Qi info.LineNo.ToString(D2); var numberList new Liststring() { info.No1.ToString(D2), info.No2.ToString(D2), info.No3.ToString(D2), info.No4.ToString(D2), info.No5.ToString(D2), info.No6.ToString(D2), info.No7.ToString(D2), }; control.NumberList numberList; control.BindData(); control.ClickEventHandler (s, data) { //遍历所有的控件统一处理样式 foreach (var subCtrl in panel.Controls) { if (subCtrl is LotteryItemControl2 lottery) { lottery.SetSelected(data); } } }; controlList.Add(control); } this.panel.Controls.AddRange(controlList.ToArray());如果我们不喜欢每个控件都对事件进行一个层层的处理也可以引入MediatR来实现事件总线的处理。我们在程序启动的时候注入对应的接口服务IMediator那么就可以通过该静态类的 GetService方法获取对应的注入接口IMediator我们需要利用该接口来发送Send请求/应答命令或者发布Publish消息的处理。public partial class TestMediatR : BaseForm { private readonly IMediator _mediator; public TestMediatR() { InitializeComponent(); _mediator ServiceLocator.GetServiceIMediator(); }MediatR是一个跨平台通过一种进程内消息传递机制进行请求/响应、命令、查询、通知和事件的消息传递并通过C#泛型来支持消息的智能调度其目的是消息发送和消息处理的解耦。它支持以单播和多播形式使用同步或异步的模式来发布消息创建和侦听事件。它主要的几个对象IMediator主要提供Send与Publish方法需要执行的命令都是通过这两个方法实现IRequest、IRequest命令查询 | 处理类所继承的接口一个有返回类型一个无返回类型一个查询对应一个处理类程序集只认第一个扫描到的类。IRequestHandler实现Handle方法 命令处理接口。命令查询 | 处理类继承它也可以继承AsyncRequestHandler实现抽象Handle方法、RequestHandler实现抽象Handle方法接口INotification命令查询 | 处理类所继承的接口这个没有返回与IRequest不通的是可以对于多个处理类INotificationHandler与IRequestHandler一样的只不过这是INotification的处理接口例如我们发送消息后收到应答消息结果展示在界面中的如下所示。/// summary /// 使用请求、应答的消息进行测试获得返回结果后输出显示 /// /summary private async void btnSend_Click(object sender, EventArgs e) { //应答处理 var outputMessage await _mediator.Send(new RetrieveInfoCommandRequest { Text this.txtSend.Text }); Console.WriteLine(outputMessage.OutputMessage); this.txtReceived.AppendText(outputMessage.OutputMessage Environment.NewLine); }如果控件比较多处理的时候刷新的时候记得移除面板上已经添加的控件。//清空界面 while (panel.Controls.Count 0) { var controltoremove panel.Controls[0]; panel.Controls.RemoveAt(0); controltoremove.Dispose(); } panel.Controls.Clear();Winform界面中自定义的用户控件处理例如在附件管理的时候对于一些窗体的信息我们需要了解该业务对应的附件信息有几个并且提供入口可以查看或者管理附件列表那么可以根据需要封装一个自定义附件管理的自定义用户控件。在实际界面应用的时候由于附件管理的自定义控件已经封装好了所以在使用的时候拖动到界面即可如下界面所示。我们在做病历管理的时候就需要大量用到不同的分类的附件信息的展示如下界面效果所示。还有就是有时候对于权限管理里面部门信息在不少的地方用到如果每次对原始的下拉列表处理那么增加不少工作量如果把它封装为自定义控件和常规的控件一样使用即可就会很方便如下界面所示。它的实际展示效果如下所示。单击下拉列表后展示部门的列表信息。同理用户控件一旦创建后我们可以在很多需要的地方直接使用省却初始化的一些代码操作。我们在初始化的时候显示相关的部门列表选择后获得部门的ID也可以设置部门的ID。/// summary /// 部门显示控件 /// /summary public partial class DeptControl : XtraUserControl { public string ParentOuID -1; /// summary /// 选择的值发生变化的时候 /// /summary public event EventHandler EditValueChanged; public DeptControl() { InitializeComponent(); this.txtDept.EditValueChanged new EventHandler(cmbUpperOU_EditValueChanged); } void cmbUpperOU_EditValueChanged(object sender, EventArgs e) { if (EditValueChanged ! null) { EditValueChanged(sender, e); } } private async void DeptControl_Load(object sender, EventArgs e) { if (!this.DesignMode) { //限定用户的选择级别 var list await Portal.gc.GetMyTopGroup(); foreach (OuInfo OuInfo in list) { if (OuInfo ! null) { this.ParentOuID OuInfo.Id.ToString(); } } Init(); } }需要可以响应相关的编辑事件用来触发关联的信息变化如下所示是自定义控件的使用代码。public partial class FrmEditUser : BaseEditForm { public FrmEditUser() { InitializeComponent(); this.txtDept.EditValueChanged new EventHandler(txtDept_EditValueChanged); } void txtDept_EditValueChanged(object sender, EventArgs e) { if (!string.IsNullOrEmpty(txtDept.Value)) { InitManagers(txtDept.Value.ToInt32()); } }在介绍一个场景我们在一些选择用户的界面中如CRM中对于分配用户、工作流中选择流程用户的操作中往往需要选择系统的人员列表可以多个选择那么我们可以设计界面如下所示。其中选择的人员用红色方框标识这个部分的用户和移除图标是自定义控件界面如下所示。主要就是方便对用户进行显示和移除设置的一些简单的封装。在比如在工作流的创建入口中我们展示相关可以创建流程的快速入口通过一些图片、文字来展示工作流程的信息单击事件进行弹出不同的流程对话框处理过程。这个过程主要就是美观性的要求是相对于全部文本信息的单调有一些改善的效果。本文转载自博客园 - 伍华聪

相关新闻

界面组件DevExpress WinForms v23.2 - 数据可视化功能升级

界面组件DevExpress WinForms v23.2 - 数据可视化功能升级

DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…

2026/7/22 16:01:23 阅读更多 →
TI C6000 DSP SYSCFG模块详解:从寄存器配置到系统级调试实战

TI C6000 DSP SYSCFG模块详解:从寄存器配置到系统级调试实战

1. 项目概述:为什么你需要关注SYSCFG模块?如果你正在基于TI C6000系列DSP(比如C674x)做嵌入式开发,尤其是涉及实时信号处理、多核通信或者复杂外设管理,那么你迟早会跟一个叫SYSCFG(System Conf…

2026/7/22 16:01:23 阅读更多 →
界面开发框架DevExpress XAF v24.1新版预告 - 跨平台应用UI(二)

界面开发框架DevExpress XAF v24.1新版预告 - 跨平台应用UI(二)

DevExpress XAF是一款强大的现代应用程序框架,允许同时开发ASP.NET和WinForms。XAF采用模块化设计,开发人员可以选择内建模块,也可以自行创建,从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。本文中的内容概述了XA…

2026/7/24 0:43:36 阅读更多 →

最新新闻

GB/T 47640-2026 国标正式发布,数字化转型数字人才建设迎来统一规范

GB/T 47640-2026 国标正式发布,数字化转型数字人才建设迎来统一规范

一、标准官方发布背景2026 年 7 月 2 日,国家市场监督管理总局、国家标准化管理委员会发布 2026 年第 30 号国家标准公告,正式批准发布《数字化转型 数字人才技术能力和培养要求》(GB/T 47640-2026),该国家标准将于202…

2026/7/24 6:20:04 阅读更多 →
ROS C++发布订阅模型详解:从节点通信到实战优化

ROS C++发布订阅模型详解:从节点通信到实战优化

1. 项目概述:从节点通信看ROS的核心骨架如果你刚开始接触ROS,可能会被它庞大的生态和复杂的术语搞得有点懵。什么节点、话题、服务、动作,听起来就像一套全新的语言。但别担心,今天我们就从一个最基础、也最核心的环节切入——使用…

2026/7/24 6:20:04 阅读更多 →
前所未有的人工智能失控事故!中方救场

前所未有的人工智能失控事故!中方救场

近日,美国人惊恐地得知,类似科幻电影《终结者》中人工智能失控攻击人类的情况,居然真的在美国上演了。更令他们吃惊的是,救场的居然是中国的人工智能。这一让美国科技界惊掉下巴的事件,始于上周。当时,美国…

2026/7/24 6:20:04 阅读更多 →
从两数之和到四数之和:双指针算法详解与C++实现

从两数之和到四数之和:双指针算法详解与C++实现

1. 项目概述:从“两数之和”到“四数之和”的算法进化如果你在力扣上刷过“两数之和”和“三数之和”,那么看到“四数之和”这道题时,第一反应可能是“又来?”。没错,这道编号为18的题目,正是经典双指针算法…

2026/7/24 6:20:04 阅读更多 →
HarmonyOS ArkTS 实战:实现一个大创项目申报管理应用

HarmonyOS ArkTS 实战:实现一个大创项目申报管理应用

HarmonyOS ArkTS 实战:实现一个大创项目申报管理应用 项目效果 本文使用 HarmonyOS 和 ArkTS 实现一个大创项目申报管理应用。 应用可以查看申报通知,提交项目申报,查看审核状态,项目进度,并提供成员管理、指导老师、中…

2026/7/24 6:20:04 阅读更多 →
C++实现图像腐蚀算法:从原理到代码实践

C++实现图像腐蚀算法:从原理到代码实践

1. 项目概述:从像素到形态的运算在图像处理的世界里,我们常常需要处理一些“不完美”的图片。比如,从扫描仪得到的文档图像,边缘可能带有毛刺;或者,在识别某个物体轮廓时,我们希望去除一些细小的…

2026/7/24 6:19:04 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻