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;
... 그런 다음 TabControl
의 Selecting
이벤트를 다음과 같이 처리 할 수 있습니다 .
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"); }
사용자는 탐색하기 위해 탭을 클릭 할 수 없지만 두 개의 버튼 ( 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;
}
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
'ProgramingTip' 카테고리의 다른 글
오류 : ORA-65096 : 오라클의 공용 사용자 또는 역할 이름이 잘못되었습니다. (0) | 2020.10.22 |
---|---|
Xcode 4.1 치명적인 오류 : 미리 빌드 된 헤더 수정 된 stdlib (0) | 2020.10.22 |
활성 페이지의 현재 카테고리 ID 가져 오기 (0) | 2020.10.22 |
UIScrollView에서 프로그래밍 방식으로 스크롤을 강제 중지해야합니까? (0) | 2020.10.22 |
여러 배열 키가 있는지 확인하는 방법 (0) | 2020.10.22 |