Получение значений из динамически созданных элементов управления - PullRequest
0 голосов
/ 21 января 2020

Первый пост, так что go легко для меня.

Я кодировал годами, сначала с VB6, затем с VB. NET и совсем недавно ASP. NET. Мне стыдно сказать, что эта проблема дошла до такой степени, что мне нужно обратиться за помощью. Больше всего раздражает то, что это должно быть простым делом! Я явно что-то здесь упускаю.

Я создаю элементы управления флажками динамически, довольно много из них на самом деле. Две на динамически создаваемую строку таблицы и их идентификаторы добавляются с идентификатором конкретной записи БД в строке, строки 1, 2, 3 и т. Д. c. Таким образом, в каждой строке будет два флажка, ihave_check_1, ineed_check_1. Следующая строка будет ihave_check_2 и ineed_check_2 и т. Д.

В нижней части страницы есть кнопка «Отправить», и при щелчке она должна l oop через каждую строку (и ячейку) в выберите из таблицы элементы управления, идентификаторы которых содержат «ihave_check_» и «ineed_check_», а затем получите проверенное значение. Получив значения, я добавляю запись в базу данных.

Проблема в том, что когда вы нажимаете кнопку, таблица исчезает, как и значения.

Из того, что я прочитал до сих пор это происходит потому, что элементы управления создаются динамически, если бы они были c (закодированы в разделе HTML), у меня не было бы этой проблемы.

Итак, первый вопрос: что мне делать? нужно сделать, чтобы это заработало? И второй вопрос, почему использование элементов управления Dynami c так сложно?

Вот код, устанавливающий таблицу, который прекрасно работает:

Private Sub ddCardSeries_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ddCardSeries.SelectedIndexChanged
    If IsPostBack = True And Not ddCardSeries.SelectedValue = "Select..." Then
        cardsTable.Visible = True
        Dim dat As New DataLayer3.DataConnector
        dat.DataConnector("Provider=SQLOLEDB;Server=192.XXX.XXX.XXX;Database=GPKDB;User Id=sa;Password=XXXXXXXXXXX;")
        Dim dtSections As New DataTable
        dtSections = dat.DataSelect("SELECT baseCardID,baseCardSeries,baseCardNumber,baseCardName,frontArtist,conceptArtist,backArtist,backWriter,isBaseCard,isDieCut,isMatte,isGlossy,differentBack,frontImage,backImage FROM baseCards where baseCardSeries = '" & Split(Split(ddCardSeries.Text, "(ID:")(1), ")")(0) & "' and isBaseCard = 'Yes'")
        If dtSections.Rows.Count > 0 Then
            For i As Integer = 0 To dtSections.Rows.Count - 1

                Dim row As New TableRow
                For x = 0 To dtSections.Columns.Count - 1
                    Dim cell1 As New TableCell
                    If Not IsDBNull(dtSections.Rows(i)(x)) Then
                        If x = 0 Then
                            cell1.Text = dtSections.Rows(i)(x)
                        ElseIf x = 1 Then
                            cell1.Text = get_card_series(dtSections.Rows(i)(x))
                        ElseIf x = 13 Then
                            cell1.Text = "<img src='" & dtSections.Rows(i)(x) & "' height='120'"
                        ElseIf x = 14 Then
                            cell1.Text = "<img src='" & dtSections.Rows(i)(x) & "' height='120'"
                        Else
                            cell1.Text = dtSections.Rows(i)(x)
                        End If

                    Else
                        cell1.Text = ""
                    End If
                    row.Cells.Add(cell1)


                Next x
                Dim newbutton As New Button
                Dim newlabel As New Label
                newlabel.Text = "<br />"
                newbutton.Text = "Modify this entry"
                newbutton.Width = 120
                newbutton.ID = "modify_button_" & dtSections.Rows(i)(0)
                Dim newcheck1 As New CheckBox
                Dim newlabel2 As New Label
                newlabel2.Text = "<br />"
                newcheck1.Text = "I own this card"
                newcheck1.Width = 120
                newcheck1.ID = "ihave_check_" & dtSections.Rows(i)(0)
                Dim newcheck2 As New CheckBox
                newcheck2.Text = "I need this card"
                newcheck2.Width = 120
                newcheck2.ID = "ineed_check_" & dtSections.Rows(i)(0)
                Dim cell2 As New TableCell
                If is_user_admin() = True Then
                    newbutton.Enabled = True
                Else
                    newbutton.Enabled = False
                End If

                cell2.Controls.Add(newbutton)
                cell2.Controls.Add(newlabel)
                cell2.Controls.Add(newcheck1)
                cell2.Controls.Add(newlabel2)
                cell2.Controls.Add(newcheck2)
                row.Cells.Add(cell2)



                cardsTable.Rows.Add(row)
            Next
        End If

    Else
        cardsTable.Visible = False
    End If
End Sub

Вот код, который проходит по таблице и пытается сохранить результаты в базе данных:

    Protected Sub SubmitChanges_Click(sender As Object, e As EventArgs) Handles SubmitChanges.Click

    For Each pcontrol As control In Page.Controls
        Dim havecard As String = Nothing
        Dim needcard As String = Nothing
        Dim rowcardid As String = Nothing
        'For Each tabcell As TableCell In tabrow.Cells
        'For Each pgcontrol As Control In tabcell.Controls
        If TypeOf pcontrol Is CheckBox And Split(pcontrol.ID, "_")(0) = "ihave" Then
            rowcardid = Split(pcontrol.ID, "_")(2)
            Dim chkbox As CheckBox = pcontrol
            If chkbox.Checked = True Then
                havecard = "Yes"
            Else
                havecard = "No"
            End If
        End If
        If TypeOf pcontrol Is CheckBox And Split(pcontrol.ID, "_")(0) = "ineed" Then
            rowcardid = Split(pcontrol.ID, "_")(2)
            Dim chkbox As CheckBox = pcontrol
            If chkbox.Checked = True Then
                needcard = "Yes"
            Else
                needcard = "No"
            End If
        End If
        'Next

        If Not havecard = Nothing And Not needcard = Nothing Then
            If add_card_to_user_list(Session("username"), rowcardid, havecard, needcard) = True Then
                Label1.Text = "Update complete"
            Else
                Label1.Text = "Update failed"
            End If
        End If


        'Next
    Next




End Sub



Public Function add_card_to_user_list(ByVal userid As String, ByVal cardid As String, ByVal own As String, ByVal need As String) As Boolean
    Try
        Dim dat As New DataLayer3.DataConnector
        dat.DataConnector("Provider=SQLOLEDB;Server=192.XXX.XXX.XXX;Database=GPKDB;User Id=sa;Password=XXXXXXXX;")
        Dim dtCardSeries As New DataTable
        dtCardSeries = dat.DataSelect("select CardID from [" & userid & "_cards] where cardid = '" & cardid & "'")
        If dtCardSeries.Rows.Count > 0 Then
            dat.DataDelete("delete from [" & userid & "_cards] where cardid = '" & cardid & "'")
        End If
        dat.DataInsert("insert into [" & userid & "_cards] (Username,CardID,Own,Need) values ('" & userid & "', '" & cardid & "', '" & own & "', '" & need & "');")
        Return True
    Catch ex As Exception
        Return False
    End Try



End Function

Любая помощь на этом этапе будет с благодарностью получена.

Спасибо!

...