none
TabControl 能隱藏索引標籤嗎? RRS feed

  • 問題

  • 我想由程式中控制tabpage的切換,所以不想在畫面上呈現標籤,但不幸的事我找不到任何方式可以達到這樣子的功能,連msdn的help都要說若不顯示要從collection去移除!

    The tabs in a TabControl are part of the TabControl, but not parts of the individual TabPage controls. Members of the TabPage class, such as the ForeColor property, affect only the client rectangle of the tab page, but not the tabs. Additionally, the Hide method of the TabPage will not hide the tab. To hide the tab, you must remove the TabPage control from the TabControl.TabPages collection.

    不知道有沒有什麼方式可以達成? 還有為什麼他的設計模式要定義的這麼死板?

    2006年8月26日 上午 02:50

解答

  • 您好:
    請參考 VB 的範例程式:
    Imports System.ComponentModel
    
    Namespace Dotnetrix.Samples.VB
    
        <ToolboxBitmap(GetType(System.Windows.Forms.TabControl))> _
        Public Class TabControl
            Inherits System.Windows.Forms.TabControl
    
            Private m_HideTabs As Boolean
    
            <DefaultValue(False), RefreshProperties(RefreshProperties.All)> _
            Public Property HideTabs() As Boolean
                Get
                    Return m_HideTabs
                End Get
                Set(ByVal Value As Boolean)
                    If m_HideTabs = Value Then Return
                    m_HideTabs = Value
                    If Value = True Then Me.Multiline = True
                    Me.UpdateStyles()
                End Set
            End Property
    
            <RefreshProperties(RefreshProperties.All)> _
            Public Overloads Property Multiline() As Boolean
                Get
                    If Me.HideTabs Then Return True
                    Return MyBase.Multiline
                End Get
                Set(ByVal Value As Boolean)
                    If Me.HideTabs Then
                        MyBase.Multiline = True
                    Else
                        MyBase.Multiline = Value
                    End If
                End Set
            End Property
    
            Public Overrides ReadOnly Property DisplayRectangle() As System.Drawing.Rectangle
                Get
                    If Me.HideTabs Then
                        Return New Rectangle(0, 0, Width, Height)
                    Else
                        Dim tabStripHeight, itemHeight As Int32
     
                        If Me.Alignment <= TabAlignment.Bottom Then
                            itemHeight = Me.ItemSize.Height
                        Else
                            itemHeight = Me.ItemSize.Width
                        End If
    
                        If Me.Appearance = TabAppearance.Normal Then
                            tabStripHeight = 5 + (itemHeight * Me.RowCount)
                        Else
                            tabStripHeight = (3 + itemHeight) * Me.RowCount
                        End If
                        Select Case Me.Alignment
                            Case TabAlignment.Top
                                Return New Rectangle(4, tabStripHeight, Width - 8, Height - tabStripHeight - 4)
                            Case TabAlignment.Bottom
                                Return New Rectangle(4, 4, Width - 8, Height - tabStripHeight - 4)
                            Case TabAlignment.Left
                                Return New Rectangle(tabStripHeight, 4, Width - tabStripHeight - 4, Height - 8)
                            Case TabAlignment.Right
                                Return New Rectangle(4, 4, Width - tabStripHeight - 4, Height - 8)
                        End Select
                    End If
                End Get
            End Property
    
        End Class
    End Namespace
    2006年8月27日 上午 02:19
  • 您好:
    下面的程式碼是 C# 語法:
    using System.ComponentModel;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace Dotnetrix.Samples.CSharp
    {
        [ToolboxBitmap(typeof(System.Windows.Forms.TabControl))]
        public class TabControl : System.Windows.Forms.TabControl
        {
            private bool m_HideTabs = false;
            
            [DefaultValue(false)]
            [RefreshProperties(RefreshProperties.All)]
            public bool HideTabs
            {
                get{return m_HideTabs;}
                set
                {
                    if (m_HideTabs == value) return;
                    m_HideTabs = value;
                    if (value == true) this.Multiline = true;
                    this.UpdateStyles();
                }
            }
            
            [RefreshProperties(RefreshProperties.All)]
            public new bool Multiline 
            {
                get
                {
                    if (this.HideTabs) return true;
                    return base.Multiline;
                }
                set
                {
                   if (this.HideTabs)
                        base.Multiline = true;
                    else
                        base.Multiline = value;
                }
            }
            
            public override System.Drawing.Rectangle DisplayRectangle
            {
                get
                {
                    if (this.HideTabs)
                        return new Rectangle(0, 0, Width, Height);
                    else
                    {
                        int tabStripHeight, itemHeight;
    
                        if (this.Alignment <= TabAlignment.Bottom)
                            itemHeight = this.ItemSize.Height;
                        else
                            itemHeight = this.ItemSize.Width;
    
                        if (this.Appearance == TabAppearance.Normal)
                            tabStripHeight = 5 + (itemHeight * this.RowCount);
                        else
                            tabStripHeight = (3 + itemHeight) * this.RowCount;
    
                        switch (this.Alignment)
                        {
                            case TabAlignment.Bottom:
                                return new Rectangle(4, 4, Width - 8, Height - tabStripHeight - 4);
                            case TabAlignment.Left:
                                return new Rectangle(tabStripHeight, 4, Width - tabStripHeight - 4, Height - 8);
                            case TabAlignment.Right:
                                return new Rectangle(4, 4, Width - tabStripHeight - 4, Height - 8);
                            default:
                                return new Rectangle(4, tabStripHeight, Width - 8, Height - tabStripHeight - 4);
                        }
    
                    }
                    
                }
                
            }
            
        }
    }
    2006年8月27日 上午 04:13

