Structure, collection ou classe pour regrouper les propriétés des colonnes d'un

Résolu
BasicZx81 Messages postés 140 Date d'inscription samedi 5 mars 2011 Statut Membre Dernière intervention 13 août 2013 - 31 janv. 2012 à 21:53
 Utilisateur anonyme - 4 févr. 2012 à 16:57
Bonsoir à tous,
J'ai beaucoup cherché sur le net et j'en appelle à vous pour m'aider à trouver mon bonheur. je cherche un moyen efficace pour regrouper dans une collection ou autre toutes les propriétés des colonnes d'un Datagridview. Plus précisément je cherche à construire de façon dynamique et par du code un datagridview. Ceci est indispensable pour plusieurs raison : la première concerne les droits que j'attribue à chaque utilisateurs concernant la visibilité de certaines colonnes et comme je peux changer d'utilisateur à loisirs il faut que mon Datagridview puisse se "reconstruire" ou adapter ses propriétés en conséquence à chaque changement d'utilisateur et cela sans quitter le programme, cela peut servir également pour stocker les préférences utilisateurs comme les largeurs de colonnes par exemple, la deuxième raison pour "automatiser" la construction du Datagridview plutôt que d'être obligé de construire chaque colonne une par une avec chacune ses spécificités en sachant que les colonnes peuvent être de plusieurs type : Textbox, checkbox et image. Le Datagridview est alimenté en partie depuis une table Access en ADO.NET et en partie par des valeurs calculées dans le programme (pour certaines colonnes).
Donc la difficulté pour moi est principalement de trouver un moyen de stocker toutes ces informations de colonnes et ainsi pourvoir accéder facilement à tel ou tel propriété à partir soit du nom de la colonne soit d'un index pour construire le datagridview et modifier ces propriétés facilement.
J’espère que ma requête n'est pas trop complexe pour que vous puissiez me répondre simplement et je me dit qu'avec un peu de chance vous utilisez déjà un système bien rodé pour répondre à ce type de problématique.
En tout cas je vous remercie d'avance et aussi pour m'avoir déjà aidé plusieurs fois sur le site.

Cordialement.

12 réponses

BasicZx81 Messages postés 140 Date d'inscription samedi 5 mars 2011 Statut Membre Dernière intervention 13 août 2013
4 févr. 2012 à 16:53
Oh la honte , j'ai trouvé :

DataGridView1.Columns("CATEGORIE").Visible = True


Cette fois je pense que c'est bon. En remerciant tous le monde pour vos contributions.
3
Utilisateur anonyme
1 févr. 2012 à 00:26
Salut,

Je commence par le début donc:
je cherche à construire de façon dynamique et par du code un datagridview

Dim NewDataGrid As New DataGrid
Controls.Add(NewDataGrid)



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
1 févr. 2012 à 00:40
Bonjour,

Pourquoi ne pas stocker les propriétés de ton Datagridview dans un fichier ini en fonction de chaque utilisateur ? Par exemple :

[Dupont]
visible=1,2,3
largeur=100,256,128
[Durant]
visible=2,3,5,6
largeur=64,96,72,154

Tu mets un TextBox dans lequel l'utilisateur inscrit son nom et en fonction du nom tu lis la section adéquate du fichier ini et tu fais un split sur les virgules (ou autres séparateurs) pour récupérer chaque paramètre.

Tu peux aussi utiliser, mais c'est moins souple (car pas reconfigurable sans éditer le code) un tableau avec une structure du genre :
Public Type PARAM
   nom() As String   ' ou Index() As Integer 
   visible() as boolean
   largeur() As Integer
End Type


Cheyenne
0
Utilisateur anonyme
1 févr. 2012 à 00:55
Salut cheyenne,
Oui, plusieurs méthodes sont possibles, mais de la façon que c'est expliqué (d'ailleurs je ne suis pas arrivé à la fin) avec plusieurs demandes à la fois

je me suis arrêté à la première question (la plus facile)

Est-ce que pour le demandeur "les propriétés des colonnes d'un Datagridview" c'est différent des propriétés du DataGridView "tout court"?
(j'attendais un peu plus d'explications)

