Có cách nào để tắt một tab trong TabControl không?
Có cách nào để tắt một tab trong TabControl không?
Câu trả lời:
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;
}
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.
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;
}
Visible
tà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ó.
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 .
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 );
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 Selecting
sự kiện như:
private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
{
e.Cancel = !((Control)e.TabPage).Enabled;
}
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.
Cách duy nhất là nắm bắt Selecting
sự kiện và ngăn kích hoạt một tab.
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);
Bạn có thể làm điều đó thông qua các trang: tabPage1.Hide (), tabPage2.Show (), v.v.
tabControl.TabPages.Remove (tabPage1);
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.
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;
}
}
}
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 ( Nextvà Back). 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;
}
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
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.
Đâ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();
}
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.
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
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 SelectedIndexChanged
trườ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.