Câu hỏi này đã có câu trả lời ở đây:
- Ẩn và hiển thị TabPages trong tabControl 16 câu trả lời
Làm cách nào để ẩn TabPage khỏi TabControl trong WinForms 2.0?
Câu hỏi này đã có câu trả lời ở đây:
Làm cách nào để ẩn TabPage khỏi TabControl trong WinForms 2.0?
Không, điều này không tồn tại. Bạn phải xóa tab và thêm lại khi bạn muốn. Hoặc sử dụng điều khiển tab khác (bên thứ 3).
Đoạn mã để ẩn TabPage
private void HideTab1_Click(object sender, EventArgs e)
{
tabControl1.TabPages.Remove(tabPage1);
}
Đoạn mã để hiển thị TabPage
private void ShowTab1_Click(object sender, EventArgs e)
{
tabControl1.TabPages.Add(tabPage1);
}
Tôi nhận ra câu hỏi đã cũ và câu trả lời được chấp nhận là cũ, nhưng ...
Ít nhất là trong .NET 4.0 ...
Để ẩn một tab:
tabControl.TabPages.Remove(tabPage);
Để đặt lại:
tabControl.TabPages.Insert(index, tabPage);
TabPages
làm việc tốt hơn nhiều so Controls
với điều này.
Thuộc tính Visiblity chưa được triển khai trên Tabpages và cũng không có phương thức Chèn.
Bạn cần phải chèn và xóa các trang tab theo cách thủ công.
Đây là một công việc xung quanh cho cùng.
http://www.dotnetspider.com/resource/18344-Hiding-Showing-Tabpages-Tabcontrol.aspx
Để tránh hiện tượng thị giác, bạn có thể cần phải sử dụng:
bindingSource.RaiseListChangeEvent = false
hoặc là
myTabControl.RaiseSelectedIndexChanged = false
Xóa một trang tab:
myTabControl.Remove(myTabPage);
Thêm một trang tab:
myTabControl.Add(myTabPage);
Chèn một trang tab tại vị trí cụ thể:
myTabControl.Insert(2, myTabPage);
Đừng quên đảo ngược các thay đổi:
bindingSource.RaiseListChangeEvent = true;
hoặc là
myTabControl.RaiseSelectedIndexChanged = true;
myTabPage.parent = null;
myTabPage.parent = myTabControl;
Các giải pháp được cung cấp cho đến nay là quá phức tạp. Đọc giải pháp đơn giản nhất tại: http://www.codeproject.com/Questions/614157/How-to-Hide-TabControl-Headers
Bạn có thể sử dụng phương pháp này để làm cho chúng vô hình trong thời gian chạy:
private void HideAllTabsOnTabControl(TabControl theTabControl)
{
theTabControl.Appearance = TabAppearance.FlatButtons;
theTabControl.ItemSize = new Size(0, 1);
theTabControl.SizeMode = TabSizeMode.Fixed;
}
private System.Windows.Forms.TabControl _tabControl;
private System.Windows.Forms.TabPage _tabPage1;
private System.Windows.Forms.TabPage _tabPage2;
...
// Initialise the controls
...
// "hides" tab page 2
_tabControl.TabPages.Remove(_tabPage2);
// "shows" tab page 2
// if the tab control does not contain tabpage2
if (! _tabControl.TabPages.Contains(_tabPage2))
{
_tabControl.TabPages.Add(_tabPage2);
}
Tôi đã kết hợp câu trả lời từ @Jack Griffin và câu trả lời từ @amazedsaint ( đoạn mã dotnetspider tương ứng ) thành một TabControlHelper duy nhất .
Các TabControlHelper cho phép bạn:
public class TabControlHelper
{
private TabControl _tabControl;
private List<KeyValuePair<TabPage, int>> _pagesIndexed;
public TabControlHelper(TabControl tabControl)
{
_tabControl = tabControl;
_pagesIndexed = new List<KeyValuePair<TabPage, int>>();
for (int i = 0; i < tabControl.TabPages.Count; i++)
{
_pagesIndexed.Add(new KeyValuePair<TabPage, int> (tabControl.TabPages[i], i ));
}
}
public void HideAllPages()
{
for (int i = 0; i < _pagesIndexed.Count; i++)
{
_tabControl.TabPages.Remove(_pagesIndexed[i].Key);
}
}
public void ShowAllPages()
{
for (int i = 0; i < _pagesIndexed.Count; i++)
{
_tabControl.TabPages.Add(_pagesIndexed[i].Key);
}
}
public void HidePage(TabPage tabpage)
{
if (!_tabControl.TabPages.Contains(tabpage)) return;
_tabControl.TabPages.Remove(tabpage);
}
public void ShowPage(TabPage tabpage)
{
if (_tabControl.TabPages.Contains(tabpage)) return;
InsertTabPage(GetTabPage(tabpage).Key, GetTabPage(tabpage).Value);
}
private void InsertTabPage(TabPage tabpage, int index)
{
if (index < 0 || index > _tabControl.TabCount)
throw new ArgumentException("Index out of Range.");
_tabControl.TabPages.Add(tabpage);
if (index < _tabControl.TabCount - 1)
do
{
SwapTabPages(tabpage, (_tabControl.TabPages[_tabControl.TabPages.IndexOf(tabpage) - 1]));
}
while (_tabControl.TabPages.IndexOf(tabpage) != index);
_tabControl.SelectedTab = tabpage;
}
private void SwapTabPages(TabPage tabpage1, TabPage tabpage2)
{
if (_tabControl.TabPages.Contains(tabpage1) == false || _tabControl.TabPages.Contains(tabpage2) == false)
throw new ArgumentException("TabPages must be in the TabControls TabPageCollection.");
int Index1 = _tabControl.TabPages.IndexOf(tabpage1);
int Index2 = _tabControl.TabPages.IndexOf(tabpage2);
_tabControl.TabPages[Index1] = tabpage2;
_tabControl.TabPages[Index2] = tabpage1;
}
private KeyValuePair<TabPage, int> GetTabPage(TabPage tabpage)
{
return _pagesIndexed.Where(p => p.Key == tabpage).First();
}
}
Tạo một lớp trống mới và vượt qua nó bên trong nó:
using System.Windows.Forms;
namespace ExtensionMethods
{
public static class TabPageExtensions
{
public static bool IsVisible(this TabPage tabPage)
{
if (tabPage.Parent == null)
return false;
else if (tabPage.Parent.Contains(tabPage))
return true;
else
return false;
}
public static void HidePage(this TabPage tabPage)
{
TabControl parent = (TabControl)tabPage.Parent;
parent.TabPages.Remove(tabPage);
}
public static void ShowPageInTabControl(this TabPage tabPage,TabControl parent)
{
parent.TabPages.Add(tabPage);
}
}
}
2- Thêm tham chiếu vào không gian tên ExtensionMethods trong mã biểu mẫu của bạn:
using ExtensionMethods;
3- Bây giờ bạn có thể sử dụng yourTabPage.IsVisible();
để kiểm tra khả năng hiển thị của nó, yourTabPage.HidePage();
để ẩn nó và yourTabPage.ShowPageInTabControl(parentTabControl);
hiển thị nó.
public static Action<Func<TabPage, bool>> GetTabHider(this TabControl container) {
if (container == null) throw new ArgumentNullException("container");
var orderedCache = new List<TabPage>();
var orderedEnumerator = container.TabPages.GetEnumerator();
while (orderedEnumerator.MoveNext()) {
var current = orderedEnumerator.Current as TabPage;
if (current != null) {
orderedCache.Add(current);
}
}
return (Func<TabPage, bool> where) => {
if (where == null) throw new ArgumentNullException("where");
container.TabPages.Clear();
foreach (TabPage page in orderedCache) {
if (where(page)) {
container.TabPages.Add(page);
}
}
};
}
Sử dụng nó như thế này:
var hider = this.TabContainer1.GetTabHider();
hider((tab) => tab.Text != "tabPage1");
hider((tab) => tab.Text != "tabpage2");
Thứ tự ban đầu của các tab được giữ trong Danh sách được ẩn hoàn toàn bên trong hàm ẩn danh. Giữ một tham chiếu đến thể hiện chức năng và bạn giữ lại thứ tự tab ban đầu của mình.
bạn có thể đặt cha mẹ của trang tab thành null để ẩn và để hiển thị chỉ cần đặt cha mẹ trang tab thành tabcontrol
Chà, nếu bạn không muốn làm rối mã hiện có và chỉ muốn ẩn một tab, bạn có thể sửa đổi mã được tạo bởi trình biên dịch để nhận xét dòng thêm tab vào điều khiển tab.
Ví dụ: Dòng sau đây thêm một tab có tên "readformatcardpage" vào Tabcontrol có tên "tabcontrol"
this.tabcontrol.Controls.Add (this.readformatcardpage);
Sau đây sẽ ngăn việc thêm tab vào tabcontrol
//this.tabcontrol.Controls.Add(this.readformatcardpage);
+1 cho microsoft :-).
Tôi đã quản lý để làm theo cách này:
(giả sử bạn có một Next
nút hiển thị TabPage tiếp theo - tabSteps
là tên của điều khiển Tab)
Khi khởi động, hãy lưu tất cả các tab trong danh sách phù hợp.
Khi người dùng nhấn Next
nút, hãy xóa tất cả các TabPages trong điều khiển tab, sau đó thêm nó với chỉ mục thích hợp:
int step = -1;
List<TabPage> savedTabPages;
private void FMain_Load(object sender, EventArgs e) {
// save all tabpages in the list
savedTabPages = new List<TabPage>();
foreach (TabPage tp in tabSteps.TabPages) {
savedTabPages.Add(tp);
}
SelectNextStep();
}
private void SelectNextStep() {
step++;
// remove all tabs
for (int i = tabSteps.TabPages.Count - 1; i >= 0 ; i--) {
tabSteps.TabPages.Remove(tabSteps.TabPages[i]);
}
// add required tab
tabSteps.TabPages.Add(savedTabPages[step]);
}
private void btnNext_Click(object sender, EventArgs e) {
SelectNextStep();
}
Cập nhật
public class TabControlHelper {
private TabControl tc;
private List<TabPage> pages;
public TabControlHelper(TabControl tabControl) {
tc = tabControl;
pages = new List<TabPage>();
foreach (TabPage p in tc.TabPages) {
pages.Add(p);
}
}
public void HideAllPages() {
foreach(TabPage p in pages) {
tc.TabPages.Remove(p);
}
}
public void ShowAllPages() {
foreach (TabPage p in pages) {
tc.TabPages.Add(p);
}
}
public void HidePage(TabPage tp) {
tc.TabPages.Remove(tp);
}
public void ShowPage(TabPage tp) {
tc.TabPages.Add(tp);
}
}
Là một công việc rẻ tiền xung quanh, tôi đã sử dụng một nhãn hiệu để che đi các tab tôi muốn ẩn.
Sau đó chúng ta có thể sử dụng chỗ dựa có thể nhìn thấy của nhãn thay thế. Nếu bất cứ ai đi theo con đường này, đừng quên xử lý các nét bàn phím hoặc các sự kiện hiển thị. Bạn sẽ không muốn các phím con trỏ bên trái để lộ tab bạn đang cố ẩn.
Không chắc chắn về "Winforms 2.0" nhưng điều này đã được thử và chứng minh:
http: // www. mostthingsweb.com/2011/01/hiding-tab-headers-on-a-tabcontrol-in-c/
Trong WPF, nó khá dễ:
Giả sử bạn đã đặt tên cho TabItem, ví dụ:
<TabItem Header="Admin" Name="adminTab" Visibility="Hidden">
<!-- tab content -->
</TabItem>
Bạn có thể có đoạn mã sau dưới dạng:
if (user.AccessLevel == AccessLevelEnum.Admin)
{
adminTab.Visibility = System.Windows.Visibility.Visible;
}
Cần lưu ý rằng một User
đối tượng có tên user
đã được tạo với thuộc AccessLevel
tính của nó được đặt thành một trong các giá trị enum do người dùng định nghĩa là AccessLevelEnum
... bất cứ điều gì; đó chỉ là một điều kiện để tôi quyết định hiển thị tab hay không.
Tôi cũng đã có câu hỏi này. tabPage.Visible không được triển khai như đã nêu trước đó, đây là một trợ giúp tuyệt vời (+1). Tôi thấy bạn có thể ghi đè lên điều khiển và điều này sẽ hoạt động. Một chút cần thiết, nhưng tôi nghĩ sẽ đăng giải pháp của mình lên đây cho người khác ...
[System.ComponentModel.DesignerCategory("Code")]
public class MyTabPage : TabPage
{
private TabControl _parent;
private bool _isVisible;
private int _index;
public new bool Visible
{
get { return _isVisible; }
set
{
if (_parent == null) _parent = this.Parent as TabControl;
if (_parent == null) return;
if (_index < 0) _index = _parent.TabPages.IndexOf(this);
if (value && !_parent.TabPages.Contains(this))
{
if (_index > 0) _parent.TabPages.Insert(_index, this);
else _parent.TabPages.Add(this);
}
else if (!value && _parent.TabPages.Contains(this)) _parent.TabPages.Remove(this);
_isVisible = value;
base.Visible = value;
}
}
protected override void InitLayout()
{
base.InitLayout();
_parent = Parent as TabControl;
}
}
Tôi đã sử dụng cùng một cách tiếp cận nhưng vấn đề là khi trang tab bị xóa khỏi danh sách TabPages kiểm soát tab, nó cũng bị xóa khỏi danh sách Điều khiển trang tab. Và nó không được xử lý khi hình thức được xử lý.
Vì vậy, nếu bạn có nhiều trang tab "ẩn" như vậy, bạn có thể nhận được các cửa sổ xử lý lỗi vượt quá hạn ngạch và chỉ khởi động lại ứng dụng mới khắc phục được.
Nếu bạn đang nói về AjaxTabControlExtender thì hãy đặt Tab Index của mọi tab và đặt thuộc tính Hiển thị Đúng / Sai theo nhu cầu của bạn.
myTab.Tabs [1] .Visible = true / false;
TabPage pageListe, pageDetay;
bool isDetay = false;
private void btnListeDetay_Click(object sender, EventArgs e)
{
if (isDetay)
{
isDetay = false;
tc.TabPages.Remove(tpKayit);
tc.TabPages.Insert(0,pageListe);
}
else
{
tc.TabPages.Remove(tpListe);
tc.TabPages.Insert(0,pageDetay);
isDetay = true;
}
}
// inVisible
TabPage page2 = tabControl1.TabPages[0];
page2.Visible= false;
//Visible
page2.Visible= true;
// disable
TabPage page2 = tabControl1.TabPages[0];
page2.Enabled = false;
// enable
page2.Enabled = true;
//Hide
tabCtrlTagInfo.TabPages(0).Hide()
tabCtrlTagInfo.TabPages(0).Show()
Chỉ cần sao chép dán và thử nó, đoạn mã trên đã được thử nghiệm trong vs2010, nó hoạt động.