• 病人资料管理系统中高级查询功能的实现


    在我的共享软件-病人资料管理系统(该软件是是一款针对病人基本情况、手术情况、化疗情况、随访情况的存储、修改维护、条件查询、导出导出Excel、科室数据合并、图片查找、数据打印、高级查询等功能的软件)中,有时候资料管理者需要对多个条件进行组合查询,由于字段比较多,一般很难满足客户的要求,在一个窗体中列出所有的条件可供查询,而且一般情况下,很多条件很少用到,把它全部摆到主界面上也显得不够美观和实用。

    我的做法是,只在主界面中列出比较常用的一些条件给客户进行普通的查询显示,如下图所示:

     
    而需要更多条件查询的时候,把它做成一个高级查询的页面,列出所有的字段给用户选择,然后可以注册多个条件进行查询,如高级查询的界面如下所示:

     

    这样客户一个可以方便在常用查询条件中查询数据,第二个可以当有需要的时候,在所有的字段中组合查询各种条件来查询内容,虽然高级查询界面做的不算很复杂,但满足一般的需求是没问题了,而且很多客户使用,也感觉不错,这就足够了。

    说完一些总体的内容,我们下面开看看详细的代码实现,以便给大家提供思路及参考。

    1、首先我们在界面上绑定相关的查询条件数据、字段列表等信息,具体代码如下所示,其中获取字段列表的时候,我们获取一条记录,取返回表格数据的表头信息即可:

            private void BindData()
            {
                
    this.txtCondtion.Items.Clear();
                
    this.txtCondtion.Items.Add(new CListItem("模糊包含", SqlOperator.Like.ToString()));
                
    this.txtCondtion.Items.Add(new CListItem("等于", SqlOperator.Equal.ToString()));
                
    this.txtCondtion.Items.Add(new CListItem("不等于", SqlOperator.NotEqual.ToString()));

                PagerInfo pagerInfo 
    = new PagerInfo();
                pagerInfo.CurrenetPageIndex 
    = 1;
                pagerInfo.PageSize 
    = 1;
                DataSet ds 
    = BLLFactory<PatientCase>.Instance.GetAllToDataSet(pagerInfo);
                
    if (ds != null)
                {
                    DataTable dt 
    = ds.Tables[0];
                    
    this.txtFieldName.Items.Clear();
                    
    foreach (DataColumn col in dt.Columns)
                    {
                        
    this.txtFieldName.Items.Add(col.ColumnName);
                    }
                }
            } 

    当响应添加条件的时候,我们存储相关的信息并显示在ListView里面即可,如下所示。

    private void btnAddCondition_Click(object sender, EventArgs e)
            {
                
    if (this.txtContent.Text.Length == 0)
                {
                    
    if (MessageUtil.ShowYesNoAndTips("查询内容为空,您确认要继续么?"== DialogResult.No)
                    {
                        
    return;
                    }
                }

                 CListItem selectItem 
    = this.txtCondtion.SelectedItem as CListItem;
                 
    if (selectItem != null)
                 {
                     ListViewItem item 
    = new ListViewItem(this.txtFieldName.Text);
                     item.SubItems.Add(
    this.txtCondtion.Text);
                     item.SubItems.Add(
    this.txtContent.Text);
                     item.Tag 
    = ConvertCondition(selectItem.Value);
                     
    this.listView1.Items.Add(item);
                 }
            }

    而当用户确定的时候,我们只需要简单的处理一下,给窗体的DialogResult设置为OK即可。

            private void btnOK_Click(object sender, EventArgs e)
            {
                
    if (this.listView1.Items.Count == 0)
                {
                    
    if (MessageUtil.ShowYesNoAndTips("条件组合为空,您确认要继续么?"== DialogResult.No)
                    {
                        
    this.DialogResult = DialogResult.None;
                        
    return;
                    }
                }

                
    this.DialogResult = DialogResult.OK;
            } 


     而在弹出高级查询窗体的父窗口里面,我们这样操作,判断窗体返回值是DialogResult是OK的话,那么获取到相应的条件,然后再主界面中查询即可,代码如下所示:

    private void tsbAdvanceSearch_Click(object sender, EventArgs e)
            {
                FrmAdvanceSearch dlg 
    = new FrmAdvanceSearch();
                
    if (dlg.ShowDialog() == DialogResult.OK)
                {
                    SearchCondition condtion 
    = dlg.GetAdvanceCondition();
                    BindData(condtion);
                }
            } 


    其中 GetAdvanceCondition函数是高级查询窗体里面的函数,主要是根据已有条件生成给父窗体调用的,返回响应的查询条件,实现如下所示:

            public SearchCondition GetAdvanceCondition()
            {
                
    if(this.listView1.Items.Count > 0)
                {
                    SearchCondition condition 
    = new SearchCondition();
                    
    foreach (ListViewItem item in this.listView1.Items)
                    {
                        SqlOperator op 
    = (SqlOperator)item.Tag;
                        condition.AddCondition(item.Text, item.SubItems[
    2].Text, op);
                    }
                    
    return condition;
                }
                
    return null;
            }

            
    private SqlOperator ConvertCondition(string strSqlOperator)
            {
                SqlOperator sqlOperator 
    = SqlOperator.Like;
                
    try
                {
                    sqlOperator 
    = (SqlOperator)Enum.Parse(typeof(SqlOperator), strSqlOperator);
                }
                
    catch
                {
                }
                
    return sqlOperator;
            } 

    其中的SearchCondition 类是我封装的一个查询类,用来代替硬编码等相关操作,以便方便、准确、有效的实现查询条件的组合及转换的。

    以上就是高级查询功能的实现思路及代码,在此抛砖引玉,希望和大家共同探讨。 

    主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    1257: [CQOI2007]余数之和
    BZOJ1036[ZJOI2008]树的统计——树链剖分+线段树
    BZOJ4822[Cqoi2017]老C的任务——树状数组(二维数点)
    BZOJ4196[Noi2015]软件包管理器——树链剖分+线段树
    BZOJ4034[HAOI2015]树上操作——树链剖分+线段树
    BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra
    BZOJ2120&2453数颜色——线段树套平衡树(treap)+set/带修改莫队
    BZOJ2141排队——树状数组套权值线段树(带修改的主席树)
    初探莫比乌斯反演及欧拉反演
    BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/2018981.html
Copyright © 2020-2023  润新知