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属性即可。

        public override string Text
        {
            get
            {
                string result = "";
                if (this.txtOperator.EditValue != null)
                {
                    result = this.txtOperator.EditValue.ToString();
                }
                return result;
            }
            set
            {
                this.txtOperator.EditValue = value;
            }
        }

5)这样控件的操作就完成了,编译代码后,我们在工具箱上就可以看到最新的控件图标了。

接着我们把相关的控件拖动到需要的地方(如果是界面和控件在相同的工程里面,注意需要移除重复的工程引用),重新编译系统代码,那么本文开始的界面效果就可以出现了。

2、会员卡级别选择操作

刚才说了,人员选择可以使用这种弹出列表选择的方式,其实很多地方可以用这个方式来进行选择,如一些相对比较少记录的信息就很适合这种显示方式,比如在会员管理里面的,会员卡级别的选择,也可以采用这种方式。

这个模块的做法也和第一种很类似,有点不同的是,我需要选择后把会员卡的折扣也关联显示出来,那我们应该如何处理呢?

1)定义控件和事件处理

为了方便在控件选择后进行事件的触发处理,我在这里定义了一个事件处理器SelectedValueChanged

    /// <summary>
    /// 卡级选择控件
    /// </summary>
    public partial class CardGradeSelectControl : XtraUserControl
    {
        /// <summary>
        /// 选择项发生变化的事件处理
        /// </summary>
        public event EventHandler SelectedValueChanged;

然后在内部控件的EditValue改变的时候,在其中的事件里面触发我们自定义的事件即可, 如下所示。

        private void txtCardGrade_EditValueChanged(object sender, EventArgs e)
        {
            if (SelectedValueChanged != null)
            {
                SelectedValueChanged(sender, e);
            }
        }

2)在窗体界面中自定义控件的事件调用

在会员编辑界面里面,我们对这个卡级别的选择控件的自定义事件进行处理即可。

处理事件里面,我们获取对应卡级别的优惠折扣(GetDiscountByGradeNo),然后绑定到界面的控件显示即可,这样就实现了联动效果了。

    public partial class FrmEditMember : BaseEditForm
    {
        /// <summary>
        /// 创建一个临时对象,方便在附件管理中获取存在的GUID
        /// </summary>
        private MemberInfo tempInfo = new MemberInfo();

        public FrmEditMember()
        {
            InitializeComponent();

            this.txtCardGrade.SelectedValueChanged += new EventHandler(txtCardGrade_SelectedValueChanged);
        }

        void txtCardGrade_SelectedValueChanged(object sender, EventArgs e)
        {
            string gradeNo = txtCardGrade.Text;
            if (!string.IsNullOrEmpty(gradeNo))
            {
                this.txtDiscount.Value = BLLFactory<CardGrade>.Instance.GetDiscountByGradeNo(gradeNo);
            }
        }

3、创建人员和创建时间的显示处理

在我们窗体数据的编辑界面里面,为了友好显示,我们可能需要显示数据的创建人和创建时间。这种效果是如何实现的,我们来看看。

1)数据显示时候处理

数据显示的时候,可能是新增界面的显示,也可以是现有记录的显示,我们需要区分对待。

如果是已有数据,我们需要解析创建人员的ID,显示已有时间即可;如果是新增界面,那么我们把当前登陆用户的名称显示出来,及显示当前时间即可。

在设计模式里面,把控件设置为ReadOnly=true,不用编辑修改控件的值即可。

        /// <summary>
        /// 数据显示的函数
        /// </summary>
        public override void DisplayData()
        {
            InitDictItem();//数据字典加载(公用)

            if (!string.IsNullOrEmpty(ID))
            {
                #region 显示信息
                MemberInfo info = BLLFactory<WHC.Member.BLL.Member>.Instance.FindByID(ID);
                if (info != null)
                {
                    tempInfo = info;//重新给临时对象赋值,使之指向存在的记录对象

                    txtHandNo.Text = info.HandNo;
                    txtCardNo.Text = info.CardNo;
                    txtCardCode.Text = info.CardCode;
                    txtCardStatus.SetComboBoxItem(info.CardStatus.ToString());
                    txtOpenUser.Text = info.OpenUser;
..............

                    txtCreator.Text = SecurityHelper.GetFullNameByID(info.Creator);
                    txtCreateTime.SetDateTime(info.CreateTime);
                }
                #endregion
            }
            else
            {this.txtOpenDate.DateTime = DateTime.Now;
                this.txtHandNo.Text = IDUtils.NewId();

                this.txtCreateTime.DateTime = DateTime.Now;
                this.txtCreator.Text = LoginUserInfo.FullName;//默认为当前登录用户
            }

            this.portraitControl1.MemberID = tempInfo.ID;
            this.portraitControl1.BindPicture(tempInfo.ID);

            //tempInfo在对象存在则为指定对象,新建则是全新的对象,但有一些初始化的GUID用于附件上传
            SetAttachInfo(tempInfo);
        }

