Controle Utilisateur Problème SplitContainer

Résolu
scottmat Messages postés 438 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 23 janvier 2011 - 26 mars 2007 à 17:38
scottmat Messages postés 438 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 23 janvier 2011 - 30 mars 2007 à 11:32
Bonjours à tous et à toutes,



J'ai créé un contrôle utilisateur (MyControl) et souhaiterai ré-analyser tous les contrôles provenant de ce moule.



Pour cela ces 2 lignes de code :



foreach (MyControl  oControle in  this.Controls)



            {



                MessageBox.Show(oControle.Name);



            }



Mais j'ai un SplitContainer dans mon projet, enfin ma feuille et il m'affiche cette erreur :



Impossible d'effectuer un cast d'un objet de type 'System.Windows.Forms.SplitContainer' en type 'Projet1.Control'.



Comment puis-je contourner ce problème ? j'ai essayer de me passer du SlipContainer et il me produit la même erreur sur TOUS mes objets qui ne sont pas MyControl  (mon controle quoi)

Je travail la dessus depuis quelques jour maintenant, je précisse que je suis débutant en C# et en création d'objet en .NET

Merci par avance ;)

9 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
28 mars 2007 à 01:12
Si tu mets ton contrôle dans le SplitContainer c'est donc la liste des contrôles du SplitContainer qu'il faut parcourir..

foreach ( Control c in sc.Panel1.Controls ) // ou Panel2
{
   //   ...
}

Sinon pour parcourir les contrôles récursivement comme le propose Bidou c-à-d parcourir tous les contrôles mêmes ceux imbriqués dans d'autres contrôles tu as ma méthode FindControl

http://www.csharpfr.com/infomsg_WINFORM-CONTROLES-DYNAMIQUES_537180.aspx

ou

this.Control.ControlCollection.Find( key, searchAllChildren );

 
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
26 mars 2007 à 18:36
Salut,

foreach ( Control c in this.Control )
{
   // ou as
   if ( c is MyControl )
   {
         // ...
   }
}
0
scottmat Messages postés 438 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 23 janvier 2011 1
26 mars 2007 à 19:37
salut,
merci pour ta réponse
mais sa plante directement dans la boucle, donc le code entre les accolades n'a pas le temps de s'executer
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
27 mars 2007 à 12:38
Tu as remarqué que j'ai oublié un 's' à this.ControlS' dans le code précédent. :p

Même avec un SplitContainer et ton propre contrôle ça marche :

public partial class Form1 : Form
{
    private class MyControl : Control
    {


    }


    public Form1( )
    {
        InitializeComponent( );


        Button b1 = new Button( );
        b1.Text = "b1";
        b1.Name = "b1";


        Button b2 = new Button( );
        b2.Text = "b2";
        b2.Text = "b2";


        SplitContainer sc = new SplitContainer( );
        sc.Name = "sc";
        sc.Dock = DockStyle.Fill;
        sc.Panel1.BackColor = Color.Aquamarine;
        sc.Panel1.Controls.Add( b1 );
        sc.Panel2.BackColor = Color.Purple;
        sc.Panel2.Controls.Add( b2 );


        MyControl ctrl = new MyControl( );
        ctrl.Name = "ctrl";
        ctrl.Height = 50;
        ctrl.Dock = DockStyle.Bottom;
        ctrl.BackColor = Color.SkyBlue;


        this.Controls.AddRange( new Control[ ] { sc, ctrl } );


        foreach ( Control c in this.Controls )
        {
            if ( c is MyControl )
                MessageBox.Show( c.Name +  " - C'est mon contrôle !!! :D" );
        }
    }
}
0

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

Posez votre question
scottmat Messages postés 438 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 23 janvier 2011 1
27 mars 2007 à 15:20
Merci pour tes réponse,
je regarde ton code depuis tout à l'heure (excuse moi si je pose des questions bète) mais le code ne marche que pour un objet ?
C'est à dire j'ai modifier ton code pour tester et ai créer 2 (ou même 3) controles MyControl
Quand on arriver à la boucle il ne détecte que la dernière créer !
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
27 mars 2007 à 15:48
Non, tous les objects de type MyControl qui se trouve dans le Container (dans l'exemple de Lutinore, la form).
Ce code ne cherche pas à l'intérieur des sous-Controls !

<hr />
-Blog-
0
scottmat Messages postés 438 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 23 janvier 2011 1
27 mars 2007 à 16:43
alors j'ai bien regarder ! Mais éléments à 'détecter' sont sur un objet (un SplitContainer), c'est peut-être sa qui bloque !
J'ai modifier le code pour reproduire le système de mon application, ce qui donne le code suivant :



public



partial



class



Form1
:

Form



{







private



class



MyControl
:

Button

{


}







public
Form1(){

InitializeComponent();


MyControl
ctrl =

new



MyControl
();ctrl.Name =


"ctrl"
;ctrl.Height = 50;

ctrl.Dock =


DockStyle
.Bottom;ctrl.BackColor =


Color
.SkyBlue;


this
.splitContainer1.Panel2.Controls.AddRange(

new



Control
[] {ctrl});}


private



void
button1_Click(

object
sender,

EventArgs
e){


foreach
(

Control
c

in



this
.Controls){


if
(c

is



MyControl
)


MessageBox
.Show(c.Name +

" - C'est mon contrôle !!! :D"
);}

}

}



J'ai ajouter un button et un SlipContainer1
L'élément MyControl se créer bien dans le slipContainer mais n'est pas détecter
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
27 mars 2007 à 18:41
Oui c'est normal, tu dois prendre tous les Controls récursivement, car ils peuvent justement être contenu eux même dans un autre Control (c'est à dire pas directement sur le container principal (la form))

<hr />
-Blog-
0
scottmat Messages postés 438 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 23 janvier 2011 1
30 mars 2007 à 11:32
tout simplement parfait ! Merci à vous deux pour votre aide :)
0
Rejoignez-nous