通过这个控件,可以判断你输入的文本框中的内容是否与你已经存在的数据或者是数据集中的数据相等(当焦点离开该控件的时候),并且根据你输入的要提示的信息来提示输入的是否是正确的:比如用户注册的时候,你可以用来判断用户名是否已经存在,以便快速的提示给注册的用户。它自带要提示的信息的属性,可以在文本框的后面进行提示。空间的数据集为object,支持多种数据类型:可以是单个的数据源,也可以为数组,arraylist,datatable、dataset等数据集。
主类:(ValidTextBox.cs)
//复合自定义控件源码:
using System;
using System.Data;
using System.Drawing;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using DJControl.DJTextBox.Valid.DataBind;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace DJControl.DJTextBox.Valid
{
//创建一个由TextBox 组成的简单的复合控件
//复合控件类应该通过从 CompositeControl 继承开始
[DefaultProperty("DataField"), ToolboxData("<{0}:ValidTextBox runat=server></{0}:ValidTextBox>")]
public class ValidTextBox : CompositeControl //WebControl
{
//定义属性
#region All Property
[Description("数据源"), DefaultValue(null), Browsable(false), Bindable(true)]
public object DataSource
{
get
{
object source = (object)ViewState["Source"];
return ((source == null) ? null : source);
}
set
{
ViewState["Source"] = value;
}
}
[Description("要进行验证的字段"), DefaultValue("")]
public string DataField
{
get
{
String datafield = (String)ViewState["ValidField"];
return ((datafield == null) ? String.Empty : datafield);
}
set
{
ViewState["ValidField"] = value;
}
}
[Description("正确时的提示"), DefaultValue("")]
public string TrueText
{
get
{
String trueText = (String)ViewState["TrueText"];
return ((trueText == null) ? String.Empty : trueText);
}
set
{
ViewState["TrueText"] = value;
}
}
[Description("错误时的提示"), DefaultValue("")]
public string FalseText
{
get
{
String falseText = (String)ViewState["FalseText"];
return ((falseText == null) ? String.Empty : falseText);
}
set
{
ViewState["FalseText"] = value;
}
}
#endregion
//CreateChildControls 方法
/*
* 我们的复合控件由一个标签和一个文本框组成。
* 我们无法使用简单控件的技术来显示这两个标记,除非使用强制方式和 Render() 方法。
* 因为我们希望利用自适应呈现并显示我们的两个控件,
* 所以我们需要覆盖内置到 CompositeControl 类中的 CreateChildControls() 方法。
* 这种方法使我们可以定义控件,并将我们的复合控件的属性传递到要显示的单个控件中。
*/
protected override void CreateChildControls()
{
System.Web.UI.WebControls.TextBox tb = new System.Web.UI.WebControls.TextBox();
DJTextBox.Valid.DataBind.TextBox mytxtbox = new DJTextBox.Valid.DataBind.TextBox();
this.Controls.Add(mytxtbox);
this.Controls.Add(tb);
//add System TextBox
tb.Text = " *";
tb.ForeColor = Color.Red;
tb.BorderWidth = 0;
tb.ReadOnly=true;
//add My TextBox
mytxtbox.DataSource = this.DataSource;
mytxtbox.DataField = this.DataField;
mytxtbox.TrueText = this.TrueText;
mytxtbox.FalseText = this.FalseText;
mytxtbox.BorderColor = Color.Silver;
mytxtbox.BorderStyle = BorderStyle.Solid;
mytxtbox.BorderWidth = 1;

//call the parent method
base.CreateChildControls();
}
//注意,我们必须初始化每个控件、分配所有属性,然后将控件添加到内置到 CompositeControl 类中的 Controls 集合。
//我们还使用了 Literal 对象将换行符置于标签和控件之间。Literal 对象是非常简单的控件,您可以使用它在功能元素之间插入原始 HTML。
//protected override void RenderContents(HtmlTextWriter output)
//{
// output.Write(Text);
//}
//protected override void OnPreRender(EventArgs e)
//{
// base.OnPreRender(e);
//}
}
}

