- 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イベントを起こしてて、テキストの整形をさせてるんですが、そ
こでのエラーという事が判明しました。
お騒がせしてすみませんでした。
|