ProgramingTip

TabControl 내에서 탭을 선택해야합니까?

bestdevel 2020. 10. 22. 22:16
반응형

TabControl 내에서 탭을 선택해야합니까?


TabControl 에서 탭을 비활성화하는 방법이 있습니까?

C #을 사용하고 있습니다.


TabPage의 클래스는 Enabled 속성을 숨 깁니다. 어색한 UI 디자인 문제가 있기 때문에 의도적이었습니다. 기본 문제는 페이지를 갖추고 있습니다. 그리고 TabControl에 페이지가 하나만있을 때 작동하지 않습니다.

여전히 작동하지 않는 경우 성 문제가 문제가없는 경우에도 마찬가지입니다. 이것은 IntelliSense에서 숨겨 질뿐입니다. FUD가 불편하면 다음과 같이하면됩니다.

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

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

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

계속 활성화되는 탭 페이지의 헤더는 계속 활성화됩니다.


다음을 사용할 수 있습니다.

tabPage.Enabled = false;

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

TabControler편집 불가능한 탭으로 멋진 수 있습니다 선택 이벤트를 프로그래밍 할 수 있습니다 .

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

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

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

또 다른 아이디어는 모든 컨트롤을 패널 컨트롤의 탭 페이지에 만들었습니다! 스마일리

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

신용은 littleguru @ Channel 9 로 이동합니다 .


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

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

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

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

Cédric Guillemette 대답을 확장하면 다음을 종료합니다 Control.

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

... 그런 다음 TabControlSelecting이벤트를 다음과 같이 처리 할 수 ​​있습니다 .

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

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

tabControl1.Controls.Remove(tabPage2);

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


방법은 Selecting이벤트 를 활성화하지 않고 탭이 활성화되지 않도록하는 것입니다.


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

 tabPage.Parent = null;

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

tabPage.Parent = tabControl;

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

tabControl.TabPages.Insert(indexLocationYouWant, tabPage);

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


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


tabControl.TabPages.Remove (tabPage1);


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


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

탭을 클릭 할 때마다 선택 이벤트가 실행됩니다. 많은 수의 탭의 경우 "CASE"가 여러 개의 경우보다 사용하기 더 쉬울 수 있습니다.

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

이 문제를 다음과 같이 해결했습니다. 3 개의 탭이 있고 사용자가 로그인하지 않은 경우 첫 번째 탭에 사용자를 유지하고 싶습니다. 그래서 TabControl의 SelectingEvent에 썼습니다.

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

사용자는 탐색하기 위해 탭을 클릭 할 수 없지만 두 개의 버튼 ( 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;
}

Vb.Net에 대한 rfnodulator 답변 :

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

다음 컨트롤이 안심 가정합니다.

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

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


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


사용하다:

 tabControl1.TabPages[1].Enabled = false;

이 코드를 작성하면 탭 페이지가 완전히 비활성화되지는 않지만 (선택할 수 없음) 내부 콘텐츠는 비활성화되어 귀하의 요구를 충족한다고 생각합니다.


해결책은 매우 간단합니다.

이 줄 제거 / 주석

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

MainForm.cs의 IntializeComponent () 메서드에서


질문에 대한 적절한 답을 찾지 못했습니다. 특정 탭을 비활성화하는 해결책이없는 것 같습니다. 내가 한 일은 특정 탭을 변수에 전달하고 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;
}

따라서 실제로 탭을 비활성화하지는 않지만 다른 탭을 클릭하면 항상 선택한 탭으로 돌아갑니다.


MyTabControl.SelectedTab.Enabled = false;

참고 URL : https://stackoverflow.com/questions/418006/how-can-i-disable-a-tab-inside-a-tabcontrol

반응형