Supprimer plusieurs lignes d'un flexgrid [Résolu]

js8bleu 576 Messages postés samedi 14 octobre 2006Date d'inscription 27 janvier 2014 Dernière intervention - 30 déc. 2010 à 16:33 - Dernière réponse : cs_subaqua 69 Messages postés jeudi 22 décembre 2005Date d'inscription 20 juin 2011 Dernière intervention
- 8 janv. 2011 à 14:20
Bonjour,

je souhaiterai supprimer plusieurs lignes d'un msflexgrid (que j'aurai sélectionné). Mais je ne sais pas comment m'y prendre. J'ai mis la propriété BackColorSel à &HF8505 en cas de sélection et je me disais qu'en faisant :
Do While msflog.BackColorSel = &HF8505
cn.Execute "delete from tlog where " & msflog.BackColorSel = &HF8505 " "
rs1.MoveNext
Loop

ça irai, mais ça ne marche malheureusement pas. Quelqu'un aurait-il une idée s'il vous plaît?

Merci d'avance.

Cordialement.
Afficher la suite 

Votre réponse

18 réponses

cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 4 janv. 2011 à 19:03
+3
Utile
Re,

Argggg !!! je n'avais pas pensé à RemoveItem
Bien plus simple :

' Déclaration
Dim ligDEB As Integer
Dim ligFIN As Integer

