- PR -

【C#】フォーカスされているコントロールを判定する

1
投稿者投稿内容
あぼしゃん
会議室デビュー日: 2006/02/02
投稿数: 3
投稿日時: 2006-02-02 16:47
はじめまして。
C#のコントロールについての質問です。

作るもの
Form1
  textBox1,textBox2,ButtonA

Form2
textBox1,ButtonB

Form1 の textBox1 もしくは textBox2 を選んで
そのtextBoxに入力できる状態で、ButtonA を押して Form2 を呼び出し
Form2 の textBox1に文字を入力したあとで ButtonB を押したときに、
Form1 の 選んだほうの textBox に Form2 の textBox1 と同じ文字を入れたいのです。

Form2にForm1の選ばれているtextBoxのポインタ?を投げられればできそうなのですが
選ばれているtextBoxの判定方法がわからないのです。

読みにくい文になってしまい、申し訳ないのですが
どなたか、ご教授をお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-02 16:58
ButtonA を選択する時点で、フォーカスは ButtonA ですから単純にはできないことはおわかりですか?

Enter イベント Leave イベントなどで、どのコントロールにフォーカスがあったのかを記録しておきましょう。
または、Validating イベントでもできますが、意味合いがわからなくなるので前者をお勧めします。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
あぼしゃん
会議室デビュー日: 2006/02/02
投稿数: 3
投稿日時: 2006-02-02 17:26
じゃんぬねっとさん、返答ありがとうございます。
やっぱりそうですよね・・・
前者の方法で作ってみます。それができたら、後者の方も試してみます。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-02 17:39
面倒なら Form.UpdateDefaultButton メソッドをオーバーライドする方法もありますね。
(インフラ ストラクチャのサポート メソッドなのでアレですがw)

このメソッドで、前回の ActiveControl を保持するようにします。
これなら仕様変更で TextBox の数が増えても大丈夫です。(^-^;)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-02-02 18:34
引用:

Form2 の textBox1に文字を入力したあとで ButtonB を押したときに、
Form1 の 選んだほうの textBox に Form2 の textBox1 と同じ文字を入れたいのです。


どうでしょう。
Form2を閉じるか表示したままかで違ってくると思います。
閉じるのであれば、Form2にカスタムプロパティなどを実装してForm1で受け取るとか。
閉じなくてもイベントで通知するとか。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-02 19:11
とりあえず、ShowDialog だろうと決め付けて、駄ソースです。
完全にニーモニックに対応していない危険なソースです。

コード:

    private Control beforeControl  = null;

    protected override void UpdateDefaultButton() {
        if (! (this.ActiveControl is Button)) {
            this.beforeControl = this.ActiveControl;
        }

        base.UpdateDefaultButton();
    }

    private void button1_Click(object sender, System.EventArgs e) {
        using (Form2 hForm2 = new Form2()) {
            hForm2.ShowDialog();

            // [OK] ボタンのみ適用する場合は以下のように置き換える
            //if (hForm2.ShowDialog() != DialogResult.OK) {
            //    return;
            //}

            if (this.ActiveControl == this.button1) {
                this.beforeControl.Text = hForm2.ResultText;
            } else {
                this.ActiveControl.Text = hForm2.ResultText;
            }
        }
    }


Form2 には ResultText という読み取り専用プロパティを実装して、
Form1 から Form2 の TextBox の値を取得できるものとする。

または、ShowDialog メソッドの代わりに Form2 側で ShowDialog なメソッドを作って、戻り値を取得するかですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
あぼしゃん
会議室デビュー日: 2006/02/02
投稿数: 3
投稿日時: 2006-02-02 19:26
>>まどかさん

Form2は、毎回閉じるように設定する予定です。


>>じゃんぬねっとさん

サンプルコードまで作っていただき本当にありがとうございます。


とりあえず、フォーカスを移動せずに作るのは、テキストボックスにクリックイベント
を作ることで、一時的に解決しておきました。
ですが、他にもたくさんの方法(じぇんぬねっとさんの教えていただいた方法など)
があるみたいなので、色々試してみたいと思います。
1

スキルアップ/キャリアアップ(JOB@IT)