Button本身没有TextChanged事件。你可以自己扩展一个。public class MyTextHandledButton:Button { public event EventHandler TextChanged; public new Text { get{return base.Text;} set { base.Text=value; if(TextChanged!=null) TextChanged(this,new EventArgs()); } } } 使用这个,在TextChanged事件中写代码判断button2.Text即可。
也可以这样 class MyButton : Button { public override string Text { get { return base.Text; } set { base.Text = value; if (base.Text == "aaaa") base.PerformClick(); } } } 这样改,你只要改一下new的地方 Button button1=new MyButton();
当buton2的Text赋为"aaaa"的时候调用button1_Click即可:this.button2.Text = "aaaa"; this.button1_Click(button1, new EventArgs());当然你也可以像4楼和5楼那样封装一下
button是有textchanged事件的,当然,这可能和.net版本有关,我这边是4.0
和版本没关系,TextChanged 从1.0 就有Button 从 Control 继承,也有此事件
上面那个是对的,下面来提提我的理解来完善下,错了请指正。 public class MyTextHandledButton:Button { public event EventHandler TextChanged; public new Text { get{return base.Text;} set { //比较一下是否值不同了,因为事件本身就是只在值改变时发生 if(base.Text!= value) { base.Text=value; //事件发生 if(TextChanged != null) { //为了让所有注册的事件发生 foreach (Delegate del in ddd.GetInvocationList()) { //如果是控件的,就直接Invoke,省的出现跨线程访问出错 System.Windows.Forms.Control c = del.Target as System.Windows.Forms.Control; if (del != null) c.Invoke(del, new object[] { this, EventArgs.Empty }); else TextChanged(this, EventArgs.Empty); } } } } } }还有,最好不要直接在TextChanged事件的处理中直接用button1_Click(),因为这样不易程序的阅读,代码的维护。尤其是事件发生对象已经改变,参数也不对了。应该把button1_Click事件中的方法独立一个方法,然后在TextChanged事件中使用独立出来的方法。 如 private void button2_TextChanged(object sender, EventArgs e) { button1_Click(button2, e); } 这样是不好的。最好是: private void button1_Click(object sender, EventArgs e) { DoSomeThing(object[] param); }//把具体的方法独立出来调用 private void DoSomeThing(params object param) { //some thing }private void button2_TextChanged(object sender, EventArgs e) { DoSomeThing(object[] param); }
{
if (button2.Text == "aaaa")
button1_Click(button2, e);
}
{
if (button2.Text == "aaaa")
button1_Click(button1, e);
}
或者将button1的click事件方法内的代码做成一个独立的方法,button1_Click和button2_TextChanged内都调用这个方法。
{
public event EventHandler TextChanged;
public new Text
{
get{return base.Text;}
set
{
base.Text=value;
if(TextChanged!=null) TextChanged(this,new EventArgs());
}
}
}
使用这个,在TextChanged事件中写代码判断button2.Text即可。
class MyButton : Button
{
public override string Text {
get { return base.Text; }
set {
base.Text = value;
if (base.Text == "aaaa") base.PerformClick();
}
}
}
这样改,你只要改一下new的地方
Button button1=new MyButton();
this.button1_Click(button1, new EventArgs());当然你也可以像4楼和5楼那样封装一下
上面那个是对的,下面来提提我的理解来完善下,错了请指正。
public class MyTextHandledButton:Button
{
public event EventHandler TextChanged;
public new Text
{
get{return base.Text;}
set
{
//比较一下是否值不同了,因为事件本身就是只在值改变时发生
if(base.Text!= value)
{
base.Text=value;
//事件发生
if(TextChanged != null)
{
//为了让所有注册的事件发生
foreach (Delegate del in ddd.GetInvocationList())
{
//如果是控件的,就直接Invoke,省的出现跨线程访问出错
System.Windows.Forms.Control c = del.Target as System.Windows.Forms.Control;
if (del != null) c.Invoke(del, new object[] { this, EventArgs.Empty });
else TextChanged(this, EventArgs.Empty);
}
}
}
}
}
}还有,最好不要直接在TextChanged事件的处理中直接用button1_Click(),因为这样不易程序的阅读,代码的维护。尤其是事件发生对象已经改变,参数也不对了。应该把button1_Click事件中的方法独立一个方法,然后在TextChanged事件中使用独立出来的方法。
如
private void button2_TextChanged(object sender, EventArgs e)
{
button1_Click(button2, e);
}
这样是不好的。最好是:
private void button1_Click(object sender, EventArgs e)
{
DoSomeThing(object[] param);
}//把具体的方法独立出来调用
private void DoSomeThing(params object param)
{
//some thing
}private void button2_TextChanged(object sender, EventArgs e)
{
DoSomeThing(object[] param);
}