应用C#设计winform的一些心得

简介: 近期,因工作需要,应用C#设计了一个winform界面,主要是用来实现人员的量化积分管理,类似于很多单位的绩效考核管理系统那种。坦言之,这其实只是个人第二次涉猎winform窗体应用的设计(上一次还要追溯6-7年前的院校时期),上手还是比较慢的,前后大概花了10天时间。因为最后功能上还算比较满意,特写此文以作总结,记录当下。

近期,因工作需要,应用C#设计了一个winform界面,主要是用来实现人员的量化积分管理,类似于很多单位的绩效考核管理系统那种。坦言之,这其实只是个人第二次涉猎winform窗体应用的设计(上一次还要追溯6-7年前的院校时期),上手还是比较慢的,前后大概花了10天时间。因为最后功能上还算比较满意,特写此文以作总结,记录当下。


640.jpg


首先谈谈关于7个控件的全新感受。


  • Button。button应该差不多是编写winform程序最常用的空间之一了,点击一个按钮,对应一组操作,带来一系列状态变化,这似乎是我们对于软件最常用的操作。Button的实现也好理解,但要做到美观实用却并不简单,比如button可以不用文字,而用图标来表示其含义就很可能带来更好的效果;或者,多个button的排布,先后顺序、大小配置以及位置摆放都会很有讲究。

  • Label。label是一个标签,可能是与button并列最常用的控件,最初个人对它的理解是片面的,后来发现它可以与button具有相同的功效:点击后实现某些操作。只是label的点击相比button而言,会缺乏实际的点击体验:看不到点击前后变化,但这又在某些场合却恰恰可以被巧妙的应用。另外,label标签的显隐变化,大小设置(比如为了体现竖排文字),以及多label配合实现颜色搭配,这些都值得去充分发挥想象空间和艺术细胞。

  • TextBox。textbox可能存在的最大意义就是实现用户与软件的交互,通过接受文字输入实现相应的功能变化,对其最大的定制化操作在于与picturebox合理布局后的外观设计以及与其他button/label控件配合使用的效果。另外,textbox自带passwordchar属性,可以实现密码栏加密显示。



  • ComboBox。下拉框可以理解成一个定制的textbox,通过设置下拉模式(dropdownstyle)的不同,又可以实现普通textbox和只读textbox之间的区分。另外,下拉可选值还可以通过程序来动态填充,而不必仅依托初始赋值,这就实现了可以从数据库中罗列当前侯选值,再加上是否制定初始的selectedindex,就能带来很多细节上的不同效果。


  • DataGridView。这就是个表格,这个表格可以通过设置实现列名和行名的程序赋值、显隐和用户可编辑,以及奇偶行不同颜色显示,是否单列可排序(这个对于居中的效果影响很大:可排序时,列名在居中状态下会偏左,因为右侧留出了排序的点击按钮,不可排序时则是完全的物理居中),是否支持右键菜单,是否管理数据库(制定数据源会更方便)。这个控件是涉及各类表格操作的首选,尤其是关联数据库时就更加适合使用。

  • Groupbox。groupbox常用来容纳一些控件并将它们分为一组,典型的就是和RadioButton配合来实现多选一,当然用于容纳其他控件也是有不错的效果。

  • Panel。在认识panel之前,我曾经很苦恼于多窗口操作:为了实现点击一个按钮弹出一个界面,之前总会想到增加一个winform窗体,通过show或者showdialog的方式,但在认识了panel的强大之后,通过设计visible属性便可以轻松实现此显彼隐,非常方便。需要注意的一个细节是,要将多个panel充分剥离开,否则系统会自动其变成容纳关系,就失去了想要的隐显效果,充分剥离又往往意味着要将其放置于错误的位置,所以又涉及到初始化时手动设置其location属性。

然后说下2个具体的界面操作相关


  • 父界面和子界面传值。界面间传值也算是窗体程序设计间的一个老话题,网上也有很多教程,比如父传子容易实现,通过正常的函数传参即可实现;子传父又涉及到同步传值和异步传值的问题,一般需要强制指定拥有者来实现方位。实际上,个人在解决这个问题时倒是想到了两个可称得上是“投机”的解决办法:
    1.借用数据库来存储数据和传递数据,当弹出子窗口和父窗口的目的就是为了记录或获取一些值时,这时传值的操作就等价于子窗口将数据存储,待子窗口关闭后父窗口从数据库总读取,因为数据库操作响应速度很快,所以这不失为一种有效的解决界面间传值的方案;
    2.考虑能否规避两个窗口,而用2个panel来实现,前面讲到panel可以通过设置visible属性来实现隐显,其实也可算得上是一种窗口的弹出和消失。而panel间传值则相比窗口间传值要容易了。之于panel的设计能否实现弹出窗口带来的相同效果,则要具体情况具体分析了。

  • 界面缩放控制。这个问题目前还没有找到很好的解决方案,主要就是放大后控件位置错乱、比例失调等问题。所以,要么锁死(不允许放大),要么根据使用屏幕尺寸定制好大小。当然,这都不是有效的解决办法,目前还在研究中。


