0
votes

Ajout de nouvelle ligne à DataGridView non liée

J'ai un dataGridView non lié. En raison des différentes choses que je fais avec les données de la grille, je ne veux pas le lier. Les colonnes sont prédéfinies dans les paramètres (colonnes d'édition) du DataGridView. Je souhaite créer une nouvelle ligne, puis renseigner la ligne de grille avec des données. J'essaie d'utiliser la méthode .Add.rws code> mais il échoue avec

{"L'indice était hors de portée. Doit être non négatif et moins que la taille de la collection." & VBCLLF & "Nom du paramètre: index"} p> BlockQuote>

Le SQL suivant Récupérez les données: P>

    Dim FSchedCmd As SqlCommand
    Dim FSchedSQL As String
    Dim FSchedConn As New SqlConnection()
    Dim FSchedadapter As New SqlDataAdapter()
    Dim i As Integer = 0
    Dim rowIndex As Integer
    Dim row As DataGridViewRow

    AddedNewRow = 1

    Dim dsFSched As New DataSet()
    FSchedSQL = "Select ShiftName, ScheduleStart, ScheduleEnd, Position, ADP_ID1, Name1, ADP_ID2, Name2, ADP_ID3, Name3, ADP_ID4, Name4, ADP_ID5, Name5, ADP_ID6, Name6, ADP_ID7, Name7 from FormattedSchedules where ScheduleName = @ScheduleName;"
    Try
        If GlobalVariables.logProd = 1 Then
            GlobalVariables.strConnection = "CCAPProdConnectionString"
        Else
            GlobalVariables.strConnection = "CCAPTestConnectionString"
        End If
        FSchedConn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings(GlobalVariables.strConnection).ConnectionString
        FSchedConn.Open()
        FSchedCmd = New SqlCommand(FSchedSQL, FSchedConn)
        FSchedCmd.Parameters.Add("@ScheduleName", SqlDbType.VarChar).Value = cboCreateScheduleName.Text
        FSchedadapter.SelectCommand = FSchedCmd
        FSchedadapter.Fill(dsFSched)
        FSchedadapter.Dispose()
        FSchedCmd.Dispose()
        FSchedConn.Close()
        'dgvCreateSchedule.DataSource = dsFSched.Tables(0)
        dgvCreateSchedule.Rows.Clear()
        With dgvCreateSchedule
            Dim RowNo As Long = 0
            '.RowCount = 0
            While RowNo <= dsFSched.Tables(0).Rows.Count - 1

                .Rows.Add(1)
                .Rows(RowNo).Cells(0).Value = dsFSched.Tables(0).Rows(RowNo).Item(0) 'ShiftName
                '.Rows(RowNo).Cells(1).Value = dsFSched.Tables(0).Rows(RowNo).Item(1) 'Start Time
                .Rows(RowNo).Cells(1).Value = Convert.ToDateTime(dsFSched.Tables(0).Rows(RowNo).Item(1)).TimeOfDay
                '.Rows(RowNo).Cells(2).Value = dsFSched.Tables(0).Rows(RowNo).Item(2) 'End Time
                .Rows(RowNo).Cells(2).Value = Convert.ToDateTime(dsFSched.Tables(0).Rows(RowNo).Item(2)).TimeOfDay 'End Time
                .Rows(RowNo).Cells(3).Value = dsFSched.Tables(0).Rows(RowNo).Item(3) 'Position
                .Rows(RowNo).Cells(4).Value = dsFSched.Tables(0).Rows(RowNo).Item(4) 'ADP_ID1
                .Rows(RowNo).Cells(5).Value = dsFSched.Tables(0).Rows(RowNo).Item(5) 'Name1
                .Rows(RowNo).Cells(6).Value = dsFSched.Tables(0).Rows(RowNo).Item(6) 'ADP_ID2
                .Rows(RowNo).Cells(7).Value = dsFSched.Tables(0).Rows(RowNo).Item(7) 'Name2
                .Rows(RowNo).Cells(8).Value = dsFSched.Tables(0).Rows(RowNo).Item(8) 'ADP_ID3
                .Rows(RowNo).Cells(9).Value = dsFSched.Tables(0).Rows(RowNo).Item(9) 'Name3
                .Rows(RowNo).Cells(10).Value = dsFSched.Tables(0).Rows(RowNo).Item(10) 'ADP_ID4
                .Rows(RowNo).Cells(11).Value = dsFSched.Tables(0).Rows(RowNo).Item(11) 'Name4
                .Rows(RowNo).Cells(12).Value = dsFSched.Tables(0).Rows(RowNo).Item(12) 'ADP_ID5
                .Rows(RowNo).Cells(13).Value = dsFSched.Tables(0).Rows(RowNo).Item(13) 'Name5
                .Rows(RowNo).Cells(14).Value = dsFSched.Tables(0).Rows(RowNo).Item(14) 'ADP_ID6
                .Rows(RowNo).Cells(15).Value = dsFSched.Tables(0).Rows(RowNo).Item(15) 'Name6
                .Rows(RowNo).Cells(16).Value = dsFSched.Tables(0).Rows(RowNo).Item(16) 'ADP_ID7
                .Rows(RowNo).Cells(17).Value = dsFSched.Tables(0).Rows(RowNo).Item(17) 'Name7
                RowNo = RowNo + 1
            End While
        End With

        If dgvCreateSchedule.RowCount > 0 Then
            dgvCreateSchedule.Rows(0).Selected = True
            dgvCreateSchedule.CurrentCell = dgvCreateSchedule.Rows(0).Cells(0)
            'dgvCreateSchedule.FirstDisplayedScrollingRowIndex = dgvCreateSchedule.CurrentRow.Index
        End If
    Catch ex As Exception
        MessageBox.Show("Cannot open FormattedSchedules to load grid")
    End Try
    AddedNewRow = 0


