- PR -

[C#.NET]TabControlのTabPage表示順序変更

1
投稿者投稿内容
初心
会議室デビュー日: 2004/06/23
投稿数: 15
投稿日時: 2005-09-08 13:19
いつも拝見させて頂いております。
初心でございます。

表題のTabControlのTabPageについて質問をさせて下さい。
例えば、TabControlでデフォルトが下記となっているとします。
−−−−−−−−−−−−
| A | B | C |
−−−−−−−−−−−−−−−−−−−−−−−−
| |
| |

特定の条件下の場合のみ
−−−−−−−−−−−−
| C | B | A |
−−−−−−−−−−−−−−−−−−−−−−−−
| |
| |
等のようにTabの表示順序を変更したい場合、
やはり内部的にTabPageに取得し、RemoveAtとAddで再作成を行わないと無理なのでしょうか?
SelectedIndexやSelectedTabが有るので、特定のTabに対してIndexを再セットしなおす方法はありますでしょうか?

よろしくお願いします。
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2005-09-08 13:42
お世話になります。

そういう事はできるのかな…と思って
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformstabcontroltabpagecollectionclasstopic.asp
↑を見てみましたがなさそうな感じですね。

SelectedIndexやSelectedTabは、
TabPageを"選択"されたものを取得or"選択"する
なので、これらではできないのではないでしょうか。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-09-08 14:22
引用:

やはり内部的にTabPageに取得し、RemoveAtとAddで再作成を行わないと無理なのでしょうか?



RemoveAt と Add を使いますが、再作成を「行わないで」実現可能です。

tabControl1.AddPage ("A");
tabControl1.AddPage ("B");
tabControl1.AddPage ("C");

のような感じでタブページを挿入したなら

ArrayList list = new ArrayList();

int length = tabControl1.TabPages.Count;

for (int i = 0; i < length; i++)
{
list.Add (tabControl1.TabPages [0]);
tabControl1.TabPages.RemoveAt (0);
}

for (int i = 0; i < list.Count; i++)
{
tabControl1.TabPages.Add (list.Count - i - 1);
}

のような感じでOKなはずです。

ポイントは「Remove する前に TabPage の参照の控えを取っておくこと」です。

# ソラで書いてるので、そのままでは動かないかもしれません。
# テキトーに修正してください。

引用:

SelectedIndexやSelectedTabが有るので、特定のTabに対してIndexを再セットしなおす方法はありますでしょうか?



SelectedIndext や SelectedTab に適切な値を「代入」すれば、選択状態を変更できます。

どんな値を代入すればいいかはタブページの並べ替えの規則によります。
並び順は自分で決めるんだから、計算できるはずですよね?
初心
会議室デビュー日: 2004/06/23
投稿数: 15
投稿日時: 2005-09-08 17:41
なおこ様、渋木様ありがとうございました。

表現が下手で申し訳ありません。
イメージとしては、不可能ですが下記のような事ができないかと思いまして。
<<<イメージ>>>
tabA.Index = 2;
tabB.Index = 1;
tabC.Index = 0;
(各tabA,tabB,tabCは、TabPageコントロールとした場合)

やはり、色々調べてみましたが、なおこ様のおっしゃる通り不可能のようでした。

そこで、渋木様に頂いたアドバイスを元に下記の記述で可能になりました。

for (int i = 0; i < tabControl.TabPages.Count; i++)
{
tabControl.TabPages.RemoveAt (0);
}

if (TabMode == PATTERN_A)
{
tabControl.TabPages.Add (TabPageA);
tabControl.TabPages.Add (TabPageB);
tabControl.TabPages.Add (TabPageC);
}
else
{
tabControl.TabPages.Add (TabPageC);
tabControl.TabPages.Add (TabPageB);
tabControl.TabPages.Add (TabPageA);
}

画面の表示上、かなりのちらつきが発生します。
VB6.0のFlexGridのRedrawのようなものが有れば良かったのですが・・・。

本当にありがとうございました。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-09-08 20:41
引用:

画面の表示上、かなりのちらつきが発生します。
VB6.0のFlexGridのRedrawのようなものが有れば良かったのですが・・・。



SuspendLayout(), ResumeLayout() してみるとか。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
初心
会議室デビュー日: 2004/06/23
投稿数: 15
投稿日時: 2005-09-21 14:32
遅レス申し訳ありません。
渋木様、ありがとうございます。
アドバイスで問題が解決致しました。
本当にありがとうございます。
1

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