2017-02-19 4 views
0

クラスの複数のオブジェクトを作成し、それらを1つのフォームで編集し、それらのオブジェクトを複数のフォームで使用したいとします。うまくいけば、以下のコードは問題を強調表示しようとします。C#複数のフォームで使用するためのクラスのグローバルオブジェクトの作成

私はForm1の上で、このような...

public class Player 
{ 
     public string name; 
     public int goals;   
} 

としてクラスを作成し、私はトムとダンを作成し、押されたときに彼らの目標数を増加させるボタンが追加されました。

public partial class Form1 : Form 
{ 

    Player tom = new Player() 
    { 
     name = "Tom", 
     goals = 5 
    }; 

    Player dan = new Player() 
    { 
     name = "Dan", 
     goals = 7 
    }; 

    public void UpdateForm() 
    { 
     label1.Text = tom.name; 
     label2.Text = dan.name; 
    } 


    public Form1() 
    { 
     InitializeComponent(); 
     UpdateForm(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     tom.goals += 1; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     dan.goals += 1; 
    } 
} 

次に、form2に名前と新しい目標数を表示したいと考えています。私が持っている問題は、それらのオブジェクトがそのコンテキストに存在しないということです。

{ 
public partial class Form2 : Form 
{ 
     public void UpdateForm2() 
    { 
     label1.Text = tom.name; 
     label2.Text = tom.goals; 
     label3.Text = dan.name; 
     label4.Text = dan.goals; 
    } 


    public Form2() 
    { 
     InitializeComponent(); 
     UpdateForm2(); 
    } 
} 
} 

これらのオブジェクトをグローバルにしてフォーム間で編集できるようにするにはどうすればよいですか?私は答えを見つけようとしましたが、このユースケースにかなり一致するものは見つかりませんでした。私は助けとアドバイスを感謝します。

+0

'Form2'は' Form1'によって表示されます、 'Form1'コードのどこかで' Form2'のインスタンスを作成して表示していますか?フォームはどのように関連していますか?彼らは両方とも同時に表示されているか、どちらかが他の人に電話をかけているのですか、それとも独立して両方を起動している3番目のクラス/フォームがありますか? – pstrjds

答えて

0

List<Person>を保持するサービスクラスが必要なようです。そして、あなたの2つのフォームが同じサービスのインスタンスを共有するようにしてください。または、怠惰なオプションは、サービスを静的クラスにすることです。

更新

また、サービスでObserverパターンの実装を検討できます。あなたは、名前空間の概念を把握しておく必要があり

http://www.dofactory.com/net/observer-design-pattern

+0

私はそれを静的なクラスにすると、別のフォームの値を編集できないというわけではありませんか?提案していただきありがとうございます、私はそれを行ってみましょう! –

+0

異なるフォームで編集できないようにする必要はありません。 –

0

。 1つのフォームの名前空間にオブジェクトを作成すると、その特定のフォームを参照せずにその特定のオブジェクトを使用することはできません。

これまでのところ、オブジェクトplayerの2つのインスタンスをform名前空間に作成しました。しかし、それはform2名前空間にはありません。したがって、あなたはそのエラーを取得しています。

あなたは、一般的に値を更新するために、子ウィンドウのメソッドを呼び出すように

  • として更新するのに使用される多くのメソッドを使用することができます。
  • メディエーターを使用する
  • イベントリスナーを値の変更時にform2に追加します。

オブジェクトインスタンスまたは静的オブジェクトのグローバルインスタンスを使用することはベストプラクティスではありません。

0

2番目のフォームのコンストラクタでプレーヤーのリストを渡すことができます。

0

はい、データを新しい形式で転送する必要があります。 Meybe パラメータをForm2 コンストラクタパラメータに送信するか、form2設定メソッドを使用してください。例については

 private readonly Player _tom; 
     private readonly Player _dan; 

    public Form2(player tom, player dan) // or use List<Player> parameter 
     { 
      InitializeComponent(); 
      _tom = tom; 
      _dan = dan; 
     } 

別の方法

//にForm2.cs

private Player _tom; 
private Player _dan; 

public void SetPalyers(Player tom, Player dan) 
{ 
    _tom = tom; 
_dan = dan; 
} 
1

あなたForm1クラスは他のクラスのようなものです。プロパティを導入Form2

public partial class Form1 : Form 
{ 
    public Player Tom { get; private set; } 
    public Player Dan { get; private set; } 

    this.Tom = new Player() 
    { 
     name = "Tom", 
     goals = 5 
    }; 

    this.Dan = new Player() 
    { 
     name = "Dan", 
     goals = 7 
    };  

    // The rest of your code 
} 

あなたは、このような第二のフォームを表示する前に(あなたの最初のフォームでこのコードを入れて)そのプロパティを設定し
public partial class Form2 : Form 
{ 
    public Form1 CallingForm {get; set;} 
    public Form2() 
    { 
     InitializeComponent(); 
     UpdateForm2(); 
    } 
} 

をので、あなたはそれで2つのプロパティを作成することができます:

Form2 f2 = new Form2(); 
f2.CallingForm = this; 

は、次に第二の形式で、あなたはこのように選手にアクセスすることができます。

label1.Text = CallingForm.Tom.name; 

多くのプレイヤーがいる場合は、代わりにList<Player>プロパティを作成してください。代わりに、公共の場、使用特性の.NETの命名規則次

他のいくつかの注意事項

してみてください。プロパティは、データバインディングとカプセル化、検証に使用でき、その他の利点もあります。

public class Player 
{ 
    private int goals; 
    public string Name {get; set;} 
    public int Goals 
    { 
     get { return this.goals; } 
     set 
     { 
      if (value < 0) 
      { 
       throw new ArgumentException("Goals cannot be less than 0."); 
      } 
      this.goals = value; 
     } 
    }  
} 
+0

@HüseyinBurakKaradagごめんなさいあなたの質問を理解できません。 – CodingYoshi

+0

データの問題にアクセスしたり転送したりする質問がありました。あなたの答えはform1です。データの問題を移動するためにフォーム全体を呼び出すべきではありません。私はそれが転送操作のための全体のフォームを継承する正しい方法ではないと思う –

+0

@HüseyinBurakKaradagそれは使用する技術です。したがって、フォーム参照や個々のプロパティや別のカスタムタイプを共有するかどうかを決めることができます。 – CodingYoshi

0

カプセル化について考えてみましょう。 Form2は、Form1に含まれているため、インスタンス化されたクラスオブジェクトにアクセスできません。あなたは次のように記述

label1.Text = tom.name; 

コンパイラはオブジェクトForm2.tomを探しているが、それは存在しません。あなたがそうのように、どこを見れにそれを指示する必要が

Form1接頭辞を使用せずに、すべての選択したクラスに、これらのオブジェクトを利用できるようにするに

label1.Text = Form1.tom.name; 

、選択したクラスはForm1のサブクラスでなければならないであろう。それ以外の場合は、前に説明した方法でそれらを参照する必要があります。

関連する問題