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;
using System.Collections.Generic;
using System.Data.SqlClient;
using IIP.Data.SQLHelper;
/**//// <summary>
/// 转贴地址
http://www.cnblogs.com/huowujiyx/archive/2008/07/07/1237355.html /// 使用说明:调用该控件,要设置控件的相关属性:
/// 显示提示的筛选字段名 TextField
/// 查询数据的存储过程名 Procedurename
/// 存储过程的各项参数 ProcedureParams(Hashtable类型,key值放参数名,value值为参数值)
/// 还可以通过下面的方法,设置域的值:
/// List<string> showFields 要下拉提示的相关信息 AddShowFields(string field)方法添加
/// 设置好上面的信息后就可以使用了,要得到文本框信息,通过属性Text得到
/// 要取得与文本信息相匹配的隐藏信息,也就是与hiddenFields对应的信息,通过属性Values得到
/// </summary>
public partial class Suggest : System.Web.UI.UserControl
{
private string textField;
/**//// <summary>
/// 设置要显示提示的筛选字段名
/// </summary>
public string TextField
{
set { textField = value; }
}
private string valueField;
/**//// <summary>
/// 设置要得到的唯一性标识的字段名
/// </summary>
public string ValueField
{
set { valueField = value; }
}
private string procedurename;
/**//// <summary>
/// 设置查询数据的存储过程名
/// </summary>
public string Procedurename
{
set { procedurename = value; }
}
private Hashtable procedureParams = new Hashtable();
/**//// <summary>
/// 设置存储过程的各项参数
/// </summary>
public Hashtable ProcedureParams
{
set { procedureParams = value; }
}
private List<string> showFields = new List<string>();
/**//// <summary>
/// 添加显示内容的字段
/// </summary>
/// <param name="field">字段名</param>
public void AddShowFields(string field)
{
showFields.Add(field);
}
/**//// <summary>
/// 得到文本框的值
/// </summary>
public string Text
{
get
{
string[] texts = txtInput.Value.Split(new string[] { ";" }, StringSplitOptions.None);
DataTable dt = GetDataSourse(this.hprocedurename.InnerText, this.hhashvalue.InnerText);
string txtvalue = "";
foreach (string text in texts)
{
DataRow[] drs = dt.Select(this.hshowfield.InnerText.Split(new string[] { "$h,w$" }, StringSplitOptions.RemoveEmptyEntries)[0] + " = '" + text + "'");
if (drs.Length > 0)
{
txtvalue += text + ",";
}
}
return txtvalue;
}
}
/**//// <summary>
/// 得到与文本框值匹配的信息
/// </summary>
public string Values
{
get
{
string[] texts = txtInput.Value.Split(new string[] { ";" }, StringSplitOptions.None);
DataTable dt = GetDataSourse(this.hprocedurename.InnerText, this.hhashvalue.InnerText);
string value = "";
foreach (string text in texts)
{
DataRow[] drs = dt.Select(this.hshowfield.InnerText.Split(new string[] { "$h,w$" }, StringSplitOptions.RemoveEmptyEntries)[0] + " = '" + text + "'");
if (drs.Length > 0)
{
value += drs[0][this.hneedfield.InnerText.Trim()].ToString() + ",";
}
}
return value;
}
}
/**//// <summary>
/// 得到数据源
/// </summary>
/// <param name="procedurename">存储过程名</param>
/// <param name="condition">存储过程参数</param>
/// <returns>查询数据源</returns>
private DataTable GetDataSourse(string procedurename, string condition)
{
//从数据源得到数据
string[] keyandvalue = condition.Split(new string[] { "$h,w$" }, StringSplitOptions.RemoveEmptyEntries);
SqlParameter[] commandparameters;
if (keyandvalue.Length == 0)
{
commandparameters = null;
}
else
{
commandparameters = new SqlParameter[keyandvalue.Length];
for (int i = 0; i < commandparameters.Length; i++)
{
string[] tempvalue = keyandvalue[i].Split(new string[] { "$h,57,w$" }, StringSplitOptions.None);
commandparameters[i] = new SqlParameter(tempvalue[0], SqlDbType.VarChar, 500);
commandparameters[i].Value = tempvalue[1];
}
}
DataSet ds = SqlHelper.ExecuteDataset(Comm.connectionString, CommandType.StoredProcedure, procedurename, commandparameters);
if (ds == null || ds.Tables[0] == null)
{
return null;
}
else
{
return ds.Tables[0];
}
}
/**//// <summary>
/// 根据输入内容,得到数据
/// </summary>
/// <param name="txtfield">显示文本</param>
/// <param name="showtextfield">下拉提示的相关字段</param>
/// <param name="procedurename">存储过程名</param>
/// <param name="condition">存储过程参数</param>
[Ajax.AjaxMethod]
public string[] GetSuggestData(string txtfield, string showtextfield, string procedurename, string condition)
{
//数据的要显示字段和要相关得到数值的字段
string[] shows = showtextfield.Split(new string[] { "$h,w$" }, StringSplitOptions.RemoveEmptyEntries);
//数据的筛选
DataTable dt = GetDataSourse(procedurename, condition);
if (dt == null)
{
return null;
}
DataRow[] drs = dt.Select(shows[0] + " like '%" + txtfield + "%'");
if (drs.Length == 0)
{
return null;
}
//将数据做为显示流
List<string> fields = new List<string>();
for (int j = 0; j < shows.Length; j++)
{
fields.Add(shows[j]);
}
string[] tbs = new string[drs.Length];
int count = 0;
foreach (DataRow dr in drs)
{
foreach (string item in fields)
{
tbs[count] += "<td>" + dr[item].ToString() + "</td>";
}
count++;
}
return tbs;
}
/**//// <summary>
/// 页面的相关信息的保存
/// </summary>
private void BindValue()
{
//页面中加上与文本输入相关的有下拉提示的字段
this.hshowfield.InnerText = this.textField;
int i = 0;
foreach (string item in showFields)
{
this.hshowfield.InnerText += "$h,w$";
this.hshowfield.InnerText += item;
i++;
}
//页面中加上查询数据源的存储过程
this.hprocedurename.InnerText = this.procedurename;
//页面中加上与存储过程匹配的参数
this.hhashvalue.InnerText = "";
if (procedureParams != null && procedureParams.Count > 0)
{
i = 0;
foreach (DictionaryEntry temp in procedureParams)
{
if (i != 0)
{
this.hhashvalue.InnerText += "$h,w$";
}
this.hhashvalue.InnerText += temp.Key.ToString() + "$h,57,w$" + temp.Value.ToString();
i++;
}
}
//唯一标识的字段名
this.hneedfield.InnerText = this.valueField;
}
protected void Page_Load(object sender, EventArgs e)
{
Ajax.Utility.RegisterTypeForAjax(typeof(SearchText));
if (!IsPostBack)
{
BindValue();
}
}
}