0

たくさんのフォームがあり、いくつかのコンポーネントが別のフォームからいくつかのコンポーネントにアクセスする必要があるアプリを実行しています....リッチテキストボックスを公開して他の場所からアクセスしようとすると、スレッドセーフエラーが表示されます... soそのテキストボックスを静的にして、クラスに属するオブジェクトのみが存在し、このようにアクセスできるようにしました。

Form1.richTextBox.Text    

これは正常に機能しますが、問題は、winformに新しいコンポーネントを追加するたびに、静的オブジェクトが非静的になり、オブジェクトへの直接アクセスがすべてエラーになることです。私の質問は、Visual Studioでコード(デザインコード)の変更を停止するにはどうすればよいですか?または循環依存なしで他のフォームからオブジェクトに安全にアクセスしますか?

4

2 に答える 2

0

String myStaticのような静的要素を作成し、他のフォームからこの要素にアクセスしてみてください。この要素を更新する必要がある場所では、次のような方法を使用します

void UpdateMyStatic() {
myStatic = richTextBox.Text;
}
于 2013-02-21T15:39:00.167 に答える
0

あなたのコメントから「どこか他の場所からアクセスしてみてください、それはスレッドセーフエラーを言います」私は問題がクロススレッド操作であると信じています。それは「どこか別の場所」でバックグラウンド/ワーカースレッドで実行されていますか?すなわち。リッチテキストボックスがインスタンス化されたスレッドではありません。その場合は、InvokeRequiredプロパティをテストする必要があります。MSDNから:「呼び出し元は、コントロールが作成されたスレッドとは異なるスレッド上にあるため、呼び出し元がコントロールへのメソッド呼び出しを行うときに、invokeメソッドを呼び出す必要があるかどうかを示す値を取得します。」

ところで:C#オブジェクト(richtextbox)が表示されていても、それはWindowsハンドルのファサードにすぎません。したがって、VisualStudioの動作は正しいです。コントロールは1つの親(つまりウィンドウ)のみを持つことができます。静的なリッチテキストボックスが必要であると「考える」場合は、デザインを再考する必要があります。

于 2013-02-27T07:37:18.627 に答える