当前位置:编程学习 > C#/ASP.NET >>

懂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代码放在类里,这样不是很合理,可测试性太差了。这样程序员就会去做美工的事,生成的页面代码的可读性也不高。 --------------------编程问答-------------------- 这书我也买了,可是买来了,还没看过,惭愧啊~~ --------------------编程问答--------------------
引用 4 楼 ld1201 的回复:
控件我基本很少使用也很少开发。
目前使用的是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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,