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
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
bin......


et t'auras un crash si le séparateur est le "."
ou plutôt non : tu censures tout utilisateur ayant autre chose que la virgule, ce sans même l'en informer

et MsgBox c'est pas du dotnet
et vbCrLf c'est pas du dotnet

et tu as fais la même erreur que moi, à savoir mettre annule à false par défaut (et s'il clique sur la croix?)

et si tu veux appliquer des valeurs par défaut, à part les combos, j'aurais plutôt vu çà depuis la form, appelant par exemple SA ligne -> .SetDefaultProperties, puis irait la lire ensuite

pour la double ligne ajoutée faut voir çà en pas à pas ;)

++
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
en relisant ma réponse je ... pense savoir pourquoi t'as une double ligne ^^

tu vas trouver donc
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
aller pour le fun, et surtout parce que ton test dans les text_changed me fait mal aux yeux


Public Class frmOperation

#Region "Séparateur décimal selon les regional settings"
    Private Const LOCALE_SDECIMAL As Integer =  &HE
    Private Declare Auto Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Integer, ByVal LCType As Integer, ByVal lpLCData As String, ByVal cchData As Integer) As Integer
    Private Declare Auto Function GetUserDefaultLCID Lib "kernel32" () As Integer

    ''' <summary>
    ''' Renvoie le séparateur décimal correspondant au Regional Settings propres au poste client
    ''' </summary>
    ''' <value></value>
    ''' <returns>Caractère séparateur, type Char</returns>
    ''' <remarks>Propriété en lecture seule</remarks>
    Public ReadOnly Property Separator() As Char
        Get
            'vérifié à chaque usage
            Dim sSeparator As String = " "
            GetLocaleInfo(GetUserDefaultLCID, LOCALE_SDECIMAL, sSeparator, 1)
            Return sSeparator(0)
        End Get
    End Property

