Làm cách nào để tắt một tab bên trong TabControl?


81

Có cách nào để tắt một tab trong TabControl không?


1
Tôi hoặc là sẽ loại bỏ các tab hoặc thay thế nội dung của nó với một lời giải thích ...
Phil1970

Câu trả lời:


71

Lớp TabPage ẩn thuộc tính Enabled. Đó là cố ý vì có một vấn đề thiết kế giao diện người dùng khó xử với nó. Vấn đề cơ bản là vô hiệu hoá trang cũng không vô hiệu hoá tab. Và nếu cố gắng giải quyết vấn đề đó bằng cách tắt 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 khiến bạn quan tâm thì hãy nhớ rằng thuộc tính 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;
}

3
Tôi tự hỏi câu chuyện đằng sau là gì vì không cho phép chuyển đổi chế độ hiển thị tab
Shekhar

91

Truyền TabPage của bạn đến một Điều khiển, sau đó đặt thuộc tính Đã bật thành false.

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

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


3
Tôi nghĩ rằng điều này bỏ sót điểm tắt tab, chính nó. Người dùng không được phép chọn nó và xem nội dung.
ThunderGr

3
Đó có thể là trường hợp sử dụng của bạn nhưng tôi nghĩ nó hữu ích nếu tab cần ở chế độ chỉ đọc vì một số quyền.
Cédric Guillemette

9
Tại sao cần kiểm soát TabPage downcasting? Chúng tôi có thể gọi thuộc tính Enabled từ TabPage do tính đa hình.
Eldar Agalarov

1
Không biết có bao giờ khác không nhưng ngày nay điều đó hoàn toàn vô nghĩa. 69 người ủng hộ sai. Ouch ..
TaW

1
@TaW Câu hỏi này trả lời cụ thể và ngắn gọn câu hỏi. "Có cách nào để tắt một tab trong điều khiển tab không?" Họ không hỏi làm thế nào để ẩn một tab. 69 người ủng hộ ở đúng ... 1 người bình luận không đọc nhầm câu hỏi. Ouch ...
DDuffy

70

Bạn chỉ cần sử dụng:

tabPage.Enabled = false;

Thuộc tính này không được hiển thị, nhưng nó hoạt động mà không gặp bất kỳ sự cố nào.

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

3
Thật kỳ lạ .. điều này cũng có vẻ đúng với Visibletài sản, mặc dù nó dường như không thực sự có bất kỳ hiệu ứng hình ảnh nào khi tôi kiểm tra nó.
Alfie

@Alfie Vì TabPage kế thừa từ hệ thống phân cấp sau: Control> ScrollableControl> Panel> TabPage, hành vi Enable, Visible, v.v. là đa hình.
Master Yoda

49

Bạn có thể đăng ký sự kiện "Lựa 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! Mặt 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 trang tab.

Tín dụng được chuyển đến littleguru @ Kênh 9 .


Hoàn chỉnh hơn và bài tôi nên đã gửi :)
Martijn Laarman

Đây là một giải pháp tuyệt vời đẫm máu !!
Cornelius

13

Có lẽ, bạn muốn xem tab trong điều khiển tab, nhưng bạn muốn nó bị "tắt" (tức là chuyển sang 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 làm điều này được cung cấp ở đây .

Điều kỳ diệu nằm trong đoạn mã 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 );

1
Liên kết ví dụ bây giờ dường như đã chết.
Tường thuật

1
@Narthring - Cảm ơn, tôi đã thay thế liên kết bằng một liên kết đang hoạt động.
Stewart

2
@Narthring Nó lại chết rồi.
Sukasa

