2

我知道如果我想动态创建现有表单的新实例,我可以简单地这样做......

Dim NewForm As New ExistingForm

... 并且来自 ExistingForm 的所有控件的新实例将在 NewForm 中可用。

但是,如果我想在单独的现有表单中创建现有控件的新实例怎么办?

更具体地说,假设我有 2 个表单 -FormAFormB. 里面FormB是一个现有的面板(我们称之为ExistingPanel)。里面ExistingPanel有几个按钮、文本框等,完全按照我想要的方式排列。

好的,所以......在按钮的点击事件中FormA,我想做这样的事情(显然它不起作用,但应该让你对我想要完成的事情有一个好主意)......

Dim NewExistingPanel As New FormB.ExistingPanel

然后我想NewExistingPanel包含来自 ExistingPanel 的所有单个控件的新实例(以便我可以单独动态地操作每个控件)。

所以基本上,我的程序需要NewExistingPanel在运行时创建几个 s。在创建它们之后,我将需要单独访问每个(及其所有子控件)。

我怎样才能做到这一点?到目前为止,我已经尝试了几个小时但没有运气,所以我想我会崩溃并询问真正的专业人士:)

4

3 回答 3

2

当您创建一个新的用户控件时,您可以使用一个字典,其中标签值作为键,控件名称作为值。然后您可以使用 IndexOfKey 方法直接访问该控件。

    Dim NewForm2 As New Form2
    Dim ControlIndex As New Dictionary(Of String, String)
    For I = 0 To 2
        Dim NewPanel As New WindowsControlLibrary2.MyCustomPanel
        NewPanel.Name = "Panel-" + I.ToString
        NewPanel.Location = New Point(0 + (NewPanel.Size.Width * I), 0)
        NewPanel.Tag = "MyTagValue" + I.ToString
        ControlIndex.Add(NewPanel.Tag, NewPanel.Name)
        NewForm2.Controls.Add(NewPanel)
        NewForm2.Update()
    Next
    NewForm2.Show()
    Dim CurrentPanel As WindowsControlLibrary2.MyCustomPanel =NewForm2.Controls(NewForm2.Controls.IndexOfKey(ControlIndex("MyTagValue1")))
于 2013-05-26T06:19:37.350 回答
1

添加控件,例如带有文本框和按钮的面板..

  1. 在您的项目中-添加>用户控件->
    在此部分中,您可以根据需要将面板与文本框和按钮
    命名为“myPanel ”并将其保存为“myPanel.vb ”->或任何您想要的

  2. 在您的表单和名为button1的按钮中,您可以添加到您的 button1_click 事件:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            Dim mypanel1 As New MyPanel
    
            mypanel1.Location = New Point(0, 0)
    
            Controls.Add(mypanel1)
            mypanel1.TextBox1.Text = "Hi, Im new"
    
    End Sub
    

你会在运行时得到你的面板......

你会得到 textbox1.text 填充“嗨,我是新的”......

于 2013-05-26T06:22:40.167 回答
1

您可以创建一个用户控件,按照您想要的方式布置子控件,然后创建它的新实例。在解决方案菜单中添加 New > User Control,然后构建,您的控件应该可以拖到工具箱顶部的设计器中,或者像任何其他控件一样在代码中实例化。

扩展我的评论:

Private somePanels As New Dictionary(Of String, YourUserControl)

然后您可以按如下方式添加它们:

Dim c As New YourUserControl()
…
Me.Controls.Add(c)
somePanels.Add("SomeTag", c) ' Instead of using Tag; if your tags are numbers, use a List instead of a Dictionary

并以以下方式访问它们:

Dim c = somePanels("SomeTag")
于 2013-05-25T22:59:18.567 回答