0

20 個のフォームに 100 個のテキスト ボックスが配置されていますが、それらはすべて 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 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 に答える