-5

いくつかのボタン、テキスト ボックス、ラベルなどを含むメイン フォームがあります。2 番目のフォームでは、メイン フォームのテキスト ボックスから 2 番目のフォームにテキストをコピーしたいと考えています。

試しました:

var form = new MainScreen();
TextBox tb= form.Controls["textboxMain"] as TextBox;
textboxSecond.Text = tb.Text;

しかし、それは例外を引き起こすだけです。メイン画面のテキストボックスが初期化され、テキストが含まれています。カーソルを合わせると、formすべてのコントロールが表示されます。

私は何を間違っていますか?

4

2 に答える 2

1

フェニックスリボーンは正しいです。問題は、新しい MainScreen を作成していることです。つまり、新しいコントロールが作成されるため、フォーム コンストラクターでコントロール内のテキストが初期化されない限り、それらは空になります。通常、これを処理する方法は、次のように、最初のフォーム インスタンスを 2 番目のフォームに渡すことです。

SecondForm second = new SecondForm(this);

2 番目の形式では、次のようになります。

public SecondForm (MainForm form)
{
    // do something with form, like save it to a property or access it's controls
}

そうすれば、2 番目のフォームは最初のフォームのコントロールにアクセスできます。使用する必要があるプロパティを公開することを検討してください (デザイナーのプロパティ ペインで)。そうすれば、ただ行うことができますform.textboxMain.Text

于 2013-01-12T18:55:56.100 に答える
1

元のコードを見ると、取得している の潜在的な理由が 2 つありNullReferenceExceptionます。まず、tbあなたが提供するコードで定義されていないので、それが何であるかわかりません。

第 2 に、コントロールが見つからない場合、またはではない場合にTextBox textbox = form.Controls["textboxMain"] as TextBox返すことができます。デフォルトでは、コントロールはアクセサーでマークされているため、メンバーに戻ると思われます。nullTextBoxprivateform.Controls[...]nullprivate

コントロールを としてマークすると、internalこの問題が解決される可能性がありますが、この状況に対処するための最善の方法ではなく、将来のコーディング習慣の低下につながるだけです。privateコントロールのアクセサーはまったく問題ありません。

フォーム間でデータを共有するより良い方法は、publicプロパティを使用することです。たとえば、TextBoxメイン画面に がusernameTextBoxあり、それを他のフォームに公開したいとします。

public string Username
{
  get { return usernameTextBox.Text; }
  set { usernameTextBox.Text = value; }
}

次に、コードで行う必要があるのは次のとおりです。

var form = new MainForm();
myTextBox.Text = form.Username; // Get the username TextBox value
form.Username = myTextBox.Text; // Set the username TextBox value

このソリューションの優れた点は、プロパティを介してデータを保存する方法をより適切に制御できることです。アクションgetsetは、ロジックを含めたり、複数の値を設定したり、検証を実行したり、その他のさまざまな機能を実行したりできます。

WPFを使用している場合は、 MVVMパターンを調べることをお勧めします。オブジェクトの状態で同様のことができるからです。

于 2013-01-12T19:18:39.117 に答える