懂asp.net3.5控件开发的牛人进!·
小弟最近正在看郑键兄写的 《asp.net3.5控件和组件开发技术》一书。才看到前面4张不到目前参照本书的邮件验证控件 处于自己的想法,想修改一下这控件 可能小弟不才(或还没将此书看完) 不知道能不能实现
想把这个邮件验证控件的错误提示信息 改成光标离开此控件时判断如果填写的邮件格式错误则弹出JS提示输入格式错误。
请大家帮下忙
(之前此控件是点击按钮才能触发验证事件,而且提示的也是在文本框后面单独占一个TD列来显示提示信息)
本书代码--
/// <summary>
/// 建立子控件实例, 并设置默认值
/// </summary>
protected override void CreateChildControls()
{
//base.CreateChildControls();
this.Controls.Clear();//防止重复增加相同的子控件
daktext = new TextBox();
this.daktext.ID = "DakValue";//控件ID
this.daktext.Width = Unit.Pixel(100);//控件宽度
this.Controls.Add(daktext);//添加控件
dakrev = new RegularExpressionValidator();//验证表达式
this.dakrev.ID = "DakrevValue";
this.dakrev.ErrorMessage = "(<script>alert('输入格式错误!')</script>)";//验证失败时控件中显示的错误文本(这行我改过--源码是 this.dakrev.ErrorMessage = "[输入格式错误]";)
this.dakrev.Display = ValidatorDisplay.Static;//错误信息的显示内容
this.Controls.Add(dakrev);
this.ChildControlsCreated = true;//创建服务器控件(true)
}
/// 呈现
/// </summary>
/// <param name="writer">输出格式</param>
protected override void Render(HtmlTextWriter writer)
{
writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "0");
writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "0");
writer.AddAttribute(HtmlTextWriterAttribute.Border, "0");
//表格table标记开始
writer.RenderBeginTag(HtmlTextWriterTag.Table);
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
this.daktext.RenderControl(writer);
writer.RenderEndTag();//td标记结束
//当用户设置正则表达式的值时,则显示两列
if (String.IsNullOrEmpty(this.DakValidateExpression) == false && this.DesignMode == false)
{
writer.RenderBeginTag(HtmlTextWriterTag.Td);
this.dakrev.RenderControl(writer);
writer.RenderEndTag();
}
writer.RenderEndTag();
writer.RenderEndTag();
return;
}
--------------------编程问答-------------------- 友情up --------------------编程问答-------------------- 友情帮顶,
听说这书评价还可以, --------------------编程问答-------------------- 恩。帮顶一下吧。 --------------------编程问答-------------------- 控件我基本很少使用也很少开发。
目前使用的是3.5,不过楼主要学开发控件就建议先学c#面向对象,因为这才是基础。
做web开发目前我是这样的:UI方面使用的是试图引擎框架(简单说就是模板),然后替换上面的内容。中间一个控件也没用到,完全走java和php的路。
我不是很喜欢MS的控件,因为把html代码放在类里,这样不是很合理,可测试性太差了。这样程序员就会去做美工的事,生成的页面代码的可读性也不高。 --------------------编程问答-------------------- 这书我也买了,可是买来了,还没看过,惭愧啊~~ --------------------编程问答--------------------
学习了。 --------------------编程问答-------------------- 顶 --------------------编程问答-------------------- 楼主 这要设计事件了
楼主参考下
是庖丁解牛 的一个例子
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Matter
{
[DefaultProperty("Text")]
[ToolboxData("<{0}:postBack runat=server></{0}:postBack>")]
public class postBack : WebControl
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string Text
{
get
{
String s = (String)ViewState["Text"];
return ((s == null) ? String.Empty : s);
}
set
{
ViewState["Text"] = value;
}
}
protected override void RenderContents(HtmlTextWriter output)
{
output.Write("<INPUT type=button name=\"{0}\" value='[使用Page.ClientScript对象方法]' onclick=\"{1}\">", this.UniqueID, Page.ClientScript.GetPostBackEventReference(this, ""));
}
private bool auriPostBack = false;
[Description("是否回发")]
public bool AutoPostBack
{
get
{
return auriPostBack;
}
set
{
auriPostBack = value;
}
}
protected override void OnPreRender(EventArgs e)
{
PostBackOptions pbo = new PostBackOptions(this);
pbo.AutoPostBack =this.AutoPostBack;
pbo.PerformValidation = true; //回发是否在客户端验证
pbo.TrackFocus = true;//在执行完回发后使文本框重新获取焦点
pbo.ClientSubmit = true;
pbo.RequiresJavaScriptProtocol = false;
string str = this.Page.ClientScript.GetPostBackEventReference(pbo);
StringBuilder strPostbackFromClient = new StringBuilder();
strPostbackFromClient.Append("function PostBackFromClient_" + this.ClientID + "()");
strPostbackFromClient.Append("{");
strPostbackFromClient.Append(str + ";");
strPostbackFromClient.Append("}");
if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "PostBackFromClient_" + this.ClientID)) // 判断是否已经是否,输出过 就不在输出
{
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "PostBackFromClient_" + this.ClientID, strPostbackFromClient.ToString(), true);
}
base.OnPreRender(e);
}
protected override void Render(HtmlTextWriter writer)
{
// writer.Write("<INPUT type=button name=\"{0}\" value=\'{1}\' onblur=\'{2}\'>", this.UniqueID, HttpUtility.HtmlEncode(Text), "PostBackFromClient_"+this.ClientID);
writer.Write("<input type=\"text\" name=\"{0}\" value=\"{1}\" onblur=\"{2}\"", this.ClientID, HttpUtility.HtmlEncode(Text), "PostBackFromClient_"+this.ClientID+"()");
}
protected event HandledEventHandler TextChange;
protected virtual void OnTextChange(EventArgs e)
{
if (TextChange != null)
{
TextChange(this, e);
}
}
}
}
--------------------编程问答-------------------- 8楼 这段代码是第几张的? 我去参考下 --------------------编程问答-------------------- 讲事件的 是在第 五章 --------------------编程问答-------------------- 昏 · 还没看到那来·
补充:.NET技术 , ASP.NET