web-dev-qa-db-ja.com

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

TabControl でタブを無効にする方法はありますか?

C#を使用しています。

73
Gold

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;
}
69
Hans Passant

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

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

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

85

次を使用できます。

tabPage.Enabled = false;

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

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

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

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

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

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

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

クレジットは littleguru @ Channel 9 に移動します。

43
Stormenet

おそらく、タブコントロールにタブを表示したいが、「無効」にしたい(つまり、グレー表示され、選択できない)ことを望むでしょう。これには組み込みのサポートはありませんが、描画メカニズムをオーバーライドして、目的の効果を得ることができます。

これを行う方法の例は、 ここで提供 です。

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

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

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

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

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

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

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

tabControl1.Controls.Remove(tabPage2);

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

7
sahran

唯一の方法は、Selectingイベントをキャッチし、タブがアクティブにならないようにすることです。

5
Martijn Laarman

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

 tabPage.Parent = null;

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

tabPage.Parent = tabControl;

そして、あなたが使用できるページの中の特定の場所に戻したい場合:

tabControl.TabPages.Insert(indexLocationYouWant, tabPage);
2
Amr Ashraf

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

1
jcollum

Tabpage1.Hide()、tabPage2.Show()などのタブページを使用して実行できます。

1
aldebaran

tabControl.TabPages.Remove(tabPage1);

1
Johannes Kawali

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

0
Aaron Smith

vb.Netのrfnodulatorの回答:

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

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

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

イベント、およびタブコントロールのプロパティを使用して、必要なときに必要なものを有効または無効にすることができます。 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
KWB Tech

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

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

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

mainForm.csのIntializeComponent()メソッド

0
user9677867

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

TcExempleという名前のTabControl。

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

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

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

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

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

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
Rafael

ユーザーはタブをクリックして移動することはできませんが、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
kennedy484

質問に対する適切な答えが見つかりませんでした。特定のタブを無効にする解決策はないようです。私がしたことは、特定のタブを変数に渡し、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;
}

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

0
Andy