一个简单的登陆控件

作者参考网上代码写了自定义登录控件,运行时点击提交和重置按钮无反应,调试发现未执行对应事件处理函数。经排查,是在构造函数中创建控件后,未将按钮控件添加到容器,导致点击回传时事件绑定丢失,分享此经验供调试参考。

参考一些网上的代码写了一个自定义控件,代码如下:
--------------------------------------------------------------------------------------------------

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Drawing;
using SystemFrameWork;

namespace WebControlLibrary
{
 /// <summary>
 /// LoginControl 的摘要说明。
 /// </summary>
 [DefaultProperty("Text"),
  ToolboxData("<{0}:LoginControl runat=server></{0}:LoginControl>")]
 public class LoginControl : System.Web.UI.WebControls.WebControl
 {
  #region 所有的子控件
           private Label lblUserName = new Label();
     private Label lblPassword = new Label();
     private TextBox txtUserName = new TextBox();
     private TextBox txtPassword = new TextBox();
     private Button btnSubmit = new Button();
     private Button btnClear = new Button();
     private Panel  panel = new Panel();
  
  #endregion

  #region 成员变量

   private string text;
   private Color _clrBackColor;

  #endregion
 
  #region 所有的属性

  #region Text//文本
  /// <summary>
  /// 文本
  /// </summary>
  [Bindable(true),
   Category("Appearance"),
   DefaultValue("")]
  public string Text
  {
   get
   {
    return text;
   }

   set
   {
    text = value;
   }
  }

  #endregion

  #region BackColor//背景色
  /// <summary>
  /// 背景色
  /// </summary>
  [Bindable(true),
  Category("Appearance"),
  DefaultValue("")]
  public new Color BackColor
  {
   get
   {
    return _clrBackColor;
   }
   set
   {
    _clrBackColor = value;
   }
  }

  #endregion

  #region Height //高度

  /// <summary>
  ///  高度
  /// </summary>
  [Bindable(true),
  Category("Appearance"),
  DefaultValue("")]
  public new Unit Height
  {
   get
   {
                return this.panel.Height;
   }
   set
   {
    this.panel.Height = value;
   }
  }

  #endregion

  #region Width //宽度

  /// <summary>
  ///  宽度
  /// </summary>
  [Bindable(true),
  Category("Appearance"),
  DefaultValue("")]
  public new Unit Width
  {
   get
   {
    return this.panel.Width;
   }
   set
   {
    this.panel.Width = value;
   }
  }

  #endregion

  #region BorderColor //边框的颜色

  /// <summary>
  ///  边框的颜色
  /// </summary>
  [Browsable(true),
  Category("Appearance"),
  DefaultValue("")]
  public new Color BorderColor
  {
   get
   {
    return this.panel.BorderColor;
   }
   set
   {
    this.panel.BorderColor = value;
   }
  }

  #endregion

  #region BorderStyle//边界样式
        
  public new BorderStyle BorderStyle
  {
   get
   {
    return this.panel.BorderStyle;
   }
   set
   {
    this.panel.BorderStyle = value;
   }
  }

  #endregion

  #endregion

  #region 所有的事件
    private EventHandler SubmitOnClick;
    private EventHandler ClearOnClick;

  #endregion

  #region LoginControl()//构造函数
  /// <summary>
  /// 函数名称: LoginControl
  /// 功能描述 :构造函数
  /// </summary>
  public LoginControl()
  {
   _clrBackColor = Color.White;

     //初始化控件的一些属性
           lblUserName.Text = "用户名:";
     lblPassword.Text = "密码:";
           txtUserName.Text = "";
     txtPassword.Text = "";
     btnSubmit.Text = "提交";
     btnSubmit.Click += new EventHandler( this.btnSubmit_Click );

     btnClear.Text = "重置";
     btnClear.Click += new EventHandler( this.btnClear_Click );

     panel.Width = Unit.Percentage(100);
     panel.Height = Unit.Percentage(100);
          
    
  }
  #endregion

  #region Render()//将此控件呈现给指定的输出参数
  /// <summary>
  /// 将此控件呈现给指定的输出参数。
  /// </summary>
  /// <param name="output"> 要写出到的 HTML 编写器 </param>
  protected override void Render(HtmlTextWriter output)
  {
            panel.RenderBeginTag(output);

   output.AddAttribute(HtmlTextWriterAttribute.Border,"0");
   output.AddAttribute(HtmlTextWriterAttribute.Cellpadding,"0");
   output.AddAttribute(HtmlTextWriterAttribute.Cellspacing,"0");
   output.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Width,"100%");
   output.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Height,"100");
   output.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Bgcolor,_clrBackColor.Name);
   output.RenderBeginTag(HtmlTextWriterTag.Table);

   //用户名
   output.RenderBeginTag(HtmlTextWriterTag.Tr);
   output.RenderBeginTag(HtmlTextWriterTag.Td);
   lblUserName.RenderControl(output);
   output.RenderEndTag();
   output.RenderBeginTag(HtmlTextWriterTag.Td);
   txtUserName.RenderControl(output);
   output.RenderEndTag();
   output.RenderEndTag();

   //密码
   output.RenderBeginTag(HtmlTextWriterTag.Tr);
   output.RenderBeginTag(HtmlTextWriterTag.Td);
   lblPassword.RenderControl(output);
   output.RenderEndTag();
   output.RenderBeginTag(HtmlTextWriterTag.Td);
   txtPassword.RenderControl(output);
   output.RenderEndTag();
   output.RenderEndTag();

   //按钮
   output.RenderBeginTag(HtmlTextWriterTag.Tr);
   output.RenderBeginTag(HtmlTextWriterTag.Td);
   output.RenderEndTag();
   output.RenderBeginTag(HtmlTextWriterTag.Td);
   btnSubmit.RenderControl(output);
   output.Write("&nbsp;&nbsp;");
   btnClear.RenderControl(output);
   output.RenderEndTag();
   output.RenderEndTag();


   output.RenderEndTag();

   panel.RenderEndTag(output);
  }

  #endregion

  #region btnSubmit_Click//提交按钮的处理程序
  /// <summary>
  /// 提交按钮的处理程序
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnSubmit_Click( object sender , EventArgs e )
  {
      EventArgs e1 = new EventArgs();
   if( this.SubmitOnClick != null )
   {
     this.SubmitOnClick( this.btnSubmit , e1 );
   }
  }

  #endregion

  #region btnClear_Click//"重置"按钮的处理事件
  /// <summary>
  /// "重置"按钮的处理事件
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnClear_Click( object sender ,EventArgs e)
  {
   this.txtPassword.Text = "";
   this.txtPassword.Text = "";
   if( Page != null )
   {
     CommonPromptMessage.PromptMessage( this.Page , "无效的用户名!" );
   }

   EventArgs e1 = new EventArgs();
   if(this.ClearOnClick!=null)
    this.ClearOnClick(this.btnClear,e1);
  }

  #endregion

 }
}

------------------------------------------------------------------------------------

在运行的时候发现点击submit和reset按钮没有反映,后来在控件中设置断点进行调试
发现根本没有执行btnSubmit_Click和btnClear_Click事件,难道是事件没有绑定?
查了很多地方都没有找到原因..
    经过一番艰苦卓绝的调试,终于找到问题所在了,原来我在函数LoginControl()中虽然
创建了一些控件,但是少了下面的语句
   this.Controls.Add(btnSubmit);
导致控件虽然创建了,但是并没有被加到容器中,所以就导致了在点击回传的时候,事件绑定
可能丢失了,所以点击按钮总是没有反映
   希望我的经验能给各位的调试带来一些思路.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值