但用户保存操作的时候,如果是新增数据,我们需要把当前时间和当前用户的信息记录到数据库里面,因此需要增加一些代码进行数据的关联处理。

        /// <summary>
        /// 新增状态下的数据保存
        /// </summary>
        /// <returns></returns>
        public override bool SaveAddNew()
        {
            MemberInfo info = tempInfo;//必须使用存在的局部变量,因为部分信息可能被附件使用
            SetInfo(info);

            info.Creator = LoginUserInfo.ID.ToString();
            info.CreateTime = DateTime.Now;
            info.Dept_ID = LoginUserInfo.DeptId;
            info.Company_ID = LoginUserInfo.CompanyId;

            try
            {
                #region 新增数据
                //检查是否还有其他相同关键字的记录
                bool exist = BLLFactory<WHC.Member.BLL.Member>.Instance.IsExistKey("CardNo", info.CardNo);
                if (exist)
                {
                    MessageDxUtil.ShowTips("指定的【会员卡号】已经存在,不能重复添加,请修改");
                    return false;
                }

                bool succeed = BLLFactory<WHC.Member.BLL.Member>.Instance.Insert(info);
                if (succeed)
                {
                    //可添加其他关联操作

                    return true;
                }
                #endregion
            }
            catch (Exception ex)
            {
                LogTextHelper.Error(ex);
                MessageDxUtil.ShowError(ex.Message);
            }
            return false;
        }

我们为了方便,一般是在数据库存储人员的ID,但是列表显示的时候,我们也就需要把对应的人员ID转换为人员名称了。

            this.winGridViewPager1.gridView1.CustomColumnDisplayText += new DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventHandler(gridView1_CustomColumnDisplayText);
        void gridView1_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)
        {
            if (e.Column.FieldName == "Operator" || e.Column.FieldName == "Editor" || e.Column.FieldName == "Creator")
            {
                if (e.Value != null)
                {
                    e.DisplayText = SecurityHelper.GetFullNameByID(e.Value.ToString());
                }
            }
        }

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

时间: 2024-08-02 17:20:55

Winform开发中常见界面的DevExpress处理操作的相关文章

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

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

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

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

Winform开发中手写签名的实现

由于项目的需要,需要在项目的Winform系统的一个模块中集成手写签名的功能,一开始对这块不是很了解,只是了解他能够替代鼠标进行签名.既然是签名,一般就是需要记录手稿图片,作为一个记录核实的凭证,因为有效的签名是很难模拟的.市场上也存在很多类型的电子签名笔,一时间还真不知道那种适合.本文主要从签名笔的选型以及功能实现等方面来对实现这个需求进行分析介绍,希望能够给有同样际遇的朋友一个参考. 1.电子手写签名介绍 电子手写签名,其实就是模拟真实的笔进行签名的过程,我这里主要是介绍使用外部设备来记录手

在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开发中另一种样式的OutLookBar工具条

很早的时候,曾经写了一篇随笔<WinForm界面开发之"OutLookBar"工具条>介绍了OutLookBar样式的工具条,得到很多同行的热烈反馈,我个人也比较喜欢这样的工具条布局,因此我很多共享软件中,都经常看到这种OutLookBar的工具条,这种工具条提供了一种较好的界面布局,方便对工具的分类和排列.如我的多篇随笔<从开发的软件<备件仓库管理系统>总结的一些经验>.<WinForm界面开发之酒店管理系统--开篇>.<Winf

winform开发中autovue 默认选中平移按钮怎样弄?求助

问题描述 winform开发中autovue默认选中平移按钮怎样弄?求助 解决方案 解决方案二:autovue用的版本是:autovue20.0.0.7330.

asp.net开发中常见公共捕获异常方式总结(附源码)_实用技巧

本文实例总结了asp.net开发中常见公共捕获异常方式.分享给大家供大家参考,具体如下: 前言:在实际开发过程中,对于一个应用系统来说,应该有自己的一套成熟的异常处理框架,这样当异常发生时,也能得到统一的处理风格,将异常信息优雅地反馈给开发人员和用户.我们都知道,.net的异常处理是按照"异常链"的方式从底层向高层逐层抛出,如果不能尽可能地早判断异常发生的边界并捕获异常,CLR会自动帮我们处理,但是这样系统的开销是非常大的,所以异常处理的一个重要原则是"早发现早抛出早处理&q

winform开发中autovue 默认选中平移按钮怎样弄?

问题描述 winform开发中autovue 默认选中平移按钮怎样弄? winform开发中autovue 默认选中平移按钮怎样弄?求助 解决方案 SendMessage(选择框句柄,BM_SETCHECK,BST_CHECKED,0)

对开发中常见的内存泄露,GDI泄露进行检测

  对开发中常见的内存泄露,GDI泄露进行检测 一.GDI泄露检测方法: 在软件测试阶段,可以通过procexp.exe 工具,或是通过任务管理器中选择GDI对象来查看软件GDI的对象是使用情况. 注意点:Create出来的GDI对象,都要用DeleteObject来释放:Create出来的DC,都要用DeleteDC来释放,GetDC得出的DC,要用ReleaseDC来释放.   以下是一些常用到的函数:   1.  检查GetWindowDC(), 后面是否有ReleaseDC(); 2.