2010-12-31 11 views
0

この質問はC#に関連しています。ボタンをクリックすると、ファイルの読み込み、データ操作、ファイルのダンプなどの操作が行われます。私はステータスを更新する各操作はUI(FORM-frmTesting)にあるラベルに(つまり、ファイルの読み込み完了し、データ操作が完了)代理人:上位レイヤーに操作を通知する

ボタンクリックイベントは

namespace frmTesting 
{ 
    public partial class Form1 : Form 
    { 
     private void button1_Click_1(object sender, EventArgs e) 
     { 
      class1 l_objClass1 = new class1(); 
      l_objClass1.DoOperation(); 
     } 
    } 

    public class class1 
    { 
     public int DoOperation() 
     { 
      ReadTextFile(); 
      ParsingData(); 
      SaveTextFile(); 
      return 0; 
     } 
     private int ReadTextFile() 
     { 

      //Read the text File 
      return 0; 
     } 
     private int ParsingData() 
     { 
      // Data manipulation 
      return 0; 
     } 
     private int SaveTextFile() 
     { 
      // save the file 
      return 0; 
     } 
    } 
} 

をすることは可能ですです代理人を使ってやる?

答えて

1
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 

namespace WindowsFormsApplication3 
{ 
    public delegate void MyDelagate(); 

    class Class1 
    { 
     public event MyDelagate _myDelegate; 
     private String s1 = String.Empty; 

     public String s 
     { 
      get 
      { 
       return s1; 
      } 

      set 
      { 
       s1 = value; 
       if(_myDelegate != null) 
        _myDelegate(); 
      } 
     } 
     public int DoOperation() 
     { 
      s = "Started"; 
      ReadTextFile(); 
      ParsingData(); 
      SaveTextFile(); 
      s = "Completed"; 
      return 0; 
     } 
     private int ReadTextFile() 
     { 
      s = "Read Text File"; 
      Thread.Sleep(3000);    
      return 0; 
     } 
     private int ParsingData() 
     { 
      s = "Parsing Data"; 
      Thread.Sleep(3000); 
      return 0; 
     } 
     private int SaveTextFile() 
     { 
      s = "Save Text File"; 
      Thread.Sleep(3000); 
      return 0; 
     } 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication3 
{ 
    public partial class Form1 : Form 
    { 
     Class1 x = new Class1(); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      x._myDelegate += new MyDelagate(UpdateStatus); 
      x.DoOperation(); 
     } 

     void UpdateStatus() 
     { 
      label1.Text = x.s; 
      Validate(); 
     } 
    } 
} 
+0

これは、「プロパティ」の使用が非常に悪いことです。代わりに 'Method'を使用してください。特定のコードや特定のアクション(ここではロギング)の実行のために 'Property'に依存するべきではありません。これは単に悪い習慣です。 – decyclone

+0

いいえ、これは標準的な方法です。プロパティーの作者には、実行されるコードの種類や種類は不明です。彼のコントロールではありません。 –

+0

上記のコードを解釈すると、デリゲートが呼び出されるときに呼び出されるように再帰が発生し、呼び出されるサブメソッドのそれぞれが "s"プロパティを設定し、何度も繰り返し呼び出すようになります... – DRapp

0

Class1にデリゲートプロパティを設定します。

Class1を作成した後(またはコンストラクタでこれを行うことができます)、代理プロパティに関数を割り当てます。

操作が行われているときに、デリゲートがnullでないかどうかを確認し、必要なイベント引数(ステータスレベル、完了ステータス、そのようなもの)を使用してデリゲートを実行します。

次に、代理人に渡されたForm1の関数は、引数の処理を処理し、テキストフィールドに値を割り当てます。

関連する問題