2016-11-02 5 views
1

私はC#のVisual Studio 2015でフォームアプリケーションを構築しています。まず、2つのテキストボックスと1つのボタンを使用してユーザーログインフォームを作成しました。私がしたいのは、ユーザー名を含むテキストボックスからMainMenuという別のフォームにあるラベルに値を渡すことだけです。これは私がログインフォームに作られたボタンの私のコードです:フォームに値を渡すC#

private void button_login(object sender, EventArgs e) 
{ 
    MainMenu username = new MainMenu(); 
    username.Value1 = textBox1.Text; 
    this.Hide(); 
    MainMenu ss = new MainMenu();     
    ss.Show(); 
} 

と私は値を渡したいのMainMenuフォームのコードは次のとおりです。

private string value1 = string.Empty; 
    public string Value1 
    { 
     set { value1 = value; } 
     get { return value1; }    
    } 
    private void MainMenu_Load(object sender, EventArgs e) 
    { 
     label7.Text = Value1; 
    } 

あなたが見ることができるように私は、MainMenuフォームの中に直接textbox1から値を転送できるように、ログインフォームからアクセス可能なMainMenuフォームのプロパティを作成しています。問題は、label7のテキストが実行時に空のままで、なぜ私が理解できないかということです。私のコードから何かを見逃しているのですか、まったく間違っていますか?

+1

'MainManu'に' Value1'プロパティを設定しましたが、それ以降は 'MainMenu'を新しく作成するのはなぜですか? – Pikoh

答えて

1

のようなものでなければなりません。 Value1usernameに設定しましたが、Value1を設定していないssが表示されます。だから、usernameが表示されるはずです:

private void button_login(object sender, EventArgs e) 
{ 
    MainMenu username = new MainMenu(); 
    username.Value1 = textBox1.Text; 

    this.Hide(); 
    username.Show(); // and not ss.Show(); 
} 

また、チップは、あなたの変数のためのより良い名前を使用します。以下のコードはまったく同じことを行うが、はるかに分かりやすいです。

private void loginButton_Click(object sender, EventArgs e) 
{ 
    var mainMenuForm = new MainMenu(); 
    mainMenuForm.UserName = userNameTextBox.Text; 

    this.Hide();   
    mainMenuForm.Show(); 
} 

class MainMenu : Form 
{ 
    // This is an "Auto-Implemented Property". 
    // Auto-Implemented Properties are used as a shortcut of what you have done. 
    // Google them for more information. 
    public string UserName { get; set; } 

    private void MainMenu_Load(object sender, EventArgs e) 
    { 
     userNameLabel.Text = UserName; 
    } 
} 
1

MainMenu usernameMainMenu ssは2つの異なるインスタンス(同じMainMenuクラスですが、詳細です)です。 メンバ変数Value1usernameインスタンスに設定していますが、ssインスタンスが表示されています。 usernamess:あなたは二つの異なるメインメニューのオブジェクトを使用している

private void button_login(object sender, EventArgs e) 
{ 
    MainMenu username = new MainMenu(); 
    username.Value1 = textBox1.Text; 
    this.Hide(); 
    usename.Show(); 
} 
+0

お返事いただきありがとうございました。返信は –

1

このコードを考えてみましょう 、右のコードでは、あなたは、実際には2つのフォームを作成

MainMenu username = new MainMenu(); 
    username.Value1 = textBox1.Text; 
    this.Hide();    
    username .Show(); 
+0

ありがとうございました。返信ありがとうございました。結局のところ、 –

1

ただ、問題とは全く異なるアプローチとして:別のオプションは、いずれかを収容するプロジェクト内の静的クラスを作成することです

再利用したい変数。

あなたの静的クラスがグローバル変数と呼ばれるようにするには、成功したログイン後に必要な変数、つまりGlobals.Username = textBox1.Textを設定します。

その後、この値を再度必要とする場合は、Globals.Usernameを使用してアクセスできます。

+0

です。この音は非常に便利です。 –

+0

私はこれを悪い解決策と考えています。変数のスコープが小さければ小さいほど、コードを維持しやすくなります。そして、静的クラスは実際にはグローバル変数です –

+0

これは私が今までに見つけた最も簡単な方法なので、私のソリューションの最良の選択肢は何でしょうか? – ThatChris

1

可変値をあるフォームから別のフォームに渡す必要がある場合は、それに応じて2番目のフォームのコンストラクタを記述し、2番目のフォームのオブジェクトを作成する際に値を渡します。

private void button_login(object sender, EventArgs e) 
{ 
    MainMenu ss= new MainMenu(textBox1.Text); 
    this.Hide();    
    ss.Show(); 
} 

class MainMenu : Form 
{ 
    // This is an "Auto-Implemented Property". 
    // Auto-Implemented Properties are used as a shortcut of what you have done. 
    // Google them for more information. 
    public string UserName { get; set; } 

    private void MainMenu(string userName) 
    { 
     this.UserName = userName; 
    } 
} 

公開プロパティを作成し、クラスの各インスタンスごとに別のクラスにアクセスすることは、OOPの悪い習慣です。

関連する問題