簡單介紹:
1.完全無刷實現,客戶端主要實現生成條件選擇或錄入控件,並進行錄入控制;
2.將字段信息存放於XML文件,便於數據移植
3.通過JS腳本,AJax框架引擎獲取字段信息
4.通過JS腳本生成組合條件;
5.運行效果:
下面是代碼和實現效果:
1.AJaxSeachMethod.cs
using System;
using System.XML;
using System.Data;
using System.Data.SqlClIEnt;
namespace WebUI.AJaxSearchSystem
{
/**//// <summary>
/// SearchMethod 的摘要說明。
/// </summary>
public class AJaxSearchMethod
{
private string[] CHAR_OP = new string[]{"等於|=","不等於|<>","相似於|Like","不相似於|Not Like"};
private string[] NUM_OP = new string[]{"大於|>","大於或等於|>=","等於|=","不等於|<>","小於|<","小於或等於|<="};
private string[] DATE_OP = new string[]{"等於|=","不等於|<>","先於|<","後於|>"};
public AJaxSearchMethod()
{}
/**//// <summary>
/// 根據表名獲取包含的字段
/// </summary>
/// <param name="table">表名</param>
/// <returns></returns>
[AjaxPro.AJaxMethod]
public string[] GetFIElds(string table)
{
string[] strArrFIElds = null;
try
{
XmlDocument xd = LoadXml(@"\AJaxSearchDataCollection.XML");
XMLElement xe =xd.DocumentElement;
XMLNode xn = xe.SelectSingleNode("descendant::Table[@value='"+table+"']");
XMLNodeList xnl = xn.ChildNodes;
int iLen = xnl.Count;
strArrFIElds = new string[iLen];
int iIndex = 0;
foreach(XMLNode xnFIEld in xnl)
{
strArrFields[iIndex] = xnField.Attributes["Name"].InnerText + "|" + xnFIEld.Attributes["Value"].InnerText;
iIndex ++;
}
}
catch(Exception ee)
{
throw new ArgumentOutOfRangeException(@"AJaxSearchDataCollection.xml","/Table[@value='"+table+"']:指定的接點不存在,請重新定義XML文檔!");
}
return strArrFIElds;
}
/**//// <summary>
/// 根據字段獲取對應的操作符列表
/// </summary>
/// <param name="fIEld"></param>
/// <returns></returns>
[AjaxPro.AJaxMethod]
public string[] GetOpts(string table,string fIEld)
{
string strTypeofField = GetTypeofField(table,fIEld);
switch(strTypeofFIEld)
{
case "char":
return CHAR_OP;
break;
case "int":
if(GetEnumField(table,fIEld)==null)
{
return NUM_OP;
}
else
{
return (new string[]{"是|=","不是|<>"});
}
break;
case "decimal":
return NUM_OP;
break;
case "datetime":
return DATE_OP;
break;
default:
return (new string[]{"等於|="});
break;
}
}
/**//// <summary>
/// 根據字段獲取對應的可能存在的枚舉值列表
/// </summary>
/// <param name="fIEld"></param>
/// <returns></returns>
[AjaxPro.AJaxMethod]
public string[] GetEnums(string table,string fIEld)
{
string strTypeofField = GetTypeofField(table,fIEld);
string[] enums = GetEnumField(table,fIEld);
int iLen = enums==null?0:enums.Length;
string[] result = new string[iLen+1];
result[0] = strTypeofFIEld;
if (iLen == 0)
{
return result;
}
int iIndex = 1;
foreach(string str in enums)
{
result[iIndex] = str;
iIndex ++;
}
return result;
}
內部支持腳本#region 內部支持腳本
//裝載XML文檔
private XmlDocument LoadXml(string XMLPath)
{
XmlDocument xd = new XMLDocument();
try
{
xd.Load(System.Web.HttpContext.Current.Request.PhysicalApplicationPath+XMLPath);
}
catch(XMLException ee)
{
throw new ArgumentOutOfRangeException(ee.Message,"讀取條件編輯信息失敗,請檢查XML文檔路徑設置是否正確!");
}
return xd;
}
//獲取字段的數據類型
private string GetTypeofField(string table,string fIEld)
{
string strTypeofFIEld = string.Empty;
try
{
XmlDocument xd = LoadXml(@"\\AJaxSearchDataCollection.XML");
XMLElement xe =xd.DocumentElement;
XMLNode xn = xe.SelectSingleNode("descendant::Table[@value='"+table+"']");
xn = xn.SelectSingleNode("descendant::Field[@Value='"+fIEld+"']");
strTypeofFIEld = xn.Attributes["DataType"].InnerText;
}
catch(Exception ee)
{
throw new ArgumentOutOfRangeException(@"AJaxSearchDataCollection.xml","/Field[@Value='"+fIEld+"']:指定的接點不存在,請重新定義XML文檔!");
}
return strTypeofFIEld.ToLower();
}
//獲取字段的數據類型
private string[] GetEnumField(string table,string fIEld)
{
string strTypeofFIEld = string.Empty;
string strEnumSqlSyntax = string.Empty;
string strTextFIEld = string.Empty;
string strValueFIEld = string.Empty;
try
{
XmlDocument xd = LoadXml(@"\AJaxSearchDataCollection.XML");
XMLElement xe =xd.DocumentElement;
XMLNode xn = xe.SelectSingleNode("descendant::Table[@value='"+table+"']");
xn = xn.SelectSingleNode("descendant::Field[@Value='"+fIEld+"']");
xn = xn.ChildNodes[0];
if (xn == null)
{
return null;
}
else
{
strEnumSqlSyntax = xn.Attributes["SqlSyntax"]==null?"":xn.Attributes["SqlSyntax"].InnerText;
strTextField = xn.Attributes["TextField"]==null?"":xn.Attributes["TextFIEld"].InnerText;
strValueField = xn.Attributes["ValueField"]==null?"":xn.Attributes["ValueFIEld"].InnerText;
}
return GetEnumField(strEnumSqlSyntax,strTextField,strValueFIEld);
}
catch(NullReferenceException ee)
{
throw new ArgumentOutOfRangeException(@"AJaxSearchDataCollection.xml","/Field[@Value='"+fIEld+"']:指定的接點不存在,請重新定義XML文檔!");
}
}
private string[] GetEnumFIEld(string sqlSyntax,string text,string value)
{
if (sqlSyntax.Length == 0 || text.Length==0 || value.Length==0)
{
return null;
}
DataSet ds = new DataSet();
try
{
SqlConnection sc = new SqlConnection("server=OY-M;User ID=sa;PassWord=DBCs@%1+ZhLx;database=pubs;Connection Reset=FALSE;Connect Timeout=6");
sc.Open();
SqlCommand scmd = new SqlCommand(sqlSyntax,sc);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = scmd;
da.Fill(ds);
}
catch(SqlException ee)
{
throw ee;
}
DataTable dt = ds.Tables[0];
if (dt == null)
{
return null;
}
DataRowCollection drc = dt.Rows;
string[] enumFIElds = new string[drc.Count];
int iIndex = 0;
foreach(DataRow dr in drc)
{
enumFIElds[iIndex] = dr[text].ToString().Trim() +"|"+dr[value].ToString().Trim();
iIndex ++;
}
return enumFIElds;
}
#endregion
}
}
2.AJaxSearchDataCollection.XML
<?XML version="1.0" encoding="utf-8" ?>
<FIElds>
<Table Name="產品表" value="employee">
<FIEld Name="雇傭號" Value="emp_id" DataType="char">
</FIEld>
<FIEld Name="名字" Value="fname" DataType="char">
<Enum SqlSyntax="" TextField="" ValueFIEld=""></Enum>
</FIEld>
<FIEld Name="工作號" Value="job_id" DataType="int">
<Enum SqlSyntax="SELECT job_id,job_desc FROM jobs" TextField="job_desc" ValueFIEld="job_id"></Enum>
</FIEld>
<FIEld Name="工作**" Value="job_lvl" DataType="int">
</FIEld>
<FIEld Name="雇傭日期" Value="hire_date" DataType="datetime">
</FIEld>
</Table>
</FIElds>