TabControl 에서 탭을 비활성화하는 방법이 있습니까?
답변:
TabPage의 클래스는 Enabled 속성을 숨 깁니다. 어색한 UI 디자인 문제가 있기 때문에 의도적이었습니다. 기본적인 문제는 페이지를 비활성화해도 탭도 비활성화되지 않는다는 것입니다. 그리고 Selecting 이벤트로 탭을 비활성화하여이 문제를 해결하려고하면 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;
}
Visible
내가 그것을 테스트했을 때 실제로 어떤 시각적 효과가 없었던 것처럼 보였지만 속성에 대해서도 사실 인 것 같습니다.
"선택"이벤트를 등록하고 탭 페이지 탐색을 취소 할 수 있습니다.
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;
... 그러면 TabControl
의 Selecting
이벤트를 다음과 같이 처리 할 수 있습니다 .
private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
{
e.Cancel = !((Control)e.TabPage).Enabled;
}
유일한 방법은 Selecting
이벤트 를 포착하고 탭이 활성화되는 것을 방지하는 것입니다.
가장 까다로운 방법은 부모를 null로 만드는 것입니다 (부모없이 탭만 만드십시오).
tabPage.Parent = null;
그리고 당신이 그것을 되돌리고 싶을 때 (페이지 컬렉션의 끝에서 되돌릴 것입니다) :
tabPage.Parent = tabControl;
페이지 중 특정 위치로 되돌리려면 다음을 사용할 수 있습니다.
tabControl.TabPages.Insert(indexLocationYouWant, tabPage);
tabPage1.Hide (), tabPage2.Show () 등 탭 페이지를 통해 할 수 있습니다.
사용자가 클릭하지 못하도록 과거에 탭 페이지를 제거했습니다. 탭 페이지가 있는지 확인해야 할 수도 있기 때문에 이것은 아마도 최선의 해결책은 아닐 것입니다.
이벤트 및 탭 컨트롤의 속성을 사용하여 원할 때 원하는 것을 활성화 / 비활성화 할 수 있습니다. 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;
}
}
}
사용자는 탐색하기 위해 탭을 클릭 할 수 없지만 두 개의 버튼 ( 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;
}
다음 컨트롤이 있다고 가정합니다.
이름이 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);
}
}
}
두 번째 탭을 클릭 할 수 없게됩니다.
이것은 오래된 질문이지만 누군가가 내 추가로 이익을 얻을 수 있습니다. 숨겨진 탭을 연속적으로 표시하는 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();
}
양식로드 이벤트에서를 작성 this.tabpage.PageEnabled = 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;
}
따라서 실제로 탭을 비활성화하지는 않지만 다른 탭을 클릭하면 항상 선택한 탭으로 돌아갑니다.