#End Region



    Public Canceled As Boolean = True
    Public Operation As New clsAccountItem

    Private Sub frmOperation_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        txtCredit.Text = "0"
        txtDebit.Text = "0"
    End Sub

    Private Sub cmdCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCancel.Click
        Me.Close()
    End Sub

    Private Sub cmdAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAdd.Click
        With Me.Operation
            .DateOperation = mcDateOperation.SelectionRange.Start
            .TypeOperation = cboType.Text
            .Budget = cboBudget.Text
            .Commentaires = txtComments.Text
            Double.TryParse(txtCredit.Text, .Credit)
            Double.TryParse(txtDebit.Text, .Debit)
            .Pointage = optPoint1.Checked
            .Mensuel = optMens1.Checked

            If .Credit.Equals(.Debit) AndAlso .Debit.Equals(0.0#) Then
                MessageBox.Show("Opération invalide" & Environment.NewLine & "Crédit et Débit NULL")
                txtCredit.Focus()
            Else
                Me.Canceled = False
                Me.Close()
            End If
        End With

    End Sub

    Private Sub txtCredit_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtCredit.KeyPress, txtDebit.KeyPress
        'interdit le coller
        If e.KeyChar.Equals(Convert.ToChar(22)) Then
            e.Handled = True
        Else
            Dim sAccept As String = "0123456789.," & Convert.ToChar(Keys.Back).ToString
            Dim bFound As Boolean = False
            For i As Integer = 0 To sAccept.Length - 1
                If sAccept(i) = e.KeyChar Then
                    'virgule = point, ou l'inverse
                    If (e.KeyChar.Equals("."c) And Me.Separator.Equals(","c)) _
                    Or (e.KeyChar.Equals(","c) And Me.Separator.Equals("."c)) _
                    Then
                        e.KeyChar = Me.Separator
                    End If

                    bFound = True
                    Exit For
                End If
            Next

            If Not bFound Then
                e.Handled = True
            Else
                'exception quand même pour le multipoints
                If DirectCast(sender, System.Windows.Forms.TextBox).Text.Contains(Me.Separator) AndAlso e.KeyChar.Equals(Me.Separator) Then
                    e.Handled = True
                End If
            End If
        End If
    End Sub
End Class



mais bon...
tu peux aussi garder le fonctionnement de Separator et remplacer tes textboxes par des masktextboxes dont tu définies le masque par code, genre = "99999" & me.separator.tostring & "99"

enfin...
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Oulala ma pauvre tête
Là tu y vas un peu fort avec moi
N'oublis pas mon niveau de base
Balaise le test de double ^^
Bon j'essaye de décrypter tout cela dans la journée. Merci

et t'auras un crash si le séparateur est le "."
ou plutôt non : tu censures tout utilisateur ayant autre chose que la virgule, ce sans même l'en informer
C'est vrai, mais je pensais qu'en france / europe s'était toujours pareil.

et MsgBox c'est pas du dotnet
et vbCrLf c'est pas du dotnet
vi je sais mais c'est plus rapide à taper que le messagebox.show, je l'aurais modifier au final bien sûr

et tu as fais la même erreur que moi, à savoir mettre annule à false par défaut (et s'il clique sur la croix?)
Ben il ne se passe rien normalement puisque je test l'appui sur "OK"
 If add.DialogResult = Windows.Forms.DialogResult.OK And Not add.annule Then


et si tu veux appliquer des valeurs par défaut, à part les combos, j'aurais plutôt vu çà depuis la form, appelant par exemple SA ligne -> .SetDefaultProperties, puis irait la lire ensuite
là j'ai peur de ne pas avoir bien compri.
Si BP ajout, je renseigne les valeurs par défaut, si BP copier je transmet les valeurs de la lignes selectionnées, donc je le fais depuis la form principal. On parles bien de la même chose ?

A que bon vikend à toi
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Ps : j'ai pas l'impression d'une double ligne dans mon bug, mais plutôt qu'elle ne se remplit pas, tout est par défaut, la date 12:00:00 et le reste à nothing -_-" . Bon vais faire les courses et je rebosse dessus aprés, kenavo
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Wouhou i found the mistake ^^ la vache quel boulet je fais !
En fait j'écrivais cela au retour de la form F_op :
    Private Sub Bp_add_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bp_add.Click
        'déclare une nouvel instance de la form F_op
        Dim add As New F_op
        ' Renseigne la variable "enfant" (dans F_op : Public new_ligne As New ligne_compte)
        add.txt_credit.Text = "0"
        add.txt_debit.Text = "0"
        add.Combo_budget.DataSource = mon_compte.budgets
        add.Combo_type.DataSource = mon_compte.types
        add.calendrier.TodayDate = Now
        add.Chk_pointage.Checked = False
        add.Chk_mensuel.Checked = False
        add.ShowDialog()
        If add.valide Then
            mon_compte.lignes.Add(F_op.new_ligne)
            mon_compte.save(Fichier)
            ' a faire dans la classe compte la miseAjour_lv
            ' ListView1.Items.Add(F_op.new_ligne.ToListViewItem)
            ' à supprimer ensuite...
            MiseAjour_LV()
        End If
        add = Nothing
          End Sub

Du coup impossible de recevoir les infos de la form F_op à la validation ! ben évidement andouille que je suis,
c'est F_op qui renvois les infos, c'est add l'instance de F_op ! grrrrr, une aprés midi de perdu pour ça...
mon_compte.lignes.Add(add.new_ligne) marche beaucoup mieux ^^

Bon sinon j'ai pas tout pigé dans ton test de saisie, alors plutôt que le copier bétemment je laisse comme cela pour l'instant et je m'attaque au reste : modif de ligne et surtout suppression. @++ M.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
tu risques de souvent rencontrer ce genre de problème "dur à débugger" si tu gardes cette syntaxe/nomenclature temporaire....

je t'avais dis l'autre jour : je comprends que tu puisses t'y perdre ^^
à vouloir gagner du temps en codant à la va-vite, on en perd souvent beaucoup plus

bonne continuation

ps :
suppression de ligne : 4 secondes sans gestion d'erreur, 2mn en passant par la classe principale
modif de ligne : réutilise F_OP existant, avec un paramètre (une propriété) d'utilisation
( = 3mn)

quoi que pour les estimations, reste la partie rigolade : les ID

++
[hr]
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
nouveau soucis, avant je gérais tout via la listview (grave erreur car ce n'est qu'une visualisation, d'où la refonte compléte du code, sujet de ce post^^ )
alors voila comment faire pour trier ? avant je faisait simplement : ListView1.Sorting = SortOrder.Descending
avec un format de date sur la premiére colonne (invisible) : listItem.Text = (mon_compte.lignes.Item(ligne - 1).L_date.ToString("yyyy MM dd"))
maintenant si je test le double clic sur la list view ben j'ai pas le même index ce qui est normal.
A tu une idée pour trier ma classe, plutôt que ma listview ?
Va t'il faloir que je créer une nouvelle colonne dans ma classe avec ce format de date ? brrr
Merci pour ton aide Ô combien précieuse. amicalement
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Oups à pas lu ta réponse avant de poster, et oui je suis bien d'accord avec toi, un bon schéma de l'appli me ferais gagner du temps en débug, mais bon j'suis automaticien hein ^^
Pour les ID je crois que mon post du dessus montre que je suis bien dans le caca -
c'est si pas facile la prog
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
tu arrives à une partie intéressante des LIST, que j'ai à peine survolé mais déjà..



par chance il y a de bons exemples dans la MSDN

++
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
j'dois avouer...

certains aspects de dotnet sont tout simplement déconcertants

en peu de lignes....

    Private Shared Function ComparisonByDateOperationAsc(ByVal x As clsAccountItem, ByVal y As clsAccountItem) As Integer
        Return x.DateOperation.CompareTo(y.DateOperation)
    End Function


avec une tite routine qui répartie bien la chose, voilà le résultat





trace :

Ordre actuel :
DATE     TYPE     BUDGET    CREDIT     DEBIT    POINTAGE    MENSUEL
02/01/2010 00:00:00  CB  divers  10  20  True  True
02/01/2010 00:00:00  CB  alimentaire  20  30  True  False
23/01/2010 00:00:00  CB  divers  99  996,6  True  True
12/01/2010 00:00:00  VIR  divers  0  40  False  True
03/01/2010 00:00:00  TPV  divers  0  16  False  False

Ordre par date ASC:
DATE     TYPE     BUDGET    CREDIT     DEBIT    POINTAGE    MENSUEL
02/01/2010 00:00:00  CB  alimentaire  20  30  True  False
02/01/2010 00:00:00  CB  divers  10  20  True  True
03/01/2010 00:00:00  TPV  divers  0  16  False  False
12/01/2010 00:00:00  VIR  divers  0  40  False  True
23/01/2010 00:00:00  CB  divers  99  996,6  True  True



là ok, on a du managé
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Pff, déconcertant tu l'as dit
3heures de recherche et je pige que dalle.
déja j'ai pas taclass.items.sort(), mais plutôt mon_compte.lignes.sort(), donc je le redis j'ai du me vautrer dés le début de la class. Ensuite ben il veux rien savoir puisqu'il ne peut trier qu'une dimension.
d'ou ta sub avec X et Y, mais là pour moi c'est du chinois.
par chance il y a de bons exemples dans la MSDN
pour un pro comme toi surrement, mais for me c'est la grosse loose
Je pense que j'ai cherché mes limites avec cette refonte de code, et que je les ai trouvé.
bon je cherche encore pendant une heure sur le web (de la triche tiens, mais bon...)
++ et merci
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
En plus , lorsque je fouine un peu je trouve cela (mon premier code est avec des tableaux)
Le travail sur les tableaux est beaucoup plus rapide que sur les collections.
Par exemple , pour stocker 1000 string dans un tableau ou une collection, l'usage du tableau est 60% plus rapide.
bon j'suis pas à encore à mille lignes mais bon...c'est décourageant non ?
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Bon j'en suis arrivé là : (dans une nouvelle class)
Imports System
Imports System.Collections.Generic

Public Class trie_lignes
    Implements IComparer(Of ligne_compte)

    Public Function Compare(ByVal x As ligne_compte, ByVal y As ligne_compte) As Integer Implements System.Collections.Generic.IComparer(Of ligne_compte).Compare
        Return x.L_date.CompareTo(y.L_date)
    End Function
End Class

Mais comme j'y pige que dalle, j'suis pas plus avancé
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
j'ai bien cette exemple :
Public Class SortListClass
    Implements IComparer(Of Basket)
 
    Public Function Compare(ByVal x As Basket, ByVal y As Basket) As Integer Implements System.Collections.Generic.IComparer(Of Basket).Compare
        If x.TaskList(0).StartTime < y.TaskList(0).StartTime Then
            Return -1
        ElseIf x.TaskList(0).StartTime = y.TaskList(0).StartTime Then
            Return 0
        Else
            Return 1
        End If
    End Function
End Class
 
    Private Sub SortActiveList()
        Dim MyComparer As New SortListClass
        ActiveList.Sort(MyComparer)
    End Sub

il me correspond bien , mais j'ai l'impression qu'il y a deux instances de la class à comparer
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
ok un petit coup de main?


déja j'ai pas taclass.items.sort(), mais plutôt mon_compte.lignes.sort(), donc je le redis j'ai du me vautrer dés le début de la class.


non tu ne t'es pas forcément vautré, on a pas les mêmes noms puisque j'ai tout repris souviens-toi
je n'ai donc pas les mêmes noms...

CurrentAccount est le nom de mon instance privée, correspondant à ton instance publique nommée mon_compte

c'est pour moi l'instance de clsAccount du fichier clsAccount.vb, correspondant à ton modèle Class_fichier_compte du fichier compte.vb

(bin ouai déjà rien que là, t'as qu'une seule classe dans un fichier.vb et tu te brouilles en ne mettant même pas le même nom )

nos 2 classes ont bien des LIST(of X)
ma LIST public est une list of clsAccountItem
ta LIST public est une list of ligne_compte

ma LIST s'appelle Items
ta LIST s'appelle lignes

ma classe clsAccountItem est dans un fichier clsAccountItem.vb
ta classe ligne_compte est dans un fichier ligne.vb


chacun s'y retrouve comme il le sent, j'ai remanié de manière à m'y retrouver (forcément), maintenant à part te re-re-re-re conseiller de choisir des nomenclatures plus naturelles, le code reste le même, on a donc bien la même action :

'mon code :
CurrentAccount.Items.Sort()

'ton code :
mon_compte.lignes.sort()



voilà pour la clarification et les pseudo-correspondances





Ensuite ben il veux rien savoir puisqu'il ne peut trier qu'une dimension


effectivement et c'est là où le MSDN est bien faite et où les LIST (qui même si utilisables comme tel, ne sont pas tout à fait des COLLECTIONS) sont intéressantes

en effet l'exemple que j'ai repris :

'source : http://msdn.microsoft.com/fr-fr/library/w56d4y5z(VS.85).aspx

Imports System
Imports System.Collections.Generic

Public Class Example

    Private Shared Function CompareDinosByLength( _
        ByVal x As String, ByVal y As String) As Integer

        If x Is Nothing Then
            If y Is Nothing Then 
                ' If x is Nothing and y is Nothing, they're
                ' equal. 
                Return 0
            Else
                ' If x is Nothing and y is not Nothing, y
                ' is greater. 
                Return -1
            End If
        Else
            ' If x is not Nothing...
            '
            If y Is Nothing Then
                ' ...and y is Nothing, x is greater.
                Return 1
            Else
                ' ...and y is not Nothing, compare the 
                ' lengths of the two strings.
                '
                Dim retval As Integer =  _
                    x.Length.CompareTo(y.Length)

                If retval <> 0 Then 
                    ' If the strings are not of equal length,
                    ' the longer string is greater.
                    '
                    Return retval
                Else
                    ' If the strings are of equal length,
                    ' sort them with ordinary string comparison.
                    '
                    Return x.CompareTo(y)
                End If
            End If
        End If

    End Function

    Public Shared Sub Main()

        Dim dinosaurs As New List(Of String)
        dinosaurs.Add("Pachycephalosaurus")
        dinosaurs.Add("Amargasaurus")
        dinosaurs.Add("")
        dinosaurs.Add(Nothing)
        dinosaurs.Add("Mamenchisaurus")
        dinosaurs.Add("Deinonychus")
        Display(dinosaurs)

        Console.WriteLine(vbLf & "Sort with generic Comparison(Of String) delegate:")
        dinosaurs.Sort(AddressOf CompareDinosByLength)
        Display(dinosaurs)

    End Sub

    Private Shared Sub Display(ByVal lis As List(Of String))
        Console.WriteLine()
        For Each s As String In lis
            If s Is Nothing Then
                Console.WriteLine("(Nothing)")
            Else
                Console.WriteLine("""{0}""", s)
            End If
        Next
    End Sub
End Class

' This code example produces the following output:
'
'"Pachycephalosaurus"
'"Amargasaurus"
'""
'(Nothing)
'"Mamenchisaurus"
'"Deinonychus"
'
'Sort with generic Comparison(Of String) delegate:
'
'(Nothing)
'""
'"Deinonychus"
'"Amargasaurus"
'"Mamenchisaurus"
'"Pachycephalosaurus"





comme indiqué j'avais déjà survolé mais jamais cherché plus que çà
(beh ouai, VB6 moi )
on voit bien le principe : comparaison de 2 STRING pour une LIST(of STRING)


donc je teste....

dans clsAccount je me fais mes fonctions shared de LIST(of CLSACCOUNTITEM) en respectant les noms X et Y attendus, et une méthode pour regrouper les appels (cf capture), se nommant SortItems, qui va ensuite aller faire le Me.Items.Sort(AddressOf LaFonctionDeMonChoix)



pas évident peut-être, mais ni si compliqué, ni décourageant, au contraire non?


après y'a autre chose à bien prendre en compte... :
avant je gérais tout via la listview (grave erreur car ce n'est qu'une visualisation, d'où la refonte compléte du code, sujet de ce post^^ )

justement, on trie pour quelle raison ici?
tu veux juste que l'utilisateur puisse cliquer sur les headers?
que ton fichier enregistre l'ordre préféré?

j'ai poussé ce SORT par curiosité, j'avoue...
pis c'est comme çà qu'on apprend
mais si ce n'est que(*) pour le confort de l'utilisateur, il n'y a pas de tri à faire sur ta list

(*) j'entends bien sûr qu'un tri est à faire, le confort est important, mais c'est alors bel et bien au niveau de la listview, et non au niveau de la list
la listview n'est qu'une représentation d'une vue

tu peux enregistrer sa "préférence" et forcer le tri selon cette préférence à la prochaine ré-ouverture
aucun besoin de réorganiser ta list en mémoire pour çà !
il faut juste ne pas te tromper dans les ID (et évidemment la date n'est pas un bon ID)


par contre si tu veux proposer un tri plus spécifique (pour ma part, toujours pour tester, j'ai trié par ordre croissant ou décroissant de différence entre le débit et le crédit), là oui pourquoi pas. et encore, si c'est faisable directement sur la listview (par une proposition combo ou autre) alors on en revient là : visualisation!

le tout étant bien sûr de ne jamais modifier tes items DEPUIS la listview, mais c'est ce que j'ai déjà dit au dessus



donc recadrage :
*sauvegarde ton projet

*nouveau projet, re-pars avec des noms plus sains (même en français avec ou sans casse, il faut juste que tu t'y retrouves, ce qui n'est plus le cas ici. et français ou anglais, pas un petit mélange...)
NB : pas copier coller de ton ancien projet hein :)

*complète le projet par ce que tu as déjà fait : relis chaque bout que tu colles pour bien le comprendre.
ex :
-ton test de double ligne lors du chargement.... il sert à quoi?
-ouverture d'un fichier existant => depuis une SAVEBOX ?
-.SAVE juste après le OPEN? pourquoi
-etc...

*et isoler les besoins finaux! fais-toi un fichier texte, une trace à suivre pour éviter la dispersion


je reste dans les parages
bon courage
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
je digére, je pleure, je recode et je reviens
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Bonsoir, pour le nom des variables je vais refaire un peu de ménage, mais j'évite comme tu le fais d'utiliser des nom qui se rapproches trop du language VB (ex : items pour toi = lignes pour moi)
Mais tu as raison il faut que soit plus rigoureux.

Pour le trie je m'y colle desuite.

je suis obligé de trier la class et pas la listview, car sinon si je clic sur la listview pour pointer une ligne ou la dupliquer cela ne sera pas la bonne ligne de ma class (la listview est certe une visu, mais c'est aussi et surtout l'IHM de mon appli ;) )

Pour ce qui est de réécrire le code, je préfére finir celui là, et en refaire un nouveau aprés avec un nouveau sujet (liste de contact téléphonique par exemple), là je dois avouer que cette éxo me pompe beaucoup trop de temps et ma femme commence à trouver le temps long

-ton test de double ligne lors du chargement.... il sert à quoi?
-ouverture d'un fichier existant => depuis une SAVEBOX ?
-.SAVE juste après le OPEN? pourquoi
-etc...


Ce n'est pas un test de double ligne c'est la mise à jours des opération marqué comme mensuel
ouverture via une savebox ? j'ai pas vu, sinon c'est une grosse bétise, pour le save aprés le open c'est dans le cas d'un nouveau fichier.

Mais encore une fois je vérifie tout ça avant de te reposter mon travail.

Encore mille merci pour ton aide et ton soutient !
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
je suis obligé de trier la class et pas la listview, car sinon si je clic sur la listview pour pointer une ligne ou la dupliquer cela ne sera pas la bonne ligne de ma class (la listview est certe une visu, mais c'est aussi et surtout l'IHM de mon appli ;) )

non non et.. non

si çà ne correspond pas à la bonne ligne c'est parce que tu gères mal les ID, déjà dit
ne prend ni la position, ni la date

aller, un piste (avec toutes ces pistes c'est du code complet non? ^^) :

dans clsAccountItem
Public ID As System.Guid =  System.Guid.NewGuid  'ID unique (attention aux .Clone!!)



dans clsAccount
    Public Function GetItemByGuid(ByVal sGuid As String) As Integer
        If Me.Items.Count > 0 Then
            For i As Integer  = 0 To Me.Items.Count - 1
                If Me.Items(i).ID.Equals(New System.Guid(sGuid)) Then Return i
            Next
        End If
        Return -1
    End Function



et dans frmMain
    Private Sub tsmDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsmDelete.Click
        Dim pos1 As Integer = ListView1.SelectedItems.Item(0).Index
        Dim pos2 As Integer = CurrentAccount.GetItemByGuid(ListView1.SelectedItems.Item(0).Text)
        If MessageBox.Show("Êtes-vous sûr de vouloir supprimer cet élément", "Suppression définitive!", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) = Windows.Forms.DialogResult.Yes Then
            CurrentAccount.Items.RemoveAt(pos2)
            ListView1.Items.RemoveAt(pos1)
            CurrentAccount.Save()
        End If
    End Sub



tu l'auras compris bien sûr, la première colonne masquée contient cet ID (et non la date)


mon soutien beh... pas de souci
++
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
OUHOU
Bon a y est j'ai pigé le truc ! en effet pas si dur et vachement puissant mine de rien (je suis incapable de comprendre ce qui se passe dasn cette fonction mais cela marche nickel ! )
Voici mon code :
Dans une classe :
Imports System
Imports System.Collections.Generic

Public Class CLS_trie_lignes
    Implements IComparer(Of CLS_lignes)

    Public Function CompareByDate(ByVal x As CLS_lignes, ByVal y As CLS_lignes) As Integer _
 Implements System.Collections.Generic.IComparer(Of CLS_lignes).Compare
        ' compare les dates et retourne un integer pour le manager de la fonction (transparent)
        If x.L_date > y.L_date Then
            Return -1
        ElseIf x.L_date = y.L_date Then
            Return 0
        Else
            Return 1
        End If
    End Function
End Class


puis dans ma classe général de compte :
    Public Sub trie()
        Dim MonTrie As New CLS_trie_lignes
        Me.lignes.Sort(MonTrie)
    End Sub


et enfin l'appel dasn mon code là ou j'en ai besoin :
        ' trie mon_compte avant 
        mon_compte.trie()


De la grosse balle, comme disent les zeuns
Bon allez spa tout ça, au boulot @dn ^^