0 commentaires

3 Réponses :


1
votes

Ceci devrait être l'option la plus rapide: xxx

ce qu'il ajoute toutes les "cellules" avec la ligne.

et lors de la modification des cellules, je préfère utiliser < / p> xxx


5 commentaires

Nous avons posté à peu près exactement la même heure


Tu as raison. Je n'ai pas vu votre réponse avant de soumettre.


Vous devez ajouter .Value au code d'édition. Aussi, vous avez une parenthèse supplémentaire de la routine à la ligne.Ajouter.


@Mary vrai ça.


J'ai essayé d'utiliser les deux méthodes suggérées dans les réponses: .Rows.add (dsfsched.tables (0) .Rows (Rowno) .itemarray) Pour chaque XROW comme Datarow dans DSFSCHED.TABLE (0) .ore DGVCreateschedule.rows.add (XROW .Itemarray) Suivant et les deux me donnent la même erreur



0
votes

Ajoutez-le comme ceci, en supposant qu'il y a le même nombre de colonnes / commande xxx


1 commentaires

J'ai essayé d'utiliser les deux méthodes suggérées dans les réponses:> .Rows.add (dsfsched.tables (0) .Rows (Rowno) .itemarray)> Pour chaque XROW comme DataRow dans DSFSCHED.TABLE (0) .ore DGVCreateschedule.rows.Ajouter (xrow.itemarray) Suivant ... et me donne la même erreur



0
votes

J'ai changé le nom de la DGV vers DataGridView1 CODE> car c'est ce que je suis arrivé dans mon projet de test.

Vous pouvez utiliser des instructions de compilation conditionnelle pour choisir la chaîne de connexion correcte. Pas nécessaire de conserver une variable booléenne quelque part pour déterminer la chaîne correcte. Je sais que j'oublierais de le changer pour la version de libération. P>

Vous avez fait une bonne fermeture et votre disposition d'objets de base de données, mais s'il y a une erreur, tout ce bon travail sera pour rien. Un en utilisant ... fin à l'aide d'un bloc code> accomplira la fermeture, disposera même s'il y a une erreur. P>

transmettez la chaîne de connexion directement sur le constructeur de la connexion et passez le SQL Déclaration et la connexion directement au constructeur de la commande. P>

N'ouvrez pas votre connexion avant la dernière minute. Dans le cas d'un datadapter.frillez code>, la connexion est ouverte et fermée pour vous, si l'adaptateur recherche et ouvre la connexion, il le laisse ouverte. Dans ce cas, il n'y a pas besoin d'un adaptateur ou d'un fichier de données code>. P>

Je ne vois rien de mal à votre ligne .rows.add (1) code >. Le problème vient sur la ligne suivante. L'index de datagridview.rows code> est un int32 code>, integer code> dans vb.net, et que vous avez déclaré rowno code> comme long code>. Bien sûr, vous voudrez utiliser le code suggéré par @cruled Réponse. P>

Private Sub OPCode()
    Dim dt As New DataTable
    Dim FSchedSQL = "Select ShiftName, ScheduleStart, ScheduleEnd, Position, ADP_ID1, Name1, ADP_ID2, Name2, ADP_ID3, Name3, ADP_ID4, Name4, ADP_ID5, Name5, ADP_ID6, Name6, ADP_ID7, Name7 from FormattedSchedules where ScheduleName = @ScheduleName;"
    Try
#If Not DEBUG Then
        GlobalVariables.strConnection = "CCAPProdConnectionString"
#Else
        GlobalVariables.strConnection = "CCAPTestConnectionString"
#End If
        Using FSchedConn As New SqlConnection(ConfigurationManager.ConnectionStrings(GlobalVariables.strConnection).ConnectionString)
            Using FSchedCmd As New SqlCommand(FSchedSQL, FSchedConn)
                FSchedCmd.Parameters.Add("@ScheduleName", SqlDbType.VarChar).Value = cboCreateScheduleName.Text
                FSchedConn.Open()
                dt.Load(FSchedCmd.ExecuteReader)
            End Using
        End Using
        DataGridView1.Rows.Clear()
        For Each xrow As DataRow In dt.Rows
            DataGridView1.Rows.Add(xrow.ItemArray)
        Next
        If DataGridView1.RowCount > 0 Then
            DataGridView1.Rows(0).Selected = True
            DataGridView1.CurrentCell = DataGridView1.Rows(0).Cells(0)
        End If
    Catch ex As Exception
        MessageBox.Show("Error loading grid")
    End Try
End Sub


0 commentaires