Для каждого ... Следующая итерация еще раз, чем следовало бы? - PullRequest
0 голосов
/ 18 мая 2019

Если я скопирую из excel одну строку, состоящую из трех ячеек, где значения в ячейках 1, 2 и 3 равны A, B и C соответственно, я ожидаю одну строку результатов в таблице данных loadDG. Однако я получаю вторую строку результатов второй итерации цикла For Each ... Next, даже если из Excel была скопирована только одна строка значений, о чем свидетельствует отсутствие значения в Col 2.

Пожалуйста, кто-нибудь может объяснить, что происходит? Вот (отредактированный, следующие комментарии ниже) код:

Public Class Form1

'Initialise the Datagrid
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    InitialiseLoadsDG()
End Sub

'Initialise Datagrid
Public Sub InitialiseLoadsDG()
    LoadsDG.Rows.Clear()
    LoadsDG.RowTemplate.Height = 20

    For i As Integer = 1 To 50
        LoadsDG.Rows.Add(i, "", "", "")
    Next

    LoadsDG.ClearSelection()
End Sub

'Paste copied values
Private Sub LoadsDG_KeyDown(sender As Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles LoadsDG.PreviewKeyDown

    If e.Control And e.KeyCode = Keys.V Then
        Dim i As Integer = 0

        For Each copiedLine As String In Clipboard.GetText.Split(vbNewLine)
            LoadsDG.Rows(i).Cells(1).Value = copiedLine
            LoadsDG.Rows(i).Cells(2).Value = i
            i = i + 1
        Next
    End If

End Sub

End Class

Вот что я ожидаю:

        Column1 Column2 Column3 Column4
   Row1           ABC      0
   Row2            

Вот что я получаю:

        Column1 Column2 Column3 Column4
   Row1           ABC      0
   Row2                    1

ОБНОВЛЕНИЕ: После комментария Джими мой Sub для вставки содержимого буфера обмена работает как положено. Код удаляет из скопированного содержимого Excel возврат каретки (vbCr), перевод строки (vbLf) и комбинированные возврат каретки и перевод строки (vbCrLf), оставляя только выделенные табуляцией значения. Обратите внимание, что каждая строка скопированного содержимого Excel занимает отдельный элемент (выделенный табуляцией) в массиве copiedCells. Оставшаяся часть кода просто разбивает каждую выделенную табуляцией строку (vbTab) на отдельные значения ячейки Excel и вставляет их в соответствующую ячейку сетки loadDG. Большое спасибо всем, кто откликнулся. Вот полный код:

'Paste copied values
Private Sub LoadsDG_KeyDown(sender As Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles LoadsDG.PreviewKeyDown

    If e.Control And e.KeyCode = Keys.V Then

        Dim copiedCells() As String = Clipboard.GetText.Split(New String() {vbCr, vbLf, vbCrLf}, StringSplitOptions.RemoveEmptyEntries)

        Dim i As Integer = 0
        Dim ii As Integer = 1

        For Each rowOfCells As String In copiedCells

            For Each cellValue As String In rowOfCells.Split(vbTab)
                LoadsDG.Rows(i).Cells(ii).Value = cellValue
                ii = ii + 1
            Next

            i = i + 1
            ii = 1
        Next

    End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...