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 中访问父表单的 PropertyEditValue 方法

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

2 回答 2

0

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

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

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

this.line1TextEditSubscriber.EditValueChanged += ParentClass.PropertyEditValue
于 2013-10-25T16:39:02.430 回答
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();
    }
}

这允许子类将事件“向上传递”给父类,以便它可以处理事件,而子类不需要知道任何关于使用它的类型的实现。这个孩子现在可以被任意数量的不同类型的父母使用,或者它可以在父母的具体实现都固定/已知之前编写(允许开发人员独立处理每个表单)并且意味着孩子表单获胜不会因为父级的更改而“损坏”。这方面的技术术语是减少耦合。

于 2013-10-25T16:42:18.307 回答