
他クラスからForm1内コントロルの操作方法を教えて(C#プログラミング)
Form1で定義してあるtextBox1のText値を他クラスから操作したいのですが、そのコーディング要領が判らず困っております。どなたか教えてくださいませんか?
我流で下記の様なソース(要点のみ記述、他は省略)を作ってみましたが、コンパイルエラー「'object' に 'textBox1' の定義が含まれておらず、型 'object' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。」がでます。
このエラーメッセージの意味を理解できず、何故Form1オブジェクトが伝わらないのか判らず、どこをどう直せばよいのか途方に呉れております。
以下我流C#ソースの抜粋
delegate void SetTextCallback(string text);
public class Form1 {
通常のForm内コントロールの定義
Object formobj = this;
AAAclass aaa = new AAAclass (formobj);
この後Aclass内の基幹メソッドを走らせる
}
public class AAAclass {
private Object formObject = null;
public AAAclass(Object formobj) {
formObject = formobj;
様々な初期化処理
}
private void textDisplay(string text) {
if (formObject.textBox1.InvokeRequired){ //この行の"textBox1"部分がエラー
SetTextCallback d = new SetTextCallback(textDisplay);
formObject.Invoke(d, new object[] { text }); //この行の"Invoke"部分がエラー
}
else {
formObject.textBox1.Text = text; //この行の"textBox1"部分がエラー
}
}
この後、複数のスレッドを定義し、走らせている
それらのスレッドで上記の共通テキスト表示メソッドを利用している
}
No.2ベストアンサー
- 回答日時:
>> formObject.textDisplay(text) //この行の"textDisplay"部分がエラー
formObjectがObjectの参照型なので、textDisplayなんてメンバが無いからエラーになっているのです。Form1の参照だとコンパイラが分からないとエラーになります。
((Form1)formObject).textDisplay(text)
のようにキャストで正しい型を示すか、最初からformObjectをForm1の参照型として作っておくかすればOKだと思います。
度重なる幼稚な質問にご丁寧なお答えを頂きまして誠にありがとうございました。ご指摘の様にキャストすることで無事にコンパイルをパスすることができました。C#を始めてから3ヶ月くらいで知識としてキャスト機能は知っていたのですが、全く応用能力が欠けており思い付きませんでした。恥ずかしく思っております。今後も何かとご迷惑な質問をするかも知れませんが、どうかその折にはよろしくお願いもうしあげます。本当にありがとうございました。
No.1
- 回答日時:
Form1内のtextBox1の定義はどうなっていますか?
通常のFormデザイナで構築した場合、Form内のコントロールはすべてprivateで宣言されているので、Formの外からはアクセスできません。
原因がprivateならpublicに変えれば済む話ですが、ここを弄るのはプログラミングの作法上良いとは思えません。一般的にはForm1の中でコントロールにアクセス処理を行うメソッドを定義し、これをpublic宣言して外部から呼び出すようにするのがスマートなやり方です。
この回答への補足
他クラスからForm1内コントロルの操作方法を教えて
早速のご回答ありがとうございます。ご回答の趣旨は良く理解できましたので、下記のように変更してみました。しかしながら、クラスForm1のオブジェクトの伝達方法が拙くて、メソッド呼出文で同じコンパイルエラーが発生しまいます。どこで間違えてしまっているのでしょうか?
delegate void SetTextCallback(string text);
public class Form1 {
通常のForm内コントロールの定義
textBox1のアクセス修飾子はprivateのままとし
メソッド"textDisplay"はForm1内に写し、オブジェクト部を"this"に変更
public void textDisplay(string text) {
if (this.textBox1.InvokeRequired){
SetTextCallback d = new SetTextCallback(textDisplay);
this.Invoke(d, new object[] { text });
}
else {
this.textBox1.Text = text;
}
}
Object formobj = this;
AAAclass aaa = new AAAclass (formobj);
この後AAAclass内の基幹メソッドを走らせる
}
public class AAAclass {
private Object formObject = null;
public AAAclass(Object formobj) {
formObject = formobj;
様々な初期化処理
}
この後、複数のスレッドを定義し、走らせている
それらのスレッドでForm1内の共通テキスト表示メソッドを下記要領で利用
formObject.textDisplay(text) //この行の"textDisplay"部分がエラー
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
別のフォームで記述している関数を実行するには?C#
C言語・C++・C#
-
C# 別なフォームへ値を渡す (初心者です)
その他(プログラミング・Web制作)
-
DataGridViewの、選択されている行を取り出したい
Visual Basic(VBA)
-
-
4
DataGridViewの内容をDBに反映する時
Visual Basic(VBA)
-
5
C#「オブジェクト参照が必要です」(初心者)
その他(プログラミング・Web制作)
-
6
DataGridViewでyyyy/MM/dd
Visual Basic(VBA)
-
7
C#テキストボックスの文字を配列にいれてその後表示する
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBA: UserForm.Show で実...
-
End Sub が必要です。
-
ラズパイ上の、pythonのエラー...
-
フォートランのエラーについて...
-
他クラスからForm1内コントロル...
-
特定のPCだけ動作しないVBAマク...
-
教えて下さい
-
エクセルで特定の列が0表示の場...
-
String""から型'Double'への変...
-
UserForm1.Showでエラーになり...
-
Excelのセル値に基づいて図形の...
-
【VB.NET】 パワポ操作を非表示で
-
メッセージボックスのOKボタ...
-
一つのTeratermのマクロで複数...
-
特定文字のある行の前に空白行...
-
TERA TERMを隠す方法
-
配列数式の解除
-
ソース内の行末に\\
-
On ErrorでエラーNoが0
-
【マクロ】【画像あり】4つの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
End Sub が必要です。
-
フォートランのエラーについて...
-
VBでエラー'ActiveX component ...
-
他クラスからForm1内コントロル...
-
対応する関数ヘッダーがありません
-
intel fortranのエラーで困って...
-
フォートラン(fortran)のエラー...
-
クラスに volatile は必要?
-
Excel VABについて 下記記述が...
-
Delphiでif文がうまく書けないです
-
ラズパイ上の、pythonのエラー...
-
Excel VBA: UserForm.Show で実...
-
コンパイルエラー
-
ISLispのsetq関数について教え...
-
C# IEnumerable が IEnumerable...
-
typedef による2重定義
-
構造体のポインタ参照
-
C2065: 'EnumDisplayDevices' :...
-
STL mapでアクセス違反
-
43:syntax error at end of input
おすすめ情報