- PR -

ユーザーコントロールを貼り付けた場合のActiveControlについて

1
投稿者投稿内容
いっちょ
会議室デビュー日: 2004/10/10
投稿数: 5
投稿日時: 2005-09-23 14:18
初めて書込みします。初心者です。

Labelを継承したユーザーコントロールに、テキストボックス"textBox1"を追加したコントロール"UserControl1"を作成しました。
このコントロールをフォームに貼り付けて実行し、textBox1にフォーカスがある状態でActiveControlを取得すると、"UserControl1"ではなくその中の"textBox1"が取得されました。
これを、ActiveControl="UserControl1"としたいのですが、何か方法はありますでしょうか?

※ちなみに…
Labelを継承せずに、テキストボックスだけを追加したユーザーコントロールの場合は、ActiveControl="UserControl1"になっていました。

コード:
public class UserControl1 : System.Windows.Forms.Label
{
    private System.Windows.Forms.TextBox textBox1;

    public UserControl1()
    {
        InitializeComponent();
    }

    private void InitializeComponent()
    {
        this.textBox1 = new System.Windows.Forms.TextBox();
        this.SuspendLayout();
        // 
        // textBox1
        // 
        this.textBox1.Location = new System.Drawing.Point(0, 0);
        this.textBox1.Name = "textBox1";
        this.textBox1.Size = new System.Drawing.Size(56, 19);
        this.textBox1.TabIndex = 0;
        // 
        // UserControl1
        // 
        this.Name = "UserControl1";
        this.Controls.Add(this.textBox1);
        this.Size = new System.Drawing.Size(136, 112);
        this.ResumeLayout(false);
    }
}

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-09-23 14:59
こんにちは、じゃんぬ です。

引用:

いっちょさんの書き込み (2005-09-23 14:18) より:

このコントロールをフォームに貼り付けて実行し、
textBox1にフォーカスがある状態でActiveControlを取得すると、
"UserControl1"ではなくその中の"textBox1"が取得されました。
これを、ActiveControl="UserControl1"としたいのですが、
何か方法はありますでしょうか?


ん? そうなること自体がおかしいと思います。
フォームから ActiveControl を参照した時は UserControl になるハズ。
UserControl 内での ActiveControl を参照した時のみ、textBox1 になるハズ。


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-09-23 15:04
って、書いておいてから [検索] し直して思い出しましたが、
そうなるのは SelectNextControl の時だけだったかも...
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=23818&forum=7

今環境がないので確認できません。。。

解決策としては、Parent の Type を見て、
UserControl であれば、UserControl を返すことになるのかな。


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
いっちょ
会議室デビュー日: 2004/10/10
投稿数: 5
投稿日時: 2005-09-24 20:59
こんばんは。じゃんぬさん、アドバイスありがとうございます。

引用:
解決策としては、Parent の Type を見て、
UserControl であれば、UserControl を返すことになるのかな。



IContainerControlを継承して、ActiveControlプロパティを実装するということでしょうか?
こんな感じで追加してみましたが、変わりませんでした。

コード:
public Control ActiveControl
{
    get
    {
        if (this.Parent.GetType() == System.Type.GetType("UserControl"))
            return this.Parent;
        else
            return this;
    }
}


にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-09-24 21:33
本論とは関係ありませんが。

> Labelを継承したユーザーコントロール
.NET の用語ではユーザーコントロールは System.{Windows.Forms|Web.UI}.UserControl を継承したものなので、別の呼び方をしたほうがいいかと思います。

最初見たときに勘違いしたもので。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-09-26 09:16
こんにちは、じゃんぬ です。

引用:

いっちょさんの書き込み (2005-09-24 20:59) より:

IContainerControlを継承して、ActiveControlプロパティを実装するということでしょうか?
こんな感じで追加してみましたが、変わりませんでした。


いや、それだけのために ActiveControl プロパティを作るんですか?
それと、ActiveControl という名前のプロパティだと「本来の動作」との差異があるため、混乱を招きます。
別の名前で、別の新規のプロパティとして UserControl 側に定義しましょう。


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-09-26 09:21
こんにちは、じゃんぬ です。

引用:

にしざきさんの書き込み (2005-09-24 21:33) より:

.NET の用語ではユーザーコントロールは System.{Windows.Forms|Web.UI}.UserControl を継承したものなので、別の呼び方をしたほうがいいかと思います。
最初見たときに勘違いしたもので。


広義と狭義の差異によるものでしょうね。

  カスタム コントロールのプロパティ、メソッド、およびイベント


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

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