je cherche un moyen efficace pour regrouper dans une collection ou autre toutes les propriétés des colonnes d'un Datagridview


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0

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

Posez votre question
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
1 févr. 2012 à 03:39
Salut,

Ton problème est vraiment le stockage ? Car comme il t'a été répondu précédemment plusieurs solutions possibles, fichier ini, xml, paramètres d'application, sérialisation binaires ou xml, base de données... tu n'as que l’embarras du choix.

Mais j'ai plutôt l'impression que ta question est mal formuler et que si je comprends bien tu cherches un moyen de faire ça en seulement 3 ou 4 lignes de code. Ton but est d'automatiser la tâche.

Malheureusement ça ne sera pas possible, car question de logique chaque utilisateur devra avoir un chargement et un enregistrement des préférences qui plus est, selon les droits les affichages des colonnes changent. Donc il te faudra coder à la main.

De toute façon si ton DataGridView est lié aux données celui-ci doit vidé puis reconstruit à chaque requêtes.
Don tes modifications interviendrons après le binding des données.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
BasicZx81 Messages postés 140 Date d'inscription samedi 5 mars 2011 Statut Membre Dernière intervention 13 août 2013
1 févr. 2012 à 07:31
Bonjour à tous,
Ma question est en effet un peu vaste. Pour répondre à active, ce sont bien les colonnes qui changent de propriétés, le Datagridview reste le même quelques que soit l'utilisateur connecté.
En faite ce que je souhaite faire c'est trouver un moyen de stocker par exemple pour chaque colonne (Name "Colonne1", Type "Image" type string ???, Visible = True ou false, Largeur = .....etc) et pouvoir appeler ces propriétés au démarrage de l'application pour construire le Datagridview ou reconfigurer les propriétés de chaque colonne sur changement d'utilisateur.
Donc si je détaille toutes les étapes :
1- Au démarrage de mon application l'utilisateur s'authentifie le nom d'utilisateur est donc connue.
2- A l'aide du nom d'utilisateur je vais lire dans une base access les droits qui lui sont attribués.
3- En fonction des droits qui lui sont attribués, je stocke les propriétés dans de chaque colonne dans des variables
4- je transmet ce jeux de données à une procédure qui se chargera de construire chaque colonne au démarrage de l'appli.
5- Si l'utilisateur change je recharge le jeux de données dans ces mêmes variable pour modifier les propriétés du datagridview déjà construit et je refait appel à ma procédure avec ce jeux de variable afin de modifier les propriétés de chaque colonne déjà construite.

