Вставить данные из автоматически сгенерированного текстового поля в базу данных SQL Server - PullRequest
0 голосов
/ 10 июля 2019

Я создал код для создания текстового поля в vb.net с помощью нажатия кнопки и функции

 Public Function AddNewTextBox() As System.Windows.Forms.TextBox
    Dim txt As New System.Windows.Forms.TextBox()
    Me.Controls.Add(txt)
    txt.Top = cLeft * 30
    txt.Left = 100
    'txt.Text = "TextBox " & Me.cLeft.ToString
    cLeft = cLeft + 1
    txt.ForeColor = Color.DarkGreen
    txt.BackColor = Color.Gray
    txt.Font = New Font("Arial", 14.0, FontStyle.Regular)
    txt.Size = New Size(237, 31)
    txt.Location = New Point(156, 130 + top1)

    Return txt
End Function

В кнопке

Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'call the function
        AddNewTextBox()

End Sub

Я пробовал это

cmd.CommandText = "INSERT INTO userlog ([username],[userlastname]) Values ( @username) "
cmd.Parameters.AddWithValue("@username", txt.Text(i).Text)
cmd.Parameters.AddWithValue("@userlastname", txt.Text(i).Text)

но получаю ошибку в

txt.Text(i)

, поскольку txt объявлен только в функции AddNewTextBox.

Я сделал 3 автоматически сгенерированных текстовых поля

Каксохранить эти данные внутри текстового поля в базе данных?

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Добавьте FlowlayoutPanel к вашей форме и установите для FlowDirection значение TopDown. (как прокомментировал @jmcilhinney) Это экономит расчет позиции текстовых полей.

Нет смысла иметь функцию, возвращающую текстовое поле, когда вы никогда не используете возвращаемое значение.

Код доступа к данным использует метод .Add, предложенный @SMor. Увидеть http://www.dbdelta.com/addwithvalue-is-evil/ а также https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ и еще один: https://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications

Я должен был угадать типы данных. Проверьте правильность типов в вашей базе данных.

Значения получены из коллекции элементов управления FlowLayoutPanel, в которую были добавлены элементы управления.

Использование блоков гарантирует, что объекты базы данных будут закрыты и удалены даже в случае ошибки. Передайте строку соединения непосредственно в конструктор соединения, а текст команды и соединение - непосредственно в конструктор команды.

Public Sub AddNewTextBox()
    Dim txt As New System.Windows.Forms.TextBox()
    txt.Name = "user" & nameTextBox.ToString
    txt.ForeColor = Color.DarkGreen
    txt.BackColor = Color.Gray
    txt.Font = New Font("Arial", 14.0, FontStyle.Regular)
    txt.Size = New Size(120, 30)
    FlowLayoutPanel1.Controls.Add(txt)
End Sub

Private Sub UpdateUsers()
    Using cn As New SqlConnection("Your connection string")
        Using cmd As New SqlCommand("INSERT INTO userlog ([username],[userlastname]) Values ( @username, @userlastname);", cn)
            cmd.Parameters.Add("@username", SqlDbType.VarChar).Value = FlowLayoutPanel1.Controls(0).Text
            cmd.Parameters.AddWithValue("@userlastname", SqlDbType.VarChar).Value = FlowLayoutPanel1.Controls(1).Text
            cn.Open()
            cmd.ExecuteNonQuery()
        End Using
    End Using
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    AddNewTextBox()
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    UpdateUsers()
End Sub

EDIT

    For Each tb As TextBox In FlowLayoutPanel1.Controls
        If tb.Text = "" Then
            MessageBox.Show("Please fill all text boxes before Updating")
            Return
        End If
    Next
1 голос
/ 10 июля 2019

Поскольку TextBox добавляется в коллекцию элементов управления формы, вы можете использовать перечисляемый метод OfType , чтобы получить все элементы управления TextBox. Более того, я бы, вероятно, назначил Tag сгенерированного TextBox желаемому имени поля, чтобы вы могли запросить коллекцию элементов управления для первого экземпляра TextBox, чей тег равен требуемому полю.

Также стоит упомянуть, что вы можете использовать ключевое слово With, чтобы избавиться от ненужного кода.

С учетом всего вышесказанного, ваш метод AddNewTextBox будет выглядеть следующим образом:

Public Function AddNewTextBox(ByVal fieldName As String) As System.Windows.Forms.TextBox
    Dim txt As New System.Windows.Forms.TextBox()
    Me.Controls.Add(txt)

    With
      .Top = cLeft * 30
      .Left = 100
      '.Text = "TextBox " & Me.cLeft.ToString
      cLeft = cLeft + 1
      .ForeColor = Color.DarkGreen
      .BackColor = Color.Gray
      .Font = New Font("Arial", 14.0, FontStyle.Regular)
      .Size = New Size(237, 31)
      .Location = New Point(156, 130 + top1)
      .Tag = fieldName
    End With

    Return txt
End Function

Событие нажатия вашей кнопки будет выглядеть так:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    'call the function
    Dim txt As TextBox = AddNewTextBox("username")
End Sub

И ваш параметризованный запрос будет выглядеть так:

Dim usernameTextBox As TextBox = Me.Controls.OfType(Of TextBox).FirstOrDefault(Function(txt) txt.Tag IsNot Nothing AndAlso txt.Tag = "username")

If usernameTextBox IsNot Nothing Then
  cmd.Parameters.AddWithValue("@username", usernameTextBox.Text)
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...