TabControl内のタブを無効にするにはどうすればよいですか?


回答:


71

TabPageのクラスには、Enabledプロパティを隠します。厄介なUIデザインの問題があるため、これは意図的なものでした。基本的な問題は、ページを無効にしてもタブが無効にならないことです。また、Selectingイベントでタブを無効にすることでこれを回避しようとすると、TabControlにページが1つしかない場合は機能しません。

これらのユーザビリティの問題が問題にならない場合は、プロパティが引き続き機能することを覚えておいてください。これは、IntelliSenseから隠されているだけです。FUDが不快な場合は、次のようにするだけです。

public static void EnableTab(TabPage page, bool enable) {
    foreach (Control ctl in page.Controls) ctl.Enabled = enable;
}

3
タブの可視性の切り替えを許可しないことの裏話は何でしょうか
Shashank Shekhar 2015年

91

TabPageをコントロールにキャストしてから、Enabledプロパティをfalseに設定します。

((Control)this.tabPage).Enabled = false;

したがって、タブページのヘッダーは引き続き有効になりますが、その内容は無効になります。


3
これは、タブ自体を無効にするという点を見逃していると思います。ユーザーはそれを選択して内容を見ることができないはずです。
ThunderGr 2012年

3
それはあなたのユースケースかもしれませんが、いくつかの権利のためにタブを読み取り専用にする必要がある場合に役立つと思います。
セドリックGuillemette

9
制御するためにTabPageをダウンキャストする必要があるのはなぜですか?ポリモーフィズムにより、TabPageからEnabledプロパティを呼び出すことができます。
エルダーアガラロフ2013

1
それが今までに異なっていたかどうかはわかりませんが、今日ではまったくナンセンスです。間違った69人の賛成者。痛い...
TAW

1
@TaWこの質問は、具体的かつ簡潔に質問に答えます。「タブコントロールでタブを無効にする方法はありますか?」彼らはタブを隠す方法を尋ねません。右の69人の賛成者...質問を間違って読んでいない1人のコメント投稿者。痛い...
DDuffy

70

あなたは単に使うことができます:

tabPage.Enabled = false;

このプロパティは表示されていませんが、問題なく機能します。

Selectingイベントをプログラムして、TabControler編集不可能なタブに変更できないようにすることができます。

private void tabControler_Selecting(object sender, TabControlCancelEventArgs e)
{
    if (e.TabPageIndex < 0) return;
    e.Cancel = !e.TabPage.Enabled;
}

3
なんて奇妙なことでしょうVisible。私がテストしたとき、実際には視覚的な効果はなかったようですが、これはプロパティにも当てはまるようです。
アルフィー

@Alfie TabPageは次の階層から継承するため、Control> ScrollableControl> Panel> TabPage、Enable、Visibleなどの動作はポリモーフィックです。
マスターヨーダ

50

「選択中」イベントを登録して、タブページへのナビゲーションをキャンセルすることができます。

private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
    if (e.TabPage == tabPage2)
        e.Cancel = true;
}

もう1つのアイデアは、パネルコントロールのタブページにあるすべてのコントロールを配置し、パネルを無効にすることです。スマイリー

tabControl1.TabPagesコレクションからタブページを削除することもできます。それはタブページを隠すでしょう。

クレジットはlittleguru @ Channel9に送られます。


より完全で、私が投稿すべきだった投稿:)
Martijn Laarman 2009年

これは血まみれの素晴らしい解決策です!
コーネリアス

13

おそらく、タブコントロールにタブを表示したいが、タブを「無効」(つまり、灰色で選択不可)にしたい場合があります。これに対する組み込みのサポートはありませんが、描画メカニズムをオーバーライドして、目的の効果を与えることができます。

これを行う方法の例をここに示します

魔法は、提示されたソースからのこのスニペットと、DisableTab_DrawItemメソッドにあります。

this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += new DrawItemEventHandler( DisableTab_DrawItem );

1
リンクの例は死んでいるように見えます。
ナルスリング

1
@ Narthring-ありがとう、私はリンクを機能するものに置き換えました。
スチュワート

2
@Narthringまた死んだ。
スカサ2014

