2011-07-10 6 views
0

解決済み:ビジュアルスタジオの問題であることが判明しました。閉鎖されたビジュアルスタジオ、清掃され、再建され、値は表示を開始しました。助けてくれてありがとう、私はVS2010に切り替える必要があると思う。公開テキストボックスを使用したフォーム間の値の受け渡し

これは、フォーム間で値を渡すのに最適で安全な方法ではないかもしれませんが、これは私がその時点で試みている方法です。だから、私がこの方法で働くのを助けてください。 の後に回答を提供すると、より良いやり方を追加することができます。

問題は、モーダルダイアログボックスを閉じて所有者に戻ったときに、モーダルのテキストボックス値が実際の値ではなく空の文字列であることです。私はいくつかの場所でこれを読んだことはありません。データはモーダルボックスが破棄された後でも保持されるはずです。ここに私のコードです。

public partial class PreferencesForm : Form 
{ 

    public PreferencesForm() 
    { 
     InitializeComponent(); 
    } 

    private void okButton_Click(object sender, EventArgs e) 
    { 
     if (masterRadioButton.Checked == true) 
     { 
      if (password1TextBox.Text != password2TextBox.Text) 
      { 
       errorLabel.Text = "Passwords do not match, please re-enter both passwords and try again."; 
       this.Refresh(); 
      } 
      else if (password1TextBox.Text == "" && password2TextBox.Text == "") 
      { 
       errorLabel.Text = "You must enter a password."; 
      } 
      else 
      { 
       okResultButton_Click(null, null); 
      } 
     } 
     else if (singleRadioButton.Checked == true) 
     { 
      okResultButton_Click(null, null); 
     } 
    } 

    private void cancelButton_Click(object sender, EventArgs e) 
    { 
     this.DialogResult = DialogResult.Cancel; 
     this.Dispose(); 
    } 

    private void okResultButton_Click(object sender, EventArgs e) 
    { 
     // invisible button 
     this.DialogResult = DialogResult.OK; 
     this.Dispose(); 
    } 

ここでは、上記のフォームをモーダルダイアログボックスとして呼び出すコードを示します。

private void setPreferencesToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     PreferencesForm pf = new PreferencesForm(); 
     DialogResult result = pf.ShowDialog(); 
     if (result == DialogResult.OK) 
     { 
      if (pf.password1TextBox.Text != "") 
      { 
       masterPassword = pf.password1TextBox.Text; 
      } 
      else 
      { 
       masterPassword = null; 
      } 
     } 
    } 

ありがとうございます。私はここでかなり不満を感じています。 > :(

注:password1TextBox変数のReadOnlyプロパティが正しく、私は、モーダルフォームで選択した内容に応じて、真または偽として示されているが、テキストプロパティは、まだ正しく表示されません

+0

ダイアログフォームでDispose()を呼び出すことが正しくありません。 DialogResultプロパティを割り当てることで、ダイアログを閉じることができます。フォームインスタンスを削除するには、メインフォームの* using *ステートメントを使用する必要があります。 –

答えて

0

私はコントロールが配置された後Disposeも。それが含まれているコントロールを配置します、テキストはどちらかの有効なもはやそうではないことを推測している。むしろDisposeよりCloseを試して、呼び出し元でDispose

+0

質問の最後にマイノートを読むと、ReadOnlyプロパティが正しく表示されますが、テキストは表示されないため、何か間違っている可能性があります。 – CODe

+0

@CODe:テキストボックスの 'Dispose'は、参照されているリソース(テキストなど)を解放してしまう可能性があります。'ReadOnly'はおそらくヒープ上のどこかではなくテキストボックスに格納されています。 'Text'にアクセスしようとすると、それは解放されたことに気付き、空文字列を返します。 (再び、私はこれについてはわかりませんが、起こっている可能性があります。) – icktoofay

0

あなたがすべきthを聞くあなたの質問に答える人々。 Disposeは割り当てられたメモリをクリアするはずですが、ReadOnlyプロパティを取得できるかどうかは関係ありません。

フォームでDisposeを呼び出さないで、ShowDialogメソッドのドキュメント(http://msdn.microsoft.com/en-us/library/c7ykbedk.aspx#Y851)のサンプルコードのように、呼び出しコードからdisposeを呼び出します。 Disposeは、testDialog変数がスコープから外れる直前に呼び出されることに注意してください。

私はただの文字列プロパティにあなたのダイアログのコントロールの文字列を保存し、ダイアログを閉じた後、その クラスプロパティの値なく コントロールのプロパティ値を取得し、約 Disposeかを心配停止提案
public void ShowMyDialogBox() 
{ 
    Form2 testDialog = new Form2(); 

    // Show testDialog as a modal dialog and determine if DialogResult = OK. 
    if (testDialog.ShowDialog(this) == DialogResult.OK) 
    { 
     // Read the contents of testDialog's TextBox. 
     this.txtResult.Text = testDialog.TextBox1.Text; 
    } 
    else 
    { 
     this.txtResult.Text = "Cancelled"; 
    } 
    testDialog.Dispose(); 
} 
0

ではなく、Disposeなどです。

希望する

関連する問題