Incrémenter des cellules d'un datagridview à l'aide de poignées

fan1971 Messages postés 11 Date d'inscription mercredi 9 juillet 2008 Statut Membre Dernière intervention 19 décembre 2014 - 16 déc. 2014 à 09:36
fan1971 Messages postés 11 Date d'inscription mercredi 9 juillet 2008 Statut Membre Dernière intervention 19 décembre 2014 - 19 déc. 2014 à 15:15
Bonjour,
Je cherche un bout de code me permettant d'incrémenter les cellules d'un datagridview avec l'aide d'une poignée présente dans le coin inférieur droit de la cellule.
Fonctionnement identique à l'incrémentation de cellule d'excel.

Merci


--

7 réponses

fan1971 Messages postés 11 Date d'inscription mercredi 9 juillet 2008 Statut Membre Dernière intervention 19 décembre 2014
18 déc. 2014 à 10:02
Bonjour,
Visiblement tous le monde sèche.
Je vais donc continuer la méthode consistant à sélectionner une plage de cellules puis avec un bouton "Incrémenter" lire la valeur de la première cellule et en extraire le numéro et le texte puis reconstruire dans les autres cellules.
Si certain sont intéressé par la méthode je peux la mettre à disposition.

Bien à vous

--
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 déc. 2014 à 10:16
Bonjour,
Visiblement tous le monde sèche.

Il en ira peut-être différemment lorsque tu auras défini avec précision et la plus grande clarté ce que tu cherches à faire.
lire la valeur de la première cellule et en extraire le numéro et le texte puis reconstruire dans les autres cellules.

