Пустая строка под последней строкой данных в gridview после привязки из XML

#c# #asp.net #sql #xml #vb.net

#c# #asp.net #sql #xml #vb.net

Вопрос:

Я пытаюсь привязать XML-данные к gridview, после нажатия кнопки «ButtonSaveToDataBase» метод начнет считывать данные из моего gridview и загружать их в массив моего сериализуемого типа класса, а затем сериализовать его и, наконец, сохранить в поле типа XML в моем SQL. Проблема в том, что когда я вызываю BindData() в конце сериализации, он считывает XML из моей базы данных и успешно связывает его, но мой gridview отображает пустую строку под моими данными следующим образом:

 Edit-Update     VouCode  Quantity       Delete
Edit               1        3           Delete
Edit                                    Delete
 

Может кто-нибудь посоветовать, где что-то пошло не так, это часть сериализации? Спасибо.

    Protected Sub btnAdd_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnAdd.Click    

 'This method will add a new row of data into my gridview but not save it yet.

    Dim newTable As New DataTable("NewTable")
                        newTable.Columns.Add("VouCode")
                        newTable.Columns.Add("QTY")
                        Dim dr2 As DataRow = newTable.NewRow

                        dr2("VouCode") = DropDownList1.SelectedIndex
                        dr2("QTY") = TextBox1.Text
                        newTable.Rows.Add(dr2)
                        ds.Tables.Add(newTable)
                        Me.GridView1.DataSource = ds.Tables(0)
                        Me.GridView1.DataBind()
                        ViewState("VoucherRewardsSet") = ds
                        con.Close() 

    End Sub

Protected Sub ButtonSaveToDataBase_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonSaveToDatabase.Click

        Dim dbCommand As DbCommand = Nothing
        Dim con As New SqlConnection(ConfigurationManager.ConnectionStrings("Test").ConnectionString)

        Dim cmd As New SqlCommand("Campaign_InsertNew", con)
        cmd.CommandType = CommandType.StoredProcedure

        Dim cv(GridView1.Rows.Count) As CampaignVoucher 'create an array of gv row size

        Dim vc As String = String.Empty
        Dim qt As Integer

        For i As Integer = 0 To GridView1.Rows.Count - 1 'loop through gv and load data into array
            vc = GridView1.Rows(i).Cells(1).Text
            qt = GridView1.Rows(i).Cells(2).Text
            cv(i) = New CampaignVoucher(vc, qt)
        Next


            ' -----------------Serialization ------------------  

            Dim serializer As New XmlSerializer(cv.[GetType]())
            Dim memoryStream As New MemoryStream()
            Dim writer As New XmlTextWriter(memoryStream, Encoding.UTF8)

            serializer.Serialize(writer, cv)

            'get the stream from the writer
            memoryStream = TryCast(writer.BaseStream, MemoryStream)

            'apply encoding to the stream 
            Dim enc As New UTF8Encoding
            Dim xml As String = enc.GetString(memoryStream.ToArray()).Trim()

            ' -------------------------------------------        

            cmd.Parameters.Add("@voucherXML", SqlDbType.Text).Value = xml

            cmd.Connection = con
            con.Open()
            cmd.ExecuteScalar()
            con.Close()

            GridView1.EditIndex = -1
            BindData()

            TextBox1.Text = ""
End Sub

   Private Sub BindData()
        Dim con As New SqlConnection(ConfigurationManager.ConnectionStrings("Test").ConnectionString)
        Dim cmdSelect As New SqlCommand("Select VoucherXML from RewardVouchers", con)
        Dim ds As New DataSet("VoucherRewardsSet")
        con.Open()
        Using reader = cmdSelect.ExecuteReader()
            cmdSelect.Connection = con
            reader.Read()
            If (reader.HasRows) Then
                Dim xml As String = reader.GetString(0)
                'Dim ds As New DataSet()
                ds.ReadXml(New StringReader(xml))
                Dim dtableForGVBinding As DataTable = ds.Tables(0)
                Me.GridView1.DataMember = "CampaignVoucher"
                Me.GridView1.DataSource = dtableForGVBinding
                Me.GridView1.DataBind()
            End If
        End Using
        con.Close()
    End Sub
 

XML скопирован из моего поля SQL:

 <ArrayOfCampaignVoucher xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<CampaignVoucher VouCode="1" Qty="34" />
<CampaignVoucher xsi:nil="true" />
</ArrayOfCampaignVoucher>
 

Ответ №1:

Вы создаете дополнительный элемент в своем массиве.

 Dim cv(GridView1.Rows.Count) As CampaignVoucher 'create an array of gv row size
 

Должно быть

 Dim cv(GridView1.Rows.Count - 1) As CampaignVoucher 'create an array of gv row size