2017-05-23 20 views
0

私はc#とVisual Studioを使用しています。私は別のフォームから変数にアクセスしたい。Visual Studioで別のフォームから変数にアクセスするには#

textBox1.Text = form22.textBoxt17.Text; 

しかし、私はtextBox値にアクセスしたくないので、変数にアクセスしたいだけです。私はこれを試した:

string myVar1 = Form2.myVar2; 

しかし、それは動作しません。

助けが必要ですか?

更新 これは私が今持っているものである:(変数が配置されている)formLoginで

 private string _firstName = string.Empty; 
     public string firstName 
     { 
      get 
      { 
       return _firstName ; 
      } 
      set 
      { 
       if (_firstName != value) 
        _firstName = value; 
      } 
     } 

を、ちょうどpublic partial class formLogin : Form

の下に続いて、後のコードでは、上のボタンの内側にクリックイベント:

私はこれをフォームに書き込みます(アクセスしたい場所から) formLoadイベントで変数):

 formLogin fli = new formLogin(); 
     lblName.Text = fli.firstName;    

このすべての問題はformAntonymsが開いたとき、lblNameではなく、ユーザー名を表示するので、まだ空である、ということです。私は間違っています。私はすべてのステップを正しく行っています...

+0

正確には動作しません。エラーメッセージはありますか? – Codor

答えて

1

あなたは正しいパスにいるので、コントロールや変数をクライアントコードに直接公開しないでください。

はあなたから値を読みたい形/クラスで読み取り専用のプロパティを作成します。

//Form2.cs 
public string MyVar{get{ return textBoxt17.Text;}} 

次に、あなたすでにロードForm2フォームクラスのインスタンス変数をform22されています。

string myVal = frm22.MyVar; 

EDIT:次に、それへの参照を持っている任意のクライアントコードから、あなたがプロパティの値読み取ることができ、あなたの最後のコメントに

[OK]をベースに、あなたはFlorm1内の変数を持っていますそしてForm2をからアクセスしたい、原理は前の例と同じであるが、代わりにコントロールプロパティをさらすことになりましたプライベート変数を露出させ、その代わりのForm2での生活、それは今のForm1に住んでいる:

//Form1.cs 
private string _myVar = string.Empty 

public string MyVar 
{ 
    get 
    { 
     return _myVar ; 
    } 
    set 
    { 
     if(_myVar != value) 
      _myVar = value; 
    } 
} 

tyは現在読み取り/書き込み可能なので、クライアントコードからその値を更新できます

+0

@スティーブ、あなたの提案に応じて編集。 –

+0

私はreturn textBox17.Text部分まですべてを取得します。しかし、それは私のせいです、私はよく説明していません。私は任意のtxtBoxまたはラベルまたはボタンに関連付けられていない変数にアクセスしたい、それはコード内にあるが、Form1.csで宣言されている。そして私はForm2.csからアクセスしたいと思います –

+0

私がここで見つけたものの例として、textBox17の最初のコードを挙げました。誰もがtextBox17の値にアクセスする方法を尋ねているので、宣言され定義されたフォームに表示されない変数にアクセスしたい。 @ E-bat –

0

まず、クラスから変数に直接アクセスするのはオブジェクト指向の設計が悪いです。メンテナンス性と再利用性が低下します。

オブジェクトの機能が明確でないため、問題が発生します。

「この変数の値を欲しい」という考え方ではなく、「あなたがform22を持っているとします。

明らかに、サイズや位置、その他多くのものがあります。フォームには表示される情報があり、このフォームのユーザーは表示された情報のテキストを知りたいと考えています。

表示される情報の名前がMyInformationであるとします。情報の説明のみを表示できることに注意してください。この記述テキストは情報そのものではありません。フォームの

適切なオブジェクト指向設計は

class Form22 : Form 
{ 
    public string MyInformationText {get {return ...; } 
    ... 
} 

は今、あなたはForm22は、いくつかのMyInformationを持っていることをForm22のユーザーに通信していることになります。また、あなたはこの情報を共有する意思がないと伝え、情報の説明文を共有するだけです。さらに、フォームのユーザーはこの情報を変更することはできません。

これは、多くの利点をもたらします。たとえば、TextBoxのテキストをComboBoxに表示したくないとします。それとも、もう表示したくないかもしれません。 MyInformationの記述テキストを必要とするフォームのユーザーは、変更する必要はありません。

もちろん、フォームのユーザーが情報を変更したい場合は、デザインが異なる場合があります。おそらく、それはあなたの情報の表示された説明を変更する必要があることを意味するでしょう。しかし、再び:フォームのユーザーはこれを知る必要はありません。繰り返しますが、これは、ユーザーが変更することなく、それを変更するために、あなたに自由を与える:

public MyInformation SpecialInformation 
{ 
    get {return this.mySpecialInformation;} 
    set 
    { 
     this.mySpecialInformation = value; 
     this.UpdateDisplay(mySpecialInformation); 
    } 
} 

あなたがまだ表示されたテキストかどうかのプロパティを提供するべきである場合には、お使いのモデルによって異なります。世界のすべてのMyInformationオブジェクトが持つべき同じ表示されたテキスト、またはform22の表示されたテキストがform23のMyInformationの表示されたテキストと異なる場合がありますか?これに対する答えは、MyInformationが記述テキストを取得する関数を持つべきか、フォームが記述テキストを取得する関数を持つべきかどうかに影響します。

これは、あなたが考えるべきことを示すための単なる例です。私のオブジェクトはどうすればよいですか?私のオブジェクトのユーザは、自分のオブジェクトで何ができるのでしょうか。あなたができるようにするほど、変更することが少なくなります。必要以上に情報を提供しないと、最大限の柔軟性が得られます。あなたは、はるかに少ない機能性しかテストする必要はありません。

関連する問題