プロが教えるわが家の防犯対策術!

他クラスから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"部分がエラー
}
}
この後、複数のスレッドを定義し、走らせている
  それらのスレッドで上記の共通テキスト表示メソッドを利用している
}

A 回答 (2件)

>> formObject.textDisplay(text) //この行の"textDisplay"部分がエラー



formObjectがObjectの参照型なので、textDisplayなんてメンバが無いからエラーになっているのです。Form1の参照だとコンパイラが分からないとエラーになります。

((Form1)formObject).textDisplay(text)

のようにキャストで正しい型を示すか、最初からformObjectをForm1の参照型として作っておくかすればOKだと思います。
    • good
    • 1
この回答へのお礼

度重なる幼稚な質問にご丁寧なお答えを頂きまして誠にありがとうございました。ご指摘の様にキャストすることで無事にコンパイルをパスすることができました。C#を始めてから3ヶ月くらいで知識としてキャスト機能は知っていたのですが、全く応用能力が欠けており思い付きませんでした。恥ずかしく思っております。今後も何かとご迷惑な質問をするかも知れませんが、どうかその折にはよろしくお願いもうしあげます。本当にありがとうございました。

お礼日時:2010/04/27 21:10

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"部分がエラー
}

補足日時:2010/04/27 15:32
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A