DOBON.NET DOBON.NETプログラミング掲示板過去ログ

自作クラスからフォームのテキストボックスに文字列を入力

環境/言語:[Windows7 C#]
分類:[.NET]

C#でクラスの学習をしています。

フォームに下記のコントロールが配置されています。
■Form(MainForm)。Formのデザインで作成。
■TextBox(inputHere)。(internal)
■Button(click_me)。(private)


別で、新しい項目の追加で、クラス(HandleMainForm)を作成しました。

click_meを押下した時の処理は下記になります。
this.inputHere.text = "こんにちは";

この処理を外のクラスに出したいと思っています。
そこで下記のコードを書きました。

※MainFormのclick_me押下時

HandleMainForm handlemain = new HandleMainForm();
handlemain.handleText();

追加したClassファイル
Class HandleMainForm{
public void handleText()
{
MainForm mainf = new MainForm();
mainf.inputHere.text = "こんにちは";
mainf.update();
}
}

しかしながら、上記のコードではinputHereテキストボックスには何も表示されませんでした。
既にMainFormのインスタンスはできているので、
mainf.inputHere.text = "こんにちは"; ⇒MainForm.inputHere.text = "こんにちは";
としてもダメでした。

この処理を実現するにはどうしたらよいでしょうか?
返信したら、元投稿が消えていて焦りました。(^_^;)

■No32113 改め No32114 に返信(omniさんの記事)
> click_meを押下した時の処理は下記になります。
> this.inputHere.text = "こんにちは";
 this.inputHere.Text = "こんにちは";
の間違いでは?


> Class HandleMainForm{
> public void handleText()
> {
> MainForm mainf = new MainForm();
> mainf.inputHere.text = "こんにちは";
> mainf.update();
> }
> }
Class ではなく class ですし、text ではなく Text ですし
update ではなく Update だとは思いますが、それはさておき。

上記は、(既存のフォームとは別に)新たに MainForm フォームを生成し、
そのフォームを表示(Show/ShowModal)することなく、
inputHere にセットするコードですね。

> しかしながら、上記のコードではinputHereテキストボックスには何も表示されませんでした。
既存の MainForm とは別の、非表示の MainForm に表示するコードですし。


> この処理を実現するにはどうしたらよいでしょうか?
class HandleMainForm
{
 MainForm owner;
 public HandleMainForm(MainForm owner) { this.owner = owner; }
 public void handleText() { this.owner.inputHere.Text = "こんにちは"; }
}

などのように、処理対象のフォームをクラス側に教えておく必要があります。
使うときはこんな感じ。

HandleMainForm handlemain = new HandleMainForm(this); // 既存フォームを引数に渡す
handlemain.handleText();


もしくは(あまり望ましくは無いですが)、OpenForms で辿るとか。

class HandleMainForm
{
 public void handleText()
 {
  var f = Application.OpenForms.OfType<MainForm>().FirstOrDefault();
  if(f != null) f.inputHere.Text = "こんにちは";
 }
}
魔界の仮面弁士さん

ご回答ありがとうございました。
一度目の投稿した直後にコードに誤りがあり、一旦削除をして投稿しなおしました。
ご迷惑おかけして申し訳ありませんでした。

>Class ではなく class ですし、text ではなく Text ですし
>update ではなく Update だとは思いますが、それはさておき。

ケアレスミス、ちょっと恥ずかしいです^^;気をつけます。

>public HandleMainForm(MainForm owner) { this.owner = owner; }

thisを使って、Formの参照先を自作のクラスに教えてあげる必要があるんですね。
理解できました!

OpenFormsでのやり方は、まだ私には理解できないので、こちらはお教え頂きましたコードを元に調べてみます。
重ね重ね、ありがとうございます。

■No32116に返信(魔界の仮面弁士さんの記事)
> 返信したら、元投稿が消えていて焦りました。(^_^;)
>
> ■No32113 改め No32114 に返信(omniさんの記事)
>>click_meを押下した時の処理は下記になります。
>>this.inputHere.text = "こんにちは";
>  this.inputHere.Text = "こんにちは";
> の間違いでは?
>
>
>>Class HandleMainForm{
>>public void handleText()
>>{
>>MainForm mainf = new MainForm();
>>mainf.inputHere.text = "こんにちは";
>>mainf.update();
>>}
>>}
> Class ではなく class ですし、text ではなく Text ですし
> update ではなく Update だとは思いますが、それはさておき。
>
> 上記は、(既存のフォームとは別に)新たに MainForm フォームを生成し、
> そのフォームを表示(Show/ShowModal)することなく、
> inputHere にセットするコードですね。
>
>>しかしながら、上記のコードではinputHereテキストボックスには何も表示されませんでした。
> 既存の MainForm とは別の、非表示の MainForm に表示するコードですし。
>
>
>>この処理を実現するにはどうしたらよいでしょうか?
> class HandleMainForm
> {
>  MainForm owner;
>  public HandleMainForm(MainForm owner) { this.owner = owner; }
>  public void handleText() { this.owner.inputHere.Text = "こんにちは"; }
> }
>
> などのように、処理対象のフォームをクラス側に教えておく必要があります。
> 使うときはこんな感じ。
>
> HandleMainForm handlemain = new HandleMainForm(this); // 既存フォームを引数に渡す
> handlemain.handleText();
>
>
> もしくは(あまり望ましくは無いですが)、OpenForms で辿るとか。
>
> class HandleMainForm
> {
>  public void handleText()
>  {
>   var f = Application.OpenForms.OfType<MainForm>().FirstOrDefault();
>   if(f != null) f.inputHere.Text = "こんにちは";
>  }
> }
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板