Donc par exemple pour la colonne1 :
1- si je veux la construire : (il me faut le nom de la colonne, le type image ou textbox......etc), j'aimerais pouvoir accéder à ces propriétés de cette façon : Colonne1.Name, Colonne1.position (sa position dans le Datagridview) Colonne1.Type (pour savoir si c'est une colonne image ou textbox), colonne1.visible, colonne1.largeur...et ainsi de suite pour chaque colonne. (cela peut être aussi sous la forme : colonne(0).Name, le 0 étant soit un indexe quelconque ou utilisé pour représenter la position de la colonne dans le DataGridview.

Je ne sais pas si je doit utiliser un type structure ou des collections ou encore une classe pour faire ça. Quelle est le type de données à utiliser selon vous est comment l'utiliser.
j'espére que ma question n'est pas trop vaste mais c'est pour mieux expliquer ce que je souhaite faire. Si déjà je pouvais avoir une idée de la structure des données à utiliser pour faire ça m'aiderait beaucoup.
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
1 févr. 2012 à 11:51
Bonjour BasicZx81,

J'avais bien compris ce que tu voulais faire.
Le plus simple, c'est un fichier ini que tu construira à la main avec le NotePad, donc facilement modifiable.

Exemple avec 5 colonnes visibles.
Tu peux te passer du nombre en te référant au Ubound du tableau qui sera splitté sur la virgule.

[Dupont]
nombre=5
visible=0,4,8,9,12
nom=Toto,Tata,Tonton, Titi,Tutu
largeur=100,256,128,96,200
type=0,0,1,2,0

Tu as donc respectivement les n° de colonnes visibles, leurs noms, leurs largeurs et leurs types où 0=TextBox 1=CheckBox 2=Image

Il est ainsi très simple de récupérérer dans un tableau temporaire toutes ces valeurs et de les appliquer en faisant une boucle sur le nombre de colonnes.

Cheyenne
0
BasicZx81 Messages postés 140 Date d'inscription samedi 5 mars 2011 Statut Membre Dernière intervention 13 août 2013
1 févr. 2012 à 19:38
Bonsoir cheyenne,
merci pour ta contribution.
Je m’aperçois qu'il y a plusieurs questions dans une dans ma demande mais grâce à vous il m'ai venu quelques idées et s'en ai suivi quelques corrections de mon analyse dans la journée.
L'idée du fichier INI est bonne, je m'en sert d'ailleurs assez souvent mais je m'en servirait pour enregistrer les préférences de l'utilisateur du pc plutôt que pour enregistrer les préferences de tous les membres enregistrés dans ma base (c'est plus raisonnable...), en revanche il me faudra toujours adapter la visibilité de certaines colonnes selon la personne qui s'authentifie et qui utilise le programme .
Il faut que j'arrive à trouver une bonne architecture de mon programme, les bonnes procédures et les bonnes variables à utiliser dans tel ou tel situation, séparer la partie affichage de ma Form et la partie chargement des données utilisateurs donc tous ça ne va pas se faire en 5 minutes.
Je reviendrais certainement sur ce topic quand j'aurais bien avancer la dessus....en espérant que je ne fasse pas trop de noeuds au cerveaux d'ici là, parce que j'ai l'impression que c'est partie pour .
Un grand merci à vous tous.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
1 févr. 2012 à 20:28
Bonjour,
et moi je pense que feraient ici parfaitement l'affaire :
1) un bon fichier .res (ça, pour la traduction en fonction de l'utilisateur)
2) un bon dico (mais c'est là un autre aspect n'ayant rien à voir avec cette appli ).



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
BasicZx81 Messages postés 140 Date d'inscription samedi 5 mars 2011 Statut Membre Dernière intervention 13 août 2013
4 févr. 2012 à 16:19
Bonsoir à tous, comme vous pouvez le voir j'ai bien avancé, finalement je n'ai pas utilisé un type de donnée ou structure pour stocker toutes les caractéristiques des colonnes (du moins pas encore). Il y a surement des méthodes plus astucieuses mais cela fonctionne pas trop mal et surtout plus tard je pourrais adapter mon code facilement pour transmettre les paramétres soit à partir du base de données ou autres.

Il me reste juste un détail à régler : Dans ma procédure "ColonnesVisibles()" j'aimerais pouvoir modifier la visibilité de chaque colonnes et pour cela j'aimerais appeler chaque colonne à partir de son "Nom" comme dans l'exemple ci-dessous mais ça ne marche pas :
DataGridView1.Columns.IndexOf("CATEGORIE").visible =  true

Vous pouvez m'aider à faire fonctionner cette ligne ?


Public Sub LoadDataFormOnChangeSession() ' Cette procédure est appelé lors d'un changement de Session Utilisateur ou au moment du chargement du formulaire
            ' Construction des colonnes dont la position n'est pas imposé :
            Call BuildColonnes("TextBox", ChampsE_Taches.ID_TACHE, "N°", "N° de tache", 30, False, True, True, "Add")
            Call BuildColonnes("Image", "ICO_TYPE", "Type", "Icone type document", 30, False, True, True, "Add")
            Call BuildColonnes("Image", "ICO_STATUT", "Statut", "Icone de statut", 30, False, True, True, "Add")
            Call BuildColonnes("TextBox", "CATEGORIE", "Catégorie", "Catégorie", 60, False, True, True, "Add")
            Call BuildColonnes("TextBox", "SUJET", "SUJET", "Sujet", 300, False, False, True, "Add")
            Call BuildColonnes("CheckBox", "VALIDE_AT", "Validé par l'auteur", "Validé par l'auteur", 50, False, True, True, "Add")
            Call BuildColonnes("CheckBox", "VALIDE_CP", "Validé par le chef de projet", "Validé par le chef de projet", 50, False, True, True, "Add")
            Call BuildColonnes("CheckBox", "TERMINE", "Terminé", "Terminé", 50, False, True, True, "Add")

            ' Construction des colonnes dont la position est imposées :
            Call BuildColonnes("TextBox", "TYPE", "Type", "Type", 50, False, True, True, "Insert", PosColTypeTache)
            Call BuildColonnes("TextBox", "STATUT", "Statut", "Statut", 50, False, True, True, "Insert", PosColStateTache)
