Bouton indépendant d'un winform pour une génération dynamique de boutons [Résolu]

Signaler
Messages postés
17
Date d'inscription
lundi 15 mai 2006
Statut
Membre
Dernière intervention
6 décembre 2006
-
Messages postés
17
Date d'inscription
lundi 15 mai 2006
Statut
Membre
Dernière intervention
6 décembre 2006
-
Bonjour,

Je cherche à rendre indépendant un bouton d'un winform. Je sais manipuler les boutons lorqu'ils sont implémentés dans mon winform. Je sais aussi customiser mon bouton via une classe dérivée, mais j'aimerais pouvoir manipuler mon bouton via une classe sans passer par un winform (même si je souhaite quand même garder un winform pour un menu classique).

J'ai trouvé dans les sources du site un code qui me semble pas très compliquait à mettre en oeuvre (http://www.csharpfr.com/codes/AJOUT-DYNAMIQUE-CONTROL-VOLEE_30850.aspx)  et qui s'apparente à peu près à ce que je veux faire mais il est fait pour une picturebox et lorsque je l'adapte pour un bouton ça ne fonctionne pas. Mon problème vient de cette ligne :  Form1.ActiveForm.Controls.Add(this.cmdSchool).

Mon compilo veut que je lui déclare une instance de Form1 pour que ça passe. Pourtant avec la picturebox ce n'était pas le cas?!?
 J'ai une classe Bouton (elle remplace la classe star du code relatif au lien ci-dessus), une classe Form1 (pour mon formulaire), et une classe Main.

Le but de la manoeuvre quand j'aurais réussi à isoler le code de mon bouton c'est la création d'une méthode qui me permettra de générer des boutons dans lesquelles j'y mettrais des informations, en fonction d'une liste où chaque élément correspond à un bouton. Voilà où je veux me diriger.

Si vous avez une petite idée ou un conseil je suis preneur, je vous remercie d'avance

Ro
 

6 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
55
Je trouve que ton problème n'est pas clair.
Tu peux faire une méthode ailleurs que dans ton Form qui créer des boutons, par exemple (rapidement fait) :

public List CreateButtons(int nb)
{
    List btns = new List();
    for(int i=0; i<nb; i++)
   {
       Button btn = new Button();
       btn.Text = "...."
       btn.Size = .....
       // etc
      btns.Add(btn)
   }
    return btns;
}

Et quand tu dois ajouter les boutons, tu fais :
myForm.Controls.Add(CreateButtons(4));

<hr size="2" />VC# forever
Messages postés
17
Date d'inscription
lundi 15 mai 2006
Statut
Membre
Dernière intervention
6 décembre 2006

Re

Merci pour m'avoir donné une réponse si rapide.
J'ai essayer de créer une classe listButton qui me permet de créer par la suite mes boutons en leur injectant des infos venant d'une liste d'objet ou chaque objet a une chaine de caractère. Je n'ai réussi qu'à afficher un seul bouton.

Du coup j'ai essayé ta méthode et je suis arrivé au même résultat. J'ai dû mettre les appels de mes fonctions et de mes méthodes dans InitializeComponent() de mon Form et j'ai eu du mal avec le "myForm.Controls.Add(CreateButtons(4));".
En fait pour moi ça donne ça:
public

static List
<DynButton
> CreateButtons(listTerms lf
){

List
<DynButton
> btns
= new List
<DynButton
>();

int k
=1,l
= 1;

for (int i
=0; i
<lf
.Count
; i
++){

DynButton btn
= new DynButton (lf
[i
].name
, lf
[i
].weight
,1);

btn
.Text
= ""+lf
[i
].name
+" "+lf
[i
].weight
+"";

btn
.Font
= new System
.Drawing
.Font("Arial", 12F, ((System
.Drawing
.FontStyle
)((System
.Drawing
.FontStyle
.Bold
| System
.Drawing
.FontStyle
.Underline
))), System
.Drawing
.GraphicsUnit
.Point
, ((System
.Byte
)(0)));

btn
.Size
= new System
.Drawing
.Size(112, 64);

btn
.Location
= new System
.Drawing
.Point(4*k
, 60*l
);

btn
.Click
+ = new System
.EventHandler(btn
.cmdBase_Click
);

btns
.Add(btn
);

k
= +20;

l
=+5;}

return btns
;}

et dans le Form je construis mes boutons successifs par:
for

( int i
=0; i
<btns
.Count
; i
++){

this
.Controls
.Add(this
.btns
[i
]);}

Je me suis aperçu dans les deux cas de mon erreur (pourquoi j'avais un seul bouton). J'avais placé les indices me permettant de changer de position dans ma boucle for en début. Du coup, la position était toujours la même!! arg!!!

Enfin, maintenant c'est tout bon. Il faut que je trouve trouve une solution plus élégante pour positionner mes boutons; ce qui me paraissait pas très facile est fait. 

Merci beaucoup pour l'aide.
 
Ro
 
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
55
Salut,
Si ce que tu veux faire c'est créer un bouton dynamiquement, alors tu peux faire quelque chose comme ceci :

Bouton btn = new Bouton();
// Ensuite tu sets tout ce que tu veux
// Et tu l'ajoutes sur ta form
myForm.Controls.Add(btn);

<hr size="2" />VC# forever
Messages postés
17
Date d'inscription
lundi 15 mai 2006
Statut
Membre
Dernière intervention
6 décembre 2006

Le problème c'est que je suis obligé de mettre toutes les fonctionnalités de mon bouton dans le code du form et c'est ce qui me gène. En plus de cela je ne peux pas déclarer mon bouton comme ça, car en fonction de ma liste en entrée je peux avoir un bouton comme je peux en avoir plusieurs.

Je vais essayer tout bêtement de créer une liste d'objet via les générics comme ça elle sera extensible en fonction de mes données en entrée, qui contient des boutons et je vais voir comment je peux me dépatouiller avec ça. Ca devrait marcher.

Merci quand même pour la réponse très rapide.
Je suis toujours preneur si quelqu'un a une idée lumineuse pour mon sujet et encore merci d'avance

Ro 
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
55
Euh oui, mais pourquoi tu crées une classe DynButton? Si c'est juste pour créer des boutons dynamiquement, ça ne sert à rien, tu peux utiliser la class Button

<hr size="2" />VC# forever
Messages postés
17
Date d'inscription
lundi 15 mai 2006
Statut
Membre
Dernière intervention
6 décembre 2006

Ma classe DynButton hérite d'une classe ButtonGen qui définit un bouton avec un design particulier: mes boutons sont ovales, changent de couleur au passage de la souris, ont une certaine transparence etc... c'est pour cette raison que je n'utilise pas la classe de base Button directement.

En passant, j'ai fait une erreur grossière dans le code ci-dessus. Il faut remplacer k=+20 et l=+5 qui sont en fin de ma boucle for par k=k+20 et l=l+5; sinom ça n'affiche que 2 boutons. Normal vu que le k et l ne sont pas bien incrémentés si on les laisse tels que je les avais donnés.

Ro