it-swarm-vi.tech

Làm cách nào để vô hiệu hóa một tab bên trong TabControl?

Có cách nào để vô hiệu hóa một tab trong TabControl ?

Tôi đang sử dụng C #.

66
Gold

TabPage class ẩn thuộc tính Đã bật. Đó là cố ý vì có một vấn đề thiết kế UI khó xử với nó. Vấn đề cơ bản là việc vô hiệu hóa trang cũng không vô hiệu hóa tab. Và nếu cố gắng khắc phục điều đó bằng cách vô hiệu hóa tab với sự kiện Chọn thì nó không hoạt động khi TabControl chỉ có một trang.

Nếu những vấn đề về khả năng sử dụng này không liên quan đến bạn thì hãy nhớ rằng tài sản vẫn hoạt động, nó chỉ bị ẩn khỏi IntelliSense. Nếu FUD không thoải mái thì bạn chỉ cần làm điều này:

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

Truyền TabPage của bạn thành Điều khiển, sau đó đặt thuộc tính Kích hoạt thành sai.

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

Do đó, tiêu đề của tab vẫn sẽ được bật nhưng nội dung của nó sẽ bị tắt.

80
Cédric Guillemette

Bạn chỉ có thể sử dụng:

tabPage.Enabled = false;

Khách sạn này không được hiển thị, nhưng nó hoạt động mà không có bất kỳ vấn đề.

Bạn có thể lập trình sự kiện Chọn trên TabControler để không thể thay đổi thành tab không thể chỉnh sửa:

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

Bạn có thể đăng ký sự kiện "Chọn" và hủy điều hướng đến trang tab:

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

Một ý tưởng khác là đặt tất cả các điều khiển trên trang tab trong điều khiển Bảng điều khiển và vô hiệu hóa bảng điều khiển! Cười

Bạn cũng có thể xóa trang tab khỏi bộ sưu tập tabControl1.TabPages. Điều đó sẽ ẩn các tab.

Tín dụng đi đến littleguru @ Kênh 9 .

42
Stormenet

Có lẽ, bạn muốn xem tab trong điều khiển tab, nhưng bạn muốn nó bị "vô hiệu hóa" (nghĩa là, màu xám và không thể chọn). Không có hỗ trợ tích hợp cho việc này, nhưng bạn có thể ghi đè cơ chế vẽ để mang lại hiệu quả mong muốn.

Một ví dụ về cách thực hiện việc này là được cung cấp ở đây .

Phép thuật nằm trong đoạn trích này từ nguồn được trình bày và trong phương thức DisableTab_DrawItem:

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

Mở rộng theo câu trả lời của Cédric Guillemette, sau khi bạn tắt Control:

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

... sau đó bạn có thể xử lý sự kiện TabControl 's Selecting như:

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

Điều này sẽ xóa trang tab, nhưng bạn sẽ cần thêm lại nó khi bạn cần:

tabControl1.Controls.Remove(tabPage2);

Nếu bạn sẽ cần nó sau này, bạn có thể muốn lưu trữ nó trong một trang tạm thời trước khi xóa và sau đó thêm lại khi cần.

6
sahran

Cách duy nhất là bắt sự kiện Selecting và ngăn tab được kích hoạt.

5
Martijn Laarman

Tôi đã phải xử lý điều này một thời gian trở lại. Tôi đã xóa Tab khỏi bộ sưu tập TabPages (tôi nghĩ đó là nó) và thêm lại khi điều kiện thay đổi. Nhưng đó chỉ là trong Winforms nơi tôi có thể giữ tab xung quanh cho đến khi tôi cần lại. 

1
jcollum

Bạn có thể làm điều đó thông qua các trang tab: tabPage1.Hide (), tabPage2.Show (), v.v.

1
aldebaran

Cách khó nhất là làm cho cha mẹ của nó bằng null (tạo tab một mình mà không có cha mẹ):

 tabPage.Parent = null;

Và khi bạn muốn trả lại (sẽ trả lại ở cuối bộ sưu tập trang):

tabPage.Parent = tabControl;

Và nếu bạn muốn trả lại nó ở một vị trí cụ thể trong số các trang bạn có thể sử dụng:

tabControl.TabPages.Insert(indexLocationYouWant, tabPage);
1
Amr Ashraf

tabControl.TabPages.Remove (tabPage1);

1
Johannes Kawali

Tôi đã xóa các trang tab trong quá khứ để ngăn người dùng nhấp vào chúng. Đây có lẽ không phải là giải pháp tốt nhất bởi vì họ có thể cần thấy rằng trang tab tồn tại.

0
Aaron Smith

câu trả lời rfnodulator cho Vb.Net: 

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

Tôi đã giải quyết vấn đề như thế này: Tôi có 3 tab và tôi muốn giữ người dùng ở tab đầu tiên nếu anh ta không đăng nhập,

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

Sử dụng các sự kiện và các thuộc tính của điều khiển tab, bạn có thể bật/tắt những gì bạn muốn khi bạn muốn. Tôi đã sử dụng một bool có sẵn cho tất cả các phương thức trong lớp biểu mẫu con mdi nơi tabControl đang được sử dụng. 

Hãy nhớ rằng sự kiện chọn sẽ kích hoạt mỗi khi nhấp vào bất kỳ tab nào. Đối với số lượng lớn các tab, "CASE" có thể dễ sử dụng hơn một loạt các 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
KWB Tech

Giải pháp này rất đơn giản.

Xóa/nhận xét dòng này 

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

trong phương thức IntializeComponent () trong MainForm.cs

0
user9677867

Giả sử rằng bạn có các điều khiển này:

TabControl với tên tcExemple.

TabPages có tên tpEx1 và tpEx2.

Thử nó:

Đặt DrawMode của TabPage của bạn thành chủ sở hữuDrawFixed;

((Control)tcExemple.TabPages["tpEx2").Enabled = false;

Thêm vào Lựa chọn tcExemple sự kiện mã dưới đây:

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

Đính kèm vào sự kiện DrawItem của tcExemple mã này:

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

Nó sẽ làm cho tab thứ hai không thể nhấp được.

0
Rafael

Người dùng không thể nhấp vào các tab để điều hướng, nhưng họ có thể sử dụng hai nút (Next và Back). Người dùng không thể tiếp tục tiếp theo nếu điều kiện // không được đáp ứng.

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
kennedy484

Tôi không thể tìm thấy một câu trả lời thích hợp cho câu hỏi. Dường như không có giải pháp nào để vô hiệu hóa tab cụ thể. Những gì tôi đã làm là chuyển tab cụ thể cho một biến và trong sự kiện SelectedIndexChanged đặt nó trở lại 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;
}

Vì vậy, bạn không thực sự vô hiệu hóa tab, nhưng khi nhấp vào tab khác, nó luôn đưa bạn trở lại tab đã chọn.

0
Andy