- PR -

【C#】TabControlを子コントロールから操作する

投稿者投稿内容
shin_fm
常連さん
会議室デビュー日: 2004/05/24
投稿数: 36
お住まい・勤務地: 昼間は千代田区
投稿日時: 2005-10-14 16:10
shin_fmです。

C#のTabControlで質問です。

TabControlに"A"、"B"というTabPageがあるとします。
"A"タブに"1"、"2"、"B"タブに"3"、"4"というテキストボックスがあるとします。

現在"A"タブの"2"にFocusが有ったとして、"A"タブの"2"のKeyDownイベントで
"B"タブの"3"にFocusを移したい場合、どう移したら良いでしょうか?

コード自体はTextBoxを継承して、OnKeyDownイベントの中で書いています。
現状は"B"を取得することには成功しているので、" B.Parent,Focus(); "
とやっているのですが、「オブジェクト参照がオブジェクトインスタンスに
設定されていません」とNullExceptionがThrowされます。

" B.Parent,Focus(); "の部分でSelectedIndexプロパティを設定しようとしても
同じようにNullExceptionがThrowされます。

何処か間違ってるでしょうか?。

コード的にはこんな感じです。
コード:

// 次のコントロールにFocusを移す
private void SetFocus( )
{
Control ctlBuff = null;
{
// 次のコントロールをチェック
ctlBuff = ParentControlCheck(this);
// コントロールはTabPageか
if(ctlBuff.GetType().Name.ToString() == "TabPage")
{
// "B"のTabPageが返ってくる
if(ctlBuff.Parent.CanFocus)
{
//ここでエラー⇒ ctlBuff.Parent.Focus();
}
ctlBuff.Select();
ctlBuff = ChildControlCheck(ctlBuff);
}
ctlBuff.Focus();
}
}

// 親コンテナの次のコントロールを取得する
private Control ParentControlCheck(Control objControl)
{
Control objReturn = null;
// 親コンテナ内のコントロールを走査
foreach(Control objBuff in objControl.Parent.Controls)
{
// 自コントロールよりTabIndexが大きいか
if(objBuff.TabIndex > objControl.TabIndex)
{
// 戻り値バッファがNullか
if(objReturn == null)
{
objReturn = objBuff;
}
// 戻り値バッファよりTabIndexが小さいか
else if( objBuff.TabIndex < objReturn.TabIndex)
{
objReturn = objBuff;
}
}
}
// 戻り値バッファがNullか
if (objReturn == null)
{
objReturn = ParentControlCheck(objControl.Parent);
}
return objReturn;
}




[ メッセージ編集済み 編集者: shin_fm 編集日時 2005-10-14 16:13 ]
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2005-10-14 17:02
引用:

現状は"B"を取得することには成功しているので、" B.Parent,Focus(); "
とやっているのですが、「オブジェクト参照がオブジェクトインスタンスに
設定されていません」とNullExceptionがThrowされます。
コード:
                    if(ctlBuff.Parent.CanFocus)
                    {
//ここでエラー⇒         ctlBuff.Parent.Focus();
                    }




エラー内容だけからすれば、
本当にBの参照を取得できてますか?
エラー箇所は「if(ctlBuff.Parent.CanFocus)」ではないですか?

この手の処理はNull判断を細かく入れておくべきと思います。

以下、独り言。
TabControl.SelectedTabを設定した後に子コントロールのFocusという流れが自然なような。。。
自動でフォーカスを移すことの是非はおいといても、
処理自体は対象コントロールを管理するオブジェクトがやるべきでは。
#そのための抽象的なプロパティの実装は違和感が無いけれど
shin_fm
常連さん
会議室デビュー日: 2004/05/24
投稿数: 36
お住まい・勤務地: 昼間は千代田区
投稿日時: 2005-10-14 17:29
お返事有難うございます。

引用:

まどかさんの書き込み (2005-10-14 17:02) より:

エラー内容だけからすれば、
本当にBの参照を取得できてますか?
エラー箇所は「if(ctlBuff.Parent.CanFocus)」ではないですか?




いえ、CanFocusでは発生しないんです。デバッグでも値はTrueを返してますし。
なので、「何故?」となってしまった訳です。

やはり、TabControlを継承して「次へ」「前へ」のメソッドを用意して呼び出す
のが良しなのでしょうか?
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2005-10-14 19:03
お世話になります。

単純な考えですが…
これでは駄目なんでしょうか。
コード:

private void tabControl1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
  if (this.ActiveControl == this.textBox1) {
    this.tabControl1.SelectedIndex = 1;
    this.textBox2.Focus();
  }
}



#追記
form上のtabControl1にtabpageを2つ追加して、
1つめのtabpageにtextbox1を配置。
2つめのtabpageにtextbox2を配置。

[ メッセージ編集済み 編集者: なおこ(・∀・) 編集日時 2005-10-14 19:04 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-15 11:03
こんにちは、じゃんぬ です。

そうですね、お二方の言うとおりです。
子から親をどうこうしようとしたらダメでしょう。
構造化言語からの基本です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
shin_fm
常連さん
会議室デビュー日: 2004/05/24
投稿数: 36
お住まい・勤務地: 昼間は千代田区
投稿日時: 2005-10-17 11:04
なおこ(・∀・) さん、じゃんぬねっと さん
お返事有難う御座います。

結局TabControl側に下記のコードを持たせて子コントロールから呼び出す事にしました。
ご教示有難う御座いました。

コード:
        public bool NextTab()
        {
            if(this.TabPages.Count == 0)
            {
                return false;
            }
            else if(this.SelectedIndex == this.TabPages.Count-1)
            {
                return false;
            }
            else
            {
                this.SelectedIndex = ++this.SelectedIndex;
                return true;
            }
        }

        public bool PrevTab()
        {
            if(this.TabPages.Count == 0)
            {
                return false;
            }
            else if(this.SelectedIndex == 0)
            {
                return false;
            }
            else
            {
                this.SelectedIndex = --this.SelectedIndex;
                return true;
            }
        }

まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2005-10-17 14:41
引用:

結局TabControl側に下記のコードを持たせて子コントロールから呼び出す事にしました。
ご教示有難う御座いました。


なんか終わってるようですが、、、
本題のエラーの件はどうなったんでしょう?
shin_fm
常連さん
会議室デビュー日: 2004/05/24
投稿数: 36
お住まい・勤務地: 昼間は千代田区
投稿日時: 2005-10-17 20:04
shin_fmです。

引用:

まどかさんの書き込み (2005-10-17 14:41) より:
引用:

結局TabControl側に下記のコードを持たせて子コントロールから呼び出す事にしました。
ご教示有難う御座いました。


なんか終わってるようですが、、、
本題のエラーの件はどうなったんでしょう?




恥ずかしい話ですが、エラーの発生原因はこのコントロールを更に継承させてる先で発
生してました。
継承先でOnValidatingイベントを起こしてて、テキストの整形をさせてるんですが、そ
こでのエラーという事が判明しました。

お騒がせしてすみませんでした。

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