子窗体上的父窗体方法表示文本框事件处理程序

时间:2013-10-25 16:35:27

标签: c# winforms events c#-4.0

我有100个文本框分布在20个表单中,所有这些文本框在EditValueChanged上都是一样的。 这些是DevExpress.XtraEditors.TextEdit控件

ParentForm 
   ChildForm1
       TextBox1
       this.line1TextEditSubscriber.EditValueChanged += new System.EventHandler(PropertyEditValue);
       TextBox2
       this.line1TextEditSubscriber.EditValueChanged += new System.EventHandler(PropertyEditValue);
       TextBox3
       this.line1TextEditSubscriber.EditValueChanged += new System.EventHandler(PropertyEditValue);
       DropDow1
 ChildForm2
       TextBox1
       this.line1TextEditSubscriber.EditValueChanged += new System.EventHandler(PropertyEditValue);
       TextBox2
       this.line1TextEditSubscriber.EditValueChanged += new  System.EventHandler(PropertyEditValue);
       TextBox3
       this.line1TextEditSubscriber.EditValueChanged += new System.EventHandler(PropertyEditValue); 
       DropDow1



 public delegate void PropertyChangedEventHandler(object sender, EventArgs e);

//This one method is declared on the Parent Form.
         private void PropertyEditValue(object sender, EventArgs e)
                {
                  //Do some action 
                }

有没有办法可以在每个ChildForms Textboxe EditValueChanged中访问Parent form的PropertyEditValue方法

this.line1TextEditSubscriber.EditValueChanged += new System.EventHandler(PropertyEditValue);

2 个答案:

答案 0 :(得分:0)

只需将其公开,然后将父表单的实例传递给子表单

public void PropertyEditValue(object sender, EventArgs e)
{
  //Do some action 
}

甚至更简单,如果函数PropertyEditValue不使用任何类变量,您可以声明它static并直接访问它,如

this.line1TextEditSubscriber.EditValueChanged += ParentClass.PropertyEditValue

答案 1 :(得分:0)

您可以做的是让每个子表单在编辑任何文本框时触发自己的事件:

public class ChildForm2 : Form
{
    private TextBox texbox1;
    public event EventHandler TextboxEdited;
    private void OnTextboxEdited(object sender, EventArgs args)
    {
        if (TextboxEdited != null)
            TextboxEdited(sender, args);
    }
    public ChildForm2()
    {
        texbox1.TextChanged += OnTextboxEdited;
    }
}

您还可以将所有文本框放入集合中,以便可以在循环中添加处理程序,而不是将该行写入20次:

var textboxes = new [] { textbox1, textbox2, textbox3};
foreach(var textbox in textboxes)
    texbox.TextChanged += OnTextboxEdited;

然后父表单可以从每个子表单订阅该事件,并激活它自己的事件:

public class ParentForm : Form
{
    public void Foo()
    {
        ChildForm2 child = new ChildForm2();
        child.TextboxEdited += PropertyEditValue;
        child.Show();
    }
}

这允许子类“将事件向上传递”到父级,以便它可以处理事件,而子类不需要知道有关使用它的类型的实现的任何信息。这个孩子现在可以被任何数量的不同类型的父母使用,或者可以在父母的具体实现都是固定/已知的之前编写(允许开发人员独立地处理每个表单)并且意味着孩子表单赢了由于父母的改变而被“打破”。技术术语是减少耦合。