2017-05-11 4 views
0

は、私は2つのプロジェクトを持って、それを簡単にするために、ので、AはBで参照することはできません。 Bはプログラム全体の主なビジネスを持っており、GUI(プロジェクトA)にいくつかの情報(フィードバック、警告、エラー..)を表示する必要があります。他の参照されていないプロジェクトからGUI要素にアクセスするにはどうすればよいですか? C#クラスライブラリプロジェクト</p></li> </ul> <p>B Aに参照されています</p> <ul> <li><p>プロジェクトA:</p></li> <li><p>プロジェクトBは、Windowsフォームアプリケーション

それはプロジェクトにそれを表示するには、毎回のプロジェクトBから情報を送り返すことは非常に迷惑です。

アイデア?

+1

*プロジェクトBの情報をプロジェクトAに返信するのは非常に面倒です*これを実証するために[MCVE]を取り上げて説明してください。プロジェクトBのクラスは何をしていますか?これは、共通のコントロールがDLLに保持され、別のプロジェクトのGUI上で動的にロードされる方法です。多分あなたはそのファッションを試みていますか? – t0mm13b

+0

これはどのように動作するのですか。通常は少なくとも3つのプロジェクト、UILogic、2:BusinessLogic、3:Applicationがあり、BusinessLogicからUILogicにデータを送信し、アプリケーションによって表示されます。 –

+1

_プロジェクトBからの情報の送り返しが非常に面倒です(Windowsフォームデータバインディング)(https://msdn.microsoft.com/en-us/library/ef2xyb33(v = vs.110))をチェックしてください。 .aspx) – Fabio

答えて

4

クラスライブラリは、それが反応し、正しいUIを描くことができます変更のUIプロジェクトに通知しなければなりません。

UI層は、UI層を購読することができるイベントにプロジェクトB(コールバック)に渡す方法からaproachesの数があります。

は、以下のイベントを持つ例です。カスタムイベントの発生の詳細については、hereを参照してください。

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      var projectB = new ProjectB(); 
      projectB.OnUpdateStatus += projectB_OnUpdateStatus; 
      projectB.Run(); 
     } 

     private void projectB_OnUpdateStatus(string message) 
     { 
      MessageBox.Show(message); 
     } 
    } 



public class ProjectB 
{ 
    public delegate void StatusUpdateHandler(string message); 
    public event StatusUpdateHandler OnUpdateStatus; 

    public void Run() 
    { 
     OnUpdateStatus("Updated"); 
    } 
} 

あなたは、あなたがビジネスの内側の巨大なメソッドを持って言及していcomemnts、およびビジネスメソッドがまだ処理が終わっていないときにGUI上でいくつかの情報を表示する必要がありますから。

これはスレッドに関するものです。上記の例では動作しますが、実際のスレッドが作業を行うのに忙しいのでUIが更新されないことがあります。バックグラウンドタスクが発生している間、UIがロックアップすることさえあります。

mulitpuleスレッドと上記のaprachを使用すると、別のスレッドでUIを更新できないという問題が見つかります。

background worker threadは、2番目のスレッドで作業を行うことでこの問題を回避しますが、イベントはメインのUIスレッドに戻ります。これにより、UIが喚起され更新されます。

public partial class Form1 : Form 
    { 
     private BackgroundWorker _backgroundfWorker; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      _backgroundfWorker = new BackgroundWorker(); 
      _backgroundfWorker.ProgressChanged += OnUpdateStatus; 
      _backgroundfWorker.DoWork += backgroundWorker1_DoWork; 
      _backgroundfWorker.WorkerReportsProgress = true; 
      _backgroundfWorker.RunWorkerAsync(); 
     } 

     private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) 
     { 
      var b = new ProjectB(); 
      b.OnUpdateStatus += ProjectBOnUpdateStatus; 
      b.Run(); 
     } 

     private void ProjectBOnUpdateStatus(string message) 
     { 
      _backgroundfWorker.ReportProgress(0, message); 
     } 

     private void OnUpdateStatus(object sender,ProgressChangedEventArgs progressChangedEventArgs) 
     { 
      MessageBox.Show(progressChangedEventArgs.UserState.ToString()); 
     } 
    } 
+0

はい、プロジェクトBはプロジェクトを見ることができません。 –

+0

プロジェクトAはBを参照しています。つまり、イベントで必要なのはすべてです。私はあなたが見ることができるようにコード例を追加しました。 – John

+0

私は考えを持っています。多くのお礼ありがとうございます。 –

1

クラスライブラリは、ユーザーコントロールとフォームを含むアセンブリを参照しないでください。それは別の方法です。 WinFormsのコントロールとライブラリ間のメッセージングは​​、通常、イベントやコマンドを使用して行われます。あなたは間違いなくform1.ErrorMessage = "Something bad happened"のようなコードをクラスライブラリに持つべきではありません。

私はビジネスの内側の巨大なメソッドを持って、ビジネスメソッドが処理

まだ終わっていないときに私はGUI上のいくつかの情報を表示する必要がある、あなたはReportProgressイベントを作成したり、何で進行状況を表示するためにGUIからサブスクライブすることができます。

関連する問題

 関連する問題