高级查询--asp.net(C#)

为了更好的去重用高级查询控件,将此控件做成用户控件。利用VS2005新建一个用控件扩展名为.ascx的文件,参考下图: 

       本高级查询的原理是:当用户选择选择内容时,相应的筛选条件,筛选范围进行动态的变化。将筛选条件保存在lblFilter标签中。利用DataView的RowFilter,对数据进行筛选,但为了更好的管理,将这些配置信息保存在表中。注:以下是对应的html源代码:

 

<% @ Control Language="C#" AutoEventWireup="true" CodeFile="Advance_Query.ascx.cs"
    Inherits
="Public_AdvanceQuery" 
%>
    
< br  />
    
< table  border ="1"  bordercolor ="#ffffff"  cellpadding ="0"  cellspacing ="1"  width ="100%" >
        
< tr >
        
            
< td  style ="height: 15px" >
                筛选内容:
</ td >
            
< td  style ="height: 15px" >
                
< asp:DropDownList  ID ="ddlContent"  runat ="server"  AutoPostBack ="True"  OnSelectedIndexChanged ="ddlContent_SelectedIndexChanged" >
                
</ asp:DropDownList ></ td >
            
< td  style ="height: 15px" >
                筛选条件:
</ td >
            
< td  style ="height: 15px" >
                
< asp:DropDownList  ID ="ddlCondition"  runat ="server" >
                
</ asp:DropDownList ></ td >
            
< td   style ="height: 15px" >
                筛选范围:
</ td >
            
< td  style ="height: 15px" >
                
&nbsp; < asp:DropDownList  ID ="ddlArea"  runat ="server" >
                
</ asp:DropDownList >
                
< asp:TextBox  ID ="txtArea"  runat ="server" ></ asp:TextBox >
                
< asp:Label  ID ="lblFilter"  runat ="server"  Visible ="False" ></ asp:Label >
            
</ td >
            
< td  style ="height: 15px" >
                
< asp:Button  ID ="btnSel"  runat ="server"  OnClick ="btnSel_Click"  Text ="筛选"   />
                
< asp:Button  ID ="btnCancel"  runat ="server"  OnClick ="btnCancel_Click"
                    Text
="取消"   /></ td >                    
        
</ tr >
    
</ table >
    
< br  />

        以下是本页面对应的后台代码,主要是事件,属性,方法

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;
/// <summary>
/// 高级查询用户控件
/// 创建人:AAA
/// 创建日期:2006-08-29
/// </summary>

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);
    }

    
/// <summary>
    
/// 当前的窗体
    
/// </summary>

    private string _form;
    
/// <summary>
    
/// 数据源
    
/// 注:数据类型 DataView
    
/// </summary>

    private DataView _dv;
    
/// <summary>
    
/// GridView控件
    
/// </summary>

    private GridView _gv;
    
/// <summary>
    
/// 设置窗体名称
    
/// 注:只写属性
    
/// </summary>

    public string strForm
    
{
        
set
        
{
            
this._form = value;
        }

    }

    
/// <summary>
    
/// 设置查询的数据源
    
/// 注:只写属性 类型:DataView
    
/// </summary>

    public DataView DataSource
    
{
        
set
        
{
            
this._dv = value;
        }

    }

    
/// <summary>
    
/// 设置GridView控件
    
/// </summary>

    public GridView GridViewID
    
{
        
set
        
{
            
this._gv = value;
        }

    }

    
/// <summary>
    
/// 获取筛选字符串/设置筛选条件
    
/// </summary>

    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
{
    
/// <summary>
    
/// 高级查询
    
/// 书写人:AAA
    
/// 创建日期:2006-08-28
    
/// </summary>

    public class Query:DBClass.DBClass
    
{
        
/// <summary>
        
/// 当前的窗体名称
        
/// </summary>

        private string _strQueryForm;
        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="QueryForm">高级查询对应的窗体</param>
        
/// <param name="ECode">当前的企业编号</param>

        public Query (string QueryForm)
        
{
            _strQueryForm 
= QueryForm;
        }

        
/// <summary>
        
/// 获取当前窗体对应的筛选内容的数据集
        
/// </summary>
        
/// <returns>数据集</returns>

        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");
        }

        
/// <summary>
        
/// 设置筛选条件
        
/// </summary>
        
/// <param name="content">当前筛选内容的Value值</param>
        
/// <param name="ddlCondition">当前筛选条件对应的下拉框控件的ID</param>

        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;
            }

        }

        
/// <summary>
        
/// 获取当前筛选内容对应的类型
        
/// 注:D:日期类型 N:数值类型 S:字符类型
        
/// </summary>
        
/// <param name="content">当前筛选内容的Value值</param>
        
/// <returns>筛选内容的类型</returns>

        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();
        }

        
/// <summary>
        
/// 获取当前筛选内容对应的筛选范围
        
/// </summary>
        
/// <param name="content">当前筛选内容的Value值</param>
        
/// <returns>数据集</returns>

        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;
        }

        
/// <summary>
        
/// 获取筛选内容对应的标记
        
/// 注:0:利用的是下拉框;1:利用的是文本框
        
/// </summary>
        
/// <param name="content">当前选择的筛选内容的Value值</param>
        
/// <returns>字符串 0:利用的是下拉框;1:利用的是文本框</returns>

        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();
        }

        
/// <summary>
        
/// 获取筛选字符串
        
/// </summary>
        
/// <param name="content">筛选内容</param>
        
/// <param name="Condition">筛选条件</param>
        
/// <param name="myValue">筛选范围</param>
        
/// <returns>字符串</returns>

        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);
            }

        }

        
/// <summary>
        
/// 获取进行查询的表名称
        
/// </summary>
        
/// <param name="content">筛选内容</param>
        
/// <returns>需要进行查询的表名称</returns>

        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();
        }

        
/// <summary>
        
/// 获取DateView
        
/// </summary>
        
/// <returns></returns>

        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,可以在页面上一个按钮,高级查询,单击后,加载用户控件如下图所示:

我们可以看到,在它的下面是个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)
);

这样,运行的你的页面,就可以做到高级查询。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值