Redim tableau à n dimension (2 ici) [Résolu]

Signaler
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
-
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
-
Salut la team, voila j'ai un petit (nan un gros) soucis !
j'ai posté ce soft :
http://www.vbfrance.com/codes/COMPTE_BANCAIRE-NET_50966.aspx

j'ai envie de bien le réécrire suite aux remarques de claudedetom.

Du coup je me lance dans un défi dépassant mes compétences, et du coup j'ai besoin de votre savoir.
Mon souci, je déclare un tableau à 2dim dans une classe (mon_compte), et lors de la lecture j'aimerais qu'il mette tout seul à jour les lignes qui sont "mensualisées" (x,7)=true
Mais voila le redim me jette car il ne peux redim que la dimension de droite -_- (c'est nul)
Donc j'imagine que je dois utiliser les collections. Mais voila aprés plein de lecture j'y pige pas grand chose.
Je vous post "ma bidouille tab_temp" qui revient en fait au même et qui biensur ne marche pas.
béwui lorsque je fais
 'balance le tableau lu dans tab_temp
        tab_temp = lecture.lignes
il redimmensionne ce que j'avais avant prévu (voir plus bas)
Si une bonne âme à une idée ou un exemple je prends.
amicalement @dn
' trouve le nombre de mise à jours à faire
        Dim NB_maj As Integer = 0
        ' trouve le nombre de ligne à traiter
        Dim NB_ligne As Integer = CInt((lecture.lignes.Length / 8) - 1)
        'calcule le nombre de ligne en divisant la longueur total par le nombre de colonne (-1 car on commence à 0)
        'utlise unbound pour voir ;)
        For ligne As Integer = 0 To NB_ligne
            ' ajoute le nombre de mise à jour à faire si la colonne 7 = true.
            If CBool(lecture.lignes(ligne, 7)) Then NB_maj += 1
        Next
        'dimensionne le tableaux en fonction du nombre de ligne.
        Dim tab_temp(NB_ligne + NB_maj, 8) As String
        'balance le tableau lu dans tab_temp
        tab_temp = lecture.lignes
        'pour chaque mise à jours à faire :
        For boucle As Integer = 0 To NB_maj
            'pour chaque ligne du compte
            For ligne As Integer = 0 To NB_ligne
                ' si c'est une ligne échéancier et que la date correspond au début du mois
                If Now.Day >= 1 AndAlso CBool(lecture.lignes(ligne, 7)) Then
                    ' et que ce mois n'est pas déja rempli (ou alors si c'est une nouvelle année) alors
                    If Now.Month > CDate(lecture.lignes(ligne, 0)).Month _
                    Or Now.Year > CDate(lecture.lignes(ligne, 0)).Year Then
                        'attribut la date d'aujourd'hui et le jour de l'opération mensuel
                        Dim maintenant As Date = CDate(CDate(lecture.lignes(ligne, 0)).Day & " " & Now.Month & " " & Now.Year)
                        ' retire à l'anciénne ligne le status de mensuel
                        lecture.lignes(ligne, 7) = "false"
                        ' ajouter cette nouvelle ligne !
                        'ajoute la nouvelle ligne  et active la mensualisation (encore une fois utilse unbound ! )
                        Dim index As Integer = CInt(tab_temp.Length / 8) - 1
                        tab_temp(index, 0) = maintenant.ToString("yyyy MM dd")
                        tab_temp(index, 1) = maintenant.ToString("dd MMMM yy")
                        tab_temp(index, 2) = lecture.lignes(ligne, 2)
                        tab_temp(index, 3) = lecture.lignes(ligne, 3)
                        tab_temp(index, 4) = lecture.lignes(ligne, 4)
                        tab_temp(index, 5) = lecture.lignes(ligne, 5)
                        tab_temp(index, 6) = "False"
                        tab_temp(index, 7) = "true"
                    End If
                End If
            Next ligne
        Next boucle
        ' attribut le tableaux à ME.
        Me.mdp = lecture.mdp
        Me.types = lecture.types
        Me.budgets = lecture.budgets
        Me.lignes = tab_temp


Tiens les balises ne sont pas reconnues ^_____^, zut alors.....

115 réponses

Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Te casse pas la tête, je vais faire pareil que toi (enfin essayer tout du moins ^^)
@++
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Bien, j'ai reussi pour le supp dune ligne (normale tu m'as montré ton code) mais aussi pour la modif, sauf que la listview ne retrie pas si la date change -_-", faut que je bosse encore, pour la copie et l'ajout de ligne je ne vois pas trop comment faire sans passer par la mise à jour
Sinon depuis le temps qu'on en parle j'ai implémenté une fonction dans la classe CLS_ligne, elle va te rappeller quelque chose "ToListView" j'éspére que je te fais honneur, sinon balance tes critiques

http://www.cijoint.fr/cjlink.php?file=cj201001/cijktQ3IEq.zip

@++ M. le correcteur (j'vais finir par payer la consultation si cela continu )
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
voici la version 'allégée' reste des bugs sur le doubleclic et autres mais je pense avoir bien épuré le code
donc voici la version sur la qu'elle bosser ;)

http://www.cijoint.fr/cjlink.php?file=cj201001/cijQS4KiXZ.zip

en te remerciant, de retour de chantier vendredi soir ++
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
on avance doucement ^^

bon, décoche la référence MS.VB? (tu codes en vb.net, pas vb6...) => 22 erreurs

redimentionnes la colonne "M"? magie... :D

f_op, "modifier", le bouton indique "ajouter"

listitem_blabla="X", là on a un souci de conception
si la LIGNE te renvoie "X" (par tolistview), elle doit soit être la seule à renvoyer ce X ( = pas ailleurs dans le code), soit partager (propriété GET) cette chaine, afin de centraliser les infos
tu ne dois pas avoir plusieurs endroit à modifier le code si tu veux passer plus tard de "X" à "*"


Public Property lignes() As List(Of CLS_lignes)
Get
Return _ligne

alors, ligne ou lignes, faut que çà soit clair


sinon en diagonale et comparé au début (rappelle-toi à l'époque... page 1 ou 2 ), c'est déjà mieux

côté "plaisir de lecture", faut suivre quand même... çà manque cruellement d'aération

un code qui fait plus de lignes parce qu'il contient plus de lignes vides, c'est pas grave hein
çà compile pareil et au moins on respire


bonne continuation
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Bonsoir, je rentre juste de chantier, mais déja à fond dans !
bon, décoche la référence MS.VB? (tu codes en vb.net, pas vb6...) => 22 erreurs

Je bloque sur :
-l'inputbox, visiblement pas du .net et apparament m'oblige à faire une form (un peu dommage pour une référence qui ne géne en rien le process)


redimentionnes la colonne "M"? magie... :D
à pas compris, de toute façon elle ne sert à rien sur la listview, donc viré...


listitem_blabla="X", là on a un souci de conception
si la LIGNE te renvoie "X" (par tolistview), elle doit soit être la seule à renvoyer ce X ( = pas ailleurs dans le code), soit partager (propriété GET) cette chaine, afin de centraliser les infos
tu ne dois pas avoir plusieurs endroit à modifier le code si tu veux passer plus tard de "X" à "*"

Je pense que le nouveau zip te plaira mieux


f_op, "modifier", le bouton indique "ajouter"

alors là je m'en occupe pas du tout, je ne gére rien sur l'IHM je le ferais plus tard sur un code propre, la je test avec toi un code bien fait ;)


Public Property lignes() As List(Of CLS_lignes)
Get
Return _ligne
alors, ligne ou lignes, faut que çà soit clair

Mouhai je suis pas encore au point, mais le code final le sera (enfin j'éspére )

côté "plaisir de lecture", faut suivre quand même... çà manque cruellement d'aération
là aussi j'ai fait un peu d'air, mais bon pas partout, toutjours pour avoir un code efficasse, aprés je le formaterais et documenterais bien comme il faut.

Je te joints pour finir la derniére version de ce jour, bonne soirée et @ trés vite pour la fin de ce topic...j'ai mis V6.0.0 juste pour le fun

http://www.cijoint.fr/cjlink.php?file=cj201001/cijecZ8ewg.zip

kenavo !
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
PS prochaine étape demain faire des fonctions des codes redondants dans les fonctions ajout/modif/doubleclic etc...
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
pour MS.VB... ok tu peux t'accorder un écart pour l'input ^^
tu as juste à le préfixer de la référence complète (microsoft.visualbasic.inputbox... je crois)
et là plus de problème, tu peux décocher, pour te forcer à avoir le reste "à la sauce dotnet"


le zip.. j'aurais bien envie d'attendre la prochaine étape pour regarder
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Oukidouki, je fais cela dans la journée.
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Bon j'ai un gros binss que je n'arrive pas à résoudre
Suivant ton conseil, je n'utilise plus la miseAjour qui reload TOUTES les lignes du compte dans la LV à chaque ajout, modif ou copy. Cela marche trés bien tant que la listview affiche TOUTES les lignes. Seulement voila lorsque je cache les lignes pointées, je ne sais plus ou placer une nouvelle ligne (ou alors si au même endroit, mais si la modif de la ligne porte sur la date la ligen sera mal placé)
Voici un exemple de code avec les <> essais réalisé, seul le reload complet de la LV marche bien.
            'si instance de cette form est valide alors remplace la ligne 'évite le trie et donc la mise à jour()
            If Frm_modif.valide Then

                'modifie dans le compte
                mon_compte.remplace(index_list, Frm_modif.new_ligne)
Décidément pas pret d'en voir la fin de ce code 
Si tu as une idée je prends, Merci pour la lecture et bonne soirée à toi.

                'trie au cas où la date change
                mon_compte.trie()

                'puis l'enregistre
                mon_compte.save(Fichier)

                'supprime la ligne selectionnée
                'LV_supprime(ListView1.SelectedIndices(0))
                'trouve la nouvelle position de la ligne à ajouter à la listview et l'ajoute à la nouvelle position si la date change !
                ' //// sauf que la position de mon_compte n'est pas la même que celle de la list view en mode "caché"
                'LV_insert(mon_compte.TrouveLaLigne(Frm_modif.new_ligne.L_Id), Frm_modif.new_ligne)
                ' //// Donc pour l'instant je la remplace au même endroit dans la LV, avec la date mal placé
                'LV_remplace(ListView1.SelectedIndices(0), Frm_modif.new_ligne)
                'plus simple je fais une mise à jour de la listview !
                MiseAjour() 'reload toutes les lignes

                MiseAJourSolde()

            End If


Ce bug est commun à toutes les sub d'ajout, modif ou probablement copy, seul le supp marche puisque pas d'ajout. Voila je ne sais pas comment faire pour retrier la LV en mode "ligne pointée caché"

PS le code de mise à jour avec ou sans ligne cachée :
    Private Sub MiseAjour()

        ListView1.BeginUpdate()

        ' efface les anciennes lignes
        ListView1.Items.Clear()

        'ajoute chaque lignes du compte dans la listview
        For ligne As Integer = 1 To mon_compte.lignes.Count 'donne le nombre de lignes de mon compte
            'ajout ligne si pas pointé ou si pas demande de cacher les lignes pointées
            If (Chck_visu_pointage.Checked And Not mon_compte.lignes(ligne - 1).L_pointage) _
            Or Not Chck_visu_pointage.Checked Then
                ListView1.Items.Add(mon_compte.lignes(ligne - 1).ToListView())
            End If
        Next ligne

        ListView1.EndUpdate()

        MiseAJourSolde()

    End Sub ' à l'ouverture ou si demande "cacher les lignes pointées" charge la list view
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
salut,

mais sans la manière de récupérer index_list ni la méthode replace, çà va pas être facile à trouver
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Vi je l'ai pas noté car c'est du code basique et le soucis ne vient pas de cela, il vient simplement du fait que la list view n'affiche pas tous les items de la list compte, et du coup je n'arrive pas à placer la date au bonne endroit lors d'un ajout.
Voici l'explication des bout de code qui te manque :
Index_list=position dans la list compte, trouvé grace à item(0).txt GUID de la ligne selectionné dans la LV.mon_compte.remplace ne fait qu'un removeAt et un insert dans la list compte
Mais encore une fois il n'y a aucun probléme avec la list compte. Le seul soucis est dans l'affichage et surtout le trie des dates de la listview.
Tant que la ligne compte à modifier est au même endroit dans la listview pas de soucis, mais dés que je filtre la listview (pour n'avoir que les lignes non pointées par exemple) et que la date change je n'arrive pas à insérer cette ligne dans la listview. Sa position dans la list compte est bonne mais son index n'a plus rien à voir avec celui de listview (Ex: 500lignes dans list compte mais seulement 10 sont affichées dans la listview, si je modifie la ligne d'index 9(LV) son index dans la list compte (via son GUID) peut être 115) Si la date ne change pas je peux remplacer la ligne à l'index 9 dans la listview, mais si la date change ?? je connais la position de cette ligne dans la list compte car trié, mais je ne sais pas où l'inserer dans les 10 lignes affichées
Il faudrait que j'arrive à faire une boucle qui recherche par la date la position de la cette ligne dans la LV. OU simplement trier l'affichage de la listview, mais cela oblige à creer une nouvelle colonne date comme avant.
Tout en sachant que MiseAJour régle le probléme puisque recharge toutes la LV.Voila j'éspére être clair
Mais bon 500 lignes rafraichies juste pour une modif, trés peu pour nous
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
peut-être faut-il "détrier" avant d'ajouter?
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Oui cela marche mais cela revient à faire la mise à jour puisque c'est là que j'affiche ou pas les lignes pointées. Le soucis de départ (post N°1) c'est que justement je ne peux pas cacher des lignes dans une listview, d'où le redim de tableaux, d'où la class.
Mais bon cela va se finir comme ça, je fais la mise à jour pour un ajout et puis zou ^^.
les duals core de maintenant le supporteront sans broncher ;)
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Voici enfin mon travail !
http://www.vbfrance.com/codes/COMPTE_BANCAIRE-NET_50966.aspx
j'éspére te faire honneur en tant qu'éléve
++ et merci encore pour ton aide
Fin du topic.
(ou pas )
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
J'ai posté la version "stable" (enfin) du soft ! c'est grace à toi en grande parti

Ps j'ai tester (et laissé) un fichier de 4000 lignes et je t'assure que même en recherche de texte ou autre mes pc ne bronche pas !
@++ pour de nouvelles aventures