Winform开发的界面处理优化

在Winform开发中,客户体验是个很好的参考性指标,如果一个功能使用的时候感觉很流畅,说明我们的程序执行效率还不错,但是随着数据的真多,原先可能流程的地方可能会变得比较卡,这时候就需要追本索源,找到症结并进行处理。但是,如果我们对Winform开发有一定的经验积累,有些耗时缓慢的界面处理一开始还是比较容易避免,本文介绍一些在开发过程中的一些界面性能上的优化处理,希望对大家有帮助。

1、案例说明

在我开发的CRM系统中,系统的一些用户如经办人员,来自权限管理系统,因此在开发的时候,并没有模拟太多的用户,因此,开始的设计处理是通过下拉列表列出相关的用户即可,如下所示。

最开始的考虑是让用户能够快速选择所需要的经办人员,默认是当前用户,这种设计开始不会有任何问题,因为数据少,测试起来非常流畅。

插入用户的界面部分是这样处理的,由于这个经办人是很多界面地方用到的,所以把它封装为一个界面控件,需要的地方拖过去使用即可,和普通的文本框一样的使用方法。

上面的控件初始化的时候,应该列出一些用户信息,如下所示。

                List<UserInfo> userList = BLLFactory<User>.Instance.GetAll();
                foreach (SimpleUserInfo info in userList)
                {
                    this.txtOperator.Properties.Items.Add(new CListItem(info.FullName, info.ID.ToString()));
                }

2、界面效率优化

1)优化一

上面的代码粗看没有什么问题,但是我们知道,下拉列表为了提高效率,一般有一个BeginUpdate,EndUpdate的方法用来实现批量录入。为了提高速度,这点我们需要利用上,然后代码就修改为下面的处理方式。

                this.txtOperator.Properties.BeginUpdate();
                List<UserInfo> userList = BLLFactory<User>.Instance.GetAll();
                foreach (SimpleUserInfo info in userList)
                {
                    this.txtOperator.Properties.Items.Add(new CListItem(info.FullName, info.ID.ToString()));
                }
                this.txtOperator.Properties.EndUpdate();

在数据不算很多的时候,感觉速度比原来却是快了一些。

2)优化二

但是发现我的权限系统用户数据增加到几百个的人员的时候,速度就有点卡了。问题出现在哪里?

由于权限管理系统中用户表是一个较为庞大的表,如下所示。

每次获取用户的时候,我们调用了下面的代码。

BLLFactory<User>.Instance.GetAll()

这个操作是把用户的全部信息字段都获取一次,速度肯定比较慢了,那么我们来改进一下,因为我们这里控件只需要绑定一些简单的用户名,用户ID,用户姓名等基础字段,我们来简化一个对象用来实现数据的获取,如下所示。

于是我在权限管理系统定义了一个简单的用户对象,称为SimpleUserInfo,它只是包含了几个基本的字段即可,这样绑定代码修改如下。

                this.txtOperator.Properties.BeginUpdate();
                this.txtOperator.Properties.Items.Clear();
                List<SimpleUserInfo> userList = BLLFactory<User>.Instance.GetSimpleUsers();
                foreach (SimpleUserInfo info in userList)
                {
                    this.txtOperator.Properties.Items.Add(new CListItem(info.FullName, info.ID.ToString()));
                }
                this.txtOperator.Properties.EndUpdate();

好了,速度很快了,一眨眼功夫,几百个用户都列出来了,非常高兴。

3)优化三

上面确实感觉速度飞快了,几百个用户瞬间加载,解决了速度的问题,但是带来了另外一个问题,几百个用户,我们通过列表选择用户是否太费眼力了呢,一个个找,没有查找过滤?好费劲!

好既然速度提上来了,我们改进一下用户体验的效果吧,好像记得DevExpress有一个查找的下拉列表叫做SearchLookupEdit,就用它了。

先另外定义一个基于SearchLookupEdit的界面控件,如下所示。

设置它里面列表需要显示的字段,如下所示。

