我们在开发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());        }      }    }

转载于:https://www.cnblogs.com/caoyc/p/4117987.html

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

  1. Winform开发中手写签名的实现

    由于项目的需要,需要在项目的Winform系统的一个模块中集成手写签名的功能,一开始对这块不是很了解,只是了解他能够替代鼠标进行签名.既然是签名,一般就是需要记录手稿图片,作为一个记录核实的凭证,因为 ...

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

    FastReport.Net是一款适用于Windows Forms, ASP.NET和MVC框架的功能齐全的报表分析解决方案.可用在Microsoft Visual Studio 2005到2015, ...

  3. java web开发常见问题_javaWeb开发中常见的问题

    1.修改表单提交的时候不好使可能是因为没写对应隐藏域的ID 2.el表达式在js代码中要加"",例如 "${}" 3.JavaScript中的函数也有重载的特性 ...

  4. PHP开发中常见的安全问题详解和解决方法

    PHP开发中常见的安全问题详解和解决方法 参考文章: (1)PHP开发中常见的安全问题详解和解决方法 (2)https://www.cnblogs.com/walblog/articles/83313 ...

  5. web开发中常见的安全漏洞及避免方法

    1.安全攻击 1.SQL.HTML.JS.OS命令注入 2.XSS跨站脚本攻击,利用站内信任的用户,在web页面插入恶意script代码 3.CSRF跨站请求伪造,通过伪装来自信任用户的请求来利用受信 ...

  6. 【Web安全】Web开发中常见的安全误区

    安全是Web应用程序不容忽视的一个重要因素,而在Web应用开发中,一些开发者由于缺乏安全方面的意识,导致Web应用存在风险.下面来介绍Web开发中常见的一些安全误区. 如果我们使用Web框架,那么不必 ...

  7. WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色

    WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色  在B/S开发中,对TreeView控件要改变当前选中节点的颜色比较方便,其有相应的SelectedNodeChanged事件 ...

  8. iOS开发中常见的一些异常

    iOS开发中常见的一些异常 参考文章: (1)iOS开发中常见的一些异常 (2)https://www.cnblogs.com/feng9exe/p/7244936.html 备忘一下.

  9. Android开发中常见的内存泄露案例以及解决方法总结

    Android开发中常见的内存泄露案例以及解决方法总结 参考文章: (1)Android开发中常见的内存泄露案例以及解决方法总结 (2)https://www.cnblogs.com/shen-hua ...

最新文章

  1. mysql开启binlog
  2. 好的开始是成功的一半:网页优化之标题篇
  3. exe文件添加为服务
  4. SQL SERVER 2012修改数据库名称(包括 db.mdf 名称的修改)
  5. string容量JAVA_java的StringBuilder类的长度和容量有什么区别呢?
  6. java implements t_Java泛型——為什么“擴展T”允許而不是“實現T”?
  7. 个人知识库的分类目录_搭建个人知识体系,让印象笔记成为我们的“第二大脑”!...
  8. wamp php 安装redis,wampServer的php安装Redis 扩展
  9. dbf如何导入oracle_Oracle软件的安装介质被注入恶意程序事件分析与防御
  10. Ubantu16.04LTS麒麟版:取消登录界面的客人回话
  11. MyCat全局序列之本地时间戳方式
  12. 【数学建模】数学建模指导:建模常用算法应用场景解析
  13. ios 音频录音、上传至7牛、播放及其与android兼容的问题
  14. java与seo_seo和java哪个更好
  15. LVDS 扫盲基础知识
  16. Android中通过USB接口与和PC进行通讯的demo程序
  17. 祛除体内湿气的最佳方法 713.html,治疗湿气重的14种土方法
  18. OpenCV对矩阵进行padding操作
  19. 机器人与控制器的关联
  20. PowerDVD20中文版|CyberLink PowerDVD Ultra 20中文版 v20.0.2101.62

热门文章

  1. 插入始终是1_40分!1分钟4次!大JB太硬了!
  2. 使用TensorFlow跟踪千年猎鹰
  3. linux6直连存储挂载磁盘,CentOS7mount网络磁盘的详细步骤
  4. hung-yi lee_p13_反向传播
  5. 验证(verification)和确认(validation)
  6. 【Python培训基础】一篇文件教你py文件打包成exe
  7. HTML5培训教程:HTML5基础介绍
  8. 信科c语言实验程序修改题_豆瓣评分 9.3,史上最好的 C 语言著作,竟然翻车了.........
  9. 气温上升影响数据中心节能
  10. C# 获取指定目录下所有文件信息、移动目录、拷贝目录