2016-09-02 15 views
1

私のプログラムのメインフォームには、PortOpenerという2番目のフォームを開くボタンがあります。 PortOpenerは、シリアル、GPIB、イーサネット、およびUSBポートを開いて外部機器と通信するように設定されています。 PortOpenerでポートを開くために必要なすべてのデータを選択し、ポートを開くボタンをクリックします。これにより、すべてのポート情報がserialWindowという新しいフォームに渡され、次にserialWindowがポートを開きます。異なるフォームからオブジェクトのインスタンスへのアクセス

serialWindowが作​​成され、データが新しいフォームにどのように渡されるかがここにあります。

private void OpenPortButton_Click(object sender, EventArgs e) 
    { 
     SerialWindow _serialWindow = new SerialWindow(); 
     _serialWindow.Show(); 
     _serialWindow.OpenCom(cboPort.SelectedItem.ToString(), cboParity.SelectedItem.ToString(), cboStop.SelectedItem.ToString(), cboData.SelectedItem.ToString(), cboBaud.SelectedItem.ToString(), NamePortTextBox.Text); 
    } 

ここに、ポートに接続する新しいserialWindowがあります。

public void OpenCom(string port, string parity, string stop, string data, string baud, string PortName) 
    { 
     comm.PortName = port; 
     comm.Parity = parity; 
     comm.StopBits = stop; 
     comm.DataBits = data; 
     comm.BaudRate = baud; 
     comm.DisplayWindow = rxRichTextBox; 
     comm.OpenPort(); 
    } 

ポートが開き、ポートを介してデータを送受信できます。別のCOMポートを選択して、フォームの複数のインスタンスを開くことができます。私はmainFormがserialWindowにデータを渡して送信できるようにしようとしています。

このメソッドを使用してserialWindowからmainFormにデータを渡す方法を知っています。
How to access a form control for another form?

serialWindowsの異なるインスタンスを区別する方法がわかりません。メインフォームがCOM 3を介してデータを送信したい場合、6つのCOMポートがオープンされていれば、それぞれどのように対処しますか?私はそれをすべてに送信して、開いているCOMポートが送信したいCOMポートと一致するかどうかをserialWindowsに確認させるべきですか?助けのための

portOpenerForm

serialWindowForm

おかげ

+0

フォームで考えるのが最善の方法ではないかもしれませんが、私は、開いているすべてのポートとそれに対応するserialWindowインスタンスを追跡しているmainFormsクラスのDictionaryを作成します。 COM3やUSB1などのキーを使用すると、接続を区別できます。接続時に参照を追加し、切断時に参照を削除します。 – Yosh

+0

あなたが取ることができる多くのアプローチがあります。いくつかの異なるオプションについては、重複したマークを参照してください。それでも解決できない場合は、あなたが試したことを明確に示す良い[mcve]を含む新しい質問を投稿し、コードが現在何をしているのかについての詳細な詳細な説明、必要なものその代わりに、そしてあなたがその目標を達成している_特有の問題は何か。 –

+1

Peter Duniho、あなたがトローリングをしているかどうかわからない全体の質問を読むと、私は2つのフォームの間でデータを渡す方法を知っていることがわかりますし、私の質問が重複していると主張している例のリンクを提供しています。私が欲しかったのは、そのフォームの複数のバージョンが開かれたときに正しいフォームに話すことでした。 SteveはApplication.OpenForm.OfTypeを使って答えを解決するのを手助けしました。 – Laggmaster

答えて

0

これは、すべての開いているフォームがApplication.OpenFormsコレクションに格納されていることを知って比較的簡単です。

メソッド内SerialWindowコードでは、文字列型の(例えば)PortNameはと呼ばれるパブリックプロパティを形成

あなたSerialWindowに

public string PortName { get; set; } 

を追加OpenCom

public void OpenCom(string port, string parity, string stop, string data, string baud, string PortName) 
{ 
    this.PortName = port; 
    comm.PortName = port; 
    .... 
    comm.OpenPort(); 
} 

このプロパティを設定しますこの時点で、mainFormはこのパブリックプロパティを見ている特定のSerialWindowを特定できます

もちろん、これはあなたの任意のプロパティに適合させることができるSerialWindow

foreach(SerialWindow frm in Application.OpenForms.OfType<SerialWindow>()) 
{ 
    // If this is a SerialWindow, then it has the property PortName 
    if(frm.PortName == "COM4") 
     ... pass your data to the frm instance 
} 

アプリケーションによって開かれたすべてのフォームのインスタンスが保持され、種類の唯一の形態を見つけているApplication.OpenFormsコレクションのMainFormをあなたのループで10

あなたからチェックしたいと思うmainForm

+1

Application.OpenForms.OfTypeは仕事を完了しました。同じオブジェクトの複数のフォームを区別する方法を示してくれてありがとう。 – Laggmaster

+0

これは悪い答えを避けるためにdownvoteと将来の読者に有用なアドバイスを説明する礼儀の行為です – Steve

+0

何が投票した?私は答えとしてあなたの意見を受け入れ、それを掲示するためにあなたに投票しました。私は表彰台に必要な評判を持っていません。 – Laggmaster

関連する問題