在我的共享軟件-病人資料管理系統(tǒng)(該軟件是是一款針對(duì)病人基本情況、手術(shù)情況、化療情況、隨訪情況的存儲(chǔ)、修改維護(hù)、條件查詢、導(dǎo)出導(dǎo)出Excel、科室數(shù)據(jù)合并、圖片查找、數(shù)據(jù)打印、高級(jí)查詢等功能的軟件)中,有時(shí)候資料管理者需要對(duì)多個(gè)條件進(jìn)行組合查詢,由于字段比較多,一般很難滿足客戶的要求,在一個(gè)窗體中列出所有的條件可供查詢,而且一般情況下,很多條件很少用到,把它全部擺到主界面上也顯得不夠美觀和實(shí)用。
我的做法是,只在主界面中列出比較常用的一些條件給客戶進(jìn)行普通的查詢顯示,如下圖所示:
而需要更多條件查詢的時(shí)候,把它做成一個(gè)高級(jí)查詢的頁(yè)面,列出所有的字段給用戶選擇,然后可以注冊(cè)多個(gè)條件進(jìn)行查詢,如高級(jí)查詢的界面如下所示:
這樣客戶一個(gè)可以方便在常用查詢條件中查詢數(shù)據(jù),第二個(gè)可以當(dāng)有需要的時(shí)候,在所有的字段中組合查詢各種條件來(lái)查詢內(nèi)容,雖然高級(jí)查詢界面做的不算很復(fù)雜,但滿足一般的需求是沒(méi)問(wèn)題了,而且很多客戶使用,也感覺(jué)不錯(cuò),這就足夠了。
說(shuō)完一些總體的內(nèi)容,我們下面開(kāi)看看詳細(xì)的代碼實(shí)現(xiàn),以便給大家提供思路及參考。
1、首先我們?cè)诮缑嫔辖壎ㄏ嚓P(guān)的查詢條件數(shù)據(jù)、字段列表等信息,具體代碼如下所示,其中獲取字段列表的時(shí)候,我們獲取一條記錄,取返回表格數(shù)據(jù)的表頭信息即可:
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);
}
}
}
當(dāng)響應(yīng)添加條件的時(shí)候,我們存儲(chǔ)相關(guān)的信息并顯示在ListView里面即可,如下所示。
private void btnAddCondition_Click(object sender, EventArgs e)
{
if (this.txtContent.Text.Length == 0)
{
if (MessageUtil.ShowYesNoAndTips("查詢內(nèi)容為空,您確認(rèn)要繼續(xù)么?") == 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);
}
}
而當(dāng)用戶確定的時(shí)候,我們只需要簡(jiǎn)單的處理一下,給窗體的DialogResult設(shè)置為OK即可。
private void btnOK_Click(object sender, EventArgs e)
{
if (this.listView1.Items.Count == 0)
{
if (MessageUtil.ShowYesNoAndTips("條件組合為空,您確認(rèn)要繼續(xù)么?") == DialogResult.No)
{
this.DialogResult = DialogResult.None;
return;
}
}
this.DialogResult = DialogResult.OK;
}
而在彈出高級(jí)查詢窗體的父窗口里面,我們這樣操作,判斷窗體返回值是DialogResult是OK的話,那么獲取到相應(yīng)的條件,然后再主界面中查詢即可,代碼如下所示:
private void tsbAdvanceSearch_Click(object sender, EventArgs e)
{
FrmAdvanceSearch dlg = new FrmAdvanceSearch();
if (dlg.ShowDialog() == DialogResult.OK)
{
SearchCondition condtion = dlg.GetAdvanceCondition();
BindData(condtion);
}
}
其中 GetAdvanceCondition函數(shù)是高級(jí)查詢窗體里面的函數(shù),主要是根據(jù)已有條件生成給父窗體調(diào)用的,返回響應(yīng)的查詢條件,實(shí)現(xiàn)如下所示:
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 類(lèi)是我封裝的一個(gè)查詢類(lèi),用來(lái)代替硬編碼等相關(guān)操作,以便方便、準(zhǔn)確、有效的實(shí)現(xiàn)查詢條件的組合及轉(zhuǎn)換的。
以上就是高級(jí)查詢功能的實(shí)現(xiàn)思路及代碼,在此拋磚引玉,希望和大家共同探討。