est très loin d'être clair, notamment en ce qui concerne ce que j'ai souligné.
Une allusion à ce que permet Excel (qui, lui, demande à l'utilisateur de choisir) est loin de suffire.
Oublie cette allusion à Excel et efforce-toi donc de décrire TOI-MEME ce que tu veux faire.
0
fan1971 Messages postés 11 Date d'inscription mercredi 9 juillet 2008 Statut Membre Dernière intervention 19 décembre 2014
18 déc. 2014 à 11:47
Bonjour ucfoutu,
OK ce n'est pas clair, je reprends.

En exemple voila ce que je souhaite faire.

1- dans la première colonne j'ai un texte contenant un numéro.
2- Je souhaite incrémenter ce numéro .
3- Je positionne le curseur de la souris sur le bord inférieur droit de la cellule
4- Je maintient le click puis je tire vers le bas pour incrémenter les cellules
5- Le résultat est visible sur la colonne en bleu.

Actuellement j'utilise le bouton incrémentation après avoir sélectionné la plage de cellule que je veux incrémenter.
Ci-dessous le code utilisé.
	 Private Sub ButtonIncr_Click(sender As Object, e As EventArgs) Handles ButtonIncr.Click
	        Dim DGVsource As DataGridView = MonDgv
	        Dim mavaleur = DGVsource.Item(DGVsource.CurrentCellAddress.X, DGVsource.CurrentCellAddress.Y).Value.ToString
	
	        Dim maSelCell = DGVsource.SelectedCells
	        Dim coli = maSelCell(maSelCell.Count - 1).ColumnIndex
	        Dim RowI = maSelCell(maSelCell.Count - 1).RowIndex
	        Dim colinb = maSelCell(0).ColumnIndex - maSelCell(maSelCell.Count - 1).ColumnIndex + 1
	        Dim Rowinb = maSelCell(0).RowIndex - maSelCell(maSelCell.Count - 1).RowIndex + 1
	        mavaleur = DGVsource.Item(coli, RowI).Value.ToString
	        Dim Moncar As String = ""
	        Dim monNombre As String = ""
	        Dim MonDrap = "SUFFIXE"
	        Dim MonSuffixe = ""
	
	     ' Isoler les chaines de caractères
	        For i = 1 To Len(mavaleur)
	            Moncar = Microsoft.VisualBasic.Left(Microsoft.VisualBasic.Right(mavaleur, i), 1)
	            Select Case True
	                Case Is = Not (Asc(Moncar) >= 48 And Asc(Moncar) <= 57) And MonDrap = "SUFFIXE"
	                    'MonDrap = "SUFFIXE"
	                    MonSuffixe = Moncar & MonSuffixe
	                Case Is = Asc(Moncar) >= 48 And Asc(Moncar) <= 57
	                    MonDrap = "PREFIXE"
	                    monNombre = Moncar & monNombre
	                Case Is = MonDrap = "PREFIXE"
	                    Moncar = Microsoft.VisualBasic.Left(mavaleur, Len(mavaleur) - i + 1)
	                    Exit For
	            End Select
	            Moncar = ""
	        Next
	
	        Dim monformat = Len(monNombre)
	
	        For j = 0 To Rowinb - 1
	            DGVsource.Item(coli, RowI).Value = Moncar & monNombre & MonSuffixe
	            Dim Nomval = Moncar & monNombre & MonSuffixe
	            If monNombre <> "" Then
	                monNombre = monNombre + 1
	                Do While Len(monNombre) < monformat
	                    monNombre = "0" & monNombre
	                Loop
	            End If
	            RowI = RowI + 1
	        Next j
	
	    End Sub
	
	


Merci pour votre aide

--
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 déc. 2014 à 13:17
Bien.
Je ne connais rien à VB.Net
Il est cependant d'ores et déjà clair qu'il te faudra utiliser l'évènement MouseDown de ce contrôle, mais pas uniquement, puisque tu dois en plus vérifier que le bouton droit de la souris est enfoncé alors que le curseur se trouve dans l'angle inférieur gauche (ce qui risque d'être assez complexe)
Pourquoi, d'ailleurs, ne pas te contenter d'agir si le bouton enfoncé est de bouton droit (ce que te permet de déterminer l'évènement MouseDown lui-même !)
Pour le reste, il te faudra utiliser l'évènement Mouseup pour savoir jusqu'à quelle cellule tu veux "traiter"
Je doute assez que d'autres feront tout cela à ta place, s'ils n'y trouvent pas eux-mêmes un REEL intérêt personnel.
Il va donc te falloir commencer sur ces bases et ne revenir que sur un point particulier, concernant une difficulté particulière et parfaitement isolée.
0
fan1971 Messages postés 11 Date d'inscription mercredi 9 juillet 2008 Statut Membre Dernière intervention 19 décembre 2014
18 déc. 2014 à 16:22
Pour répondre à : "ne revenir que sur un point particulier, concernant une difficulté particulière et parfaitement isolée. "
Normalement je trouve toujours les réponses à mes questions dans les différents forums qui traitent du vb.net ou du C etc..
Cordialement
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 18/12/2014 à 16:28
Je te crois, mais là, ce n'est pas une difficulté, mais tout un mécanisme à penser, élaborer et créer.
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
18 déc. 2014 à 13:54
Bonjour

je rejoins Uc dans le sens ou faire tout ça "juste" pour toi, va prendre du temps et donc à moins d'avoir l'envie et des vacances pour relever le défis....

Par contre, dans le concept, je te propose une piste sensiblement différente.

A noter que je n'ai pas VB.Net sous la main, mais C#.
1 A l'aide de l'évenement CellMouseMouve et du paramètres e (dont les propriétés X et Y représentent les coordonnées dans la cellule) je psiterais le passage de la souris dans le coin. Si elle y passe, sauvegarde de la cellulle en cours, et affichage d'un label, une pictureBox ou autre pour siganler la possibilité de l'action.
2 A l'évenement click de notre label (ou autre), selection de la cellule en cours et mise à true d'un bool pour faire savoir qu'on est en phase de sélection.
3 De nouveau dans l'evenement CellMouseMouve , si notre bool est true, si la cellule survolée n'est pas celle de départ et qu'elle est dans la bonne colonne, alors on la sélectionne aussi.
4 Dans l'évenemement CellMouseUp, si les conditions du 3 sont OK tu lances ton traitement.
0
fan1971 Messages postés 11 Date d'inscription mercredi 9 juillet 2008 Statut Membre Dernière intervention 19 décembre 2014
18 déc. 2014 à 15:26
ucfoutu et Whishmeril,
L'intérêt pour cette fonction est la suivante:
Les datagridview sont très puissants pour afficher une table SQL. Par contre il n'existe pas à ma connaissance de fonction d'édition évoluée. Voila pourquoi j'ai customisé une fonction de copier/coller et que je cherche le moyen d'incrémenter des cellules.
Whismeril, j'ai déjà en parti étudié ta piste. Je vais approfondir le sujet.

Bien a vous.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
18 déc. 2014 à 23:16
Bonjour

peut etre ainsi

Public Class Form2

Private COUNT As Integer

Private Sub Form2_Load(sender As Object, e As System.EventArgs) Handles Me.Load
COUNT = 59
For iter As Integer = 0 To 10
DataGridView1.Rows.Add()
Next
DataGridView1.Rows(0).Cells(0).Value = "TEST" & COUNT
End Sub

Private Sub DataGridView1_CellMouseDown(sender As Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDown
If e.ColumnIndex <> 0 Or e.RowIndex <> 0 Then
Exit Sub
End If
End Sub

Private Sub DataGridView1_CellMouseUp(sender As Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseUp
For iter = 0 To e.RowIndex
DataGridView1.Rows(iter).Cells(1).Value = "TEST" & (COUNT + iter).ToString
Next
End Sub
End Class




0
fan1971 Messages postés 11 Date d'inscription mercredi 9 juillet 2008 Statut Membre Dernière intervention 19 décembre 2014
19 déc. 2014 à 07:34
Ca c'est bon !!!
Je vais broder autour pour l'adapter à mon code. De plus j'ai déjà utilisé l'événement cellmousedown et clic droit. (affichage d'une combobox dans la cellule).
Je modifie ton code pour l'adapter à mes besoins et je le met en ligne.
Merci
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
19 déc. 2014 à 10:12
aussi
en vb.net on évite les fonctions utilisées en vb6
ex Microsoft.VisualBasic.Left etc ...
en net on a la méthode length
Dim str As String = "BONJOUR"
Dim x As Integer = str.Length


Isoler les chaines de caractères
que dois tu faire ?
0
fan1971 Messages postés 11 Date d'inscription mercredi 9 juillet 2008 Statut Membre Dernière intervention 19 décembre 2014
19 déc. 2014 à 11:08
J'ai très peu travaillé avec VB6 mais beaucoup avec VBA intégré dans Excel et Autocad.

La raison pour laquelle je mets Microsoft.VisualBasic.Left est pour le différencier des références autodesk.autocad.(création de dll pour autocad).

En fait, j'isole les caractères pour en extraire un suffixe, un préfixe et un nombre. Utile pour numéroter des câbles.
0
fan1971 Messages postés 11 Date d'inscription mercredi 9 juillet 2008 Statut Membre Dernière intervention 19 décembre 2014
Modifié par fan1971 le 19/12/2014 à 15:40
Bonjour,
Suivant vos conseils je propose ce petit bout de code. Ca me convient assez par rapport à ma question initiale.
Me reste à l'incorporer dans ma DLL pour autocad.
Utilisation du code:
Placer le curseur dans le coin droit de la cellule puis cliquer et tirer vers le bas.

Public Class Form1
    Private COUNT As Integer
    Private PosInit(1) As Integer
    Private PosFin(1) As Integer
    Private Moncar As String = ""
    Private monNombre As String = ""
    Private MonSuffixe = ""
    Private DGVsource As DataGridView
    Private monformat
    Private Drapeau As Integer = 0

    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        COUNT = 59
        For iter As Integer = 0 To 10
            DataGridView1.Rows.Add()
        Next
        DataGridView1.Rows(0).Cells(0).Value = "cs_ShayW" & COUNT & "Test"
    End Sub

    Private Sub DataGridView1_CellMouseDown(sender As Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDown
        DGVsource = sender
        ' Lire les dimensions de la cellule active
        Dim Width As Integer = 0
        Dim height As Integer = 0
        Dim rect As Rectangle
        rect = DGVsource.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, False)
        Width = rect.Width
        height = rect.Height
        'Balise pour accepter l'incrémentation
        If e.Location.X > Width - Width / 10 And e.Location.Y > height - height / 5 Then
            Drapeau = 1
        Else
            Drapeau = 0
            Exit Sub
        End If

        If e.ColumnIndex <> -1 And e.RowIndex <> -1 Then
            Dim mavaleur As String = DGVsource.Item(e.ColumnIndex, e.RowIndex).Value
            If mavaleur Is Nothing Then
                mavaleur = ""
                Drapeau = 0
                Exit Sub
            End If
            Dim MonDrap = "SUFFIXE"
            For i = 0 To mavaleur.Length - 1
                Moncar = mavaleur.Substring(mavaleur.Length - i - 1, 1)
                Select Case True
                    Case Is = Not (Asc(Moncar) >= 48 And Asc(Moncar) <= 57) And MonDrap = "SUFFIXE"
                        MonSuffixe = Moncar & MonSuffixe
                    Case Is = Asc(Moncar) >= 48 And Asc(Moncar) <= 57
                        MonDrap = "PREFIXE"
                        monNombre = Moncar & monNombre
                    Case Is = MonDrap = "PREFIXE"
                        Moncar = mavaleur.Substring(0, mavaleur.Length - i)
                        Exit For
                End Select
                Moncar = ""
            Next
            monformat = monNombre.Length
            PosInit(0) = e.RowIndex
            PosInit(1) = e.ColumnIndex
        End If
    End Sub

    Private Sub DataGridView1_CellMouseMove(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseMove
        DGVsource = DirectCast(sender, DataGridView)
        Dim x As Integer = 0
        Dim y As Integer = 0
        Dim Width As Integer = 0
        Dim height As Integer = 0

        ' Lire les dimensions de la cellule active
        Dim rect As Rectangle
        rect = DGVsource.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, False)
        x = rect.X + rect.Size.Width ' + label1.Height
        y = rect.Y + rect.Size.Height - Label1.Height
        Width = rect.Width
        height = rect.Height

        If e.Location.X > Width - Width / 10 And e.Location.Y > height - height / 5 Then
            Me.Cursor = Cursors.Cross
            Me.Label1.Visible = True
            Me.Label1.Location = New Point(x, y)
        ElseIf Drapeau = 1 Then
            Me.Label1.Location = New Point(x, y)
        Else
            Me.Cursor = Cursors.Arrow
            Me.Label1.Visible = False
        End If

    End Sub

    Private Sub DataGridView1_CellMouseUp(sender As Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseUp
        PosFin(0) = e.RowIndex
        PosFin(1) = e.ColumnIndex
        If e.ColumnIndex = -1 Or e.RowIndex = -1 Or Drapeau = 0 Then
            Exit Sub
        Else
            For iter = PosInit(0) To e.RowIndex
                DGVsource.Item(PosInit(1), iter).Value = Moncar & monNombre & MonSuffixe
                Dim Nomval = Moncar & monNombre & MonSuffixe
                If monNombre <> "" Then
                    monNombre = monNombre + 1
                    Do While monNombre.Length < monformat
                        monNombre = "0" & monNombre
                    Loop
                End If
            Next
        End If
        Moncar = ""
        monNombre = ""
        MonSuffixe = ""
        Drapeau = 0
    End Sub
End Class




--
0
Rejoignez-nous