在我的共享軟件-病人資料管理系統(該軟件是是一款針對病人基本情況、手術情況、化療情況、隨訪情況的存儲、修改維護、條件查詢、導出導出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("查詢內容為空,您確認要繼續(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);
}
}
而當用戶確定的時候,我們只需要簡單的處理一下,給窗體的DialogResult設置為OK即可。
private void btnOK_Click(object sender, EventArgs e)
{
if (this.listView1.Items.Count == 0)
{
if (MessageUtil.ShowYesNoAndTips("條件組合為空,您確認要繼續(xù)么?") == 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 類是我封裝的一個查詢類,用來代替硬編碼等相關操作,以便方便、準確、有效的實現查詢條件的組合及轉換的。
以上就是高級查詢功能的實現思路及代碼,在此拋磚引玉,希望和大家共同探討。