绑定代码如下所示。

        private void OperatorSelectControl_Load(object sender, EventArgs e)
        {
            if (!this.DesignMode)
            {
                txtOperator.Properties.ValueMember = "ID";
                txtOperator.Properties.DisplayMember = "FullName";
                txtOperator.Properties.DataSource = BLLFactory<User>.Instance.GetSimpleUsers();
            }
        }

上面的设计和代码绑定弄完成后,我们来看看具体的效果了。

通过弹出的GridView里面展示用户信息,并能支持查询搜索,选择用户速度快了很多,同时也提高用户体验。

4)优化四

说完了优化三,看到优化四,是不是心里说道,不是吧,还有更好的?

当然,我们知道Winform里面很多时候,数据可能都会被反复使用,如经办人员,一般来说,很多界面可能都需要,那么每次都需要从数据库里面取出几百个用户,效率上感觉还是不太好,特别如果是在我的混合式框架中用到的WCF的分布式获取数据方式,也就是说数据不再本地,需要通过网络方式获取,那么就会产生带宽的问题,效率可能无法保证。

好了,说到这里,就是指我想把这些常用到,不会经常变化的数据缓存起来,供下一步继续使用。

我们看看获取用户数据的地方修改为下面的方法,关于MemoryCacheHelper的定义及说明,可以参考我上一篇介绍WInform里面使用缓存的随笔《Winform里面的缓存使用》。

        /// <summary>
        /// 获取用户全部简单对象信息,并放到缓存里面
        /// </summary>
        /// <returns></returns>
        public static List<SimpleUserInfo> GetSimpleUsers()
        {
            System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod();
            string key = string.Format("{0}-{1}", method.DeclaringType.FullName, method.Name);

            return MemoryCacheHelper.GetCacheItem<List<SimpleUserInfo>>(key,
                delegate() { return BLLFactory<User>.Instance.GetSimpleUsers(); },
                new TimeSpan(0, 10, 0));//10分钟过期
        }

好了,使用缓存获取数据,我们只需要稍微调整下控件的获取数据代码即可,如下所示。

        private void OperatorSelectControl_Load(object sender, EventArgs e)
        {
            if (!this.DesignMode)
            {
                txtOperator.Properties.ValueMember = "ID";
                txtOperator.Properties.DisplayMember = "FullName";
                txtOperator.Properties.DataSource = SecurityHelper.GetSimpleUsers();
            }
        }

以上经验就是在我的《CRM客户关系管理系统》里面,对于经办人这样的用户选择界面所做的一步步精益求精的优化尝试和历程,希望给大家在做同样操作的时候常考。

如果有兴趣,可以进一步了解这个系统的各种界面设计效果。

本文转自博客园伍华聪的博客,原文链接:Winform开发的界面处理优化,如需转载请自行联系原博主。

时间: 2024-10-12 16:57:33

Winform开发的界面处理优化的相关文章

Winform开发客户关系管理系统(CRM)总结 1 界面功能展示

一直以来,都希望整合一个以客户为中心的平台,有两个方面的考虑:一是实现客户数据.客户关系 .客户管理等方面的整合,以便更好利用好客户的相关资源,发挥最大的营销效益:二是整合目前我的 开发框架的所有模块和技术,包括权限管理和控制.字典管理模块.分页控件.公用类库.自动更新模 块.附件管理模块.邮件短信的信息通知模块.工作流模块,以及来电显示记录模块.群发邮件营销模 块.日历管理模块等方面的内容.本随笔系列主要介绍在开发我的CRM系统中的各种场景问题的解决思路 ,以及相关的功能实现,力求在逐步完善这

用Winform开发了一个程序,界面上的控件在Win7下是基本对齐的,到了WindowsServer2008下就变的完全对不齐了?请问这是什么原因?

问题描述 用Winform开发了一个程序,界面上的控件在Win7下是基本对齐的,到了WindowsServer2008下就变的完全对不齐了?请问这是什么原因?RT 解决方案 解决方案二:不知道你是用什么方法"对齐"的,所以无法判断.比如说你用"空格"来搞什么"对齐",那么不同系统的同一个主题下的细节设置也是有调整的,空格在高版本的windows下肯定就变宽了一些,那么自然在高版本windows下就"鼓出去"了.你用于"