これは、この質問に対する「本当の」答えです。ウェイバックマシンからのリンク切れの記録があります:[ web.archive.org/web/20131102065816/http://…
Joe Uhren 2015年

この回答の1つの改善点は、各タブにEnabledChangedイベントハンドラーを追加し、イベントハンドラーがタブコントロールでInvalidate()を呼び出すようにすることです。そうすれば、テキストの色が自動的に更新されます。
ulatekh

12

Control:を無効にした後、CédricGuillemetteの回答を拡張します。

((Control)this.tabPage).Enabled = false;

...次に、TabControlSelectingイベントを次のように処理できます。

private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
{
    e.Cancel = !((Control)e.TabPage).Enabled;
}

8

これによりタブページが削除されますが、必要に応じて再度追加する必要があります。

tabControl1.Controls.Remove(tabPage2);

後で必要になる場合は、削除する前に一時的なタブページに保存し、必要に応じて再度追加することをお勧めします。


フォームのLoadイベントで、ユーザーがこのタブにアクセスできるかどうかを確認し、資格がない場合は、完全に削除するだけで、完全に機能すると思います。
ThunderGr 2012年


2

最もトリッキーな方法は、親をnullに等しくすることです(親なしでタブだけを作成します)。

 tabPage.Parent = null;

そして、あなたがそれを返したいとき(ページコレクションの終わりにそれを返します):

tabPage.Parent = tabControl;

そして、あなたがそれをあなたが使うことができるページの中の特定の場所に戻したいならば:

tabControl.TabPages.Insert(indexLocationYouWant, tabPage);

1
そのうまく機能しています!:)..一つの質問があります。それをタブコントロールに戻すと、最終的なインデックスが追加されます。初期段階から同じインデックスにタブページを追加する方法。
user6667769 2017

2
目的の場所(最後ではない)に戻したい場合は、次を使用します。tabControl.TabPages.Insert(indexLocationYouWant、tabPage);
Amr Ashraf

1
ご回答ありがとうございます@AmrAshraf
User6667769 2017

1

私はしばらく前にこれを処理しなければなりませんでした。TabPagesコレクションからTabを削除し(それだけだと思います)、条件が変更されたときに再び追加しました。しかし、それは、再び必要になるまでタブを維持できるWinformsでのみでした。


1

あなたはタブページを通してそれをすることができます:tabPage1.Hide()、tabPage2.Show()など。


2
.net Compact Framework3.5を搭載したWindowsCE 6.0で使用しましたが、機能していました。質問はプラットフォームについての手がかりを与えません。これは、Web、デスクトップ、モバイルのどこで必要ですか?
アルデバラン2013年


0

ユーザーがタブページをクリックできないように、過去にタブページを削除しました。タブページが存在することを確認する必要がある場合があるため、これはおそらく最善の解決策ではありません。


0

イベントとタブコントロールのプロパティを使用して、必要なときに必要なものを有効/無効にすることができます。tabControlが使用されているmdi子フォームクラスのすべてのメソッドで使用できる1つのブール値を使用しました。

いずれかのタブがクリックされるたびに、選択イベントが発生することに注意してください。多数のタブの場合、「CASE」は多数のifよりも使いやすい場合があります。

public partial class Form2 : Form
    {
        bool formComplete = false;

        public Form2()
        {
            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)
        {


            formComplete = true;
            tabControl1.SelectTab(1);

        }

        private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
        {
            if (tabControl1.SelectedTab == tabControl1.TabPages[1])
            {

                tabControl1.Enabled = false;

                if (formComplete)
                {
                    MessageBox.Show("You will be taken to next tab");
                    tabControl1.SelectTab(1);

                }
                else
                {
                    MessageBox.Show("Try completing form first");
                    tabControl1.SelectTab(0);
                }
                tabControl1.Enabled = true;
            }
        }
    }

0

私はこの問題を次のように解決しました:3つのタブがあり、ユーザーがログインしなかった場合は最初のタブを維持したいので、TabControlのSelectingEventに書き込みました

if (condition) { TabControl.Deselect("2ndPage"); TabControl.Deselect("3dPage"); }

0

ユーザーはタブをクリックしてナビゲートすることはできませんが、2つのボタン(NextおよびBack)を使用することはできます。//条件が満たされない場合、ユーザーは次の条件に進むことができません。

private int currentTab = 0;

private void frmOneTimeEntry_Load(object sender, EventArgs e)
{
    tabMenu.Selecting += new TabControlCancelEventHandler(tabMenu_Selecting);
}

private void tabMenu_Selecting(object sender, TabControlCancelEventArgs e)
{
    tabMenu.SelectTab(currentTab);
}