最后讲几个方法论层面的心得


  • 设计是灵魂,算法是保证。麻雀虽小,五脏俱全。既然是设计一款软件,再小也是要讲究用户体验的,这首先就涉及到界面设计的问题。但凡一款受欢迎的软件,势必是界面很漂亮的,至少不难看,让人用着赏心悦目。而设计又不仅仅是表面功夫,当然也要有内在:包括功能的设计,操作流程的设计。而保证操作体验很重要的一方面,其实就是功能背后的算法实现问题,同样的一个问题,能否通过算法层面的改进提高功能实现的体验(比如友好的界面提示和可视化效果)、效率(响应速度)和鲁棒性(操作顺序错误或安装环境不满足时能否稳定执行),这些都要有足够的考虑。举个期间的实际例子,界面涉及到通过Excel导入数据的问题,对于Excel单元格格式是否敏感就是软件鲁棒性的一个最直接提现。

  • 大处着眼,小处着手。在软件需求分析和排布功能清单时,一定不能过于拘泥细节,而应先宏观考虑、全盘布局,尔后再考虑一区一块的具体设计和实现问题。而且依据使用频率和重要程度来区分功能区位置和选项卡大小都是很有必要的。

  • 避实就虚,用好二八法则。一个人完成从需求分析、到界面设计再到具体代码实现时,个人的最大感受就是挑软柿子捏——避实就虚——先挑简单的来,这实际上就是应用二八法则的特点:一项任务的80%工作往往需要20%左右的时间就可以完成,而剩下的20%则可能需要花费80%的时间。这个法则一直深入我心,是我面对繁杂大项任务时最大的信心激励。完成这个小项目过程中,我会挑简单的功能模块优先实现,同时在实现这些具体功能过程中,往往会对后续的功能产生灵感和启发。

  • 不破不立,重构可能意味着重生。在程序员界,往往涉及到代码重构,我想各个领域都是需要一点重构精神的。具体到这个项目,完成的重构不止一点两点,既有代码层次的改进,更有功能设计层面的重构,虽然“返工”的过程不那么美妙,但结果总会是不亚于之前的(前提是做好备份)。
目录
相关文章
|
1月前
|
存储 安全 物联网
C# 在物联网 (IoT) 应用中的应用
本文介绍了C#在物联网(IoT)应用中的应用,涵盖基础概念、优势、常见问题及其解决方法。重点讨论了网络通信、数据处理和安全问题,并提供了相应的代码示例,旨在帮助开发者更好地利用C#进行IoT开发。
48 3
|
1月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
35 3
|
1月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
57 1
|
3月前
|
SQL API 定位技术
基于C#使用winform技术的游戏平台的实现【C#课程设计】
本文介绍了基于C#使用WinForms技术开发的游戏平台项目,包括项目结构、运行截图、实现功能、部分代码说明、数据库设计和完整代码资源。项目涵盖了登录注册、个人信息修改、游戏商城列表查看、游戏管理、用户信息管理、数据分析等功能。代码示例包括ListView和ImageList的使用、图片上传、图表插件使用和SQL工具类封装,以及高德地图天气API的调用。
基于C#使用winform技术的游戏平台的实现【C#课程设计】
|
1月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
16 0
|
2月前
|
设计模式 程序员 C#
C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤
WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug
203 0
|
3月前
|
设计模式 开发框架 前端开发
MVC 模式在 C# 中的应用
MVC(Model-View-Controller)模式是广泛应用于Web应用程序开发的设计模式,将应用分为模型(存储数据及逻辑)、视图(展示数据给用户)和控制器(处理用户输入并控制模型与视图交互)三部分,有助于管理复杂应用并提高代码可读性和维护性。在C#中,ASP.NET MVC框架常用于构建基于MVC模式的Web应用,通过定义模型、控制器和视图,实现结构清晰且易维护的应用程序。
65 2
|
3月前
|
编译器 C# Android开发
Uno Platform 是一个用于构建跨平台应用程序的强大框架,它允许开发者使用 C# 和 XAML 来创建适用于多个平台的应用
Uno Platform 是一个用于构建跨平台应用程序的强大框架,它允许开发者使用 C# 和 XAML 来创建适用于多个平台的应用
350 8
|
2月前
|
消息中间件 网络协议 安全
C# 一分钟浅谈:WebSocket 协议应用
【10月更文挑战第6天】在过去的一年中,我参与了一个基于 WebSocket 的实时通信系统项目,该项目不仅提升了工作效率,还改善了用户体验。本文将分享在 C# 中应用 WebSocket 协议的经验和心得,包括基础概念、C# 实现示例、常见问题及解决方案等内容,希望能为广大开发者提供参考。
147 0
|
3月前
|
存储 C# 开发者
枚举与结构体的应用:C#中的数据组织艺术
在C#编程中,枚举(`enum`)和结构体(`struct`)是非常重要的数据类型。枚举用于定义命名常量集合,提高代码可读性;结构体则封装相关数据字段,适合小型数据集。本文从基本概念入手,探讨它们的使用技巧、常见问题及解决方案,帮助开发者更好地利用这些特性构建健壮的应用程序。
50 8