java winform开发:JTable详解

列表在任何一门开发语言中都占有非常重要的地位,在.Net中有GridView,在extjs中有GridPanel...,而在java Swing中,它的名字叫JTable.这两天在研究JTable的使用,也有一些收获,所以在这里跟大家分享交流一下,下面的内容将包括:1)JTable的基本用法:2)怎样为JTable添加行点击响应事件,双击后打开窗口:3)怎样为JTable的行添加标识,如行id等:4)怎样在JTable中动态添加新行: 1)JTable的基本用法: 我用的IDE是NetBeans

.Net WInform开发笔记(三)谈谈自制控件(自定义控件)_C#教程

末日这天写篇博客吧,既然没来,那就纪念一下. 这次谈谈自制控件,也就是自定义控件,先上图,再说 1.扩展OpenFileDialog,在OpenFileDialog中添加各种文件(.txt,.jpg,.excel等等)的预览功能 开发笔记(三)谈谈自制控件(自定义控件)_C#教程-winform自定义控件"> 2.重写ListBox,增加折叠.鼠标背影.分类等功能 -----------------------------分割线-------------------------------

winform 开发 设计器页面异常

问题描述 winform开发用户控件的时候设计器不能放第三方控件变成上下两个区域显示非常不方便布局如下图,vs自带的工具可以放,第三方的控件不能放上去如何恢复到同一个界面,能让第三方工具放到控件上? 解决方案

在Winform开发中使用FastReport创建报表

FastReport.Net是一款适用于Windows Forms, ASP.NET和MVC框架的功能齐全的报表分析解决方案.可用在Microsoft Visual Studio 2005到2015,支持.Net Framework 2.0到4.x.我下载了一个FastReport进行测试使用,这个报表功能还是很强大的. 对其中FastReport的一些功能,我编写整理了一个小小的案例进行介绍,进行了简单的测试记录,希望对了解FastReport的使用有帮助.案例界面功能如下所示. 1.Fast

在Winform开发中使用日程控件XtraScheduler

在一些应用场景中,我们可能需要记录某一天,某个时段的日程安排,那么这个时候就需要引入了DevExpress的日程控件XtraScheduler了,这个控件功能非常强大,提供了很好的界面展现方式,以及很多的事件.属性给我们定制修改,能很好满足我们的日程计划安排的需求,本文全面分析并使用这个控件,希望把其中的经验与大家分享. 1.日程控件的表现效果 整个日程控件,可以分为日视图.周视图.月视图等等,当然还有一些不常用的时间线.甘特图等,本例我们来关注控件的使用以及这几个视图的处理.先来看看他们的界面

在Winform开发中使用日程控件XtraScheduler(2)--深入理解数据的存储

在上篇随笔<在Winform开发中使用日程控件XtraScheduler>中介绍了DevExpress的XtraScheduler日程控件的各种使用知识点,对于我们来说,日程控件不陌生,如OutLook里面就有日历的模块,但是这个日程控件真的是很复杂的一个控件,需要全面掌握可能需要花费很多的时间去了解,由于是技术研究,我总是希望把它常用的功能剖析的更加彻底一些,前面随笔也介绍了它的存储功能,把它基于实体类的方式存储在数据库里面,不过介绍的还不够,本文继续上面的内容,进行数据存储方面的介绍. 在

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

我们在开发Winform程序的时候,需要经常性的对界面的一些控件进行初始化,或者经常简单的封装,以方便我们在界面设计过程中反复使用.本文主要介绍在我的一些项目中经常性的界面处理操作和代码,以便为大家开发的时候提供必要的参考. 1.选择用户的控件封装操作 在一些系统模块里面,我们需要选择系统人员作为经办人员的操作,如下面几个界面场景所示. 我们注意到,一般在我们选择的时候,界面会弹出一个新的层给我们选择,里面通过列表详细展示相关的信息,还可以支持搜索,非常方便. 当我们完成选择的时候,我们看到界面