所有回覆

  • 您好:
    請參考 VB 的範例程式:
    Imports System.ComponentModel
    
    Namespace Dotnetrix.Samples.VB
    
        <ToolboxBitmap(GetType(System.Windows.Forms.TabControl))> _
        Public Class TabControl
            Inherits System.Windows.Forms.TabControl
    
            Private m_HideTabs As Boolean
    
            <DefaultValue(False), RefreshProperties(RefreshProperties.All)> _
            Public Property HideTabs() As Boolean
                Get
                    Return m_HideTabs
                End Get
                Set(ByVal Value As Boolean)
                    If m_HideTabs = Value Then Return
                    m_HideTabs = Value
                    If Value = True Then Me.Multiline = True
                    Me.UpdateStyles()
                End Set
            End Property
    
            <RefreshProperties(RefreshProperties.All)> _
            Public Overloads Property Multiline() As Boolean
                Get
                    If Me.HideTabs Then Return True
                    Return MyBase.Multiline
                End Get
                Set(ByVal Value As Boolean)
                    If Me.HideTabs Then
                        MyBase.Multiline = True
                    Else
                        MyBase.Multiline = Value
                    End If
                End Set
            End Property
    
            Public Overrides ReadOnly Property DisplayRectangle() As System.Drawing.Rectangle
                Get
                    If Me.HideTabs Then
                        Return New Rectangle(0, 0, Width, Height)
                    Else
                        Dim tabStripHeight, itemHeight As Int32
     
                        If Me.Alignment <= TabAlignment.Bottom Then
                            itemHeight = Me.ItemSize.Height
                        Else
                            itemHeight = Me.ItemSize.Width
                        End If
    
                        If Me.Appearance = TabAppearance.Normal Then
                            tabStripHeight = 5 + (itemHeight * Me.RowCount)
                        Else
                            tabStripHeight = (3 + itemHeight) * Me.RowCount
                        End If
                        Select Case Me.Alignment
                            Case TabAlignment.Top
                                Return New Rectangle(4, tabStripHeight, Width - 8, Height - tabStripHeight - 4)
                            Case TabAlignment.Bottom
                                Return New Rectangle(4, 4, Width - 8, Height - tabStripHeight - 4)
                            Case TabAlignment.Left
                                Return New Rectangle(tabStripHeight, 4, Width - tabStripHeight - 4, Height - 8)
                            Case TabAlignment.Right
                                Return New Rectangle(4, 4, Width - tabStripHeight - 4, Height - 8)
                        End Select
                    End If
                End Get
            End Property
    
        End Class
    End Namespace
    2006年8月27日 上午 02:19
  • 您好:
    下面的程式碼是 C# 語法:
    using System.ComponentModel;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace Dotnetrix.Samples.CSharp
    {
        [ToolboxBitmap(typeof(System.Windows.Forms.TabControl))]
        public class TabControl : System.Windows.Forms.TabControl
        {
            private bool m_HideTabs = false;
            
            [DefaultValue(false)]
            [RefreshProperties(RefreshProperties.All)]
            public bool HideTabs
            {
                get{return m_HideTabs;}
                set
                {
                    if (m_HideTabs == value) return;
                    m_HideTabs = value;
                    if (value == true) this.Multiline = true;
                    this.UpdateStyles();
                }
            }
            
            [RefreshProperties(RefreshProperties.All)]
            public new bool Multiline 
            {
                get
                {
                    if (this.HideTabs) return true;
                    return base.Multiline;
                }
                set
                {
                   if (this.HideTabs)
                        base.Multiline = true;
                    else
                        base.Multiline = value;
                }
            }
            
            public override System.Drawing.Rectangle DisplayRectangle
            {
                get
                {
                    if (this.HideTabs)
                        return new Rectangle(0, 0, Width, Height);
                    else
                    {
                        int tabStripHeight, itemHeight;
    
                        if (this.Alignment <= TabAlignment.Bottom)
                            itemHeight = this.ItemSize.Height;
                        else
                            itemHeight = this.ItemSize.Width;
    
                        if (this.Appearance == TabAppearance.Normal)
                            tabStripHeight = 5 + (itemHeight * this.RowCount);
                        else
                            tabStripHeight = (3 + itemHeight) * this.RowCount;
    
                        switch (this.Alignment)
                        {
                            case TabAlignment.Bottom:
                                return new Rectangle(4, 4, Width - 8, Height - tabStripHeight - 4);
                            case TabAlignment.Left:
                                return new Rectangle(tabStripHeight, 4, Width - tabStripHeight - 4, Height - 8);
                            case TabAlignment.Right:
                                return new Rectangle(4, 4, Width - tabStripHeight - 4, Height - 8);
                            default:
                                return new Rectangle(4, tabStripHeight, Width - 8, Height - tabStripHeight - 4);
                        }
    
                    }
                    
                }
                
            }
            
        }
    }
    2006年8月27日 上午 04:13
  • ok了~謝謝!
    2006年8月27日 上午 04:53
  •  

    請問有C++的語法嗎?
    2008年5月12日 下午 01:12
  •  唉呀呀!
    這解法真是讓人無言呀,還記得以前有屬性設一下就可以直接隱藏了。
    現在的標準解法是改寫控制元件。這算是進步還是退步呀。
    2009年3月23日 上午 05:13
  • 好奇怪!
    既然用程式去載入內容,又不想要TabControl 的UI.
    那就用別的Container Constorl 去 Host 內容就好了.

    2009年3月23日 上午 06:28
  • 好奇怪!
    既然用程式去載入內容,又不想要TabControl 的UI.
    那就用別的Container Constorl 去 Host 內容就好了.

    一般來說,你是對的。
    但ERP實戰上偶而想做到的效果是:有多個“Page”可以擺資料,但不給user可以直接控制 Page 。(有點像 Wizard mode,但不是。)
    解法一:用 TabControl,但是 索引標籤 不開放。(記得寫VC6時有屬性可以直接隱藏索引標籤,不知為何.NET版的不見了)
    解法二:用 數個同樣大小的 Panel 用程式控制顯示那一個。

    2009年4月1日 上午 03:53
  • "您好:
    請參考 VB 的範例程式:
    Imports System.ComponentModel
    
    Namespace Dotnetrix.Samples.VB
    
      <ToolboxBitmap(GetType(System.Windows.Forms.TabControl))> _
      Public Class TabControl
       ...... 恕刪  "

           請問 Alex Chuo 大大 , 你PO的這段程式碼要怎麼用呢???

             他是否可以讓我們由程式去控制同一TabControl中的哪一個tabpage要顯示,哪一個tabpage要隱藏嗎??

          最近遇到要寫這種功能的問題,百試不得其解.....           

     

    2010年5月26日 上午 10:24
  • Hi!

    假如是透過移除 remove / add 的方式,可以參考 關於TabPage


    歡迎參觀我的Blog.NET菜鳥自救會
    2010年5月26日 下午 02:32
  • 我比較懶,我是用一個物件來包 TabPage ,沒有全面重新封裝。

    Private m_TabPages As TabPagesVisibleTool
    ...
    m_TabPages = New TabPagesVisibleTool(tabOptions)
    m_TabPages.Visible(1) = False
    ...
    
    #Region "TabControl TabPage 隱藏"
    Class TabPagesVisibleTool
    	Private m_ListPages As New ArrayList
    	Private m_TabControl As TabControl
    
    ...
    
    	Public Property Visible(ByVal index As Integer) As Boolean
    		Get
    			Return m_ListPages(index).Visible
    		End Get
    		Set(ByVal Value As Boolean)
    			m_ListPages(index).Visible = Value
    			If Value Then
    				m_TabControl.TabPages.Insert(index, m_ListPages(index))
    			Else
    				m_TabControl.TabPages.Remove(m_ListPages(index))
    			End If
    		End Set
    	End Property
    
    	Public Property Visible(ByVal vTabPage As TabPage) As Boolean
    		Get
    			Dim index As Integer = m_ListPages.IndexOf(vTabPage)
    			Return Visible(index)
    		End Get
    		Set(ByVal Value As Boolean)
    			Dim index As Integer = m_ListPages.IndexOf(vTabPage)
    			Visible(index) = Value
    		End Set
    	End Property
    
    
    	Sub New(ByVal vTabControl As TabControl)
    		m_TabControl = vTabControl
    		m_ListPages.AddRange(vTabControl.TabPages)
    	End Sub
    End Class
    

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已提議為解答 horngsh 2011年7月24日 上午 08:19
    2010年5月26日 下午 03:40
  • 您好:
    下面的程式碼是 C# 語法:
    using System.ComponentModel;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace Dotnetrix.Samples.CSharp
    {
      [ToolboxBitmap(typeof(System.Windows.Forms.TabControl))]
      public class TabControl : System.Windows.Forms.TabControl
      {
        private bool m_HideTabs = false;
        
        [DefaultValue(false)]
        [RefreshProperties(RefreshProperties.All)]
        public bool HideTabs
        {
          get{return m_HideTabs;}
          set
          {
            if (m_HideTabs == value) return;
            m_HideTabs = value;
            if (value == true) this.Multiline = true;
            this.UpdateStyles();
          }
        }
        
        [RefreshProperties(RefreshProperties.All)]
        public new bool Multiline 
        {
          get
          {
            if (this.HideTabs) return true;
            return base.Multiline;
          }
          set
          {
            if (this.HideTabs)
              base.Multiline = true;
            else
              base.Multiline = value;
          }
        }
        
        public override System.Drawing.Rectangle DisplayRectangle
        {
          get
          {
            if (this.HideTabs)
              return new Rectangle(0, 0, Width, Height);
            else
            {
              int tabStripHeight, itemHeight;
    
              if (this.Alignment <= TabAlignment.Bottom)
                itemHeight = this.ItemSize.Height;
              else
                itemHeight = this.ItemSize.Width;
    
              if (this.Appearance == TabAppearance.Normal)
                tabStripHeight = 5 + (itemHeight * this.RowCount);
              else
                tabStripHeight = (3 + itemHeight) * this.RowCount;
    
              switch (this.Alignment)
              {
                case TabAlignment.Bottom:
                  return new Rectangle(4, 4, Width - 8, Height - tabStripHeight - 4);
                case TabAlignment.Left:
                  return new Rectangle(tabStripHeight, 4, Width - tabStripHeight - 4, Height - 8);
                case TabAlignment.Right:
                  return new Rectangle(4, 4, Width - tabStripHeight - 4, Height - 8);
                default:
                  return new Rectangle(4, tabStripHeight, Width - 8, Height - tabStripHeight - 4);
              }
    
            }
            
          }
          
        }
        
      }
    }
    本人是初學者, 敢問大大, 上述源碼是怎樣跑?
    2010年9月24日 上午 01:28
  • 這是一個需求很大的功能, 懇求各位大大幫忙?
    2010年10月3日 上午 11:10
  • 你程式碼看懂了嗎?
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年10月3日 下午 12:45
  • 建議你把程式碼列印出來, 拿一枝鉛筆和一堆白紙, 用筆來描繪每一行程式碼的結果,  遇到不懂的就查MSDN文件庫, 然後試著寫一小段程式去驗證MSDN文件庫中的說明.

    這是最容易記憶深刻的方法.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年10月3日 下午 01:14
    版主
  • 建議你把程式碼列印出來, 拿一枝鉛筆和一堆白紙, 用筆來描繪每一行程式碼的結果,  遇到不懂的就查MSDN文件庫, 然後試著寫一小段程式去驗證MSDN文件庫中的說明.

    這是最容易記憶深刻的方法.


    多謝大大的意見, 這應是一個不錯的方法,

    但本人意思是, 如何在不理解上述程式碼的情況下, 可以整段使用
    (有時間時才真正研究上述程式碼及思考是否有更好的方法), 即視它為一個元件,
    或說, 如何在Visual Studio內使用它呢,
    是否先Add一個 Class, 再放入上述代碼使用, 再build solution......

    或說, 是否做了"某些"動作後, 可以在Visual Studio的Toolbox內見到這個"自定義"的元件呢?
    若是的話, 那些"動作"究竟是如何呢?

     

    2010年10月5日 上午 05:48

  • 多謝大大的意見, 這應是一個不錯的方法,

    但本人意思是, 如何在不理解上述程式碼的情況下, 可以整段使用
    (有時間時才真正研究上述程式碼及思考是否有更好的方法), 即視它為一個元件,

    聽起來以上大大的方法都不適合你, 最好的建議是你可以把這個元件發包出去給別人做.
    2010年10月5日 上午 06:57
  • 用設定屬性的方法如下:

    方法1 : 在設計介面的屬性視窗中設定
    Appearance  :  FlatButtons
    SizeMode     :   Fixed
    ItemSize        :   0,1

    方法2 : 在程式碼中設定屬性
    TabControl.Appearance = TabAppearance.FlatButtons
    TabControl.SizeMode = TabSizeMode.Fixed
    TabControl.ItemSize = New Size(0, 1)

    很簡單吧, 希望對你有幫助

    2010年12月19日 上午 02:38
  • 很棒~謝謝你的建議!!簡單明瞭!!感恩
    2011年3月25日 上午 08:41