87

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

4

25 に答える 25

92

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

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

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

于 2009-01-06T20:38:11.080 に答える
79

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;
}
于 2009-01-06T20:41:09.157 に答える
71

以下を簡単に使用できます。

tabPage.Enabled = false;

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

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

private void tabControler_Selecting(object sender, TabControlCancelEventArgs e)
{
    if (e.TabPageIndex < 0) return;
    e.Cancel = !e.TabPage.Enabled;
}
于 2012-10-11T14:31:37.650 に答える
53

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

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

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

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

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

于 2009-01-06T20:44:54.453 に答える
14

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

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

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

this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += new DrawItemEventHandler( DisableTab_DrawItem );
于 2009-07-29T10:44:31.013 に答える
12

を無効にした後、Cédric Guillemetteの回答を拡張しますControl

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

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

private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
{
    e.Cancel = !((Control)e.TabPage).Enabled;
}
于 2012-09-30T01:16:39.413 に答える
8

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

tabControl1.Controls.Remove(tabPage2);

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

于 2011-11-20T19:23:32.303 に答える
6

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

于 2009-01-06T20:42:01.603 に答える
1

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

于 2009-01-06T20:47:45.927 に答える
0

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

于 2009-01-06T20:44:36.840 に答える
0

タブページを通じてそれを行うことができます: tabPage1.Hide()、tabPage2.Show() など。

于 2012-12-23T03:20:29.287 に答える
0

イベントとタブ コントロールのプロパティを使用して、必要なときに必要なものを有効/無効にすることができます。tabControl が使用されている mdi 子フォーム クラスのすべてのメソッドで使用できる bool を 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;
            }
        }
    }
于 2012-07-16T22:45:02.370 に答える
0

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

if (condition) { TabControl.Deselect("2ndPage"); TabControl.Deselect("3dPage"); }
于 2015-05-22T12:02:25.903 に答える
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();
}
于 2020-04-02T23:32:41.490 に答える
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;
}
于 2014-02-14T21:29:51.397 に答える
-1

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

于 2015-02-26T06:51:59.923 に答える
-1

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

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;
    }
}
于 2020-11-20T18:15:34.023 に答える
-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;
}

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

于 2018-06-17T15:01:11.190 に答える
-4
MyTabControl.SelectedTab.Enabled = false;
于 2009-09-02T05:46:15.063 に答える