Sub msflog_MouseDown(Button As Integer, ...
   ligDEB = msflog.MouseRow
End Sub

Sub msflog_MouseUp(Button As Integer, ...
   ligFIN = msflog.MouseRow
End Sub

Sub cmdretirer_Click()
   Dim i    as integer
   Dim sens as integer
   
   sens = 1
   If ligFIN < ligDEB Then sens = -1

   With msflog
      .Redraw = False
      For i = ligDEB To ligFIN Step sens
        .RemoveItem i  ' supprime de msflog
        cn.Execute "delete ...."   ' supprime de tlog
      Next
      .Redraw = True
   End With
End Sub


C'est OK ?

A+ Cheyenne
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_cheyenne
js8bleu 576 Messages postés samedi 14 octobre 2006Date d'inscription 27 janvier 2014 Dernière intervention - 30 déc. 2010 à 21:47
0
Utile
Voici où j'en suis mais ça ne marche toujours pas :

Dim rslog As New ADODB.Recordset
rslog.Open "select * from tlog", cn, adOpenDynamic, adLockOptimistic

z = msflog.TextMatrix(msflog.Row, 0)

For i = 1 To z

   If msflog.BackColorSel = 1017093 Then
      msflog.RemoveItem i
      cn.Execute "delete from tlog where numlog = " & i & " "
                    
   Else
                    
                    
   End If
                    
Next i


Que .BackColorSel soit égal à 1017093 ou RGB(5,133,15) ça ne marche pas. Quelqu'un pourrait-il m'aider s'il vous plaît?

Merci d'avance.

Cordialement.
Commenter la réponse de js8bleu
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 31 déc. 2010 à 19:21
0
Utile
Bonjour,

Tu utilises BackColorSel, c'est ce qui sert pour le surlignage, il faudrait utiliser CellBackColor.

En attendant mieux...
Si tu mettais tes lignes avec le CellBackColor de &HF8505 à une hauteur de 15, ça irait ?

With msflexgrid
   .Col = 0
   For i = 1 .Rows - 1
      .Row = i
      If .CellBackColor = &HF8505 then
         .Rowheigth(i) = 15
      End if
   Next i
End With   


Tu aurais toujours le même nombre de lignes, mais celles avec le fond à &HF8505 ne seraient plus visibles.

Bonne année.

Cheyenne
Commenter la réponse de cs_cheyenne
js8bleu 576 Messages postés samedi 14 octobre 2006Date d'inscription 27 janvier 2014 Dernière intervention - 2 janv. 2011 à 01:06
0
Utile
Bonjour Cheyenne, Bonne Année 2011 et Merci pour ton aide. J'ai essayé ton code mais il ne marche malheureusement pas. Peut-être que le problème vient du fait que j'ai respectivement deux colonnes dans msflog : numlog et log. Et lorsque je clique sur une ligne de msflog alors il ne me met qu'une ou plusieurs cellules (selon que ce soit une sélection d'une ligne ou de plusieurs lignes) de la deuxième colonne en jaune, les cellules de la première colonne restant blanche. Penses-tu que le problème vienne de là? Si oui, comment faire de telle sorte qu'il colorie les deux colonnes en jaune s'il te plaît?

Merci d'avance.

Cordialement.
Commenter la réponse de js8bleu
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 2 janv. 2011 à 02:00
0
Utile
Bonjour js8Bleu,

Pour surligner toutes les colonnes il faut choisir la valeur de 1 :
msflexgrid.SelectionMode = flexSelectionByRow
(par code ou dans les propriétés de la grille).

Attention tu parles de colorier alors que l'action de cliquer entraîne un surlignage avec la couleur déterminée par SelBackColor.
Colorier, à mon sens, c'est plutot mettre une couleur sur le fond d'une cellule avec BackColorSel ce qui est tout à fait différent.

L'idée serait alors de déterminer lors des évènements MouseDown et MouseUp quelles lignes sont sélectionnées et d'agir en conséquence lors du MouseUp.
Dans MouseDown : ligDEB = MouseRow
Dans MouseUp : ligFIN = MouseRow
Dans Clic : Row te donnes la ligne cliquée en premier.
Donc nSEL = (ligFIN - ligBEB) nombre de lignes sélectionnées - 1.
Tu pars de Row jusqu'à Row + nSEL et tu mets ces lignes à une hauteur de 0 et non pas 15 comme dit précédement.

Attention ceci ne vaut qu'avec l'utilisation de MSHFlexGrid, d'accord ?

En espérant que cela puisse t'aider.

Cordialement de Cheyenne
Commenter la réponse de cs_cheyenne
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 2 janv. 2011 à 11:50
0
Utile
Bonjour js8Bleu,

Je me suis penché sur ton problème et voici une solution :
(nom de la grille d'essai : grdTEST)

' En déclaration
Dim ligDEB  As Integer
Dim ligFIN  As Integer
Dim bShift  As Boolean

Sub MouseDown
  bShift = Shift
  ligDEB = grdTEST.MouseRow
End Sub

Sub MouseUp
  Dim i    As Integer
  Dim sens As Integer
   
  If bShift False Then bShift Shift
  If bShift = False Then Exit Sub
  
  With grdTEST
      ligFIN = .MouseRow
      sens = 1
      If ligFIN < ligDEB Then sens = -1
      
      .Redraw = False
      For i = ligDEB To ligFIN Step sens
         .RowHeight(i) = 0
      Next
      .Redraw = True
   End With
End Sub


J'ai mis un flag pour le Shift afin de ne pas supprimer les lignes par un simple clic.

Sens, au cas où tu sélectionnes de bas en haut.

Le Redraw est facultatif, mais si ton PC et lent et/ou que tu as beaucoup de lignes à traiter, c'est mieux.

ATTENTION, avec cette solution tu gardes le même nombre de lignes et si tu te sers de la grille comme tableur, il faut vider le contenu des lignes de hauteur 0.
L'idéal est de faire la recopie des lignes inférieures et de diminuer Rows du nom de lignes supprimées : Abs(ligFIN - ligDEB) + 1

Voilà, je pense que cela convient à ta demande.

Bon Dimanche,
Cheyenne
Commenter la réponse de cs_cheyenne
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 2 janv. 2011 à 16:41
0
Utile
Re,

Je pense que tu auras corrigé de toi-même...
Les Sub MouseDown et MouseUp sont les événements de la grille.

J'aurai du écrire Sub grdTEST_MouseDown( etc..)
mais j'ai tapé ce code à la volée, cependant rassures-toi il est OK à 100%.

Bonne prog.

A+ Cheyenne
Commenter la réponse de cs_cheyenne
js8bleu 576 Messages postés samedi 14 octobre 2006Date d'inscription 27 janvier 2014 Dernière intervention - 4 janv. 2011 à 03:08
0
Utile
Bonjour Cheyenne et Merci pour ton altruisme. Désolé mais franchement je suis complètement embrouillé. Je vais tenter de mieux réexpliquer mon problème pour que tu le comprenne le mieux possible. Je souhaiterai créer un formulaire d'historique de connexion. Pour cela j'ai donc un msflexgrid (msflog) et deux boutons (cmdretirer et cmdpurger). Dans le load de mon formulaire j'affiche le contenu de la table des logs (tlog) en faisant :

    Set rs = New ADODB.Recordset
    rs.Open "select * from tlog", cn, adOpenDynamic, adLockOptimistic
    
    msflog.SelectionMode = flexSelectionByRow
    msflog.AllowUserResizing = flexResizeBoth
    msflog.CellBackColor = vbYellow
    msflog.Rows = 1
    msflog.Cols = 0
    msflog.FormatString = "Numlog| Historique                                                                                            "
    
    Do While Not rs.EOF
    
        msflog.AddItem rs!numlog & vbTab & rs!operation

        rs.MoveNext
        
    Loop
    
    rs.Close


Maitenant étant donné qu'il risque d'y avoir des milliers de lignes, je n'ai aucun problème pour purger l'historique des logs. Cependant il se pourrait que j'ai besoin de ne supprimer que quelques lignes seulement, d'où mon idée de sélectionner les lignes (en les surlignant de jaune => vbyellow) que je désire supprimer et de cliquer sur le bouton cmdretirer pour les supprimer effectivement. Pour ce faire dans l'évènement Click de cmdretirer voilà la logique que je voyais et que je n'arrive pas à mettre en oeuvre :
Tant que msflog n'est pas arrivé à la fin
   si une ligne = vbyellow (donc est sélectionnée) alors
      supprimer cette ligne de tlog et de msflog
   Finsi
FinTantQue



J'ai testé ton code (Merci pour ton aide) mais non seulement je ne le comprends pas mais en plus il ne cadre pas avec ce que je souhaites (Désolé).

As-tu compris ma logique s'il te plaît? Qu'en penses-tu? Que me proposes-tu? Au secoooours !

Merci d'avance.

Cordialement.
Commenter la réponse de js8bleu
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 4 janv. 2011 à 15:07
0
Utile
Bonjour js8Bleu,

Alors il y a confusion de ma part, je pensais que tu voulais éliminer les lignes rien qu'en cliquant dessus d'où le code que je t'ai envoyé.
Explications :
MouseDown : la 1ère ligne est mémorisée ainsi que l'état du Shift.
MouseUP : la dernière ligne est mémorisée (ou la même, dans le cas d'une seule ligne)
Si pas de Shift dans MouseDown alors le Shift est vérifié dans MouseUp. Si pas de Shift non plus alors on quitte la Sub.
Si il y a un Shift on vide la ou les lignes surlignées (de ligDEB à ligFIN) et on met leur hauteur à 0 afin de ne plus les voir.
Le Shift permet de ne pas supprimer les lignes par un simple clic.

Tu utilises CellBackColor, c'est la couleur de fond de la grille, donc de toutes les cellules ! ce n'est pas un surlignage, lequel se fait par un clic avec la couleur donnée par BackColorSel. C'est peut-être de là que vient ton problème.

Si j'ai bien compris, tu veux faire la manip en 2 temps :
1) sélectionner la ou les lignes
2) cliquer sur cmdretirer pour supprimer la ou les lignes

Mais le hic est le suivant, si tu scrutes ta grille en fonction de la couleur de sélection tu n'y arriveras pas, tu t'arrêteras à la première ligne car la couleur concerne toutes la grille.
Je ne vois pas d'instruction qui permettent de savoir quelles lignes sont sélectionnées du genre RowIsSelected.
Si tu retires ligne par ligne en 2 temps tu peux mettre dans MouseDown ou MouseUp :
With msflog:
   .Col 0: .Row .MouseRow
   .CellBackColor = vbRed 
End with

Puis dans cmretirer, tu scrutes ta grille et tu supprimes la ligne dont la Col 0 à un fond rouge.

Mais en sélectionnant plusieurs lignes tu ne peux pas changer la couleur de fond de toutes les lignes sélectionnées.

Je te propose alors ceci, valable pour 1 ou plusieurs lignes à supprimer en 2 temps :

' Déclaration
Dim ligDEB As Integer
Dim ligFIN As Integer

Sub msflog_MouseDown(Button As Integer, ...
   ligDEB = msflog.MouseRow
End Sub

Sub msflog_MouseUp(Button As Integer, ...
   ligFIN = msflog.MouseRow
End Sub

Sub cmdretirer_Click
   Dim i    as integer
   Dim sens as integer
   
   sens = 1
   If ligFIN < ligDEB Then sens = -1

   With msflog
      .Redraw = False
      For i = ligDEB To ligFIN Step sens
         .RowHeight(i) = 0
      Next
      .Redraw = True
   End With
End Sub


Si il faut absolument supprimer les lignes, il faut recopier les lignes inférieures :

Sub cmdretirer_Click()
   Dim x    As Integer
   Dim y    As Integer
   Dim nCOL As Integer
   Dim nSEL As Integer
   Dim nLIG As Integer
        
   ' si sélection des lignes de bas en haut
   If ligDEB > ligFIN Then
      temp = ligDEB
      ligDEB = ligFIN
      ligFIN = temp
   End If
   
   nSEL = (ligFIN - ligDEB) + 1

   With msflog
      nCOL = .Cols - 1
      nLIG = .Rows - nSEL
      
      .Redraw = False
      For y = ligDEB To nLIG
         For x = 0 To nCOL
            .TextMatrix(y, x) = .TextMatrix(y + nSEL, x)
         Next x
      Next y
      .Rows = .Rows - nSEL
      .Redraw = True
    End With
End Sub


J'espère avoir ce coup-ci bien cerné ton problème.

A+ Cheyenne
Commenter la réponse de cs_cheyenne
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 4 janv. 2011 à 18:18
0
Utile
Re,

Suite...
Le problème vient du fait que quel que soit la couleur du surlignage (BackColorSel) la couleur de la cellule reste la même (définie par CellBackColor).
Par exemple, tu as toutes tes cellules avec un fond vbYellow et la propriéte BackColorCell à vbRed.
Tu cliques sur une ligne, elle va bien passer en rouge, mais la valeur du fond reste bien à vbYellow. C'est pour cela que tu échoues si une fois la grille cliquée tu scrutes celle-ci pour trouver un fond vbRed.
C'est pourquoi je te proposais de passer le fond de la ligne cliquée avec une autre couleur.

Mais je pense que la 2ème partie du code (avec la recopie des lignes) devrait te convenir.

Pour éviter que la 1ère colonne de la ligne surlignée reste en blanc tu dois supprimer le focus:
msflog.FocusRect = flexFocusNone

A+ Cheyenne
Commenter la réponse de cs_cheyenne
js8bleu 576 Messages postés samedi 14 octobre 2006Date d'inscription 27 janvier 2014 Dernière intervention - 5 janv. 2011 à 11:54
0
Utile
Bonjour Cheyenne, je suis hyper content de voir que mon problème te tient toujours à coeur. Ton code marche à merveille. C'est juste que je ne sais pas quelle est la requête que je dois utiliser pour supprimer dans la tlog les lignes sélectionnée (cn.Execute "delete from tlog ...). Pourrais-tu une fois de plus m'aider sur ce point s'il te plaît ?

Merci d'avance.

Cordialement.
Commenter la réponse de js8bleu
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 5 janv. 2011 à 14:18
0
Utile
Bonjour js8bleu,

Ah, ben oui, je tenais à résoudre ce problème !

En fait il ne te manquait que la position des lignes sélectionnées dans la grille.
Je suis content d'avoir pu te dépanner sur ce point.

Mais, par contre, je ne peux pas t'aider en ce qui concerne la suppression des lignes dans tlog car je n'utilise pas les bases de données.
J'ai simplement repris "bêtement" et abrégé la requête que tu avais codée :
cn.Execute "delete from tlog where numlog = " & i & " "


Je suppose que tu n'as pas validé ma réponse car de ce fait elle était incomplète.

Bien cordialement,

Cheyenne
Commenter la réponse de cs_cheyenne
js8bleu 576 Messages postés samedi 14 octobre 2006Date d'inscription 27 janvier 2014 Dernière intervention - 7 janv. 2011 à 12:26
0
Utile
Bonjour Cheyenne et Merci pour ton aide. Je te pries de bien vouloir excuser le retard de ma réponse. C'est vrai que mon problème n'est pas totalement résolu mais j'avoue qu'il l'est plus qu'à moitié. Encore Merci pour tout et prends bien soin de toi.

Cordialement.
Commenter la réponse de js8bleu
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 7 janv. 2011 à 15:26
0
Utile
Bonjour js8bleu,

Tu es bien volontiers excusé et c'était avec plaisir que j'ai essayé de t'aider.

J'espère que tu résoudras rapidement l'autre partie du problème.

Prends bien soin de toi également.

Bien cordialement,
Cheyenne
Commenter la réponse de cs_cheyenne
cs_subaqua 69 Messages postés jeudi 22 décembre 2005Date d'inscription 20 juin 2011 Dernière intervention - 7 janv. 2011 à 18:35
0
Utile
Bonjour,

Je me permets d'intervenir dans la discussion.
Une question : la grille est renseignée avec des éléments provenant d'une base de données ou d'un tableau ?
Si oui, cela ressemble à ce que j'utilise souvent dans mes applis.

L'utilisateur sélectionne une ligne de la grille puis appuie sur un bouton "Supprimer" que je place à côté de la grille. Je connais le n° de ligne sélectionné avec grille.rowsel (on nomme le mshflexgrid : grille). Je supprime ensuite la ligne de ma base de données ou de mon tableau puis ensuite je rafraichis ma grille.

Ca vous a aidé ?
Commenter la réponse de cs_subaqua
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 7 janv. 2011 à 19:43
0
Utile
Bonjour subaqua,

Tu fais bien d'intervenir car tu as sûrement la solution pour js8bleu.

Oui, RowSel est ok, mais pour une seule ligne.
Or js8bleu cherchait à supprimer une ou plusieurs lignes de la grille ET de sa base de données.
Pour la grille, c'est fait avec le code que j'ai posté ci-dessus et qui d'ailleurs pourrait t'être éventuellement utile pour supprimer plusieurs lignes contigües d'une grille.

Ce qui lui manque en fait c'est la syntaxe de la requête pour supprimer en plus ce/ces lignes de sa base de données, ce que d'après ton post tu dois savoir faire.

cn.Execute "delete from tlog where numlog = " & i & " "


Est-ce la bonne syntaxe ?

Merci pour lui.

Amicalement de Cheyenne
Commenter la réponse de cs_cheyenne
js8bleu 576 Messages postés samedi 14 octobre 2006Date d'inscription 27 janvier 2014 Dernière intervention - 8 janv. 2011 à 02:23
0
Utile
Bonjour subaqua et Merci pour ton intérêt. Soit le bienvenu si j'ose dire. Plus on est de fou plus on rit. Mes données proviennent d'une base de données et Cheyenne a très bien expliqué le problème. C'est assez simple de supprimer une ligne sélectionnée mais plusieurs, là c'est autre chose. Penses-tu avoir une solution s'il te plaît?

Merci d'avance.

Cordialement.
Commenter la réponse de js8bleu
cs_subaqua 69 Messages postés jeudi 22 décembre 2005Date d'inscription 20 juin 2011 Dernière intervention - 8 janv. 2011 à 14:20
0
Utile
Pour supprimer une ou plusieurs lignes d'une base de données, j'utilise "delete" comme suit :

variable="subaqua" 'nom
Set bdd = OpenDatabase("c:\mabase.mdb")
set table=bdd.openrecordset("SELECT * FROM TABLE")
'on sélectionne l'enregistrement où le nom correspond à la valeur de la var. variable
table.findfirst "nom=" & variable 'ex. où un champ de la base s'appelle "nom"
table.delete

Si on veut supprimer plusieurs lignes, on fait une boucle. Je crois que vous avez réussi à déterminer les lignes de la grille à détruire.

Ca te convient js8bleu ?
Commenter la réponse de cs_subaqua

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.