• 在GridControl控件中使用SearchLookUpEdit构建数据快速输入


    较早之前,曾经介绍了一篇文章《使用DataGridView数据窗口控件,构建用户快速输入体验》,介绍了在传统DataGridView中嵌入一个数据窗口进行选择列表,从而实现数据快速录入的操作例子,在DevExpress的控件使用中,我们应该如何实现这种效果呢,本文首先通过简单的例子介绍一下,具体的实现过程。然后进阶具体的应用,指导我们实际的开发工作,以及在使用过程中需要注意的一些特殊问题,提供相应的解决方法。

    1、 GridControl集成SearchLookUpEdit的效果展现

    首先我们来介绍一下整个效果图,以便有感性的印象。

    1)启动后默认效果

    2)弹出窗体效果

    3)选中数据后效果图

    其实上面是一个测试的例子,具体的应用会比较复杂一点,不过操作过程差不多,我们都是在一个Cell里面嵌入一个可以选择(包括查询)的数据列表,从中选择我们需要的内容,然后可以在另外一个Cell中输入一些其他的信息,保存的时候,一并保存即可。

    2、GridControl集成SearchLookUpEdit的实现过程

    在开始介绍之前,我们要清楚,这个GridControl必须先绑定数据源(数据源可以为空),如果不绑定数据源,那么虽然可以弹出列表供选择,但是鼠标移开值就会丢失的问题,一开始不明白其中道理,搞了很久。

    首先要为GridControl添加两个字段,设置好他们的显示Caption和FieldName即可,然后在我们需要弹出窗口的单元格对象中,选择它的ColumnEdit控件为SearchLookup控件即可,如下所示。

    这个时候,它会生成一个repositoryItemSearchLookUpEdit1的控件,这个控件就是该单元格的内嵌编辑控件了,可以从中选择列表的值,我们设置这个列表的DisplayMember为Name(显示的字段内容),ValueMember为ID(保存的值字段),如下所示。

    除了你要设置主窗体里面的GridControl运行添加列外,你还需要设置编辑控件里面的View中OpitonsView里面的NewItemRowPosition为Botton(默认为None),这一步很重要,否则无法出现一个新建的行给你录入数据的。

    例子代码比较简单,主要是为了演示这种方式的使用,代码如下所示

            DataTable dt = new DataTable();
            private void Form1_Load(object sender, EventArgs e)
            {
                dt.Columns.Add("ID");
                dt.Columns.Add("Name");
                for (int i = 0; i < 100; i++)
                {
                    DataRow row = dt.NewRow();
                    row["ID"] = i.ToString();
                    row["Name"] = (new Random()).NextDouble().ToString();
                    dt.Rows.Add(row);
                    System.Threading.Thread.Sleep(1);
                }
    
                this.repositoryItemSearchLookUpEdit1.DataSource = dt;
                this.gridControl1.DataSource = dt.Clone();
            }
    
            private void gridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
            {
                if (e.Column.FieldName == "ID")
                {
                    string id = e.Value.ToString();
                    DataRow[] dr = dt.Select(string.Format("ID = '{0}'", id));
                    if(dr != null && dr.Length > 0)
                    {
                        DataRow row = dr[0];
                        string name = row["Name"].ToString();
                        gridView1.SetRowCellValue(e.RowHandle, "Name", name);
                    }
                }
            }

    3、 GridControl集成SearchLookUpEdit的实际案例操作

    一个实际的案例就是门诊的时候,医生用药的情况,除了选择其他内容外,主要的就是快速录入药品信息。我们平常去大一点 的医院看病,好像看到的多数操作都是这样。还有一种方式就是销售人员提供的报价单,从产品里面选择信息,然后修改下价格,这些场景都是很适合这样的操作的。下面是一个门诊的例子。

    在实际应用中,我们在编辑一些历史数据的时候,不希望原来的记录被修改,但是可以增加新的记录,但是前面所有介绍的内容,没有能够解决这个问题,那么我们应该如何操作才能实现这个效果呢?

    其实GridView对象里面有一个ShowingEditor的事件,用来判断是否显示单元格的编辑器的,这样我们对数据库已有记录进行控制,不让它在列表中显示编辑控件出来即可,具体代码如下所示。

            this.gridView1.ShowingEditor += new CancelEventHandler(gridView1_ShowingEditor);//实际使用的代码
    
    
            void gridView1_ShowingEditor(object sender, CancelEventArgs e)
            {
                object ID = this.gridView1.GetRowCellValue(this.gridView1.FocusedRowHandle, "ID");
                if (ID != null && !string.IsNullOrEmpty(ID.ToString()))
                {
                    e.Cancel = true;
                }
            }

    在保持数据的时候,我们对历史数据就不用修改保持,只需要针对新增的内容即可,如何做到的呢?其实就是判定他的绑定值是否存在即可,如果有绑定值,那么就是历史的数据,没有就是新的,进行特殊操作即可,如下代码所示。

                if (this.gridView1.RowCount > 0)
                {
                    #region 提交用药记录明细
                    for (int i = 0; i < this.gridView1.RowCount; i++)
                    {
                         //根据ID来判断是否新增的用药记录
                         object ID = this.gridView1.GetRowCellValue(i, "ID");
                         if (ID == null || string.IsNullOrEmpty(ID.ToString()))
                         {
                            //.........................
                         }
                    }
                    #endregion
                }
    主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    CVPR2020:三维实例分割与目标检测
    CVPR2020:视觉导航的神经拓扑SLAM
    使用现代C++如何避免bugs(下)
    使用现代C++如何避免bugs(上)
    蓝牙mesh网络技术的亮点
    电路功能和优点
    ARM的突破:超级计算机和Mac
    所有处理都走向AI
    Wide-Bandgap宽禁带(WBG)器件(如GaN和SiC)市场将何去何从?
    功率半导体碳化硅(SiC)技术
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/2553303.html
Copyright © 2020-2023  润新知