2017-09-13 24 views
0

嘿大家有人可以帮助我做一些代码在vb.net循环创建的标签,可以打开一个新的形式

我创建了一个循环,可以用我的OleDbDataReader生成标签 现在我想知道如果我可以让这些标签打开新的表格 ,我可以使用我的新形式中的数据标签文本创建! 这里是我的代码:

 Dim cnn As New OleDbCommand(query, con) 
    Dim cmd As New OleDbDataAdapter(cnn) 
    Dim dt As New DataTable() 
    cmd.Fill(dt) 
    Dim reader As OleDbDataReader 
    reader = cnn.ExecuteReader() 

    Dim number As Integer = 0 
    Dim location As Integer = 0 
    While reader.Read() 

     Dim sensibleFont As New Font("Segoe UI", 15) 

     Dim lb As New Label() 
     lb.Name = "labb" + number.ToString 
     lb.Size = New System.Drawing.Size(350, 40) 
     lb.Location = New System.Drawing.Point(50, 15 + location) 
     lb.Text = dt.Rows(number)(0).ToString() 
     lb.ForeColor = Color.Black 
     lb.Font = sensibleFont 
     GroupBox1.Controls.Add(lb) 

     Dim lb2 As New Label() 
     lb2.Name = "labs" + number.ToString 
     lb2.Size = New System.Drawing.Size(280, 40) 
     lb2.Location = New System.Drawing.Point(10, 5 + location) 
     lb2.Text = dt.Rows(number)(2).ToString() 
     lb2.ForeColor = Color.Black 
     lb2.Font = sensibleFont 
     GroupBox2.Controls.Add(lb2) 

     location += 40 
     number += 1 
    End While 

    con.Close() 
+0

您的阅读器看起来没有必要,因为您填充DataTable,然后使用循环中的DataTable中的信息,而不是阅读器中的信息。循环访问DataTable的行。在代码中创建一个Click方法:'Private Sub LabelClicked(sender As Object,e As EventArgs)',然后使用AddHandler lb.Click,AddressOf LabelClicked'将新标签连接到click事件。这就是设计师在幕后做的事情。 – LarsTech

回答

0

创建一个你想做的子。

Private Sub OpenForm() 
    Dim myForm As New MyForm() 
    myForm.Show() 
End Sub 

在创建标签,添加使用此子,因为它的处理器

AddHandler lb.Click, AddressOf OpenForm 
0

正如一个朋友的回答显示click事件,您可以将处理程序添加到标签的click事件。扩展,要使用正确的签名为处理程序,就可以得到这引发事件的对象,所以使用它的属性,如.Text属性:

Sub Label_Click(sender As Object, e As EventArgs) 
    Dim lbl = DirectCast(sender, Label) 
    Dim frm2 = New OtherForm(lbl.Text) 
    frm2.Show() 

End Sub 

去用它,你将需要一个构造函数(在其他形式的Sub New)(我命名为“OtherForm”)是这样的:

Public Class OtherForm 

    Sub New() 
     InitializeComponent() 

    End Sub 

    Sub New(info As String) 
     InitializeComponent() 

     Label1.Text = info 

    End Sub 

End Class 

哪里Label1只是一个标签,我把OtherForm用于测试目的。

您可能会发现控件的.Tag属性更适合传递数据,因为它可以是任何对象,例如,一个类的实例。

我注意到你正在读取数据库两次:一次填充数据表,然后再次作为数据表中的行数,这有点浪费。另外,当你完成一个字体的处理时,你应该丢弃一个字体:Using构造将为你处理这个问题,类似的方式是连接到数据库。像这样:

Sub PopulateGroupBox() 
    Dim connStr = "CONNECTION STRING HERE" 
    Dim query = "SQL QUERY HERE" 

    Dim dt As New DataTable() 
    Using con As New OleDbConnection(connStr) 
     Dim cnn As New OleDbCommand(query, con) 
     Dim cmd As New OleDbDataAdapter(cnn) 
     cmd.Fill(dt) 
    End Using 

    Dim location As Integer = 0 

    Using sensibleFont As New Font("Segoe UI", 15) 

     For i = 0 To dt.Rows.Count - 1 

      Dim lb1 As New Label() 
      lb1.Name = "labb" & i.ToString() 
      lb1.Size = New System.Drawing.Size(350, 40) 
      lb1.Location = New System.Drawing.Point(50, 15 + location) 
      lb1.Text = dt.Rows(i)(0).ToString() 
      lb1.ForeColor = Color.Black 
      lb1.Font = sensibleFont 
      AddHandler lb1.Click, AddressOf Label_Click 
      GroupBox1.Controls.Add(lb1) 

      Dim lb2 As New Label() 
      lb2.Name = "labs" & i.ToString() 
      lb2.Size = New System.Drawing.Size(280, 40) 
      lb2.Location = New System.Drawing.Point(10, 5 + location) 
      lb2.Text = dt.Rows(i)(2).ToString() 
      lb2.ForeColor = Color.Black 
      lb2.Font = sensibleFont 
      AddHandler lb2.Click, AddressOf Label_Click 
      GroupBox2.Controls.Add(lb2) 

      location += 40 

     Next 

    End Using 

End Sub 
+0

我没有得到它如何通过lb1,文本到其他形式 你能解释一下吗? –

+0

OtherForm的'Sub New(info As String)'带有一个参数。 'Dim frm2 = New OtherForm(lbl.Text)'将参数传递给它。 –

相关问题