TabPageの使用不可(Enable)について

タグの編集
投稿者 イザナギ  (社会人) 投稿日時 2019/7/18 08:49:56
TabControlに追加したTabPageを状況によって、一部使用不可にしたいと思い
Enable=Trueとしてみましたが、他のコントロールのように、使用不可状態になりませんでした。
自分でも調べてみましたが、解決できない状況です。。。
完全に素人の質問で恐縮ですが、ご回答よろしくお願いします。
投稿者 kiku  (社会人) 投稿日時 2019/7/18 09:28:18
検索しただけで試していませんが、下記が参考になりませんか。
https://dobon.net/vb/dotnet/control/tabpagehide.html
投稿者 るきお  (社会人) 投稿日時 2019/7/18 12:18:50
Windowsフォームですよね。
Visual Studio 2013 + .NET Framework 4.6.1で試してみましたが、これできましたよ。
TabControl1.TabPages(1).Enabled = False

タブの中に配置しているコントロールが使用不可になりました。
タブの切り替え自体はできました。

タブの切り替えもできないような状況をお望みでしょうか?
投稿者 イザナギ  (社会人) 投稿日時 2019/7/18 20:01:48
>kikuさん
回答ありがとうございます。
サイト、確認しました。
ただ「非表示」ではなく「非活性(使用不可)」
ですので、当てはまらないように思いました。

>るきおさん
回答ありがとうございます。
>タブの切り替えもできないような状況をお望みでしょうか?
おっしゃる通り、切り替えもできないようにしたいです。

ただ、切り替え制御は
TabControlのSelectingイベントで、任意のインデックス以外はe.cancel=trueでできました。

今、悩んでいるのは、任意のTabPageのタイトル文字を変えられないことです。
ForeColorを変えてみましたが駄目でした。。。
投稿者 るきお  (社会人) 投稿日時 2019/7/18 20:17:04
このような感じでタイトル文字を変えられますよ。

TabControl1.TabPages(0).Text = "あいうえお"
TabControl1.TabPages(1).Text = "かきくけこ"

投稿者 イザナギ  (社会人) 投稿日時 2019/7/19 00:30:05
>るきおさん

言葉足らずで申し訳ないです。

>今、悩んでいるのは、任意のTabPageのタイトル文字を変えられないことです。

先程、上のように投稿しましたが、
悩んでいるのは、タイトル文字の色等、属性を変更できないことです。
例えば、タイトルの文字色を「Color.LightGray」などにして、見た目をEnable状態にしたい。
といった使い方が可能かを悩んでいます。

投稿者 KOZ  (社会人) 投稿日時 2019/7/19 02:13:07
BackColor プロパティを変更するとわかりやすいですが、TabPage のプロパティって Panel 部分のプロパティなんですよね。

タブ部分はオーナードローする必要があります。

「TabControlのタブを自分で描画する」
https://dobon.net/vb/dotnet/control/tabownerdraw.html
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/7/20 09:26:08
> 見た目をEnable状態にしたい。

Enable だと普通の状態なので、
Disable 状態のことですよね。(Enabled = False)


手抜きですが、タブ部分のテキスト表現で誤魔化したことがあります。
中途半端感は否めませんし、利用者にとっても分かりやすいとは言えませんが。

TabPage1.Text = "Visual Basic"
TabPage2.Text = " ̷V̷i̷s̷u̷a̷l̷ ̷B̷a̷s̷i̷c̷"



Private Sub TabControl1_Selecting(sender As Object, e As TabControlCancelEventArgs) Handles TabControl1.Selecting
        e.Cancel = Not e.TabPage.Enabled
End Sub



ただ…まともに向き合うとすると、実装が意外と面倒だった記憶があります。

他の方の回答にもあるように、タブの見た目まで変えるには自前描画が必要ですし、
ホバー時の対応も含めると、さらに手間がかかってきます。

タブを選択できなくする処理も、上記のキャンセル手続きだけでは十分といえず、
矢印キーでタブ移動時に、無効なタブがスキップさせるような手続きも必要でしょう。
(選択状態を取りやめて前のタブに戻すのではなく、さらにその次の有効なタブが選択されるべき)
投稿者 KOZ  (社会人) 投稿日時 2019/7/23 15:01:57
そういえば、DrawItem イベントで描画すると枠が 3D っぽくなってあまりキレイじゃなかったので、結局全部描画したのを思い出しました。

もうちょい簡単にできないかなと思いついたのがこちら

http://kozhouse.homeip.net/dotnet/etc/20/

TabPage の Text プロパティにはスペース、Tag プロパティにタブに表示したい文字をセットし、コントロール描画後に Tag プロパティからタブの文字を描画します。