如何将 X 控件引用到 FOR 循环中?

How do I reference X controls into a FOR loop?

我有这三个文本框,名称分别为 StandardPath_TextBoxA1StandardPath_TextBoxA2StandardPath_TextBoxA3,通过 FOR 循环,我试图保存它们的 text 值到 ms 访问数据库文件中。我在下面尝试类似的操作,但我的语法错误...知道吗?

For i = 1 To 3
Dim str(i) As String
str(i) = "INSERT INTO StandardPaths ([TagNum], [Title], [Path]) values (?,?,?)"

Dim cmd As OleDbCommand = New OleDbCommand(str(i), MyConnection)
cmd.Parameters.Add(New OleDbParameter("TagNum", CType("A" & i, String)))
cmd.Parameters.Add(New OleDbParameter("Title", CType(StandardPath_LabelA(i).Text), String)))
cmd.Parameters.Add(New OleDbParameter("Path", CType(StandardPath_TextBoxA(i).Text), String)))

Try
    cmd.ExecuteNonQuery()
    cmd.Dispose()
    MyConnection.Close()
Catch ex As Exception
    MsgBox(ex.Message)
End Try
Next

编辑:

语法错误位于此处:

cmd.Parameters.Add(New OleDbParameter("Title", CType(StandardPath_LabelA(i).Text), String)))
cmd.Parameters.Add(New OleDbParameter("Path", CType(StandardPath_TextBoxA(i).Text), String)))

试试这个。它修复了原始文件中的一些类型不匹配,并删除了不必要的变量和冗余。

Dim sql As String = "INSERT INTO StandardPaths ([TagNum], [Title], [Path]) values (?,?,?)"
'DON'T RE-USE YOUR DATABASE CONNECTION, EXCEPT FOR SHORT BURSTS IN TIGHT LOOPS LIKE THIS
Using connection As New OleDbConnection("connection string here"), _
      cmd As New OleDbCommand(sql, connection)

    'Guessing at column types and lengths. Use actual types from your database here
    cmd.Parameters.Add("TagNum", OleDbType.VarChar, 2) 
    cmd.Parameters.Add("Title", OleDbType.VarWChar, 100)
    cmd.Parameters.Add("Path", OleDbType.VarWChar, 512)

    'Do this just once, outside the loop, to avoid needing to repeatedly re-negotiate with the DB. Let the USING black take care of closing the connection
    connection.Open()

    For i = 1 To 3

        Dim TitleLabel As Control = Me.Controls.Find("StandardPath_LabelA" & i.ToString(), True).First()
        Dim PathBox As Control = Me.Controls.Find("StandardPath_TextBoxA" & i.ToString(), True).First()

        cmd.Parameters(0).Value = "A" & i.ToString()
        cmd.Parameters(1).Value = TitleLabel.Text
        cmd.Parameters(2).Value = PathBox.Text

        Try
            cmd.ExecuteNonQuery()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    Next
End Using

如果您已经将这些控件分组到相关面板或类似控件中,或者将它们添加到数组中,那就更好了。这可能比 Controls.Find() 提供更好的选择,但我在问题中没有看到这一点的迹象。

另一种选择,因为项目数量少,是这样做的:

Dim sql As String = _ 
    "INSERT INTO StandardPaths ([TagNum], [Title], [Path]) values (?,?,?);" & VbCrLf & _
    "INSERT INTO StandardPaths ([TagNum], [Title], [Path]) values (?,?,?);" & VbCrLf & _
    "INSERT INTO StandardPaths ([TagNum], [Title], [Path]) values (?,?,?);"

Using connection As New OleDbConnection("connection string here"), _
      cmd As New OleDbCommand(sql, connection)

    'Guessing at column types and lengths. Use actual types from your database here
    cmd.Parameters.Add("TagNum1", OleDbType.VarChar, 2).Value = "A1"
    cmd.Parameters.Add("Title1", OleDbType.VarWChar, 100).Value = StandardPath_LabelA1.Text
    cmd.Parameters.Add("Path1", OleDbType.VarWChar, 512).Value = StandardPath_TextBoxA1.Text
    cmd.Parameters.Add("TagNum2", OleDbType.VarChar, 2).Value = "A2"
    cmd.Parameters.Add("Title2", OleDbType.VarWChar, 100).Value = StandardPath_LabelA2.Text
    cmd.Parameters.Add("Path2", OleDbType.VarWChar, 512).Value = StandardPath_TextBoxA2.Text
    cmd.Parameters.Add("TagNum3", OleDbType.VarChar, 2).Value = "A3" 
    cmd.Parameters.Add("Title3", OleDbType.VarWChar, 100).Value = StandardPath_LabelA3.Text
    cmd.Parameters.Add("Path3", OleDbType.VarWChar, 512).Value = StandardPath_TextBoxA3.Text

    connection.Open()

    Try
        cmd.ExecuteNonQuery()
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Using

我知道重复的代码通常被认为是不好的,但对于三个项目来说,有时一个循环就有点矫枉过正了。在这种情况下,跳过循环还有一个优势,即可以减少对数据库的单次原子访问。