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 :

Comment retrouver un controle de type DataGridViewColumn dans un formulaire ? (sans savoir où il se trouve)


Sujet :

VB.NET

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut Comment retrouver un controle de type DataGridViewColumn dans un formulaire ? (sans savoir où il se trouve)
    Hello,

    Je me heurte à cette question depuis le début de cette semaine.

    Pour la problématique qui m'occupe, j'ai besoin de retrouvé une colonne dans un datagridview avec pour seul indice, le nom de ladite colonne.

    Si j'étais sûr que le datagridview était un enfant direct du formulaire, cela se ferait sans souci. Mais ce n'est pas le cas. Il peut être contenu dans un panel, dans une groupbox, etc. Avec éventuellement plusieurs niveau d'imbrication.

    Au départ, j'avais fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For Each dgv As DataGridView In frm.Controls.OfType(Of DataGridView)()
       Dim query = (From dgvc As DataGridViewColumn In dgv.Columns
                         Where dgvc.Name = t.Name
                         Select dgvc)
       For Each dgvc As DataGridViewColumn In query.ToList
          'do stuff here
       Next
    Next
    Mais évidemment, si le dgv est contenu dans autre chose, cela ne marche pas.

    Je cherche donc à généraliser la recherche du dgv à tout contenant...

    Une idée? Je suis ouvert à toute suggestion

    EDIT : Si jamais cela peut aider, je sais que le nom d'un DataGridView commencera toujours par "dgv". J'ai tenté d'exploiter cette info mais je n'ai pas trouvé comment...
    Kropernic

  2. #2
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Hello again,

    Tu peux boucler (avec une fonction récursive?) sur les enfants d'un contrôle, ainsi tu peux tout récupérer à partir d'une form :

    comme là :

    http://justsomevbcode.blogspot.fr/20...rols-from.html

    ou là :

    http://www.codeproject.com/Articles/...scontrolsplusf
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    J'ai pensé à la fonction récursive mais j'sais pas pourquoi, pas moyen d'arriver à l'écrire... Ce sera pour lundi ^^.
    Kropernic

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Cette fonction récursive retrouve un contrôle par son nom:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    internal static Control GetChildControl(Control parentcontrol,string controlname)
        // Check if the parent control contains a control which name is input name and return it
        {
          Control result = null;
          if ((Object)parentcontrol!=null) for (int i=0;result==null && i<parentcontrol.Controls.Count;i++)
          {
            if (controlname==parentcontrol.Controls[i].Name) result = parentcontrol.Controls[i];
            else result = GetChildControl(parentcontrol.Controls[i],controlname);
          }
          return result;
        }
    A appeler au départ avec parentcontrol égal à la form.
    Ce qui donne par exemple (en supposant que la fonction est appelée dans une procedure de la form) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataGridView dgv = GetChildControl(this,"dataGridView1");
    Test sur le ControlName à modifier eventuellement, par exemple avec une condition comme parentcontrol.Controls[i].Name is DataGridView.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Merci graffito pour la fonction toute faite .

    Je vais juste changer le fait qu'on cherche par le nom pour chercher par le type (car c'est ce qui m'intéresse dans le cas présent).

    Par contre, vu que plus aucun des traducteurs C# -> VB.NET que j'utilisais ne fonctionne encore, comment traduit-on cette déclaration de boucle For en VB.NET ? Je dois ajouter le test que tu fais dans la déclaration l'intérieur de la boucle ? *

    C'est intéressant de voir qu'apparemment en C#, une boucle For se déclare un peu comme un boucle While la variable d'incrémentation en plus. A ma connaissance, on ne peut pas mettre d'autre condition en plus dans la déclaration.

    * Vais faire comme cela pour le moment mais si c'est possible de le faire dans la déclaration de la boucle, pourquoi pas. J'aurai appris quelque chose.
    Kropernic

  6. #6
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut le résultat pour les autres
    Hello,

    Voici la fonctionne finale en VB.NET qui permet d'avoir comme une résultat une liste de tous les contrôles d'un certain type qui sont présent sur le formulaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Private Shared Function GetControlsOfType(parentControl As Control, searchedType As System.Type) As List(Of Control)
            Dim result As List(Of Control) = New List(Of Control)
            If parentControl IsNot Nothing Then
                For i As Integer = 0 To parentControl.Controls.Count - 1
                    If parentControl.Controls(i).GetType Is searchedType Then
                        result.Add(parentControl.Controls(i))
                    Else
                        result.AddRange(GetControlsOfType(parentControl.Controls(i), searchedType))
                    End If
                Next
            End If
            Return result
        End Function
    Maintenant, y a p-e moyen d'utiliser les génériques plutôt que System.Type mais bon, ça ne doit pas changer grand chose dans le cas présent je pense.
    Kropernic

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/09/2009, 15h54
  2. Réponses: 4
    Dernier message: 19/04/2007, 20h13
  3. Réponses: 4
    Dernier message: 29/08/2006, 14h52
  4. Réponses: 5
    Dernier message: 10/05/2006, 15h47

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