了更好的去重用高级查询控件,将此控件做成用户控件。利用VS2005新建一个用控件扩展名为.ascx的文件,参考下图:
本高级查询的原理是:当用户选择选择内容时,相应的筛选条件,筛选范围进行动态的变化。将筛选条件保存在lblFilter标签中。利用DataView的RowFilter,对数据进行筛选,但为了更好的管理,将这些配置信息保存在表中。注:以下是对应的html源代码:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Advance_Query.ascx.cs"
Inherits="Public_AdvanceQuery" %>
筛选内容: |
|
筛选条件: |
|
筛选范围: |
|
Text="取消" /> |
以下是本页面对应的后台代码,主要是事件,属性,方法
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
/**////
/// 高级查询用户控件
/// 创建人:AAA
/// 创建日期:2006-08-29
///
public partial class Public_AdvanceQuery : System.Web.UI.UserControl
{
//定义类
WebClass.Query query;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
this._gv.DataSource = this._dv;
this._gv.DataBind();
//设置筛选内容
this.Load_ddlContent();
}
}
protected void ddlContent_SelectedIndexChanged(object sender, EventArgs e)
{
query = new WebClass.Query(this._form);
if (query.Get_Content_Flag(this.ddlContent.SelectedValue) == "0")
{
this.ddlArea.Items.Clear();
this.ddlArea.DataSource = query.DataSet_Area(ddlContent.SelectedValue);
this.ddlArea.DataTextField = "Name";
this.ddlArea.DataValueField = "Code";
this.ddlArea.DataBind();
//文本框不可见
this.txtArea.Visible = false;
this.ddlArea.Visible = true;
}
else
{
this.txtArea.Text = "";
this.txtArea.Visible = true;
this.ddlArea.Visible = false;
}
query.Set_Condition(this.ddlContent.SelectedValue, this.ddlCondition);
}
protected void btnSel_Click(object sender, EventArgs e)
{
query = new WebClass.Query(this._form);
//将筛选范围的值存储在文本框里
if (this.txtArea.Text == "")
this.txtArea.Text = this.ddlArea.SelectedValue;
if (btnSel.Text == "筛选")
{
this.btnSel.Text = "继续进行筛选";
this.btnCancel.Text = "取消筛选";
}
if (this.lblFilter.Text == "")
this.lblFilter.Text = query.Filter(this.ddlContent.SelectedValue, this.ddlCondition.SelectedValue, this.txtArea.Text);
else
this.lblFilter.Text += " AND " + query.Filter(this.ddlContent.SelectedValue, this.ddlCondition.SelectedValue, this.txtArea.Text);
//定义DataView
DataView dv = new DataView();
dv = this._dv;
dv.RowFilter = this.lblFilter.Text;
this._gv.DataSource = dv;
this._gv.DataBind();
//清空文本框里的内容
this.txtArea.Text = "";
}
protected void btnCancel_Click(object sender, EventArgs e)
{
DataView dv = new DataView();
this.btnSel.Text = "筛选";
this.btnCancel.Text = "取消";
this.lblFilter.Text = "";
dv = this._dv;
this._gv.DataSource = dv;
this._gv.DataBind();
}
public void Load_ddlContent()
{
query = new WebClass.Query(this._form);
//设置筛选内容
this.ddlContent.Items.Clear();
this.ddlContent.DataSource = query.DataSet_Content();
this.ddlContent.DataTextField = "By_Name";
this.ddlContent.DataValueField = "Field";
this.ddlContent.DataBind();
//设置筛选条件
query.Set_Condition(ddlContent.SelectedValue, this.ddlCondition);
//设置筛选范围
if (query.Get_Content_Flag(ddlContent.SelectedValue) == "0")
{
this.ddlArea.Items.Clear();
this.ddlArea.DataSource = query.DataSet_Area(ddlContent.SelectedValue);
this.ddlArea.DataTextField = "Name";
this.ddlArea.DataValueField = "Code";
this.ddlArea.DataBind();
//文本框不可见
this.txtArea.Visible = false;
this.ddlArea.Visible = true;
}
else
{
this.txtArea.Text = "";
this.txtArea.Visible = true;
this.ddlArea.Visible = false;
}
query.Set_Condition(this.ddlContent.SelectedValue, this.ddlCondition);
}
/**////
/// 当前的窗体
///
private string _form;
/**////
/// 数据源
/// 注:数据类型 DataView
///
private DataView _dv;
/**////
/// GridView控件
///
private GridView _gv;
/**////
/// 设置窗体名称
/// 注:只写属性
///
public string strForm
{
set
{
this._form = value;
}
}
/**////
/// 设置查询的数据源
/// 注:只写属性 类型:DataView
///
public DataView DataSource
{
set
{
this._dv = value;
}
}
/**////
/// 设置GridView控件
///
public GridView GridViewID
{
set
{
this._gv = value;
}
}
/**////
/// 获取筛选字符串/设置筛选条件
///
public string Filter
{
get
{
if (this.lblFilter.Text == "")
return "";
else
return this.lblFilter.Text;
}
set
{
this.lblFilter.Text = value;
}
}
public delegate void ButtonClickEventHandler(object sender, System.EventArgs e);
//public event ButtonClickEventHandler SelClick;
public delegate void eventhandler(object sender, EventArgs e);
//public event eventhandler CalClick;
}
另外,本用户控件还需要调用后台的类库,进行一些业务逻辑上的处理代码如下: using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
namespace WebClass
{
/**////
/// 高级查询
/// 书写人:AAA
/// 创建日期:2006-08-28
///
public class Query:DBClass.DBClass
{
/**////
/// 当前的窗体名称
///
private string _strQueryForm;
/**////
/// 构造函数
///
/// 高级查询对应的窗体
/// 当前的企业编号
public Query (string QueryForm)
{
_strQueryForm = QueryForm;
}
/**////
/// 获取当前窗体对应的筛选内容的数据集
///
/// 数据集
public DataSet DataSet_Content()
{
string mysql = string.Format("SELECT By_Name,Field FROM Advance_Query WHERE form='{0}'", this._strQueryForm);
return base.ExecuteSqlDs(mysql, "Content");
}
/**////
/// 设置筛选条件
///
/// 当前筛选内容的Value值
/// 当前筛选条件对应的下拉框控件的ID
public void Set_Condition(string content,DropDownList ddlCondition)
{
switch (Get_Content_Type(content))
{
case "S":
switch (Get_Content_Flag(content))
{
case "1":
ddlCondition.Items.Clear();
ddlCondition.Items.Add(new ListItem("包含", " = "));
break;
case "0":
ddlCondition.Items.Clear();
ddlCondition.Items.Add(new ListItem("包含", " = "));
ddlCondition.Items.Add(new ListItem("不包含", " <> "));
break;
}
break;
case "D":
ddlCondition.Items.Clear();
ddlCondition.Items.Add(new ListItem("等于", " = "));
ddlCondition.Items.Add(new ListItem("大于", " > "));
ddlCondition.Items.Add(new ListItem("大于等于", " >= "));
ddlCondition.Items.Add(new ListItem("小于", " < "));
ddlCondition.Items.Add(new ListItem("小于等于", " <= "));
ddlCondition.Items.Add(new ListItem("不等于", " <> "));
break;
case "N":
ddlCondition.Items.Clear();
ddlCondition.Items.Add(new ListItem("等于", " = "));
ddlCondition.Items.Add(new ListItem("大于", " > "));
ddlCondition.Items.Add(new ListItem("大于等于", " >= "));
ddlCondition.Items.Add(new ListItem("小于", " < "));
ddlCondition.Items.Add(new ListItem("小于等于", " <= "));
ddlCondition.Items.Add(new ListItem("不等于", " <> "));
break;
}
}
/**////
/// 获取当前筛选内容对应的类型
/// 注:D:日期类型 N:数值类型 S:字符类型
///
/// 当前筛选内容的Value值
/// 筛选内容的类型
private string Get_Content_Type(string content)
{
string strSql = string.Format("SELECT Type FROM Advance_Query WHERE Form='{0}' AND Field='{1}'",
this._strQueryForm,content);
return base.ExecuteSqlValue(strSql).ToString();
}
/**////
/// 获取当前筛选内容对应的筛选范围
///
/// 当前筛选内容的Value值
/// 数据集
public DataSet DataSet_Area(string content)
{
if (Get_Content_Flag(content)=="0")
{
string strSql = string.Format("SELECT AreaSQL FROM Advance_Query WHERE Form='{0}' AND Field='{1}'",
this._strQueryForm,content);
return base.ExecuteSqlDs(base.ExecuteSqlValue(strSql).ToString(),"area");
}
else
return null;
}
/**////
/// 获取筛选内容对应的标记
/// 注:0:利用的是下拉框;1:利用的是文本框
///
/// 当前选择的筛选内容的Value值
/// 字符串 0:利用的是下拉框;1:利用的是文本框
public string Get_Content_Flag(string content)
{
//查询语句,判断数据库中该字段对应的标志信息
string strSql = string.Format("SELECT Flag From Advance_Query WHERE Form='{0}' AND Field='{1}'",
this._strQueryForm,content);
return base.ExecuteSqlValue(strSql).ToString();
}
/**////
/// 获取筛选字符串
///
/// 筛选内容
/// 筛选条件
/// 筛选范围
/// 字符串
public string Filter(string content, string Condition, string myValue)
{
switch (Get_Content_Type(content))
{
case "S":
{
if (this.Get_Content_Flag(content) == "0")
{//当为下拉框时,进行全匹配
return string.Format("{0}{1}'{2}'", content, Condition, myValue);
}
else
{//当为文本框时,进行内容部分匹配
return string.Format("{0} LIKE '%{1}%'", content, myValue);
}
}
case "N":
return string.Format("{0}{1}{2}", content,Condition,myValue);
case "D":
return string.Format("{0}{1}'{2}'", content,Condition,myValue);
default:
return string.Format("{0}{1}'{2}'", content,Condition,myValue);
}
}
/**////
/// 获取进行查询的表名称
///
/// 筛选内容
/// 需要进行查询的表名称
private string Get_Tabel_Name(string content)
{
string strSql = string.Format("SELECT tbl FROM Advance_Query WHERE FORM='{0}' AND field='{1}'", this._strQueryForm, content);
return base.ExecuteSqlValue(strSql).ToString();
}
/**////
/// 获取DateView
///
///
public DataView Dv_SQl(string content)
{
return base.ExecuteSqlDs(string.Format("SELECT * FROM {0}", this.Get_Tabel_Name(content)),"SR_EOS").Tables[0].DefaultView;
}
}
}
在本类库需要调用最基层的DBClass,是对数据库的最基村的操作,主要是进行读取数据,获取数据集的操作,在这里,不做详细书写。
经过编译成功后,新建网页,将此用户控件拖动到需要进行的页面。进行以下的编码,主要是设置GridView控件的ID,数据源注意使DataView,在这里可以将DataSet转换成DataView,可以在页面上一个按钮,高级查询,单击后,加载用户控件如下图所示:
![](http://p.blog.csdn.net/images/p_blog_csdn_net/striveman/query1.jpg)
们可以看到,在它的下面是个GridView控件
这后我们对PageLoad,和图片中的高级查询按钮进行编写代码,如下:
public WebClass.Customer myCustomer = new WebClass.Customer();
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
this.tvCustomer.Nodes.Add(new WebClass.TreeShow().CustomerType());
this.gvCustomer.DataSource = myCustomer.DataSet_Customer();
this.gvCustomer.DataBind();
gvStat.DataSource = myCustomer.DataSet_Customer_Stat();
gvStat.DataBind();
this.btnAdd.Attributes.Add("OnClick", "window.showModalDialog('customeradd.aspx'),'','resizable:yes;status:no;'");
}
Advance_Query1.strForm = "Customer";
Advance_Query1.GridViewID = this.gvCustomer;
Advance_Query1.DataSource = this.dv("");
}
protected void btnAdvSel_Click(object sender, EventArgs e)
{
if (this.Panel1.Visible)
{
this.Panel1.Visible = false;
this.btnAdvSel.Text = "显示高级查询";
this.gvCustomer.DataSource = myCustomer.DataSet_Customer();
this.gvCustomer.DataBind();
}
else
{
this.Panel1.Visible = true;
this.btnAdvSel.Text = "隐藏高级查询";
}
}
注:本高级查询的配置信息存储在数据表中(Advance_Query):
DROP TABLE Advance_Query;
CREATE TABLE Advance_Query
(
Tbl VARCHAR2(30) NOT NULL, --表名称 PK
Form VARCHAR2(30) NOT NULL, --所属窗体名称 pk
Field VARCHAR2(30) NOT NULL, --字段名称 pk
By_Name VARCHAR2(30) NOT NULL, --字段别名
Type VARCHAR2(1) NOT NULL, --字段类型名称
Flag VARCHAR2(1) NOT NULL, --标示 0:利用下拉框 1:用文本框
AreaSQL VARCHAR2(150), --当前值对应的查询语句 适合于:flag=0时使用
CONSTRAINT PK_Text PRIMARY KEY(Tbl,Form,Field)
);
这样,运行的你的页面,就可以做到高级查询。
本文作者:网友 来源:网络http://blog.csdn.net/striveman/