Jamim Ответов: 1

- Индекс был вне досягаемости. Должно быть неотрицательным и меньше размера коллекции. Имя параметра: индекс" как это решить?


Доброе утро эксперты не могли бы вы помочь мне в этой проблеме я все еще новичок в программировании
У меня есть загруженные данные на моем Datagridview. Я пытаюсь экспортировать выбранную строку данных, которая может быть экспортирована только видимым столбцом, но я получил эту ошибку "индекс был вне диапазона. Должно быть неотрицательным и меньше размера коллекции. Имя параметра: индекс".

на этой линии

.Cells(I + 2, curCol + 1).value = DataGridView1(j,DataGridView1.SelectedRows(I).Index).Value.ToString()


Private Sub Exportonlyvisiblecolumn2()
        Dim rowsTotal, colsTotal As Short
        Dim I, j, iC As Short
        System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
        Dim xlApp As New Excel.Application
        Dim SelectedRowCount As Integer = DataGridView1.Rows.GetRowCount(DataGridViewElementStates.Selected)

        Try
            Dim excelBook As Excel.Workbook = xlApp.Workbooks.Add
            Dim excelWorksheet As Excel.Worksheet = CType(excelBook.Worksheets(1), Excel.Worksheet)
            xlApp.Visible = True
            rowsTotal = DataGridView1.RowCount - 1
            colsTotal = DataGridView1.Columns.Count - 1

            With excelWorksheet
                .Cells.Select()
                .Cells.Delete()
                Dim curCol As Short = 0
                For iC = 0 To colsTotal
                    If DataGridView1.Columns(iC).Visible Then 'Headers
                        .Cells(1, curCol + 1).Value = DataGridView1.Columns(iC).HeaderText
                        curCol += 1
                    End If
                Next
                For I = 0 To SelectedRowCount 'rowsTotal 'left to right
                    curCol = 0
                    For j = 0 To colsTotal
                        If DataGridView1.Columns(j).Visible Then 'top to bottom
                            .Cells(I + 2, curCol + 1).value = DataGridView1(j, DataGridView1.SelectedRows(I).Index).Value.ToString() '<----- Throw exeption
                            curCol += 1
                        End If
                    Next
                Next
            End With

        Catch ex As Exception
            MessageBox.Show(ex.Message)
            MessageBox.Show("Stack Trace: " & vbCrLf & ex.StackTrace)
        Finally
            'RELEASE ALLOACTED RESOURCES
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
            xlApp = Nothing

        End Try
    End Sub


Что я уже пробовал:

Я обнаружил, что цикл for продолжает зацикливаться, когда я попытался добавить addwatch1 значение I = 1 и значение j = 4, и это является причиной ошибки "индекс был вне диапазона", можете ли вы помочь мне решить эту проблему? Я пытался положить под выход между двумя далее и ошибка не появляется Есть ли лучший способ решить эту проблему? новичку в программировании нужен ваш совет и помощь
For I = 0 To SelectedRowCount 'rowsTotal 'left to right
         curCol = 0
         For j = 0 To colsTotal
             If DataGridView1.Columns(j).Visible Then 'top to bottom
                 .Cells(I + 2, curCol + 1).value = DataGridView1(j, DataGridView1.SelectedRows(I).Index).Value.ToString() '<----- Throw exeption
                 curCol += 1
             End If
         Next
     Next

1 Ответов

Рейтинг:
7

Patrice T

Если SelectedRowCount является ли граф SelectedRows в DataGridView1, вы должны остановить цикл на 1 шаг раньше, потому что цикл начинается с 0.

For I = 0 To SelectedRowCount - 1


Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш cpde, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.
Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Visual Basic / Visual Studio Video Tutorial - Базовая Отладка - YouTube[^]
Visual Basic .NET programming for Beginners - точки останова и средства отладки[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Jamim

Спасибо, мэм/мистер Патрис т.
Спасибо Вам за вашу помощь и ссылки
Последнее звено, которое вы дали, очень хорошо для меня, есть упражнения, чтобы я мог практиковать. большое вам спасибо за вашу помощь ^_^.

почему - то я этого не заметил...