private void btnNextStep_Click(object sender, EventArgs e)
{
    switch(tabMenu.SelectedIndex)
    {
        case 0:
            //if conditions met GoTo
        case 2:
            //if conditions met GoTo
        case n:
            //if conditions met GoTo
    {
    CanLeaveTab:
    currentTab++;
    tabMenu.SelectTab(tabMenu.SelectedIndex + 1);
    if (tabMenu.SelectedIndex == 3)
        btnNextStep.Enabled = false;
    if (btnBackStep.Enabled == false)
        btnBackStep.Enabled = true;

    CannotLeaveTab:
        ;
}

private void btnBackStep_Click(object sender, EventArgs e)
{
    currentTab--;
    tabMenu.SelectTab(tabMenu.SelectedIndex - 1);
    if (tabMenu.SelectedIndex == 0)
        btnBackStep.Enabled = false;
    if (btnNextStep.Enabled == false)
        btnNextStep.Enabled = true;
}

0

これらのコントロールがあると仮定します。

tcExempleという名前のTabControl。

tpEx1およびtpEx2という名前のTabPage。

それを試してみてください:

TabPageのDrawModeをOwnerDrawFixedに設定します。InitializeComponent()の後で、次のコードを追加してtpEx2が有効になっていないことを確認します。

((Control)tcExemple.TabPages["tpEx2").Enabled = false;

以下のコードをSelectiontcExempleイベントに追加します。

private void tcExemple_Selecting(object sender, TabControlCancelEventArgs e)
    {
        if (!((Control)e.TabPage).Enabled)
        {
            e.Cancel = true;
        }
    }

tcExempleのDrawItemイベントに次のコードを添付します。

private void tcExemple_DrawItem(object sender, DrawItemEventArgs e)
    {
        TabPage page = tcExemple.TabPages[e.Index];
        if (!((Control)page).Enabled)
        {
            using (SolidBrush brush = new SolidBrush(SystemColors.GrayText))
            {
                e.Graphics.DrawString(page.Text, page.Font, brush, e.Bounds);
            }
        }
        else
        {
            using (SolidBrush brush = new SolidBrush(page.ForeColor))
            {
                e.Graphics.DrawString(page.Text, page.Font, brush, e.Bounds);
            }
        }
    }

2番目のタブはクリックできなくなります。


0

これは古い質問ですが、誰かが私の追加から利益を得るかもしれません。非表示のタブを連続して表示するTabControlが必要でした(現在のタブでアクションが実行された後)。そこで、ロード時にHideSuccessive()を継承して呼び出すクイッククラスを作成しました。

public class RevealingTabControl : TabControl
{
    private Action _showNextRequested = delegate { };

    public void HideSuccessive()
    {
        var tabPages = this.TabPages.Cast<TabPage>().Skip(1);
        var queue = new ConcurrentQueue<TabPage>(tabPages);
        tabPages.ToList().ForEach(t => t.Parent = null);
        _showNextRequested = () =>
        {
            if (queue.TryDequeue(out TabPage tabPage))
                tabPage.Parent = this;
        };
    }

    public void ShowNext() => _showNextRequested();
}

0

C#7.0には、パターンマッチングと呼ばれる新機能があります。タイプパターンを介してすべてのタブを無効にすることができます。

foreach (Control control in Controls)
{
    // the is expression tests the variable and 
    // assigned it to a new appropriate variable type
    if (control is TabControl tabs)
    {
        tabs.Enabled = false;
    }
}

-1

フォームのロードイベントで、と書くthis.tabpage.PageEnabled = falseと、タブページが無効になります。


そのプロパティを見ることができません
ジョン

フォームのloadイベントで試したかどうかを確認してください。
新しい

ちょうど今ダブルチェック。見えない。
ジョン

これを使用したかどうかを確認してください:private void XtraForm1_Load(object sender、EventArgs e){this.xtraTabPage1.PageEnabled = false; } XtraForm1はDevExpressXtraFormであり、タブページxtraTabPageはDevExpress XtraTabpage
新しい

元の回答でDevExpressについて何も言わなかったのはなぜですか...?
ジョン

-1

使用する:

 tabControl1.TabPages[1].Enabled = false;

このコードを書くことによって、タブページが完全に無効になる(選択できない)ことはありませんが、その内部コンテンツは無効になります。これはあなたのニーズを満たすと思います。


-1

解決策は非常に簡単です。

この行を削除/コメントする

this.tabControl.Controls.Add(this.YourTabName);

MainForm.csのIntializeComponent()メソッド内


-1

その質問に対する適切な答えが見つかりませんでした。特定のタブを無効にする解決策はないようです。私がしたことは、特定のタブを変数に渡し、SelectedIndexChangedイベントでそれをSelectedIndex:に戻すことです。

//variable for your specific tab 
int _TAB = 0;

//here you specify your tab that you want to expose
_TAB = 1;
tabHolder.SelectedIndex = _TAB;

private void tabHolder_SelectedIndexChanged(object sender, EventArgs e)
{
    if (_TAB != 0) tabHolder.SelectedIndex = _TAB;
}

したがって、実際にはタブを無効にすることはありませんが、別のタブをクリックすると、常に選択したタブに戻ります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.