各位好,我创建了一个Class Library用于创建一个自定义控件,在这个自定义控件中我使用了两个.NET控件来组合完成所需要的功能,其中一个是TextBox控件。
现在遇到的问题是,我想给新建的这个自定义控件添加TextChanged事件,这样在引用这个控件的Form就可以使用这个空间的TextChanged事件,但是不知道怎么添加。请各位帮忙,要是有实例代码更感激不尽。
谢谢!

解决方案 »

  1.   

    public event EventHandler TextChanged;
    protected virtual void OnTextChanged()
    {
    if(this.TextChanged!=null)
    this.TextChanged(this,EventArgs.Empty);
    }
    把以上代码添加到你的组件类中
    然后在你认为需要触发TextChanged事件的地方
    调用this.OnTextChanged();
      

  2.   

    对外发布事件,参考
    http://blog.csdn.net/zhzuo/archive/2004/11/30/199599.aspx
      

  3.   

    继承UserControl类,然后你就可以像设计winform一样,用.net环境来设计你的UI组件了。
      

  4.   

    学习了。。zhzuo(秋枫)的,很不错,刚才我也看了看。
    http://blog.csdn.net/zhzuo/archive/2004/11/30/199599.aspx
      

  5.   

    秋枫的回复文章比较详细,谢谢了。也谢谢jointan。
    同时也把秋枫的帖子转贴在这里,希望秋枫不会有意见***************
    在.net应用程序中使用用户控件  郑佐 2004-11-30           做过asp.net的人都知道开发的时候使用用户控件很方便,为功能模块化提供了相当大的灵活性。令人高兴的是开发Windows窗体也可以使用用户控件。这里我们来看看为用户控件添加属性和事件,并实现把消息发送到父容器。本文主要是为没有使用过用户控件的朋友提供一些参考。           用户控件的实现比较简单,直接从System.Windows.Forms.UserControl。  public class UserControl1 : System.Windows.Forms.UserControl  为了便于测试我在上面添加了一个TextBox,并注册TextBox的TextChanged事件,  this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);  事件处理函数,  private void textBox1_TextChanged(object sender, System.EventArgs e)  {       MessageBox.Show(this.textBox1.Text);  }  这里演示如果控件中文本框的内容改变就会用MessageBox显示当前的文本框内容。  控件显示如下:  
    在窗体中添加上面的用户控件,当我们改变textBox的文本时,可以看到跳出一个对话框,很简单吧。  下面来看看对控件添加属性。
    这里定义一个私有变量。  private string customValue;  添加访问他的属性  public string CustomValue  {       get{return customValue;}       set{customValue =value;}  }  在窗体中使用的时候像普通控件一样进行访问,  userControl11.CustomValue = "用户控件自定义数据";  通过事件可以传递消息到窗体上,在定义之前我们先来写一个简单的参数类。  public class TextChangeEventArgs : EventArgs  {       private string message;       public TextChangeEventArgs(string message)       {           this.message = message;       }  public string Message       {           get{return message;}       }  }  定义委托为,  public delegate void TextBoxChangedHandle(object sender,TextChangeEventArgs e);  接下去在用户控件中添加事件, //定义事件 public event TextBoxChangedHandle UserControlValueChanged;  为了激发用户控件的新增事件,修改了一下代码,  private void textBox1_TextChanged(object sender, System.EventArgs e)  {       if(UserControlValueChanged != null)           UserControlValueChanged(this,new TextChangeEventArgs(this.textBox1.Text));  } 好了,为了便于在Csdn上回答问题,把完整的代码贴了出来:  using System;  using System.Collections;  using System.ComponentModel;  using System.Drawing;  using System.Data;  using System.Windows.Forms; namespace ZZ.WindowsApplication1  {       public class UserControl1 : System.Windows.Forms.UserControl       {           private System.Windows.Forms.TextBox textBox1;           private string customValue;            private System.ComponentModel.Container components = null;           public string CustomValue           {                get{return customValue;}                set{customValue =value;}           }           //定义事件           public event TextBoxChangedHandle UserControlValueChanged;           public UserControl1()           {                InitializeComponent();           }           protected override void Dispose( bool disposing )           {                if( disposing )                {                     if(components != null)                     {                        components.Dispose();                     }                }                base.Dispose( disposing );           }           #region 组件设计器生成的代码           private void InitializeComponent()           {                this.textBox1 = new System.Windows.Forms.TextBox();                this.SuspendLayout();                this.textBox1.Location = new System.Drawing.Point(12, 36);                this.textBox1.Name = "textBox1";                this.textBox1.TabIndex = 0;                this.textBox1.Text = "textBox1";                this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);                this.Controls.Add(this.textBox1);                this.Name = "UserControl1";                this.Size = new System.Drawing.Size(150, 92);                this.ResumeLayout(false);           }           #endregion           private void textBox1_TextChanged(object sender, System.EventArgs e)           {                if(UserControlValueChanged != null)                     UserControlValueChanged(this,new TextChangeEventArgs(this.textBox1.Text));             }       }       //定义委托       public delegate void TextBoxChangedHandle(object sender,TextChangeEventArgs e);       public class TextChangeEventArgs : EventArgs       {           private string message;           public TextChangeEventArgs(string message)           {                this.message = message;           }           public string Message           {                get{return message;}           }       }  }  使用时要在窗体中注册上面的事件,比较简单都贴源代码了,  using System;  using System.Drawing;  using System.Collections;  using System.ComponentModel;  using System.Windows.Forms;  using System.Data;   namespace ZZ.WindowsApplication1  {       public class Form1 : System.Windows.Forms.Form       {           private WindowsApplication1.UserControl1 userControl11;           private System.ComponentModel.Container components = null;           public Form1()           {                InitializeComponent();                userControl11.CustomValue = "用户控件自定义数据";                userControl11.UserControlValueChanged += new TextBoxChangedHandle(userControl11_UserControlValueChanged);           }           protected override void Dispose( bool disposing )           {                if( disposing )                {                     if (components != null)                     {                         components.Dispose();                     }                }                base.Dispose( disposing );           }           #region Windows 窗体设计器生成的代码           private void InitializeComponent()           {                this.userControl11 = new WindowsApplication1.UserControl1();                this.SuspendLayout();                this.userControl11.Location = new System.Drawing.Point(8, 8);                this.userControl11.Name = "userControl11";               this.userControl11.Size = new System.Drawing.Size(150, 84);                this.userControl11.TabIndex = 0;                this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);                this.ClientSize = new System.Drawing.Size(292, 193);                this.Controls.Add(this.userControl11);                this.Name = "Form1";                this.Text = "Form1";                this.ResumeLayout(false);           }           #endregion            [STAThread]           static voidMain()           {               Application.Run(new Form1());           }           private void userControl11_UserControlValueChanged(object sender, TextChangeEventArgs e)  {                MessageBox.Show("当前控件的值为:" + e.Message);           }      } }  另外需要动态加载,就把控件添加在容器的Controls集合就行了,下面是在构造函数中添加控件, public Form1()  {       InitializeComponent();       UserControl1 uc = new UserControl1();       uc.CustomValue = "动态加载的用户控件";       uc.UserControlValueChanged += new TextBoxChangedHandle(userControl11_UserControlValueChanged);       this.Controls.Add(uc);  }  另外从VS.net中的工具箱中拖动用户控件到窗体上,如果是第一次需要编译一下项目。