2016-08-13 5 views
0

私は、ゲームで発生する特定のイベントをログに記録できるC#アプリケーションを用意しています。簡単にするために、私はそれらをParentFormChildFormと呼ぶでしょう。C#新しいインスタンスを持たないフォーム間を通過する特定の値

ParentFormは、一般的なイベントを記録するために99%の時間が使用されます。これは、ユーザがPictureBoxをクリックし、PictureBoxTagプロパティがListBoxに追加されたことで表されます。 「希少な」イベントが発生すると、ユーザーはの「ログのまれなイベント」ボタンをクリックしてChildFormを開き、「希少イベント」のセットPictureBoxesを開きます。これはParentFormと同じです。課題は、これらの一般的なイベントと希少なイベントを同じListBoxに記録することです。そのため、PictureBoxのクリック(この後TagからPictureBoxへ)のChildFormからListBoxへのParentForm 。

ParentFormではなく、であり、ChildFormは開いており、開いたままにする必要があります。 ParentFormコードで

、私はすでにPictureBoxクリックのいずれかをキャプチャするために必要なコードとTagをつかむだけでなく、ListBoxに追加扱う取り扱いを持っているので、私がちょうど使うことができればいいと思いますこれら。

// This file is EventLogger.cs 
using rareEvent; 
namespace mainWindow { 
    public partial class EventLogger : Form { 
     // In the ParentForm (listeners for PictureBox clicks are handled elsewhere) 
     public void pictureBox_Click(object sender, EventArgs e) { 

      PictureBox pbSender = (PictureBox) sender; 

      // Open new window and handle "rare" drops 
      if (pbSender.Tag.ToString() == "rare") { 

       // Open rare form 
       EventLogger.RareForm rare = new EventLogger.RareForm(); 
       rare.Show(); 
      } 
     } 
    } 
} 

、ここでは、子供の::ここで

私は親のためにこれまでに試したものだ

// This file is Rare.cs 
using EventLogger; 
namespace rareEvent { 
    public partial class rareEventForm : Form { 

     // In the ChildForm 
     private void pictureBox_Click(object sender, EventArgs e) { 

      // Does not compile if form is not instantiated, but I do not 
      // want a new instance 
      EventLogger form; 
      form.pictureBox_Click(sender, e); 
     } 
    } 
} 

私はこのような何かが働くと考えましたが、それは誤り

を与える
The type or namespace name 'EventLogger' does not exist in the namespace 
'mainWindow' (are you missing an assembly reference?) 

ご協力いただければ幸いです。私がフォームの間を通る価値の発見した他のすべての例はすべて、私が欲しくない、または8歳で​​あって動作しなかった新しいインスタンスを作成するようです。

ありがとうございます!

編集:各ファイルにusing <namespace>というコードが追加されました。両方の形式の間で値を送信できないという問題は依然として存在しますを使用せずにnewを使用します。 (this答えを参照してください)

+0

インスタンスを使用して2つのフォーム間で引数を渡す必要がありますが、インスタンスを閉じる必要はありません。 2つのフォームプロジェクトを参照してください。私が5年以上前に開発したこのコードを使用している人がたくさんいます。他の専門家も私のコードを推奨しています:https://msdn.microsoft.com/en-us/library/w89fhyex(v=vs.110).aspx。私はどんな追加の質問にも答えてうれしいです。 – jdweng

+0

あなたが正しいことをリンクしているかどうかわからない - そのリンクはソケットに行き、 'two form project'については何も言われていない。 – Sej

+0

あなたの正しい。このリンクは、TCP上での異なる投稿に対する応答でした。ここに正しいリンクがあります:http://stackoverflow.com/questions/34975508/reach-control-from-another-page-asp-net – jdweng

答えて

1

最初のフォームでは、ここで私のform1のようなインスタンスを作成します。それは静的でなければならず、アクセスするすべてのデータ型はパブリックでなければなりません。

//FORM1 
public partial class Form1 : Form 
{ 
    //Instance of this form 
    public static Form1 instance; 

    //For testing 
    public string myProperty = "TEST"; 

    //Assign instance to this either in the constructor on on load like this 
    public Form1() 
    { 

     InitializeComponent(); 
     instance = this; 
    } 
    //or 
    private void Form1_Load(object sender, EventArgs e) 
    { 
     //Assign the instance to this class 
     instance = this; 
    } 

次に、Form2でEventLogger.RareForm rare = new EventLoggerを呼び出すとき。RareForm();代わりに新しいフォームの

EventLogger.RareForm rare = EventLogger.RareForm.instance 

それとも私の場合には

Form1 frm = Form1.instance; 

をやる私はそのように

Console.WriteLine(frm.myProperty); 

出力は、 "テスト"

だったようなのForm2からフォーム1のプロパティをチェック

何か問題があります。

+0

パーフェクト。 'インスタンス'ビットは私が必要としていたすべてでした。どうもありがとうございます!! – Sej

+0

私の最初の質問に喜んで答えてください –

+0

素晴らしいです:) – Sej

関連する問題