End Sub

Private Sub BuildColonnes(Type As String, Name As String, HeaderText As String, ToolTiptext As String, Width As Integer, Rezizable As Boolean, Read_Only As Boolean, Visible As Boolean, Mode As String, Optional Position As Integer  = 0)
        ' Construction et initialisation des colonnes du Datagridview :
        Dim i As Integer
        Select Case Type
            Case Is = "TextBox"
                Dim Col As New DataGridViewTextBoxColumn
                Col.DataPropertyName = Name
                Col.Name = Name
                Col.HeaderText = HeaderText
                Col.Width = Width
                Col.Resizable = Rezizable
                Col.ToolTipText = ToolTiptext
                Col.ReadOnly = Read_Only
                Col.Visible = Visible
                Select Case Mode
                    Case Is "Add" : i DataGridView1.Columns.Add(Col)
                    Case Is = "Insert" : DataGridView1.Columns.Insert(Position, Col)
                End Select
            Case Is = "CheckBox"
                Dim Col As New DataGridViewCheckBoxColumn
                Col.DataPropertyName = Name
                Col.Name = Name
                Col.HeaderText = HeaderText
                Col.Width = Width
                Col.Resizable = Rezizable
                Col.ToolTipText = ToolTiptext
                Col.ReadOnly = Read_Only
                Col.Visible = Visible
                Select Case Mode
                    Case Is "Add" : i DataGridView1.Columns.Add(Col)
                    Case Is = "Insert" : DataGridView1.Columns.Insert(Position, Col)
                End Select
            Case Is = "Image"
                Dim Col As New DataGridViewImageColumn
                Col.DefaultCellStyle.ForeColor = Color.Transparent
                Col.DefaultCellStyle.SelectionForeColor = Color.Transparent
                Col.DataPropertyName = Name
                Col.Name = Name
                Col.HeaderText = HeaderText
                Col.Width = Width
                Col.Resizable = Rezizable
                Col.ToolTipText = ToolTiptext
                Col.ReadOnly = Read_Only
                Col.Visible = Visible
                Select Case Mode
                    Case Is "Add" : i DataGridView1.Columns.Add(Col)
                    Case Is = "Insert" : DataGridView1.Columns.Insert(Position, Col)
                End Select
        End Select
    End Sub

    Private Sub ColonnesVisible() ' Cette procédure est appelé lors d'un changement de Session Utilisateur
        Dim Col As DataGridViewColumn
        Select Case MyUser.Privilège
            Case Is = Privilèges.Administrateur
                   DataGridView1.Columns.IndexOf("CATEGORIE").visible = true
                   DataGridView1.Columns.IndexOf("SUJET").visible = true
                   ......
            Case Is = Privilèges.Utilisateur
                   DataGridView1.Columns.IndexOf("CATEGORIE").visible = false
                   DataGridView1.Columns.IndexOf("SUJET").visible = false
                   ......
        End Select
    End Sub
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 févr. 2012 à 16:35
Bonjour,
La collection Columns attend un index mis entre parenthèses
exemple où n est un numérique entier :
DataGridView1.Columns(n).visible = false

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Utilisateur anonyme
4 févr. 2012 à 16:57
Salut,
T'es pas le seul Basic
Même moi je cherchais depuis 10 minutes dans ma tête pourquoi ça ne fonctionnerait pas...

En comme quoi, pourquoi faire compliqué quand on peux faire simple



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Rejoignez-nous