Modifier la deuxième colonne d'une listview.

Résolu
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012 - 21 sept. 2012 à 17:15
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012 - 23 sept. 2012 à 21:22
Bonjour,

Dans le but de simplifier un inventaire à l'aide d'un scanner de code barre, je créé un petit programme.

A chaque fois que je scanne un code barre, il m'ajoute la référence associé dans la listview, et dans la deuxieme colonne sa écris 1 (ce qui représente le nombre d'objet).

Quand je scanne un code qui est déjà dans la listview, sa ne rajoute pas la référence, je souhaiterai simplement modifier le 1 de la deuxieme colonne, en fesant colonne2 += 1 (en gros).

Mon problème est que je n'arrive pas à pointer vers cette colonne.

Quelqu'un pourrai t-il m'éclairer ?

Merci.

Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
        If e.KeyCode = Keys.Enter Then
            Dim mot_cherche = TextBox1.Text
            Dim fichier_lecture_1 = "BD.txt"
            Dim fso = CreateObject("Scripting.FileSystemObject")
            Dim fichier_lecture_2 = fso.opentextfile(fichier_lecture_1, 1, True)
            Do Until fichier_lecture_2.atendofstream
                Dim chaine = fichier_lecture_2.readline()
                If InStr(1, chaine, mot_cherche) > 0 Then
                    Dim d = ":" 'd=chaine début"
                    Dim Debut = InStr(1, chaine, d)  ' Position du <
                    Dim Fin = InStr(1, chaine, ".")   ' Position du <
                    chaine = Mid$(chaine, Debut + d.Length, Fin - Debut - d.Length)



                    Dim item1 As New ListViewItem(chaine.ToString, 0)
                    If ListView1.Items.Count > 0 Then
                        Dim foundItem As ListViewItem = ListView1.FindItemWithText(chaine.ToString, False, 0, True)

                        If Not (foundItem Is Nothing) Then
                            MessageBox.Show("existe")
                            'c'est ici que se ferai l'addition de la deuxieme colonne, du moins du détail de la deuxieme colonne.
                        Else
                            item1.SubItems.Add("1")
                            ListView1.Items.AddRange(New ListViewItem() {item1})
                        End If
                    Else
                        item1.SubItems.Add("1")
                        ListView1.Items.AddRange(New ListViewItem() {item1})
                    End If

                    ListView1.AutoResizeColumns(System.Windows.Forms.ColumnHeaderAutoResizeStyle.HeaderSize)
                    TextBox1.Text = ""
                End If
            Loop
            fichier_lecture_2.close()
            fichier_lecture_2 = Nothing
            fso = Nothing

        End If
    End Sub

22 réponses

KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
21 sept. 2012 à 18:41
Dim foundSubItem As ListViewSubItem = ListView1.FindItemWithText(chaine.ToString, False, 0, True).SubItems(1)
                            foundSubItem.Text += 1
3
Utilisateur anonyme
21 sept. 2012 à 21:00
Si 'chaine' représente une ligne du fichier, tu peux écrire :
Dim separateur As String() = {":", "."}
Dim resultat As String = chaine.Split(separateur, StringSplitOptions.RemoveEmptyEntries)(1)
3
Utilisateur anonyme
23 sept. 2012 à 20:43
Il y a ici un bout de code qui permet de passer en capslock.
3
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
21 sept. 2012 à 18:39
Ah ben c'est bon j'ai trouvé.
Merci
0

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

Posez votre question
Utilisateur anonyme
21 sept. 2012 à 18:41
Bonjour,

Je doute encore que tu aies activé Option Strict dans les propriétés de ton projet. Enfin bref...

1 / Toute cette partie là :
 Dim fichier_lecture_1 = "BD.txt"
            Dim fso = CreateObject("Scripting.FileSystemObject")
            Dim fichier_lecture_2 = fso.opentextfile(fichier_lecture_1, 1, True)
            Do Until fichier_lecture_2.atendofstream
                Dim chaine = fichier_lecture_2.readline()


Peut être remplacé avantageusement par :
Dim meslignes As String() = IO.File.ReadAllLines("BD.txt")
For Each chaine As String In meslignes
    'traitement de la ligne ici
Next


2 / Utilise chaine.IndexOf plutôt que Instr (obsolète)

3 / Et pour incrémenter, tu pourrais faire comme ceci par exemple :
founditem.SubItems(1).Text = (convert.ToInt32(founditem.Subitems(1).text,Integer) + 1).tostring
0
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
21 sept. 2012 à 18:45
Bonsoir banana

Je me douté que c'était la raison pour laquelle personne ne me répondais.
J'ai activé tout à l'heure les options que tu cite, et voyant toute ces erreurs je me suis apeuré (lol), comme je ne sais pas faire ce que je récupère, c'est pas facile à corriger..

Je vais essayer ce que tu m'as conseillé.

