IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Changement de la couleur d'une cellule dans une tabledatagridview selon sa valeur [Débutant]


Sujet :

VB.NET

  1. #41
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,
    Ces informations s'obtiennent dans les propriétés de la connexion, comme illustré ci-dessous.
    Mais le plus dur (et c'est là que parfois, on se dispute avec SQL Express ...), c'est sans doute de créer la connexion. Ci-joint, un petit manuel illustré ServeurDeDonnees.pdf.
    Bon travail,
    Nom : NomServeur1.jpg
Affichages : 299
Taille : 89,8 Ko

  2. #42
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2018
    Messages : 34
    Points : 1
    Points
    1
    Par défaut
    Pour moi c'est

    .\SQLEXPRESS

    Test de connection Ok

    Du coup l appli s'ouvre rapidement mais le data n affiche rien.

  3. #43
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Les joies de SQLExpress ...
    Ci-joints quelques explications qui, je l'espère, te permettront de dompter cet SGBD : ServeurDeDonnees2.pdf
    Moi, je ne suis toujours pas arrivé à le dompter, juste que parfois, avec beaucoup de patience et beaucoup de douceur, il veut bien faire quelques trucs ...
    Bonne chance.

  4. #44
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2018
    Messages : 34
    Points : 1
    Points
    1
    Par défaut
    Pour le coup, je n'ai plus rien qui fonctionne.
    Dans le gestionnaire sql, il est en échec et je ne peux pas redémarrer, il y a tout qui bug.
    Tu vois si toi qui est expérimenté, tu galères, alors moi je nage lol....
    C'est pour éviter toutes ces galères que j'ai créé la base avec l assistant.
    Bon je vais essayer un peu plus tard dans la journée.
    Merci.

  5. #45
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Courage ...
    Ci-joint, une page de conseils supplémentaires ServeurDeDonnees3.pdf.
    Peux-tu me transmettre par message de retour, les premières lignes de ton code, ainsi que ta procédure OuvreDB() ? (soit ta version des codes suivants)
    Entre-temps, je vais fouiller un peu Internet à la recherche d'une méthode plus "facile" de lier (par programmation) une DB SQLEpress à un programme VB.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Imports System.Data.SqlClient
    Public Class FTestDB
        Dim CR As Char = Char.ConvertFromUtf32(13)
     
        'Data Source=.\SQLEXPRESS;AttachDbFilename=D:\Tmp\TestAccesDBSQLExpress\DBStock_01.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True
     
        Friend NomDBComplet As String = "D:\Tmp\TestAccesDBSQLExpress\DBStock_01.mdf"
        Dim NomDuServeurSQL As String = ".\SQLEXPRESS"
    ' ...........................
        Private Sub OuvreDB()
            'ChaineConnexion = "Data Source=" & NomDuServeurSQL & "; Initial Catalog=" & NomDBComplet & ";Integrated Security=True;"
            ChaineConnexion = "Data Source=" & NomDuServeurSQL & ";AttachDbFilename=" & NomDBComplet & ";Integrated Security=True;Connect Timeout=30;User Instance=True"
            'ChaineConnexion = "Data Source=" & NomDuServeurSQL & "; AttachDbFilename=" & NomDBComplet & ";Integrated Security=True"
            MaConnexion = OuvreSQLConnexion(ChaineConnexion)
            ChargeDonnees()
            AfficheDonnees()
        End Sub
    Je ne trouve rien de très clair sur internet ...

    Mais vraiment, les 8 étapes de mon pdf de ce matin donnent de bons résultats. Je viens de les refaire plusieurs fois de suite, avec succès à chaque fois. J'ai "filmé" ma dernière expérimentation et je mets les films (CommentFaire1.mp4 et sa suite CommentFaire2.mp4) dans DropBox (ils sont un peu trop volumineux pour ce forum). Voici le lien : https://www.dropbox.com/sh/vkrepy2b0...x8M6yO4Ia?dl=0

    Bonne soirée cinéma

  6. #46
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2018
    Messages : 34
    Points : 1
    Points
    1
    Par défaut
    Salut,
    Bon en suivant tes vidéos , j'ai eu aucun mal a faire fonctionner la connexion.
    C’était de ma faute car je ne faisais pas les copier coller de la fin.

    Donc je te confirme que c'est bien compatible.

  7. #47
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bravo !!!
    Voici donc le dossier de développement de MonStock : MonStock.zip
    Tu devrais pouvoir le mettre en place sur ton ordi de la même façon que tu as installé mon projet TestAccesDBSQLExpress.
    Attention, avant de l'exécuter, tu dois refaire tout le processus de la vidéo pour que la DB DBStock_01.mdf soit opérationnelle.
    Tu pourras ensuite exécuter le programme.
    Sur sa page d'accueil, il y a le bouton "Encodage". Tu peux le cliquer de suite et tu auras la possibilité de désigner la DB et ensuite le tout est assez intuitif (je pense).
    Si tu as des difficultés d'utilisation, je te fournirai d'autres infos, une petite vidéo peut-être ...

    Et puis, je fournirai toutes les explications que tu voudras au sujet du code, si j'ai encore un peu de temps ce soir ou demain, je m'efforcerai de documenter un peu ce code (tous les programmeurs savent qu'il FAUT documenter son code, mais peu le font dans la foulée ...)

  8. #48
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2018
    Messages : 34
    Points : 1
    Points
    1
    Par défaut
    Il y avait une image avec le lien de ton d: du coup il y avait une erreur au lancement, j'ai commenté la zone image pour effacer le premier article . ça tourne !!!!

    Voilà une version code magnifique, t'as fait un travail superbe.
    Bravo.
    Je reste étonné que pour les images dans la table tu ais déclaré en text. Vu que je n'ai pas beaucoup de recul sur ce genre de code, Je pige pas là ???
    Je vais regarder ton appli de plus près.

  9. #49
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Le fichier DBStock_01.mdf se trouve dans le ZIP et il est donc dans le dossier de développement comme illustré ci-dessous. Tu as bien dû le trouver pour régler ta connexion et obtenir la chaine de connexion. N'oublie pas de modifier le nom du serveur dans les déclarations du form FGestionStock et la chaine de connexion dans la procédure OuvreDB(). Je me remettrai au "travail" après 20h.
    Nom : LaDB.jpg
Affichages : 195
Taille : 46,2 Ko

  10. #50
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Content que cela te plaise ...
    Mais je n'ai rien fait d'extra ordinaire, juste réactiver un peu du savoir endormi ...
    Je me suis beaucoup amusé à faire cela vendredi.

    Pour ce qui est des images sous forme de text, c'est que je n'enregistre que le chemin et le nom de l'image (laquelle doit bien entendu être présente aux environs de la DB, pour le confort de l'utilisateur). La DB est ainsi beaucoup moins lourde que lorsqu'on mémorise "tous les pixels" de l'image (dans une école, j'ai vu un DB Access passer de ± 10 Mo à 30 Mo le jour où ils ont trouvé bine d'y enregistrer les photos des étudiants).

    Je suis occupé à la documentation du code, me reste le plus dur : la procédure BTraitements_Click. Ce sera mon dernier job pour cette soirée.

    [Edit]
    Voici le code documenté de FGestionStock, tu peux remplacer celui que tu as déjà, par copier-coller.
    Comme je n'ai pas réalisé beaucoup de tests, je n'oserais pas garantir qu'il ne subsiste pas l'une ou l'autre petite horreur ..., mais bon, c'est de saison, bientôt Halloween

    Bon amusement,
    Bonne soirée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    Imports System.Data.Sql
    Imports System.Data.SqlClient
     
    Public Class FGestionStock
     
        Dim CR As Char = Char.ConvertFromUtf32(13) ' Juste pour l'esthétique des messages :D)))
     
        Friend NomDBComplet As String   ' Friend était une première option, finalement le NomComplet est lu à partor de ce form dans la TextBox de FBase
        Dim NomDuServeurSQL As String = "SCX_2018\SQLEXPRESS"  ' La variable est utilisée dans la chaine de connexion, procédure OuvreDB()
     
        Dim TemoinDBOuverte As Boolean = False ' si la DB est ouverte, il faut la fermer en partant. La sortie est un peu différentes, 
        ' cf. BRetourBase_Click et FGestionStock_FormClosing
     
        Dim TemoinNouvelId As Boolean = False ' Devient True quand un Id est créé (cela se produit lors de l'Ajout de données) et il redevient False
        ' quand l'Ajout n'est pas finalisé ou abandonné. A noter que l'Ajout des données nécessite de cliquer à 2 reprises sur BAjout, 
        ' une 1ère fois pour fournir un enregistrement vide à remplir, et une 2ème fois pour provoquer l'enregistrment physique ou l'abandon.
     
        Dim BalayageAutorise As Boolean = True ' Quand on entre dans la procédure de traitement des données, il doit être impossible
        ' d'encore balayer les enregistrements car BTraitements_Click traite l'enregistremnt en cours. Il faut donc finaliser l'opération commencée ou
        ' l'abandonner pour pouvoir consulter à nouveau.
     
        Dim MaConnexion As SqlConnection  ' ...
        Dim MaCommande As New SqlCommand   ' ...
        Dim ChaineConnexion As String   ' ...
     
        Dim MonStock As New DataSet  ' Le jeux d'enregistrements en mémoire. Il alimente les composants visuels d'affichage et subit instanément toutes 
        ' les modifications faites sur les textes de l'affichage. Cependant, ces modifs sont en mémoire et elles n'affectent pas la DB réelle.
        ' C'est pourquoi, l'algorithmique implémentée dans ce programme provoque l'action sur la DB réelle losqu'il le faut, c'est-à-dire par les procédures
        ' SauveAjout(Idx), SauveModif(Idx), SauveModif(Idx) pilotées par BTraitements_Click(). La consultation à partir du DataSet utilise le mode "Déconnecté"
        ' tandis que les modifs en temps réel utilise le mode "Connecté".
     
        Private Sub BRetourBase_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BRetourBase.Click
            FermeDB()  ' ...
            Me.Close()  ' ...
        End Sub
     
        Private Sub FGestionStock_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            FBase.Show()
            If TemoinDBOuverte Then     ' alors, il faut la fermer : BRetourBase_Click fait cela.
                BRetourBase_Click(Me, Nothing)
            End If
        End Sub
     
        Private Sub FGestionStock_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            OuvreDB() ' ...
        End Sub
     
        Private Sub FermeDB()
            TemoinDBOuverte = False ' puisqu'on la ferme ...
            ' 
            MaCommande.Dispose()    ' Chque instance intialisée avec l'opérateur New doit être fermée avec Dispose ou Close, 
            MaConnexion.Close()     ' ou les deux quand c'est possible. Le but des ces petites tâches est de permettre au 
            MaConnexion.Dispose()   ' système de libérer la mémoire occupée par ces objets. 
            MonStock.Dispose()
        End Sub
     
        Private Sub OuvreDB()
            NomDBComplet = FBase.TNomDB.Text 'Voici pourquoi la variable NomDBComplet pouvait être déclarée Private au lieu de Friend
            ' Le nom complet de la DB est directement lu dans le TextBox TNomDB du form FBase
     
            ' La fameuse chaine de connexion ...
            ' C'est grâce à elle, et moyennant la modification de quelques déclarations, qu'il est possible de transformer ce programme
            ' en une application SGDB_polyvalente : Access, SQL Serveur, MySql, Oracle, ... . 
     
            'ChaineConnexion = "Data Source=" & NomDuServeurSQL & "; Initial Catalog=" & NomDBComplet & ";Integrated Security=True;"
            ChaineConnexion = "Data Source=" & NomDuServeurSQL & "; AttachDbFilename=" & NomDBComplet & ";Integrated Security=True"
     
            MaConnexion = OuvreSQLConnexion(ChaineConnexion) ' Des codes, mêmes exploités une seule fois (dans ce programme) sont mis 
            ' sous procédure. 
            ' La principale raison est que dans une application un peu plus complexe, ils sont réutilisés plusieurs fois. Par ailleurs,
            ' l'isolation de ces codes permet de les ignorer (provisoirement) lorsqu'on élabore de nouvelles procédures et d'alléger leur code.
            ' OuvreDB() contient 6 lignes de codes, parfaitement compréhensibles. Si tous les codes des procédures appellées était reproduit
            ' ici, OuvreDB() contiendrait plus de 15 lignes de codes, bien moins lisibles.
     
            ChargeDonnees() ' ...
            AfficheDonnees() ' ...
     
            TemoinDBOuverte = True ' puisqu'elle est ouverte ...
        End Sub
     
        ' Avoir accès effectif aux données. Dans le mode connecté utilisé dans les mises à jour en temps réel, la connexion dit être ouverte,
        ' dans d'autres cas, il suffit qu'elle soit définie, un DataApter procéde lui-même ) l'ouverure effective.
        Private Function OuvreSQLConnexion(ByVal ChaineConnexionComplete As String, Optional ByVal Ouvrir As Boolean = True) As SQLConnection
            Dim UneConnexion As New SQLConnection
            UneConnexion.ConnectionString = ChaineConnexionComplete
            If Ouvrir Then UneConnexion.Open() ' Ouverture effective non nécessaire pour l'utilisation d'un DataAdapter
            Return UneConnexion
        End Function
     
        ' Utiliser la connexion pour lire les données de la DB selon la requête (SQL) passée par paramètre et renvoyer une DataTable pour le DataSet en mémoire
        Private Function CreeUneTable(ByRef UneConnexion As SQLConnection, ByVal Selection As String) As DataTable
            Dim UneTable As New DataTable
            Dim UneConnexionTmp As New SQLDataAdapter(Selection, UneConnexion)
            UneConnexionTmp.FillSchema(UneTable, SchemaType.Source)
            UneConnexionTmp.Fill(UneTable)
            Return UneTable
        End Function
     
        ' Notamment pour le mode connecté utilisé dans les mises à jour en temps réel, il faut obtenir l'objet "Command" approprié
        Private Function CreeSQLCommande(ByRef UneConnexion As SQLConnection, ByVal Commande As String) As SQLCommand
            Dim UneCommande As New SQLCommand
            UneCommande = UneConnexion.CreateCommand
            UneCommande.CommandType = CommandType.Text
            UneCommande.CommandText = Commande
            Return UneCommande
        End Function
     
        ' La connexion établie à l'ouveryure de la DB est utilisée pour rechercher les tables pour le DataSet en mémoire
        Private Sub ChargeDonnees()
            ' Chargement des tables dans le DataSet
            MonStock.Tables.Add(CreeUneTable(MaConnexion, "SELECT * FROM TProduit"))
     
            ' MonStock.Tables.Add(CreeUneTable(MaConnexion, "SELECT * FROM ..............."))
            ' .............
        End Sub
     
        ' La gestion des Id par le programmeur (plutôt qu'un AutoIncrement du SGBD) permet bien plus que ci-dessous
        ' Il est notamment possible de récupérer les trous laissés par les suppressions. Ici, on se contente de trouver
        ' le plus grand Id et de l'incrémenter pour obtenir le nouveau.
        Private Function CreeId() As Integer
            Dim NouvelId As Integer = 0
            If MonStock.Tables("TProduit").Rows.Count > 0 Then
                For Each R As DataRow In MonStock.Tables("TProduit").Rows
                    If R.RowState <> DataRowState.Deleted Then
                        If R.Item("Id") > NouvelId Then NouvelId = R.Item("Id")
                    End If
                Next
            End If
            Return NouvelId + 1
        End Function
     
        ' Il suffit ici de lier les composants visuels aux données qu'ils doivent afficher. La prgrammation "manuelle" de ces liaisons
        ' permet d'en rompre lorsque cela est souhaitable selon les nécessité du moment et de les reconstruire ensuite.
        ' Dans ce programme, AfficheDonnees définit les liaisons et LibereBindings() les rompt.
        Private Sub AfficheDonnees()
            ' Liaison du ListBox au DataSet par la propriété DataSource et désignation du champ à 
            ' présenter par la propriété DisplayMember.
            If MonStock.Tables("TProduit").Rows.Count < 1 Then      ' Pas la peine si pas d'enregistrement.
                Exit Sub
            End If
     
            ' Certains composants dispose d'un DataSource est ceux qui ne peuvent présenter qu'un seul champs d'nu enregistrement ont 
            ' un DataMember. C'est le cas d'une ListBox, alors on a :
            ' LaListBox.DataSource = MonStock.Tables("TProduit") ' par exemple
            ' LaListBox.DataMember = "Article" ' par exemple
     
            DGVStock.DataSource = MonStock.Tables("TProduit") ' Certains composants dispose d'un DataSource
     
            DGVStock.Columns("Id").ReadOnly = True              ' On ne touche pas manuellement aux Id
     
            ' Certains composants ne dispose pas de DataSource mais il possède une collection de Bindings dans laquelle
            ' on ajoute le nom de la propriété affectée, le DataSet qui produit les données, et le champ à affecter à la propriété
            ' Exemple : TArticle.DataBindings.Add("Text", MonStock.Tables("TProduit"), "Article")
            ' On affecte le champ "Aricle" des enregistrements de "TProduit" à la propriété "Text" de la Textbox "TArticle"
     
            TId.DataBindings.Add("Text", MonStock.Tables("TProduit"), "Id")  ' Certains composants ne dispose pas de DataSource
     
            TId.ReadOnly = True                                 ' On ne touche pas manuellement aux Id
            TArticle.DataBindings.Add("Text", MonStock.Tables("TProduit"), "Article")
            TType.DataBindings.Add("Text", MonStock.Tables("TProduit"), "Type")
            TReference.DataBindings.Add("Text", MonStock.Tables("TProduit"), "Reference")
            TImage.DataBindings.Add("Text", MonStock.Tables("TProduit"), "Image")
            TMiseAJour.DataBindings.Add("Text", MonStock.Tables("TProduit"), "MiseAJour")
            TQuantite.DataBindings.Add("Text", MonStock.Tables("TProduit"), "Stock")
     
            Coloriages()    ' Vu l'algorithmique employée, c'est le seul endroit où on appelle Coloriages()
     
        End Sub
     
        ' Le bloc de gestion des traitements. Une seule procédure événementielle répond à 3 source de Click : BAjouter,BModifier et BEffacer
        Private Sub BTraitements_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BAjouter.Click, BModifier.Click, BEffacer.Click
            Static Idx As Integer
            BalayageAutorise = False ' On est dans la gestion des traitements, on ne flâne pas ailleurs !
            Select Case sender.Name
                Case "BAjouter"
                    If TemoinNouvelId Then ' Il est False au 1er passage par ici
     
                        If MessageBox.Show("Confirmation de l'ajout de : " & CR & CR & TId.Text & ", " & _
                                           TArticle.Text & ", " & TType.Text & ", " & TReference.Text & ", " & _
                                           TImage.Text & ", " & TMiseAJour.Text & ", " & TQuantite.Text & " ?", _
                                           "Confirmation", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
                            SauveAjout(Idx) ' Si et seulement si on confirme ! Sinon, on ignore, c'est l'andondon de la tâche commencée
                            TemoinNouvelId = False
                        Else
                            MonStock.Tables("TProduit").Rows(MonStock.Tables("TProduit").Rows.Count - 1).Delete()
                            TemoinNouvelId = False
                            Exit Sub
                        End If
                    Else
                        LibereBindings()    ' Rompre les liaisons pour permettre les modifications manuelles des données
                        Idx = CreeId()  ' L'Id est créé au premier passage par ici 
                        TemoinNouvelId = True ' Puisque l'Id est créé ...
                        TId.Text = Idx ' Mettre à jour TId
                        TMiseAJour.Text = Now().ToShortDateString ' Mettre à jour TMiseAJour
                        MonStock.Tables("TProduit").Rows.Add(TId.Text, "", "", "", "", TMiseAJour.Text, 0) 'Ajouter une enregistrment vide dans le DatSet
                        AfficheDonnees() ' Refaire les liaisons des données aux composants visuels et l'enregistrement vide apparaît
                        With Me.BindingContext(MonStock.Tables("TProduit"))
                            .Position = .Count  ' Pousser le balayage des enregistrement sur ce dernier, l'enregistrement vide.
                        End With                ' Ceci provoque la mise à jour de tout l'affichage puisque tout les composant sont liés à la mêm source
                        TArticle.Select()       ' Le focus sur TArticle pour incityer l'utilsateur à commencer son encodage
                        Exit Sub                ' Et on sort par la porte dérobée pour ne surtout pas exécuter le Reset du DataSet
                    End If                      ' Ce Reset du DataSet sera exécuté après confimration de l'ajout
                Case "BModifier"
                    If TemoinNouvelId Then Exit Sub ' On est en Ajout, on achève ou on abandonne, et rien d'autres !
                    Idx = TId.Text ' C'est par l'Id qu'on désigne l'enregistrement à traiter par SQL en mode connecté
                    If MessageBox.Show("Confirmation de modification en : " & CR & CR & TId.Text & ", " & _
                                        TArticle.Text & ", " & TType.Text & ", " & TReference.Text & ", " & _
                                        TImage.Text & ", " & TMiseAJour.Text & ", " & TQuantite.Text & " ?", _
                                        "Confirmation", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
                        SauveModif(Idx) ' Si et seulement si on confirme ! Sinon, on ignore, c'est l'andondon de la tâche commencée
                    End If
                Case "BEffacer"
                    If TemoinNouvelId Then Exit Sub ' On est en Ajout, on achève ou on abandonne, et rien d'autres !
                    Idx = TId.Text ' C'est par l'Id qu'on désigne l'enregistrement à traiter par SQL en mode connecté
                    If MessageBox.Show("Confirmation de suppression de : " & CR & CR & TId.Text & ", " & _
                        TArticle.Text & " ?", "Confirmation", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
                        SauveSuppress(Idx) ' Si et seulement si on confirme ! Sinon, on ignore, c'est l'andondon de la tâche commencée
                    End If
            End Select
            BalayageAutorise = True ' Si on arrive ici, c'est qu'on a fini ou abondonné la tâche commencée, on peut donc de nouveau flâner
            LibereBindings()   ' Rompre les liaisons pour permettre le renouvellement des données
            MonStock.Reset()   ' Vider la DB en mémoire
            ChargeDonnees()    ' Remplir la DB en mémoire
            AfficheDonnees()   ' Refaire les liaisons des données aux composants visuels
        End Sub
     
        Private Sub LibereBindings()
            For Each C As Control In Me.Controls()  ' Balayage de tous les contrôles pour trouver
                Try                                 ' et rompre leurs liaisons dans un Try car
                    C.DataBindings.Clear()          ' tous, tels les boutons, n’en possèdent pas.
                Catch
                End Try
            Next
        End Sub
     
        Private Sub SauveSuppress(ByVal IdArticle As Integer) ' Mode connecté : exécution d'un ordre SQL
            Dim ConnexionTMP As SqlConnection = Nothing
            Dim MaCommande As SqlCommand = Nothing
            ConnexionTMP = OuvreSQLConnexion(ChaineConnexion, True)
            MaCommande = CreeSQLCommande(MaConnexion, "DELETE FROM TProduit" & " WHERE (Id = " & IdArticle.ToString & ")")
            ' Il peut y avoir rejet …
            Try
                If MaCommande.ExecuteNonQuery() < 1 Then
                    Throw New Exception("Identifiant non trouvé")
                End If
            Catch Ex As Exception
                MessageBox.Show(Ex.Message & CR & "Suppression refusée" & CR & "Tables en mémoire rechargées")
            Finally
                MonStock.AcceptChanges()
            End Try
            ConnexionTMP.Close()
        End Sub
     
        Private Sub SauveModif(ByVal IdArticle As Integer) ' Mode connecté : exécution d'un ordre SQL
            Dim ConnexionTMP As SqlConnection = Nothing
            Dim MaCommande As SqlCommand = Nothing
            Dim ChaineSQL As String
            ChaineSQL = "UPDATE TProduit SET Article = '" _
                & TArticle.Text & "', Type = '" & TType.Text & "', Reference = '" _
                & TReference.Text & "', Image = '" & TImage.Text & "', MiseAjour = '" & TMiseAJour.Text & "', Stock = '" _
                & TQuantite.Text & "' WHERE (Id = '" & IdArticle & "')"
            ConnexionTMP = OuvreSQLConnexion(ChaineConnexion, True)
            MaCommande = CreeSQLCommande(ConnexionTMP, ChaineSQL)
            ' Il peut y avoir rejet …
            Try
                If MaCommande.ExecuteNonQuery() < 1 Then
                    Throw New Exception("Identifiant non trouvé")
                End If
            Catch Ex As Exception
                MessageBox.Show(Ex.Message & CR & "Modification refusée" & CR & "Tables en mémoire rechargées")
            Finally
                MonStock.AcceptChanges()
            End Try
            ConnexionTMP.Close()
        End Sub
     
        Private Sub SauveAjout(ByVal IdArticle As Integer) ' Mode connecté : exécution d'un ordre SQL
            Dim ConnexionTMP As SqlConnection = Nothing
            Dim MaCommande As SqlCommand = Nothing
            Dim ChaineSQL As String
            ChaineSQL = "INSERT INTO TProduit (Id, Article, Type, Reference, Image, MiseAJour, Stock) " &
               "VALUES ('" & IdArticle & "', '" & TArticle.Text & "', '" & TType.Text & "', '" &
                    TReference.Text & "', '" & TImage.Text & "', '" & TMiseAJour.Text & "', '" & TQuantite.Text & "' )"
            ConnexionTMP = OuvreSQLConnexion(ChaineConnexion, True)
            MaCommande = CreeSQLCommande(ConnexionTMP, ChaineSQL)
            ' Il peut y avoir rejet …
            Try
                If MaCommande.ExecuteNonQuery() < 1 Then
                    Throw New Exception("Identifiant non admis")
                End If
            Catch Ex As Exception
                MessageBox.Show(Ex.Message & CR & "Ajout refusé" & CR & "Tables en mémoire rechargées")
            Finally
                MonStock.AcceptChanges()
            End Try
            ConnexionTMP.Close()
        End Sub
     
        ' Le bloc de gestion du balayge. Une seule procédure événementielle répond à 4 source de Click : BDernier, BPrecedent, BSuivant et BDernier
        Private Sub Deplacement_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BDernier.Click, BPrecedent.Click, BSuivant.Click, BPremier.Click
            ' Inutile de tenter un déplacement si le DataSet ne contient aucune table.
            If MonStock.Tables.Count > 0 And BalayageAutorise Then
                ' Le BindingContext appartient à un conteneur, le formulaire dans ce cas.
                With Me.BindingContext(MonStock.Tables("TProduit"))
                    ' Modification de sa propriété Position en fonction du bouton.
                    Select Case sender.Name
                        Case "BPremier"
                            .Position = 0
                        Case "BPrecedent"
                            If .Position = 0 Then
                                .Position = .Count - 1              ' Balayage circulaire
                            Else
                                .Position -= 1
                            End If
                        Case "BSuivant"
                            If .Position = .Count - 1 Then
                                .Position = 0                   ' Balayage circulaire
                            Else
                                .Position += 1
                            End If
                        Case "BDernier"
                            .Position = .Count - 1
                    End Select
                End With
            End If
        End Sub
     
        Private Sub BChargeImage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BChargeImage.Click
            Dim ChercheImage As New OpenFileDialog
            Dim Resultat As DialogResult        ' Valeur renvoyée par la méthode Showdialog
            ChercheImage.Title = "Désignez l'image à charger"
            ChercheImage.Filter = "Tous|*.*|JPEG|*.jpg|BMP|*.bmp|PNG|*.png"
            ChercheImage.CheckFileExists = False
            Resultat = ChercheImage.ShowDialog()
            If Resultat = Windows.Forms.DialogResult.OK Then ' OK est le gage d’une saisie plausible
                TImage.Text = ChercheImage.FileName
            End If
            ChercheImage.Dispose()
        End Sub
     
        ' Charger l'image appropriée à chaque enregistrement
        Private Sub TImage_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TImage.TextChanged
            If TImage.Text <> String.Empty Then
                PBImage.Image = System.Drawing.Image.FromFile(TImage.Text)
                PBImage.SizeMode = PictureBoxSizeMode.StretchImage
            Else
                PBImage.Image = Nothing
            End If
        End Sub
     
        Private Sub Coloriages()  ' La question initiale.............   :D)))   
            Dim CpteRouge As Integer = 0
            Dim Valeur As Integer
            Dim I As Integer
            Dim Colonne As Integer
            Dim Ligne As Integer
     
            If DGVStock.Rows.Count < 1 Then
                Exit Sub
            End If
     
            Colonne = DGVStock.Columns("Stock").Index
     
            For I = 0 To DGVStock.Rows.Count - 2
                Ligne = DGVStock.Rows(I).Index
                Valeur = DGVStock.Item(Colonne, Ligne).Value
     
                If Valeur < 5 Then  ' Test de la valeur de la cellule
                    CpteRouge += 1
                    If DGVStock.Item(Colonne, Ligne).Style.ForeColor <> Color.Red Then
                        DGVStock.Item(Colonne, Ligne).Style.ForeColor = Color.Red  ' Ici Texte en Rouge
                        DGVStock.Rows(Ligne).DefaultCellStyle.BackColor = Color.Yellow ' Couleur de fond en jaune pour toute la ligne
                        FBase.LAttention.BackColor = Color.Red  ' ' Couleur de fond en rouge
                    End If
                Else
                    If DGVStock.Item(Colonne, Ligne).Style.ForeColor = Color.Red Then
                        CpteRouge -= 1
                        DGVStock.Item(Colonne, Ligne).Style.ForeColor = Color.Black
                    End If
                    If CpteRouge = 0 Then
                        FBase.LAttention.BackColor = Color.White
                    End If
                End If
     
            Next
     
        End Sub
     
    End Class

  11. #51
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2018
    Messages : 34
    Points : 1
    Points
    1
    Par défaut
    du coup je me pose une question, ta façon de faire pour les images , on peut faire la même chose pour des fichier pdf ?
    Une remarque sur ta version , il y a bien le retour d’état couleur du stock sur ton form1 à la seul condition que tu ne fermes pas l'application.
    Lors de l'ouverture suivante tu perds le retour d’état du fait que la base de données n'est pas chargé.
    En tout cas superbe boulot.

  12. #52
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bien sûr que tu peux enregistrer ainsi n'importe quel nom complet de fichier et retrouver ensuite le fichier en question.
    Mais attention à ce qu'on veut en faire :
    • les images de ton programme sont affichées dans un composant fait pour cela, un PictureBox,
    • un fichier TXT peut-être affiché dans une ListBox ou mieux dans un RichTextBox,
    • un Word peut-aussi être affiché dans un RichTextBox,
    • mais que faire avec un pdf ?

    Pour ce qui est du Label colorié dès le démarrage du programme, il suffit de joindre un fichier de paramètre, MesParam.cfg par exemple. Ce fichier est alors constamment mis à jour (comme le Label) pendant l'exécution du programme et il est lu dès le lancement. Si j'ai du temps tout à l'heure ...

  13. #53
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2018
    Messages : 34
    Points : 1
    Points
    1
    Par défaut
    Salut,

    Pour les liens vers un format pdf , j'imagine bien un jour pouvoir rajouter une colonne dans le datagridview pour mémoriser le lien d'une notice ou une facture etc..... on peut rajouter un adobe-reader ou l'ouvrir avec le logiciel abode extérieur du programme. c'est juste pour avoir un lien direct du fichier sans aller le chercher dans un dossier. C'est pas a l'ordre du jour de toute manière.

    J'arrive pas a faire un choix entre ta version et la mienne, avec l'assistant c'est plus simple et ta version code c'est plus propre mais plus difficile a mettre en oeuvre pour moi.

    Ton mode de connexion serait le même si la base de données serait Access?
    Même mode opératoire?

  14. #54
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Voici les réponses à ton dernier message et le nécessaire pour implémenter le fichier de paramètres.

    Pour ce qui est du choix de l’algorithmique à utiliser, vu qu’en principe un programmeur veut avoir la plus grande maîtrise possible des outils qu’il exploite, tout ce qui est « Assistant » est à bannir.
    A noter que pour SQL, il sera fait usage de l’assistant de création de requêtes du gestionnaire de serveurs, mais les requêtes ainsi produites sont recopiées dans le code et adaptées en fonction des variables utilisées. Le programmeur garde ainsi la main sur le code choisi.
    Au sujet de l’assistant de création de requêtes du gestionnaire de serveur, voir le document DSN_ChaineConnexion.pdf ci-joint, il traite de cela et montre aussi comment régler un DSN (utile pour certaines migrations).

    Par ailleurs, l’algorithmique DB mise en œuvre par l’assistant est différente de celle que j’ai employée (à noter qu’il ne s’agit pas de MON algorithmique ). Je ne suis pas sûr d’arriver au même résultat dans le même temps en utilisant les DB et DataSet livrés « tout faits », ou presque, par VisualStudio (malgré une certaine expérience ).

    Enfin, l’algorithmique DB que j’ai employée permet la migration aisée d’un SGBD vers un autre. Le document (inédit) AutresSGBD.pdf ci-joint explique comment faire.

    Pour ce qui concerne le fichier de paramètres, il convient de remplacer tout le code de FBase.vb par celui-ci (un Copier-Coller est plus simple que de retaper les codes ajoutés) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    Imports System.IO
     
    Public Class FBase
     
        Friend TParam() As String
        Dim NomFichierParam As String = "MesParams.cfg"
     
        Private Sub FBase_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            If File.Exists(NomFichierParam) Then
                LitParam()
                LAttention.BackColor = Color.FromName(TParam(0))
            Else
                InitialiseTParam()
            End If
        End Sub
     
        Private Sub FBase_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
            EcritParam()
        End Sub
     
        ' On définit tous les paramètres d'exécution souhaités, chacun fera une ligne dans le fichier. 
        ' Au programmeur de connaître la signification de chaque paramètre.
        Private Sub InitialiseTParam()
            ReDim TParam(0)  ' Remplacer 0 selon le nombre de paramètres gérés.
            TParam(0) = Color.White.ToKnownColor.ToString  ' Couleur de fond pour LAttention 
            'TParam(1) = Color.ToKnownColor(...).ToString  ' Couleur de text pour LAttention
            'TParam(2) = Color.ToKnownColor(...).ToString  ' Couleur de text pour cellule DataGrid contenant stock insuffisant
            'TParam(3) = Color.ToKnownColor(...).ToString  ' Couleur de fond pour ligne DataGrid contenant stock insuffisant
            'TParam(4) = Color.ToKnownColor(...).ToString  ' ...
            'TParam(5) = N'importe quelle information qu'on peut souhaiter retrouver lors de la prochaine exécution ...
            'TParam(... ) = Cela peut être des dates, des numéros attribués, des valeurs "relativement" permanentes (ex. un Taux TVA) ...
        End Sub
     
        Friend Sub LitParam()
            Dim I As Integer = 0
            ReDim TParam(0)
            Dim FParam As New StreamReader(NomFichierParam)
            While FParam.Peek > -1
                TParam(I) = FParam.ReadLine()
                I += 1
                ReDim Preserve TParam(I)
            End While
            FParam.Close()
        End Sub
     
        Friend Sub EcritParam()
            Dim I As Integer
            Dim FParam As New StreamWriter(NomFichierParam)
            For I = 0 To TParam.Count - 1
                FParam.WriteLine(TParam(I))
            Next
            FParam.Close()
        End Sub
     
        Private Sub BGestStock_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BGestStock.Click
            If ChercheNomDB() Then
                FGestionStock.Show()
                Me.Hide()
            End If
        End Sub
     
        Private Function ChercheNomDB() As Boolean
            If File.Exists(TNomDB.Text) Then
                Return (True)
            End If
            Dim ChercheDB As New OpenFileDialog
            Dim Resultat As DialogResult        ' Valeur renvoyée par la méthode Showdialog
            ChercheDB.Title = "Désignez la base de données"
            ChercheDB.Filter = "Tous|*.*|SQL|*.mdf|Access|*.mdb"
            ChercheDB.CheckFileExists = False
            Resultat = ChercheDB.ShowDialog()
            If Resultat = Windows.Forms.DialogResult.OK Then ' OK est le gage d’une saisie
                TNomDB.Text = ChercheDB.FileName     ' correcte, sans annulation
                ChercheNomDB = True
            Else
                ChercheNomDB = False
            End If
            ChercheDB.Dispose()
        End Function
     
    End Class
    Ensuite, au bas de la procédure AfficheDonnees, il faut ajouter la ligne :
    FBase.EcritParam()

    Cette ligne doit être reproduite partout où on peut modifier un des paramètres. Ici, c’est dans Coloriage() que cela est fait pour la couleur de fond du Label LAttention et j'appelle .EcritParam() au retour de Coloriage().

    Et enfin, au bas de la procédure Coloriage(), il faut ajouter la ligne :
    FBase.TParam(0) = FBase.LAttention.BackColor.ToKnownColor.ToString

    Pour info, le fichier des paramètres est créé et géré dans le dossier par défaut de l’application lors de son démarrage, c’est-à-dire dans le dossier qui contient l’EXE, et c’est très bien ainsi puisqu’il doit être lu avant tout autre chose. En cours de développement, ce dossier est \bin\Debug, sous-dossier dans le projet.

    J’espère que cette application MonStock t’apportera beaucoup d’enseignement utile pour tes développements futurs …

  15. #55
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2018
    Messages : 34
    Points : 1
    Points
    1
    Par défaut MERCI
    Oui elles vont servir et j’espère à beaucoup d'autres débutants comme moi. Je vais essayer de suivre ton conseil et de développer comme toi en code sans l'assistant, je vais essayer en partant de ta base d évoluer cette application.
    je te tiens au courant si tu le veux bien.
    Un grand Merci pour tout ce que tu as fait, surtout le temps que tu m'as accordé.

  16. #56
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2018
    Messages : 34
    Points : 1
    Points
    1
    Par défaut
    Salut,

    Une question dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     Private Sub FermeDB()
            TemoinDBOuverte = False ' puisqu'on la ferme ...
            ' 
            MaCommande.Dispose()    ' Chque instance intialisée avec l'opérateur New doit être fermée avec Dispose ou Close, 
            MaConnexion.Close()     ' ou les deux quand c'est possible. Le but des ces petites tâches est de permettre au 
            MaConnexion.Dispose()   ' système de libérer la mémoire occupée par ces objets. 
            MonStock.Dispose()
        End Sub
    Maconnexion.close() puisque on ferme la connexion pourquoi vider derrière avec dispose?
    Je pensais que lorsqu'on exécuté un close on libéré tout.

    Merci.

  17. #57
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Un peu de lecture …

    Une classe (ce qui sera un objet une fois instanciée) bien construite doit avoir un constructeur et un destructeur, ainsi qu’idéalement, un opérateur d’affectation et un constructeur par recopie. Notre propos n’est pas ici d’étudier les bonnes manières de la POO, mais il faut savoir qu’en VB, le constructeur est invoqué par l’opérateur New. Donc, chaque fois qu’on instancie une classe avec New, on crée un objet en mémoire :
    Dim UneConnexion As New SqlConnection crée un objet de type (de classe) SqlConnection désigné dans notre code par une référence nommée UneConnexion.
    Cet objet, lorsqu’il ne sert plus, doit être détruit : UneConnexion.Dispose(), Dispose étant le destructeur.
    L’objet instancié reçoit un espace mémoire (dans le Tas) pour y stocker ses données. Il y a très probablement des variables internes dont il se sert pour son algorithmique. Ces variables continuent à occuper la mémoire, même si on n’utilise plus l’objet et ce, jusqu’à ce qu’on arrête le programme et que le système récupère la mémoire qui était allouée au programme. C’est pourquoi, si on instancie un objet de nombreuses fois, l’espace mémoire va s’encombrer inutilement de variables laissées par des objets pourtant abandonnés maintenant. Cela pourrait conduire à la saturation de la mémoire. Le rôle du destructeur est de faire en sorte que le système récupère la mémoire devenue inutile dès que possible.

    UneConnexion.Close() rend cette connexion réutilisable dans le programme par un nouvel Open() (pour exécuter une autre requête, par exemple).
    Dans la succession des Open – Close – Open – Close …, c’est toujours le même objet, avec ses mêmes variables en mémoire qui fonctionne, on n’encombre pas la mémoire. Mais on ne la libère pas non plus : il faut forcer le nettoyage de la mémoire par un Dispose avant de quitter le Form, d’autant que si on y revient, on refera un New et là, on occupe de la mémoire.

    Par ailleurs, dans le monde des fichiers, Close() force la vidange des buffers vers les mémoires de masse : si on ne fait pas de Close alors qu’un fichier est ouvert en écriture, on risque fort que les dernières données ne soient pas effectivement enregistrées.

    Ces considérations sur les Destructeurs et sur les fichiers me rappelle que dans l’application MonStock, dans le code de FBase, j’ai oublié de détruire l‘instance du fichier FParam :
    chaque ligne FParam.Close()
    doit être suivie d’une ligne FParam.Dispose()
    Et cela est très important ici car un New StreamWriter est exécuté chaque fois qu’on met à jour le fichier des paramètres.
    Cet oubli est une faute grave de ma part ! Imaginons qu’on laisse tourner le programme en permanence (parce qu’on l’utilise de nombreuse fois chaque jour) et qu’on arrête jamais l’ordinateur (pour qu’il soit disponible dès la première seconde), dans cette situation mon oubli devient la cause d’une multitude d’instances inutiles de StreamWriter. J’ignore combien de temps cela pourra durer …

    Merci d'avance de corriger FBase ...

    Bonne soirée,

  18. #58
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Voici l'extrait en question : ExtraitListView.pdf
    Bon amusement ...

  19. #59
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2018
    Messages : 34
    Points : 1
    Points
    1
    Par défaut
    salut,

    voici le bout de code qui me permet de récupérer mes lignes du datagridview pour les ajouter a un listview :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    Dim Id As String = DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(0).Value
    Dim Col As String = DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(1).Value
    Dim Etat As String =DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(4).Value
     
     
                ListView1.Items.Add(New ListViewItem(New String() {Id, Col, Etat}))
    voici le bout de code qui me permet de retirer les lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     For i As Integer = 0 To ListView1.Items.Count - 1
                        If ListView1.Items(i).Text = DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(0).Value Then
                            Dim lv As ListViewItem = ListView1.Items(i)
                            ListView1.Items.Remove(lv)
     
                            Exit For 
                        End If
                    Next

    Selon une valeur dans le datagridview j'ajoute ou je retire les lignes du listview sur une page d'accueil.

  20. #60
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bien, je vois que tu as le pied à l'étrier pour ce qui est du travail avec les ListView et DataGridView.
    Pour ce qui est des couleurs, il n'y a pas de quoi se torturer ...
    Voici une fonction que tu appelles quand tu as besoin de définir une couleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Private Function DonneCouleur() As Color
            Dim LesCouleurs As New ColorDialog()
            Dim UneCouleur As Color = Nothing
            Dim Resultat As DialogResult        ' Valeur renvoyée par la méthode Showdialog
            LesCouleurs.AllowFullOpen = True
            Resultat = LesCouleurs.ShowDialog()
            If Resultat = Windows.Forms.DialogResult.OK Then ' OK est le gage d’une saisie
                UneCouleur = LesCouleurs.Color     ' correcte, sans annulation
            End If
            LesCouleurs.Dispose()
            Return UneCouleur
        End Function
    Bon amusement ...


    Je viens d'en faire un test rapide en l'appelant dans le programme MonStock, là où tu mets en Rouge le Label du Form d'entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ' ...............
    If Valeur < 5 Then  ' Test de la valeur de la cellule
                    CpteRouge += 1
                    If DGVStock.Item(Colonne, Ligne).Style.ForeColor <> Color.Red Then
                        DGVStock.Item(Colonne, Ligne).Style.ForeColor = Color.Red  ' Ici Texte en Rouge
                        DGVStock.Rows(Ligne).DefaultCellStyle.BackColor = Color.Yellow ' Couleur de fond en jaune pour toute la ligne
                        FBase.LAttention.BackColor = DonneCouleur()             'Color.Red  ' ' Couleur de fond en rouge
                    End If
                Else
    ' ...............

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. [XL-2007] Copie d'image dans une cellule vers une cellule d'une autre feuille
    Par natsamfa dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 20/02/2017, 21h27
  2. Réponses: 2
    Dernier message: 29/07/2016, 16h49
  3. [Toutes versions] coller les données d'une plage d'une cellule dans une cellule d'une autre feuille[VBA]
    Par arthson dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/01/2012, 17h37
  4. [XL-2007] problème de codage en vba ("copie d'une partie d'une cellule dans une cellule vide")
    Par skipeemed dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/10/2010, 17h01
  5. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo