TabControl 내에서 탭을 비활성화하려면 어떻게해야합니까?


답변:


71

TabPage의 클래스는 Enabled 속성을 숨 깁니다. 어색한 UI 디자인 문제가 있기 때문에 의도적이었습니다. 기본적인 문제는 페이지를 비활성화해도 탭도 비활성화되지 않는다는 것입니다. 그리고 Selecting 이벤트로 탭을 비활성화하여이 문제를 해결하려고하면 TabControl에 페이지가 하나만있을 때 작동하지 않습니다.

이러한 사용성 문제가 문제가되지 않는 경우 속성이 여전히 작동하고 IntelliSense에서 숨겨져 있다는 점을 명심하십시오. FUD가 불편하다면 다음과 같이하면됩니다.

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

3
탭 가시성의 전환을 허용하지 않는 뒷이야기가 무엇인지 궁금합니다
Shekhar

91

TabPage를 컨트롤로 캐스팅 한 다음 Enabled 속성을 false로 설정합니다.

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

따라서 탭 페이지의 헤더는 계속 활성화되지만 그 내용은 비활성화됩니다.


3
나는 이것이 탭 자체를 비활성화하는 지점을 놓친 것 같습니다. 사용자는 그것을 선택하고 내용을 볼 수 없어야합니다.
ThunderGr

3
이것이 귀하의 사용 사례 일 수 있지만 일부 권한 때문에 탭이 읽기 전용이어야하는 경우 유용하다고 생각합니다.
Cédric Guillemette 2012

9
제어 할 TabPage 다운 캐스팅이 필요한 이유는 무엇입니까? 다형성으로 인해 TabPage에서 Enabled 속성을 호출 할 수 있습니다.
Eldar Agalarov

1
그것이 다른 것인지 확실하지 않지만 오늘은 완전히 말도 안됩니다. 69 명의 찬성 투표자가 잘못되었습니다. Ouch ..
TaW

1
@TaW이 질문은 구체적이고 간결하게 질문에 대한 답변입니다. "tabcontrol에서 탭을 비활성화하는 방법이 있습니까?" 그들은 탭을 숨기는 방법을 묻지 않습니다. 오른쪽에 69 명의 찬성자 ... 질문을 잘못 읽지 않은 댓글 작성자 1 명. Ouch ...
DDuffy

70

다음을 간단히 사용할 수 있습니다.

tabPage.Enabled = false;

이 속성은 표시되지 않지만 문제없이 작동합니다.

TabControler편집 불가능한 탭으로 변경할 수 없도록 선택 이벤트를 프로그래밍 할 수 있습니다 .

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

3
얼마나 기이 한가 .. 이것은 Visible내가 그것을 테스트했을 때 실제로 어떤 시각적 효과가 없었던 것처럼 보였지만 속성에 대해서도 사실 인 것 같습니다.
Alfie

@Alfie TabPage는 Control> ScrollableControl> Panel> TabPage, Enable, Visible 등의 동작이 다형성 계층에서 상속되기 때문입니다.
Master Yoda

49

"선택"이벤트를 등록하고 탭 페이지 탐색을 취소 할 수 있습니다.

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

또 다른 아이디어는 모든 컨트롤을 패널 컨트롤의 탭 페이지에 놓고 패널을 비활성화하는 것입니다! 스마일리

tabControl1.TabPages 컬렉션에서 탭 페이지를 제거 할 수도 있습니다. 그것은 탭 페이지를 숨길 것입니다.

크레딧은 littleguru @ Channel 9 로 이동합니다 .


더 완전하고 포스트는 내가 :) 게시한다
마티 Laarman

이것은 피비린내 나는 훌륭한 해결책입니다 !!
Cornelius 2014

13

아마도 탭 컨트롤에서 탭을보고 싶지만 "비활성화"(즉, 회색 및 선택 불가능)를 원할 것입니다. 이에 대한 기본 지원은 없지만 원하는 효과를 제공하기 위해 그리기 메커니즘을 재정의 할 수 있습니다.

이를 수행하는 방법의 예가 여기제공됩니다 .

마법은 제시된 소스의이 스 니펫과 DisableTab_DrawItem 메서드에 있습니다.

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

1
예제 링크는 이제 죽은 것처럼 보입니다.
Narthring

1
@Narthring-감사합니다. 링크를 작동하는 링크로 대체했습니다.
Stewart

2
@Narthring 또 죽었어.
Sukasa

이것이이 질문에 대한 "진짜"대답입니다. [: waybackmachine에서 죽은 링크의 기록이 web.archive.org/web/20131102065816/http://...은 .
조 UHREN

이 답변에 대한 한 가지 개선 사항은 각 탭에 EnabledChanged 이벤트 처리기를 추가하고 이벤트 처리기가 탭 컨트롤에서 Invalidate () 를 호출 하도록합니다. 이렇게하면 텍스트 색상이 자동으로 업데이트됩니다.
ulatekh

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;
}

8

이렇게하면 탭 페이지가 제거되지만 필요할 때 다시 추가해야합니다.

tabControl1.Controls.Remove(tabPage2);

나중에 필요할 경우 제거하기 전에 임시 탭 페이지에 저장 한 다음 필요할 때 다시 추가 할 수 있습니다.


양식의 Load 이벤트에서 사용자가이 탭에 액세스 할 수 있는지 여부를 확인하고 그렇지 않은 경우 모두 제거하면 완벽하게 작동한다고 생각합니다.
ThunderGr

5

유일한 방법은 Selecting이벤트 를 포착하고 탭이 활성화되는 것을 방지하는 것입니다.


2

가장 까다로운 방법은 부모를 null로 만드는 것입니다 (부모없이 탭만 만드십시오).

 tabPage.Parent = null;

그리고 당신이 그것을 되돌리고 싶을 때 (페이지 컬렉션의 끝에서 되돌릴 것입니다) :

tabPage.Parent = tabControl;

페이지 중 특정 위치로 되돌리려면 다음을 사용할 수 있습니다.

tabControl.TabPages.Insert(indexLocationYouWant, tabPage);

1
잘 작동합니다! :)..질문이 하나 있습니다. 다시 tabcontrol로 되 돌리면 최종 색인이 추가됩니다. 초기 단계에서 동일한 인덱스에 탭 페이지를 추가하는 방법.
User6667769

1
원하는 위치 (끝이 아님)로 되돌리려면 다음을 사용하십시오. tabControl.TabPages.Insert (indexLocationYouWant, tabPage);
Amr Ashraf

1
답변 @Amr 라프 주셔서 감사합니다
User6667769

1

나는 이것을 잠시 전에 처리해야했다. TabPages 컬렉션에서 Tab을 제거하고 (그게 다라고 생각합니다) 조건이 변경 될 때 다시 추가했습니다. 그러나 그것은 내가 다시 필요할 때까지 탭을 유지할 수 있었던 Winforms에서만 가능했습니다.


1

tabPage1.Hide (), tabPage2.Show () 등 탭 페이지를 통해 할 수 있습니다.


2
나는 .net compact framework 3.5와 함께 Windows ce 6.0에서 사용했고 작동했습니다. 질문은 플랫폼에 대한 단서를 제공하지 않습니다. 웹, 데스크톱 또는 모바일 중 어디에 필요합니까?
aldebaran 2013-10-22


0

사용자가 클릭하지 못하도록 과거에 탭 페이지를 제거했습니다. 탭 페이지가 있는지 확인해야 할 수도 있기 때문에 이것은 아마도 최선의 해결책은 아닐 것입니다.


0

이벤트 및 탭 컨트롤의 속성을 사용하여 원할 때 원하는 것을 활성화 / 비활성화 할 수 있습니다. tabControl이 사용되는 mdi 자식 양식 클래스의 모든 메서드에 사용할 수있는 하나의 부울을 사용했습니다.

탭을 클릭 할 때마다 선택 이벤트가 실행됩니다. 많은 수의 탭의 경우 "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

사용자는 탐색하기 위해 탭을 클릭 할 수 없지만 두 개의 버튼 ( NextBack)을 사용할 수 있습니다 . // 조건이 충족되지 않으면 사용자는 다음 작업을 계속할 수 없습니다.

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

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

다음 컨트롤이 있다고 가정합니다.

이름이 tcExemple 인 TabControl.

이름이 tpEx1 및 tpEx2 인 TabPages.

시도 해봐:

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);
            }
        }
    }

두 번째 탭을 클릭 할 수 없게됩니다.


0

이것은 오래된 질문이지만 누군가가 내 추가로 이익을 얻을 수 있습니다. 숨겨진 탭을 연속적으로 표시하는 TabControl이 필요했습니다 (현재 탭에서 작업이 수행 된 후). 그래서 저는 Load에서 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();
}

-1

양식로드 이벤트에서를 작성 this.tabpage.PageEnabled = false하면 탭 페이지가 비활성화됩니다.


그 속성을 볼 수 없습니다
John

양식의로드 이벤트에서 시도했는지 확인하십시오.
새로운

지금 두 배로 확인했습니다. 그것을 볼 수 없습니다.
John

이것을 사용했는지 확인하십시오 : private void XtraForm1_Load (object sender, EventArgs e) {this.xtraTabPage1.PageEnabled = false; } XtraForm1은 DevExpress XtraForm이고 탭 페이지 xtraTabPage는 DevExpress XtraTabpage
New

원래 답변에서 DevExpress에 대해 왜 말하지 않았습니까?
John

-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.