在我的共享软件-病人资料管理系统(该软件是是一款针对病人基本情况、手术情况、化疗情况、随访情况的存储、修改维护、条件查询、导出导出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 类是我封装的一个查询类,用来代替硬编码等相关操作,以便方便、准确、有效的实现查询条件的组合及转换的。

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

标签: none

添加新评论