自定义TextBox类:
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Text;
using
System.Web;
using
System.Web.UI;
using
System.Web.UI.WebControls;
namespace
DJControl.DJTextBox.Valid.DataBind
{
[DefaultProperty("Text"), ToolboxData("<{0}:TextBox runat=server></{0}:TextBox>")]
internal class TextBox : System.Web.UI.WebControls.TextBox
}
javascript事件触发类:(ScriptCreate.cs)
using
System;
using
System.Data;
using
System.Drawing;
using
System.Collections.Generic;
using
System.Text;
using
System.Web.UI;
using
System.Web.UI.WebControls;
namespace
DJControl.DJTextBox.Valid.DataBind
{
internal class ScriptCreate
{
#region Properties
/// <summary>
/// 存储onblur方法脚本变量
/// </summary>
private string OnBlurScript = "";
private string OnBlurScriptName = "ValueExists";
private string OnfocusScriptName = "SelectDown";
private string OnLoadScriptName = "OnInit";
/// <summary>
/// 存储onfocus方法脚本变量
/// </summary>
private string OnfocusScript = "";
/// <summary>
/// 定义Javscript
/// </summary>
private string DifinScript = "";
/// <summary>
/// 存储方法脚本变量
/// </summary>
private string FunctionScript = "";
/// <summary>
/// 存储要读取控件的属性(如: t.text/t.Value etc)
/// </summary>
private string ValueSymbol = ".value";
#endregion
#region Method
/// <summary>
/// 判断此javascript方法是否已经注册过
/// </summary>
/// <param name="control"></param>
/// <param name="ScriptName">方法名</param>
internal void ScriptIsRefistered(TextBox control,ref string ScriptName)
{
while (true)
{
if (!control.Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), ScriptName))
{
break;
}
else
{
ScriptName = control.Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), ScriptName) ? ScriptName + "1" : ScriptName;
}
}
}
internal bool CreateScript(TextBox control, object source, string field,string trueText,string falseText)
{
ScriptIsRefistered(control,ref OnBlurScriptName);
ScriptIsRefistered(control,ref OnfocusScriptName);
ScriptIsRefistered(control,ref OnLoadScriptName);

string validTxT = control.Text;
string JSHeader = "";
string JSContent = "";
int count = 0;
DataObjectExcute.SetDataSource = source;
object[] objsource=DataObjectExcute.GetDataCollection(field);
//OnBlur事件
DifinScript += "<script language='javascript'>/n";
if (objsource == null)
{
return false;
}
else if (objsource.Length == 1)
{
DifinScript += "var datalist=new Array(1);/n";
DifinScript += "datalist[0]='" + objsource[0].ToString() + "';/n";
}
else
{
DifinScript += " var datalist=new Array(" + objsource.Length + ");/n";
foreach (object obj in objsource)
{
DifinScript += " datalist[" + count + "]='" + obj.ToString() + "';/n";
++count;
}
}
OnBlurScript += DifinScript;
OnBlurScript += "/n /n document.getElementById('" + control.Parent.Controls[0].ClientID + "').onblur=" + OnBlurScriptName + ";/n";
OnBlurScript += "/n /n document.getElementById('" + control.Parent.Controls[0].ClientID + "').onfocus=" + OnfocusScriptName + ";/n";
OnBlurScript += "/n</script>/n";
//Onfocus事件
OnfocusScript += "<script language='javascript'>/n function " + OnfocusScriptName + "()/n{/n";
//OnfocusScript += "document.getElementById('" + control.Parent.Controls[0].ClientID + "').style.backgroundColor='#66ff66';/n";
OnfocusScript += "document.getElementById('" + control.Parent.Controls[1].ClientID + "').value=' *';/n";
OnfocusScript += "document.getElementById('" + control.Parent.Controls[0].ClientID + "').style.border='#66ff66 thin solid';/n";
OnfocusScript += "document.getElementById('" + control.Parent.Controls[1].ClientID + "').style.color='#ff0000';/n";
OnfocusScript += "/n}/n;";
OnfocusScript += "/n</script>/n";
//function ValueExist()
JSHeader = " <script language='javascript'>/n function " + OnBlurScriptName + "()/n{/n";
JSContent += " var isexist = false;/n for(i=0;i<datalist.length;i++)/n";
JSContent += "{/n if(datalist[i]==document.getElementById('" + control.Parent.Controls[0].ClientID + "').value)/n{/n";
JSContent += " isexist=true;/n break; /n}/n}/n";
//JSContent += "document.getElementById('" + control.Parent.Controls[0].ClientID + "').style.backgroundColor='#ffffff';/n";
JSContent += "document.getElementById('" + control.Parent.Controls[0].ClientID + "').style.borderColor='silver';/n";
JSContent += "document.getElementById('" + control.Parent.Controls[0].ClientID + "').style.borderStyle='solid';/n";
JSContent += "document.getElementById('" + control.Parent.Controls[0].ClientID + "').style.borderWidth='1px';/n";
JSContent += "/n if(document.getElementById('" + control.Parent.Controls[0].ClientID + "').value=='')/n{";
JSContent += "document.getElementById('" + control.Parent.Controls[1].ClientID + "')" + ValueSymbol + "= ' *';/n";
JSContent += "document.getElementById('" + control.Parent.Controls[1].ClientID + "').style.color='#ff0000';/n}";
JSContent += "else /n {";
JSContent += " if (isexist)/n{/n ";
/*((Control)control.Page.FindControl(resultTo)).ClientID*/
JSContent += "document.getElementById('" + control.Parent.Controls[1].ClientID + "')" + ValueSymbol;
JSContent += "=' "+falseText+"'";
JSContent += " /n document.getElementById('" + control.Parent.Controls[1].ClientID + "').style.color = '#ff0000';/n";
JSContent += "} /n else /n { /n document.getElementById('" + control.Parent.Controls[1].ClientID + "').value = ' "+trueText+"'; /n ";
JSContent += "document.getElementById('" + control.Parent.Controls[1].ClientID+ "').style.color = '#00ff33'; /n}";
JSContent += "/n} /n}/n</script>/n/n";
FunctionScript = JSHeader + JSContent;
return true;
}
internal bool RegisterScript(Page page)
{
if (OnBlurScript.Length == 0 || FunctionScript.Length == 0 || OnfocusScript.Length==0)
{
return false;
}
if (!page.ClientScript.IsClientScriptBlockRegistered(OnBlurScriptName))
{
page.ClientScript.RegisterClientScriptBlock(this.GetType(), OnBlurScriptName, FunctionScript, false);
}
if (!page.ClientScript.IsClientScriptBlockRegistered(OnfocusScriptName))
{
page.ClientScript.RegisterClientScriptBlock(this.GetType(), OnfocusScriptName, OnfocusScript, false);
}
if (!page.ClientScript.IsStartupScriptRegistered(OnLoadScriptName))
{
page.ClientScript.RegisterStartupScript(this.GetType(), OnLoadScriptName, OnBlurScript, false);
}
return true;
}
#endregion
}
}
介绍了一个自定义验证控件的实现方法,该控件能够检查文本框输入内容是否存在于指定数据集中,并提供即时反馈。
108

被折叠的 条评论
为什么被折叠?