Đây là câu trả lời "thực sự" cho câu hỏi này. Có một bản ghi về liên kết chết từ waybackmachine: [ web.archive.org/web/20131102065816/http://… .
Joe Uhren

Một cải tiến cho câu trả lời này ... hãy thêm trình xử lý sự kiện EnabledChanged vào mỗi tab của bạn và yêu cầu trình xử lý sự kiện gọi là Invalidate () trên điều khiển tab. Bằng cách đó, màu văn bản sẽ tự động cập nhật.
ulatekh

12

Mở rộng 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ý các TabControl's Selectingsự kiện như:

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

8

Thao tác này sẽ xóa trang tab, nhưng bạn sẽ cần phải thêm lại trang khi cần:

tabControl1.Controls.Remove(tabPage2);

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


Tôi nghĩ rằng nó hoạt động hoàn hảo khi bạn muốn kiểm tra, trong sự kiện Tải của biểu mẫu, nếu người dùng đủ điều kiện để truy cập tab này và nếu không, chỉ cần xóa hoàn toàn.
ThunderGr,


2

Cách khó nhất là làm cho phụ huynh của nó bằng null (chỉ tạo tab mà không có phụ huynh):

 tabPage.Parent = null;

Và khi bạn muốn trả lại nó (sẽ trả lại nó ở 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
Nó hoạt động tốt! :)..Tôi có một câu hỏi. Khi chúng tôi đưa nó trở lại tabcontrol việc thêm chỉ mục cuối cùng của nó. Làm thế nào để chúng tôi thêm trang tab ở cùng một chỉ mục từ giai đoạn đầu của nó.
Người dùng6667769

1
Nếu bạn muốn đưa nó trở lại vị trí bạn muốn (không phải ở cuối), hãy sử dụng: tabControl.TabPages.Insert (indexLocationYouWant, tabPage);
Amr Ashraf

1
Cảm ơn bạn đã trả lời của bạn @Amr Ashraf
User6667769

1

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à vậy) và thêm lại vào khi các đ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

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


2
Tôi đã sử dụng nó trong windows ce 6.0 với .net compact framework 3.5 và nó đang hoạt động. Câu hỏi không đưa ra bất kỳ manh mối nào về nền tảng. Bạn cần cái này ở đâu, web hay máy tính để bàn hay thiết bị di động?
aldebaran


0

Trước đây, tôi đã xóa các trang tab để ngăn người dùng nhấp vào chúng. Mặc dù vậy, đây có lẽ không phải là giải pháp tốt nhất vì họ có thể cần thấy rằng trang tab tồn tại.


0

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

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

Tôi đã giải quyết vấn đề này 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, vì vậy trên SelectionEvent của TabControl tôi đã viết

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

0

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 ( NextBack). Người dùng không thể tiếp tục bướ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

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

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

TabControl với tên tcExemple.

Tab Trang có tên tpEx1 và tpEx2.

Thử nó:

Đặt DrawMode của TabPage của bạn thành OwnerDrawFixed; Sau khi InitializeComponent (), hãy đảm bảo rằng tpEx2 không được kích hoạt bằng cách thêm mã này:

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

Thêm vào sự kiện Selection tcExemple mã bên dưới:

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

Đây là một câu hỏi cũ, nhưng ai đó có thể được lợi từ sự bổ sung của tôi. Tôi cần một TabControl sẽ hiển thị liên tiếp các tab ẩn (sau khi một hành động được thực hiện trên tab hiện tại). Vì vậy, tôi đã tạo một lớp nhanh chóng để kế thừa từ đó và được gọi là HideSuccessive () khi tải:

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

Trong sự kiện tải biểu mẫu nếu chúng ta viết this.tabpage.PageEnabled = false, trang tab sẽ bị vô hiệu hóa.


Không thể nhìn thấy Tài sản đó
John

vui lòng kiểm tra xem bạn đã thử nó trong trường hợp tải biểu mẫu chưa?
mới

Vừa được kiểm tra gấp đôi ngay bây giờ. Không thể nhìn thấy nó.
John

vui lòng kiểm tra xem bạn đã sử dụng cái này chưa: private void XtraForm1_Load (object sender, EventArgs e) {this.xtraTabPage1.PageEnabled = false; } XtraForm1 là DevExpress XtraForm và trang tab xtraTabPage là DevExpress XtraTabpage
Mới

Tại sao bạn không nói gì về DevExpress trong câu trả lời ban đầu của bạn ...?
John

-1

Sử dụng:

 tabControl1.TabPages[1].Enabled = false;

Bằng cách viết mã này, trang tab sẽ không bị vô hiệu hóa hoàn toàn (không thể chọn), nhưng nội dung bên trong của nó sẽ bị vô hiệu hóa mà tôi nghĩ sẽ đáp ứng nhu cầu của bạn.


-1

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

Xóa / bình luận dòng này

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

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


-1

Tôi không thể tìm thấy câu trả lời thích hợp cho câu hỏi. Có vẻ như không có giải pháp nào để tắt tab cụ thể. Những gì tôi đã làm là chuyển tab cụ thể cho một biến và trong SelectedIndexChangedtrường hợp, hãy đặ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 một tab khác được nhấp vào, nó luôn đưa bạn trở lại tab đã chọn.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.