2017-08-10 58 views
0

所以我有两种形式(Form1和Form2)。 Form2询问需要在Form1中生成多少行特定面板(TxtBoxPanel)。该面板将包含三个框,因此如果用户说要在Form1中生成5行,则会有5个面板,每个面板有3个文本框。以两种不同形式访问在运行时进行的控制

窗体2显示为所示的图像中: Form2

下面是在窗体2的代码:

Public Class Form2 
Public Rows As Integer 

Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Ok.Click 


    Rows = RowNum.Text 'Row num being box to enter no. of rows 



    For index = 1 To Rows 

     Dim TxtBoxPanel(index) 'Control Array 

     Dim LeftBox(index) 'Control Array 
     Dim CenterBox(index) 'Control Array 
     Dim RightBox(index) 'Control Array 
     Dim YAxis As Integer ' for adding TxtBoxPanel in new row 

     'adding the textbox panel 

     TxtBoxPanel(index) = New Panel 

     Form1.MajorPanel.Controls.Add(TxtBoxPanel(index)) 'referring to form1 as panel needed in form1 
     TxtBoxPanel(index).Name = ("txtBoxPanel" & index) 
     TxtBoxPanel(index).Size = New Size(610, 32) 
     YAxis += 32 
     TxtBoxPanel(index).Location = New Point(3, YAxis) 

     'adding left box 
     LeftBox(index) = New TextBox 

     TxtBoxPanel(index).Controls.Add(LeftBox(index)) 
     LeftBox(index).Name = ("LeftBox" & index) 



     LeftBox(index).Text = (index) 
     LeftBox(index).Size = New Size(100, 20) 
     LeftBox(index).Location = New Point(3, 3) 

     'adding center box 
     CenterBox(index) = New TextBox 

     TxtBoxPanel(index).Controls.Add(CenterBox(index)) 
     CenterBox(index).Name = ("CenterBox" & index) 
     CenterBox(index).Text = (index) 
     CenterBox(index).Size = New Size(100, 20) 
     CenterBox(index).Location = New Point(258, 3) 

     'adding right box 
     RightBox(index) = New TextBox 

     TxtBoxPanel(index).Controls.Add(RightBox(index)) 
     RightBox(index).Name = ("RightBox" & index) 
     RightBox(index).Size = New Size(100, 20) 
     RightBox(index).Text = (index) 
     RightBox(index).Location = New Point(495, 3) 



    Next index 

    Close() 'After generation of controls, Form2 closes 

End Sub 



End Sub 
End Class 

的框在Form1中生成以及示于下面的图像: Controls in Form1

现在,我想遍历每个“LeftBox”实例,以便在单击Form1上的“消息”按钮时可以打印出每个实例的“Name”属性。但是,生成LeftBox的代码位于Form2中,我发现很难在Form1中引用它。

请注意,我生成使用数组的控件,因为我读的地方,他们更容易地引用对照组相比,使用Controls.Find

所以,问题是,我怎么能引用控制在Form1中后,他们在运行时生成?

这是我wtried引用LeftBox,例如较早前:

' FINDING CONTROLS PROGRAMATICALLY 


    For Index = 1 To Form2.Rows 

     Dim LBox As TextBox 

     For Each LBox In Me.Controls.Find("LeftBox" & Index, True) 
      If (LBox.Name.Contains("LeftBox") = True) Then 

       MsgBox(LBox.Text, MsgBoxStyle.Information, "Testing") 

      Else 
       MsgBox("There's a problem", MsgBoxStyle.Information, "Testing") 


      End If 

     Next 

    Next 

谢谢。

+0

'Form1'有一个'Controls'集合,它将包含所有的控件。你检查了吗?显示您用来访问控件的代码。 –

+0

请不要把代码放入评论中。相反,请编辑您的问题并在其中添加代码。我有点困惑。我认为你所有的'TxtBoxPanel'控件都在'Form1'上。你添加的代码似乎在'Form2'中寻找它们? –

+0

对不起@Chris,我只是编辑了包含代码的问题。 TxtBoxPanel确实生成到Form1上,但生成面板到form1上的代码位于form2上。这就是为什么我认为我必须参考form2,因为代码实际上在那里 – Amin84

回答

0

因此,最后尝试了几个小时后,我用List来存储每个文本框的实例,这让我稍后可以参考它们。这里的代码如下:

Public Class Form2 
Public Rows As Integer 

Public Sub Button1_Click(sender As Object, e As EventArgs) Handles OK.Click 


    Rows = RowNum.Text 
    Vars.Indx = Rows 'for storing the value of rows globally 


    For index = 1 To Rows 

     Dim TxtBoxPanel 
     Dim LeftBox 
     Dim CenterBox 
     Dim RightBox 
     Dim YAxis As Integer ' for adding TxtBoxPanel in new row 

     'adding the textbox panel 

     TxtBoxPanel = New Panel 

     Form1.Controls.Add(TxtBoxPanel) 
     TxtBoxPanel.Name = ("txtBoxPanel" & index) 
     TxtBoxPanel.Size = New Size(610, 32) 
     YAxis += 30 
     TxtBoxPanel.Location = New Point(24, YAxis) 

     'adding left box 
     LeftBox = New TextBox 

     TxtBoxPanel.Controls.Add(LeftBox) 
     LeftBox.Name = ("LeftBox" & index) 



     LeftBox.Text = (index) 
     LeftBox.Size = New Size(100, 20) 
     LeftBox.Location = New Point(3, 3) 

     LeftList.Add(LeftBox) 'inserts LeftBox to list 
     'adding center box 
     CenterBox = New TextBox 

     TxtBoxPanel.Controls.Add(CenterBox) 
     CenterBox.Name = ("CenterBox" & index) 
     CenterBox.Text = index 
     CenterBox.Size = New Size(100, 20) 
     CenterBox.Location = New Point(258, 3) 
     CenterList.Add(CenterBox) 'inserts centerbox to list 
     'adding right box 
     RightBox = New TextBox 

     TxtBoxPanel.Controls.Add(RightBox) 
     RightBox.Name = ("RightBox" & index) 
     RightBox.Size = New Size(100, 20) 
     RightBox.Text = index 
     RightBox.Location = New Point(495, 3) 

     RightList.Add(RightBox) 'adds rightbox to list 

    Next index 



    Close() 'After generation of controls, Form2 closes 

End Sub 

Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles RowNum.TextChanged 

End Sub 
End Class 

中序引用在Form1的文本框,我宣布一个名为Vars模块列表如下图所示:

Module Vars 
'for storing variables needed globally 
'whatever needs to be "connected" to different forms, store it here 

Public Indx As Integer 
Public CenterList As New List(Of TextBox) 
Public RightList As New List(Of TextBox) 
Public LeftList As New List(Of TextBox) 

End Module 

然后在Form1上,这是我做的:

Public Class Form1 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Form2.Show() 
End Sub 



Private Sub Message_Click(sender As Object, e As EventArgs) Handles Message.Click 


    For index = 0 To (Vars.Indx - 1) 'loop through leftbox 

     MsgBox(LeftList(index).Text, MsgBoxStyle.Information, "INFO") 


    Next 



End Sub 
End Class 

它的工作,但我仍然怀疑这个代码是否真的有效?

相关问题