none
TabControl 標籤問題 RRS feed

  • 問題

  • 當 TabPages 標籤刪除後, 能否在下次新增時一個新標籤自動填補舊 TabPages 標籤ID

    在順序排下去?

    效果 : 可以新增標籤 / 刪除標籤

    但不會出現 InvalidArgument='1' 不是 'index' 的有效值。 參數名稱: index

    等錯誤。

    2010年12月23日 下午 03:49

解答

  • Hello, 已下供參考:

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            Dim NewPage As New TabPage                              '新 TabPage
            Dim NewLV As New ListView With {.Dock = DockStyle.Fill} '新 ListView, 順便設 Dock.

            NewLV.Items.Add("項目")                                 '依需求增加項目

            NewPage.Controls.Add(NewLV)                             'TabPage 新 ListView

            TabControl1.TabPages.Add(NewPage)                   '將新 TabPage 加入 TabControl.

        End Sub


        Private Sub TabControl1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabControl1.SelectedIndexChanged
            Try
                Label1.Text = CType(TabControl1.SelectedTab.Controls(0), ListView).Items.Count '選到上面新增的 TabPage 時可正常顯示.

            Catch ex As Exception
                MsgBox(ex.Message)
                '如果選到裡面沒有任何 Control 的 TabPage : "索引 0 超出範圍。 參數名稱: index"
            End Try

        End Sub

    • 已標示為解答 Mr.Frankie 2010年12月25日 上午 09:15
    2010年12月24日 上午 05:46

