Vb.net 在选项卡页面之间移动控件

Vb.net 在选项卡页面之间移动控件,vb.net,controls,tabcontrol,tabpage,Vb.net,Controls,Tabcontrol,Tabpage,当用户选择不同的选项卡页面时,我尝试在3个选项卡页面之间移动3个控件。它们是ToolsTip控件、richtextbox控件和combobox控件 richtextbox和combobox将根据所选选项卡页为其某些属性分配新值,toolstrip应相同,但其方法(它是典型的字体样式处理toolstrip)应影响仅在当前选项卡页上可见的richtextbox 现在,因为更改组合框的显示值也意味着当前选项卡页上的richtextbox将为其文本属性分配一个新值,所以我不想每次创建3个组合框和50个r

当用户选择不同的选项卡页面时,我尝试在3个选项卡页面之间移动3个控件。它们是ToolsTip控件、richtextbox控件和combobox控件

richtextbox和combobox将根据所选选项卡页为其某些属性分配新值,toolstrip应相同,但其方法(它是典型的字体样式处理toolstrip)应影响仅在当前选项卡页上可见的richtextbox

现在,因为更改组合框的显示值也意味着当前选项卡页上的richtextbox将为其文本属性分配一个新值,所以我不想每次创建3个组合框和50个richtextbox。我只想创建一组,并在uses引发事件(即更改combobox显示项或更改tabpage)之前,将它们的值保存在某种类型的字符串集合中

在我读这篇文章之前没有做过这件事 这建议为它的场合创建一个控件,这在我看来很荒谬

我目前的情况是,我通过designer在tabpage1中显示控件,然后我尝试了类似的方法

Private Sub TabPage_Enter(sender As Object, e As EventArgs) Handles TabPage1.Enter, TabPage2.Enter, TabPage3.Enter
    Select Case DirectCast(sender, TabPage).Name

        Case "Tabpage1"
            TabPage1.Controls.Add(RichTextBox1)
            TabPage1.Controls.Add(ToolStrip1)
            TabPage1.Controls.Add(ComboBox1)

        Case "TabPage2"
            TabPage2.Controls.Add(RichTextBox1)
            TabPage2.Controls.Add(ToolStrip1)
            TabPage2.Controls.Add(ComboBox1)

        Case "TabPage3"
            TabPage3.Controls.Add(RichTextBox1)
            TabPage3.Controls.Add(ToolStrip1)
            TabPage3.Controls.Add(ComboBox1)

    End Select
End Sub
现在,更改选项卡时,控件显示在tabpage2和tabpage3上,但tabpage1保持为空。我在表单加载事件中尝试过这样做

TabPage1.Controls.Add(RichTextBox1)
TabPage1.Controls.Add(ToolStrip1)
TabPage1.Controls.Add(ComboBox1)
但当切换回其视图时,tabpage1仍然为空。我不确定我正在尝试的是我想要做的,但我知道对于这种方法,我根本不应该使用designer,而应该自己创建代码处理大小和位置的控件。请建议是否有一个“正确”的方法来做到这一点,主要是为了保持代码简短和整洁。蒂亚


当我写这篇文章的时候,我意识到我只能在designer中为每个tabpage创建三个控件,然后按照我心目中的字符串收集方式处理组合框的更改。看起来很明智,但我仍然想知道这一点,因此我仍然在问这个问题。

这里有一个可能的解决方案,可以在选项卡之间移动控件 它假定您的控件已经创建过一次

Private Sub TabControl1_Click(sender As Object, e As EventArgs) Handles TabControl1.Click

    Try

        Dim tabCtrl As TabControl = DirectCast(sender, TabControl)
        Dim tabPageItem As TabPage = tabCtrl.SelectedTab
        moveControl(MobileButton, tabPageItem)

    Catch ex As Exception

        MessageBox.Show(String.Concat("An error occurred:", ex.Message))

    End Try

End Sub

Private Sub moveControl(controlToMove As Control, newTab As TabPage)

    Dim findButton() As Control = newTab.Controls.Find(controlToMove.Name, True)

    If findButton.GetUpperBound(0) < 0 Then

        controlToMove.Parent = newTab

    End If

End Sub
Private子选项卡control1\u单击(发送者作为对象,e作为事件参数)处理选项卡control1。单击
尝试
将tabCtrl设置为TabControl=DirectCast(发送方,TabControl)
将tabPageItem调整为TabPage=tabCtrl.SelectedTab
移动控件(移动按钮,tabPageItem)
特例
Show(String.Concat(“发生错误:”,ex.Message))
结束尝试
端接头
专用子移动控件(控件移动作为控件,新建选项卡作为选项卡页)
Dim findButton()As Control=newTab.Controls.Find(controlToMove.Name,True)
如果findButton.GetUpperBound(0)<0,则
controlToMove.Parent=newTab
如果结束
端接头

为了匹配您的Tabpage1名称,“Tabpage1”应该在您的案例陈述中使用大写字母“P”吗?这一点很明显,我在寻找一个拼写错误,但因为我关注的是排序编号1、2、3,所以我没有注意到:DSo显然控件现在出现在第一个选项卡上(该死,我在发表本文之前检查了3次,没有发现拼写错误):P但我想知道,每当enter事件触发时,在选项卡页添加控件时会发生什么?这样做吗?我想我会在继续编写代码时发现的。但是,如果有更好的方法,请将其添加为答案,或者用一篇关于不断添加控件会发生什么的信息性帖子来回答。我觉得整个策略有点奇怪。在添加之前,您会考虑测试以查看控件是否在TabPad上?我为第一个选项卡设置了一个计数器,因此如果计数器为0,则只运行代码来添加控件。当我第二次进入第一个选项卡时,它会运行,因此理论上它会在选项卡之间移动控件。现在这让我非常头疼,因为当我在splitcontainer折叠时更改选项卡时,控件的宽度会以某种方式扩展到表单之外,它们会固定在那里。。。无论如何回到主题,这是一个真正的控件移动,与我所尝试的相比…非常感谢,这实际上解决了我遇到的问题,我在上面描述过,容器的塌陷会弄乱控件的宽度。谢谢你的帮助,安德鲁!