Merci
0
Utilisateur anonyme
21 sept. 2012 à 18:46
Les posts se sont croisés mais tu verras qu'en activant Option Strict, ta solution ne marchera pas. On pouvait incrémenter un string en vb6 (très permissif). On peut le faire encore en .NET apparemment mais mieux vaut prendre de bonnes habitudes.
0
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
21 sept. 2012 à 18:57
Okok,

 If InStr(1, chaine, mot_cherche) > 0 Then
                    Dim d = ":" 'd=chaine début"
                    'Dim Debut = InStr(1, chaine, d)  ' Position du :
                    'Dim Fin = InStr(1, chaine, ".")   ' Position du .
                    Dim Debut = chaine.ToString.IndexOf(d)
                    Dim Fin = chaine.ToString.LastIndexOf(".")
                    chaine = Mid$(chaine, Debut + d.Length, Fin - Debut - d.Length)


Cela me retourne tout sans retirer le texte que je n'ai pas besoin.
0
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
21 sept. 2012 à 18:58
Autant pour moi, j'avais déplacé une variable.
0
Utilisateur anonyme
21 sept. 2012 à 19:00
Je ne sais pas ce que contient ta chaîne en question. Il y a surement bien plus simple que tes 4 lignes de code pour extraire une malheureuse donnée.
0
Utilisateur anonyme
21 sept. 2012 à 19:02
Je voudrais pas casser ton moral mais Mid est aussi obsolète
0
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
21 sept. 2012 à 20:09
Lol

Mon fichier contient ce genre de chose :

1H00969700447:BB Miel & Moutarde.
1H00969700448:BB Champagne.
1H00969700449:BB Curry.
1H00969700446:BN Camembert.
1H00969700445:BN Ancienne.
1H00969700444:BN Speculos.
0
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
21 sept. 2012 à 21:08
Ah oui effectivement :) Merci banana c'est cool.
0
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
21 sept. 2012 à 21:20
Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
        If e.KeyCode = Keys.Enter Then
            Dim mot_cherche = TextBox1.Text
            Dim meslignes As String() = IO.File.ReadAllLines("BD.txt")
            For Each chaine As String In meslignes
                'traitement de la ligne ici
                If InStr(1, chaine, mot_cherche) > 0 Then
                    Dim separateur As String() = {":", "."}
                    Dim resultat As String = chaine.Split(separateur, StringSplitOptions.RemoveEmptyEntries)(1)
                    Dim item1 As New ListViewItem(resultat.ToString, 0)
                    If ListView1.Items.Count > 0 Then
                        Dim foundItem As ListViewItem = ListView1.FindItemWithText(resultat.ToString, False, 0, True)

                        If Not (foundItem Is Nothing) Then 'l'item existe
                            Dim foundSubItem As ListViewSubItem = ListView1.FindItemWithText(resultat.ToString, False, 0, True).SubItems(1)
                            foundSubItem.Text += 1
                            'c'est ici que se ferai l'addition de la deuxieme colonne, du moins du détail de la deuxieme colonne.
                        Else
                            item1.SubItems.Add("1")
                            ListView1.Items.AddRange(New ListViewItem() {item1})
                        End If
                    Else
                        item1.SubItems.Add("1")
                        ListView1.Items.AddRange(New ListViewItem() {item1})
                    End If
                End If
            Next
            ListView1.AutoResizeColumns(System.Windows.Forms.ColumnHeaderAutoResizeStyle.HeaderSize)
            TextBox1.Text = ""
        End If
    End Sub


Voila je l'ai adapté à ta sauce :p par contre il me reste un InStr.
Si je le met sur un pc sans vb ça fonctionne pas c'est ça ?
0
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
21 sept. 2012 à 21:23
J'ai des erreurs la dessus aussi du coup que j'ai activé les options

    Private Declare Function GetKeyState Lib _
"user32" (ByVal nVirtKey As Long) As Integer
    Dim WshShell As Object
    Dim compteur As String
    Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
        TextBox1.Focus()
        If My.Computer.Keyboard.CapsLock = False Then
            WshShell = CreateObject("WScript.Shell")
            WshShell.SendKeys("{CAPSLOCK}")
        End If
    End Sub

    Private Sub Form1_Deactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Deactivate
        If My.Computer.Keyboard.CapsLock = True Then
            WshShell = CreateObject("WScript.Shell")
            WshShell.SendKeys("{CAPSLOCK}")
        End If
    End Sub
0
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
21 sept. 2012 à 21:26
    Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
        TextBox1.Focus()
        If My.Computer.Keyboard.CapsLock = False Then
            My.Computer.Keyboard.SendKeys("{CAPSLOCK}")
        End If
    End Sub

    Private Sub Form1_Deactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Deactivate
        If My.Computer.Keyboard.CapsLock = True Then
            My.Computer.Keyboard.SendKeys("{CAPSLOCK}")
        End If
    End Sub
0
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
21 sept. 2012 à 21:30
Ca fonctionne pas à tout les coups bizarre.
0
Utilisateur anonyme
22 sept. 2012 à 13:37
J'ai des erreurs la dessus aussi du coup que j'ai activé les options
Nous sortons ici largement du sujet
0
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
22 sept. 2012 à 15:02
Yep c'est juste que je dois activer les majuscule quand le programme a le focus, sinon il n'envoi pas les chiffres mais les caractère qui y sont associé.
0
Utilisateur anonyme
22 sept. 2012 à 16:42
Pourquoi n'utilises-tu pas simplement la propriété CharacterCasing du textbox ?
textbox1.charactercasing = charactercasing.upper
0
Rejoignez-nous