Datareader в источник данных в порядке, но Datagridview отображает только 1 строку

У меня есть представление данных (с источником привязки, деталь от мастера), которое заполняется программно из средства чтения данных. Datareader успешно извлекает все данные и добавляет новые строки в источник привязки. Однако в datagridview отображается только одна строка. Таким образом, в datagridview отображается последняя строка из средства чтения данных.

Когда я нажимаю кнопку «Назад» в навигаторе привязки (мастера), а затем «Далее», все строки отображаются в представлении сетки данных, как если бы он обновлял источник привязки и привязывал каждую строку к каждой строке представления сетки данных. Я знаю, что мне чего-то здесь не хватает, но не уверен, что именно.

Private Sub PopulateDetails(ByVal orderno As String)
    Dim cmd As New SqlClient.SqlCommand
    Dim dr As SqlClient.SqlDataReader

    LoadDB()

    If Not con.State = ConnectionState.Open Then
        con.Open()
    End If

    cmd.CommandText = "select orderid, pono, cono, styleno, fabriccodeid, custfabriccode, colorid, orderqty, totalbales, uomid, width, " &
                      "weightperarea, yard, gramperyard, size, unitprice, currencycode, deliverydt, remark from tblorderdetails " &
                      "where orderno = @orderno;"
    cmd.Connection = con
    cmd.Prepare()
    cmd.Parameters.AddWithValue("@orderno", orderno)
    dr = cmd.ExecuteReader

    With dr
        If .HasRows() Then
            Dim newRow As DataRowView

            While .Read
                newRow = DirectCast(TblorderdetailsBindingSource.AddNew(), DataRowView)
                newRow.BeginEdit()
                newRow.Row.BeginEdit()

                newRow.Row("orderno") = OrdernoTextBox.Text
                newRow.Row("pono") = .Item("pono")
                newRow.Row("cono") = .Item("cono")
                newRow.Row("styleno") = .Item("styleno")
                newRow.Row("fabriccodeid") = .Item("fabriccodeid")
                newRow.Row("custfabriccode") = .Item("custfabriccode")
                ''newRow("btncolor") = .Item("colorid")
                newRow.Row("orderqty") = .Item("orderqty")
                newRow.Row("totalbales") = .Item("totalbales")
                newRow.Row("uomid") = .Item("uomid")
                newRow.Row("width") = .Item("width")
                newRow.Row("weightperarea") = .Item("weightperarea")
                newRow.Row("yard") = .Item("yard")
                newRow.Row("gramperyard") = .Item("gramperyard")
                newRow.Row("size") = .Item("size")
                newRow.Row("unitprice") = .Item("unitprice")
                newRow.Row("currencycode") = .Item("currencycode")
                newRow.Row("deliverydt") = .Item("deliverydt")
                newRow.Row("remark") = .Item("remark")

                newRow.Row.EndEdit()
                newRow.DataView.Table.Rows.Add(newRow.Row)

            End While
        End If
        .Close()

    End With
    con.Close()

End Sub

person yuliana    schedule 02.12.2019    source источник


Ответы (2)


Это очень неправильный подход. После вызова ExecuteReader просто вызовите метод Load вашего DataTable и передайте считыватель данных. Это добавит все строки и даже столбцы, если их еще нет. В качестве альтернативы используйте адаптер данных и вызовите его метод Fill, передав DataTable в качестве аргумента. Тот же результат.

person jmcilhinney    schedule 02.12.2019
comment
очень неправильный путь? как это может быть? если да, то не в API? что, если мне нужно обработать каждую запись и изменить/вычислить некоторые значения перед добавлением в DataTable? что именно не так с Read()? - person ASh; 02.12.2019
comment
@jmcilhinney нет данных, но есть источник привязки. Если источник привязки приводится к таблице данных: Dim bs = Me.TblorderdetailsBindingSource Dim dt = CType(bs.DataSource, DataTable) Выдается ошибка Unable to cast object of type 'System.Windows.Forms.BindingSource' to type 'System.Data.DataTable'. - person yuliana; 02.12.2019
comment
Конечно, есть DataTable. Как вы думаете, что такое newRow.DataView.Table? Судя по этому сообщению об ошибке, похоже, что вы привязали BindingSource к другому BindingSource. Это может означать, что у вас есть родительские/дочерние данные. В любом случае, где-то внизу есть DataTable. - person jmcilhinney; 02.12.2019

Я работал в течение 4 дней, находя способы показать все строки в datagridview и, наконец, разрешить это следующим образом:

TblorderBindingSource.MovePrevious()
TblorderBindingSource.MoveNext()

По-видимому, источник привязки должен быть каким-то образом обновлен навигатором привязки, тогда только он показывает все добавленные строки в datagridview (с автоматически сгенерированным идентификатором столбца -1, -2, -3...). Пользователь может изменить эти строки, а затем сохранить.

Я сожалею, что это не похоже на «интеллектуальный» обходной путь, но рад, что он как-то работает.

person yuliana    schedule 03.12.2019