«Эта строка уже принадлежит этой таблице» даже с новой строкой внутри цикла - PullRequest
1 голос
/ 17 июня 2020

Я читал предыдущие сообщения об этом, но происходит еще кое-что, о чем я не знаю. Все, что я пытаюсь сделать, это вставить новую пустую строку в строки 1 и 3. Также я почти уверен, что номера индексов строк неверны, так как это идет в обратном направлении.

        Dim dsTemp As System.Data.DataSet
        Dim dtTemp As System.Data.DataTable
        Dim sheet As OfficeOpenXml.ExcelWorksheet = Nothing

        dsTemp = CType(Me.uwgGeneratedMatrix.DataSource, System.Data.DataSet)
        dtTemp = dsTemp.Tables(0)
        If dsTemp.Tables(0).Columns.Contains("VerticalID") Then
            dsTemp.Tables(0).Columns.Remove("VerticalID")
        End If

        If dsTemp.Tables(0) IsNot Nothing Then
            For index As Integer = dsTemp.Tables(0).Rows.Count - 1 To 0 Step -1
                Dim dsRow As System.Data.DataRow = dsTemp.Tables(0).Rows(index)
                Dim value As Object = dsRow.Item(0)
                If Not Microsoft.VisualBasic.IsDBNull(value) AndAlso String.Compare(value.ToString, "ColDes", True) = 0 Then
                    Dim newRow As System.Data.DataRow = dsTemp.Tables(0).NewRow
                    dsTemp.Tables(0).Rows.Remove(dsRow)
                    dsTemp.Tables(0).Rows.InsertAt(dsRow, 0) 
                    dsTemp.Tables(0).NewRow()
                    dsTemp.Tables(0).Rows.InsertAt(dsRow, 2)
                End If
            Next
        End If

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Посмотрите на свой код:

Dim dsRow As System.Data.DataRow = dsTemp.Tables(0).Rows(index)
'...
If Not Microsoft.VisualBasic.IsDBNull(value) AndAlso String.Compare(value.ToString, "ColDes", True) = 0 Then
    Dim newRow As System.Data.DataRow = dsTemp.Tables(0).NewRow
    dsTemp.Tables(0).Rows.Remove(dsRow)
    dsTemp.Tables(0).Rows.InsertAt(dsRow, 1) 
    dsTemp.Tables(0).NewRow()
    dsTemp.Tables(0).Rows.InsertAt(dsRow, 3)
End If

Что делает этот код? Посмотрите на каждую строку и спросите себя, что она делает.

  1. Сначала вы получаете существующую строку из таблицы и назначаете ее переменной dsRow.
  2. Внутри If block, вы создаете новую строку и назначаете ей переменную newRow. Вы больше никогда не используете эту переменную, так в чем был смысл этого?
  3. Затем вы удаляете существующую строку из таблицы.
  4. Затем вы вставляете существующую строку как вторую строку в таблице .
  5. Затем вы создаете новую строку и вообще ничего с ней не делаете, так какой в ​​этом был смысл?
  6. Затем вы пытаетесь вставить существующую строку во второй раз, как четвертый в таблице.

Неужели неожиданно, что сообщение об ошибке сообщает вам, что эта строка уже принадлежит таблице?

Во-первых, когда вы вызываете NewRow , который просто создает новую строку. Эта строка НЕ ​​добавляется в таблицу автоматически. Как это могло произойти? Он пуст, и в таблице могут быть столбцы, не допускающие значения NULL. Вы должны заполнить его по мере необходимости, а затем добавить его самостоятельно.

Кроме того, вы не можете добавить или вставить одну и ту же строку дважды.

Если все, что вы пытаетесь сделать вставляет пустые строки, тогда вам нужно фактически вставить пустые строки, а не существующие строки, которые вы удалили. Вам нужно дважды позвонить по номеру NewRow, а затем Insert, например,

myTable.Rows.Insert(myTable.NewRow(), 1)
myTable.Rows.Insert(myTable.NewRow(), 3)
0 голосов
/ 17 июня 2020

Я тупой, видимо надо делать dsTemp.Tables (0) .Rows.InsertAt (newRow, 2)

...