所有回覆

  • 您好

    請參考 HOW TO:使用 Windows Form TabControl 加入和移除索引標籤

    請使用 Name 而不要使用 Index,例如

    if (tabTrackOut.SelectedTab.Name == "tabPageName")


    歡迎參觀我的Blog.NET菜鳥自救會
    2010年12月23日 下午 04:20
    版主
  • 成功了, 謝謝小歐老師

    可是我又有另外一個問題

    例如我有一個 Label 是用來顯示每 TabPage 的 ListView.Items.Count.ToString

    當我點另外一個標籤時, 能跟隨點選的標籤 TabPage 顯示那一頁的 ListView.Items.Count.ToString 數目?

    而且標籤名稱不能重復。

    2010年12月24日 上午 04:08
  • Hello,


        假如每個 TabPage 內都只有唯一一個控制項, 且該控制項型別是 ListView,
        那就可以單純的用下列方法:

        Private Sub TabControl1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabControl1.SelectedIndexChanged

            Label1.Text = CType(TabControl1.SelectedTab.Controls(0), ListView).Items.Count

        End Sub

    以上猜測, 不懂您 "標籤名稱不能重復" 是指?

    2010年12月24日 上午 05:18
  • Hello,


        假如每個 TabPage 內都只有唯一一個控制項, 且該控制項型別是 ListView,
        那就可以單純的用下列方法:

        Private Sub TabControl1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabControl1.SelectedIndexChanged

            Label1.Text = CType(TabControl1.SelectedTab.Controls(0), ListView).Items.Count

        End Sub

    以上猜測, 不懂您 "標籤名稱不能重復" 是指?


    先感謝指教, 例如 : 已經有一個標籤name為 A, 而下次新增一個 TabPage 時,

    如果新的標籤name "A" 彈出錯誤 " 標籤名稱重覆。

    還有剛剛照你的方法去做, 結果 :

    • 已編輯 Mr.Frankie 2010年12月24日 上午 06:30
    2010年12月24日 上午 05:23
  • Hello, 已下供參考:

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            Dim NewPage As New TabPage                              '新 TabPage
            Dim NewLV As New ListView With {.Dock = DockStyle.Fill} '新 ListView, 順便設 Dock.

            NewLV.Items.Add("項目")                                 '依需求增加項目

            NewPage.Controls.Add(NewLV)                             'TabPage 新 ListView

            TabControl1.TabPages.Add(NewPage)                   '將新 TabPage 加入 TabControl.

        End Sub


        Private Sub TabControl1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabControl1.SelectedIndexChanged
            Try
                Label1.Text = CType(TabControl1.SelectedTab.Controls(0), ListView).Items.Count '選到上面新增的 TabPage 時可正常顯示.

            Catch ex As Exception
                MsgBox(ex.Message)
                '如果選到裡面沒有任何 Control 的 TabPage : "索引 0 超出範圍。 參數名稱: index"
            End Try

        End Sub

    • 已標示為解答 Mr.Frankie 2010年12月25日 上午 09:15
    2010年12月24日 上午 05:46
  • 捕充:

    要先排除這種情況, 方法之ㄧ:
    例如在 Form.Load 時先 TabControl1.TabPages.Clear(),
    統一用自訂的方法增加 TabPage.

    另, SelectedIndexChanged 中可再加個檢查
    If TabControl1.SelectedTab Is Nothing Then Exit Sub

    2010年12月24日 上午 05:58
  • 弄好了, 感謝^^
    我還有一個問題, 有辦法不使用 ContextMenuStrip 等 Menu
    而能夠在標籤旁加上移除標籤?
    移除標籤 :
    TabControl1.TabPages.Remove(TabControl1.SelectedTab)
    另外 :
    例如 : 已經有一個標籤name為 A, 而下次新增一個 TabPage 時,
    如果新的標籤name 為 A, 跟舊標籤 name 相同 -> 彈出錯誤 標籤名稱重覆。
    2010年12月24日 上午 06:35
  • 不好意思, 不大清楚您的意思,
    "不使用 ContextMenuStrip 等 Menu", 那可以使用 Button.Click, 
    甚至是 TabControl.MouseDoubleClick、TabControl1.KeyPress 等事件可用

    "標籤名稱重覆":New 的時候可以不設定標籤名稱(都是""), 我上面那段就沒指定名稱了.
    而那些 NewPage 等變數只在 Button1.Click 內有效, 也不用擔心參照錯誤.
    TabControl1.SelectedTab 就可以取得目前的 TabPage , 不一定要給 name.

    2010年12月24日 上午 07:04
  • 不好意思, 不大清楚您的意思,
    "不使用 ContextMenuStrip 等 Menu", 那可以使用 Button.Click, 
    甚至是 TabControl.MouseDoubleClick、TabControl1.KeyPress 等事件可用

    "標籤名稱重覆":New 的時候可以不設定標籤名稱(都是""), 我上面那段就沒指定名稱了.
    而那些 NewPage 等變數只在 Button1.Click 內有效, 也不用擔心參照錯誤.
    TabControl1.SelectedTab 就可以取得目前的 TabPage , 不一定要給 name.


    可是如果我要用到 TextBox.Text 來代替 TabPage

    例:TabControl1.TabPages.Add(TextBox.Text)

    當TabPage 已有一個相同的name標籤, 當我ENTER的時候, 所以要避免相同name 出現

    當下次輸入相同name標籤就 selectTab 那個標籤, 而不會又有另外一個相同標籤出現。

    2010年12月24日 上午 10:19
  • 若在 Textbox1 按下 {enter} 時引發:

        Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress

            Dim PageKey As String = TextBox1.Text

            If (e.KeyChar = vbCr) AndAlso (PageKey <> "") Then '按下{return}
                '要排除 TextBox1.Text="" 的情況, 因為 TabControl1.TabPages("") = Nothing.

                If TabControl1.TabPages.ContainsKey(PageKey) Then '已存在, 切換到該頁
                    TabControl1.SelectedTab = TabControl1.TabPages(PageKey)

                Else '不存在, 要新增

                    TabControl1.TabPages.Add(PageKey, PageKey) '增加新頁, 設 Key, Text

                    '若需要在其中增加 ListView:
                    Dim NewPage As TabPage = TabControl1.TabPages(PageKey) '參考到剛新增的 page.
                    Dim NewLV As New ListView With {.Dock = DockStyle.Fill} '新 ListView, 順便設 Dock.
                    NewLV.Items.Add("項目1")    '依需求增加項目
                    NewLV.Items.Add("項目2")
                    NewPage.Controls.Add(NewLV) 'TabPage 新 ListView

                    TabControl1.SelectedTab = NewPage   '切換到新 page
                End If

            End If

        End Sub

    以上僅供參考.

    若有在本機安裝 MSDN 文件, 可以看下說明 [TabControl 成員] :
    ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.cht/fxref_system.windows.forms/html/38fef8f5-1780-db2a-b4ff-b4d049ec2a66.htm

     

    2010年12月27日 上午 12:39
  • 若在 Textbox1 按下 {enter} 時引發:

        Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress

            Dim PageKey As String = TextBox1.Text

            If (e.KeyChar = vbCr) AndAlso (PageKey <> "") Then '按下{return}
                '要排除 TextBox1.Text="" 的情況, 因為 TabControl1.TabPages("") = Nothing.

                If TabControl1.TabPages.ContainsKey(PageKey) Then '已存在, 切換到該頁
                    TabControl1.SelectedTab = TabControl1.TabPages(PageKey)

                Else '不存在, 要新增

                    TabControl1.TabPages.Add(PageKey, PageKey) '增加新頁, 設 Key, Text

                    '若需要在其中增加 ListView:
                    Dim NewPage As TabPage = TabControl1.TabPages(PageKey) '參考到剛新增的 page.
                    Dim NewLV As New ListView With {.Dock = DockStyle.Fill} '新 ListView, 順便設 Dock.
                    NewLV.Items.Add("項目1")    '依需求增加項目
                    NewLV.Items.Add("項目2")
                    NewPage.Controls.Add(NewLV) 'TabPage 新 ListView

                    TabControl1.SelectedTab = NewPage   '切換到新 page
                End If

            End If

        End Sub

    以上僅供參考.

    若有在本機安裝 MSDN 文件, 可以看下說明 [TabControl 成員] :
    ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.cht/fxref_system.windows.forms/html/38fef8f5-1780-db2a-b4ff-b4d049ec2a66.htm

     

    您好,

    已經測試過了, 成功了

    謝謝 Ader 指教。

    2010年12月27日 上午 08:00