DOBON.NET DOBON.NETプログラミング掲示板過去ログ

TabControlのタブを非表示にしたい

分類:[.NET]

どらごらです。

タブコントロールの現在アクティブではないタブを表示にしたいのですが、
SelectedTab.Visible = False
↑では消えてくれません。

googleで検索したところオーナードローでタブの部分をグラデーション表示にしている
サンプルはありましたが、オーナードローするほどの機能ってわけでも
無いと思い、質問致しました。

なお非表示にした部分は、後で表示するのでRemoveするわけにはいきません。

現在以下のコードで試しています。
    Private Sub btnNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNext.Click
        If TabControl.TabIndex < TabControl.Controls.Count - 1 Then
            TabControl.SelectedTab.Visible = False
            TabControl.SelectedIndex += 1
            TabControl.TabIndex += 1
            TabControl.SelectedTab.Visible = True
        End If
    End Sub

    Private Sub btnBack_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBack.Click
        If TabControl.TabIndex > 0 Then
            TabControl.SelectedTab.Visible = False
            TabControl.SelectedIndex -= 1
            TabControl.TabIndex -= 1
            TabControl.SelectedTab.Visible = True
        End If
    End Sub

よろしくお願いします。

[VS.NET 2003][WinXP][VB.NET]
> なお非表示にした部分は、後で表示するのでRemoveするわけにはいきません。

Remove以外には手はないと思います。
非表示したいTabPageへの参照をTabPageコレクション以外に
別の変数にも保持しておけば、RemoveしてもそのTabPageがなくなりませんし。
表示するときはその別の変数のTabPageをAddしなおせばOKです。
毎度ありがとうございます。どらごらです。

> Remove以外には手はないと思います。
> 非表示したいTabPageへの参照をTabPageコレクション以外に
> 別の変数にも保持しておけば、RemoveしてもそのTabPageがなくなりませんし。
> 表示するときはその別の変数のTabPageをAddしなおせばOKです。

以下できました。ありがとうございました。


    'タブページ
    Private FTabIndex As Integer
    Private FTabPages() As TabPage

...

        Try
            ReDim FTabPages(TabControl.TabPages.Count - 1)
            For I = TabControl.TabPages.Count - 1 To 0 Step -1
                FTabPages(I) = TabControl.TabPages(I)
                TabControl.TabPages.RemoveAt(I)
            Next
        Catch
        End Try
        FTabIndex = 0
        TabControl.TabPages.Add(FTabPages(FTabIndex))

...
    Private Sub btnNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNext.Click

        If FTabIndex < UBound(FTabPages) Then
            FTabPages(FTabIndex) = TabControl.TabPages(0)
            TabControl.TabPages.RemoveAt(0)
            FTabIndex += 1
            TabControl.TabPages.Add(FTabPages(FTabIndex))
        End If
    End Sub

    Private Sub btnBack_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBack.Click
        If FTabIndex > 0 Then
            FTabPages(FTabIndex) = TabControl.TabPages(0)
            TabControl.TabPages.RemoveAt(0)
            FTabIndex -= 1
            TabControl.TabPages.Add(FTabPages(FTabIndex))
        End If
    End Sub

-----

 ふとここに貼り付けて思ったのですが、これってインスタンスを
 変数に格納しているから、自分で解放しないとまずいですよね^^;
解決済み!
> 'タブページ
> Private FTabIndex As Integer
> Private FTabPages() As TabPage

これはTabControlを配置しているフォームのPrivate変数にしてるんですよね?

>  ふとここに貼り付けて思ったのですが、これってインスタンスを
>  変数に格納しているから、自分で解放しないとまずいですよね^^;

フォームのPrivate変数ならこのフォームのインスタンスが解放されるときにTabPageの配列も解放されます。
フォームが生きている間にTabPageがまったくいらなくなるというのはたぶんないですよね?

例えば、そのフォームのインスタンスを参照している変数が
モジュールに定義してあってそのフォームをCloseだけした場合だと
そのフォームへの参照が生きたまま(=フォームが生きている)なので、
そのフォームが持っているTabPageの配列も保持されたままになって無駄が生じます。

その場合もそのフォームの参照を保持している変数=NothingすればOKです。
> フォームのPrivate変数ならこのフォームのインスタンスが解放されるときにTabPageの配列も解放されます。
> フォームが生きている間にTabPageがまったくいらなくなるというのはたぶんないですよね?
 無いですね。自動的に解放されるんだ。。。
 ここらへんはDelphiとは違うんですね。C#でもそうなんですか?
 それとも、Javaのガーベジコレクションに近いのかな?
 以前メモリーリーク起こしていたのが、こんな感じで起こしていたのを
 発見したので。

 現状ではFormのDisposed時にNothingではないですが、解放しています。
 詳しくメモリーの状況を調べてないですが、特に問題がなさそうなので
 必須とはいわないが、あったほうが精神衛生上楽(?)な気持ちでこのままにします。
 やっぱりGUIで作成したのは別として、自分でインスタンスを生成または保持して
 いるのは、自分で解放ってのが無難かなとも思います。

    Private Sub FrmUserEdit_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Disposed
        Dim I As Integer
        For I = 0 To UBound(FTabPages)
            FTabPages(I).Dispose()
        Next
    End Sub
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板