Comment append un contrôle à un panneau sur un formulaire à partir d’un autre contrôle utilisateur

J’ai un form1.cs et sous cette forme j’ai un panel1, dans l’événement load du form1.cs j’ajoute un contrôle au panel1. Maintenant, mon problème est, j’ai un contrôle appelé Numbers.cs, je dois append un autre contrôle à ce panneau1 mais à partir de ce contrôle dans un événement de bouton. Comment puis-je faire ceci?

public partial class Number : UserControl { public Number() { InitializeComponent(); } private void btnAcceptWelcome_Click(object sender, EventArgs e) { //HERE I NEED TO PASS A CONTROL TO THE PANEL1 IN FORM1.CS //NOT SURE HOW TO DO THIS. } } 

PLUS D’INFORMATIONS

Donc, fondamentalement, j’ai un dossier appelé UserControls et dans ce dossier, j’ai

 Numbers.cs Letters.cs Welcome.cs 

Tous les contrôles utilisateur, alors j’ai un formulaire

 Form1.cs 

Form1.cs instancie Welcome et il est ajouté à un Panel1 sur Form1.cs lors du chargement du formulaire. Ensuite, Welcome.cs a un bouton, lorsque je clique sur ce bouton, je dois permuter vers Numbers.cs. Mais je ne sais pas comment faire cela à partir de Welcome.cs

Une autre façon serait d’utiliser un événement personnalisé déclenché par Numbers et géré par Form1 pour passer le contrôle et l’append à la collection de contrôles de votre Panel.


Ceci est un exemple d’événement personnalisé ajouté à UserControl1

Formulaire 1

 public partial class Form1 : Form { UserControl2 mySecondControl = new UserControl2(); public Form1() { InitializeComponent(); userControl11.AddControl+=new EventHandler(SwapControls); } private void SwapControls(object sender, EventArgs e) { panel1.Controls.Remove(userControl11); userControl11.AddControl -= new EventHandler(SwapControls); panel1.Controls.Add(mySecondControl); } } 

UserControl

 public partial class UserControl1 : UserControl { public event EventHandler AddControl; public UserControl1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { this.AddControl(this, new EventArgs()); } } 

Remarque:

  1. Code non testé
  2. En supposant que Form1 a (ou peut obtenir) une référence à Number

Ajouter un gestionnaire d’événement à Number :

 public partial class Number : UserControl { // event handler Form1 will subscribe to public EventHandler OnWelcomeAccepted = (o, e) => { }; public Number() { InitializeComponent(); } private void btnAcceptWelcome_Click(object sender, EventArgs e) { // raise the event OnWelcomeAccepted(sender, e); } } 

… Form1 aura un abonnement après InitializeComponent() ; notez l’abonnement supplémentaire à ControlAdded :

 public partial class Form1 : Form { public Form1() { InitializeComponent(); this.ControlAdded += Control_Added; // subscribe to the event and provide the implementation Number.OnWelcomAccepted += (o, e) => { Controls.Add(GetControl( )); } } private void Control_Added(object sender, System.Windows.Forms.ControlEventArgs e) { // process size and placement and show } } 

Aucun autre contrôle ne devrait append quelque chose directement à Form1 . Laissez Form1 contrôler ses enfants.

Une façon consiste à avoir une référence à panel1 dans les nombres car les deux sont créés dans form1, vous pouvez en passer un comme argument au constructeur de l’autre.

Ce n’est pas très clair dans votre description mais vous pouvez simplement passer le contrôle que vous voulez dans le constructeur ou dans une propriété. Puisque dans C # les objects sont toujours par référence, vous serez l’action sur le même contrôle dans l’événement Button. Vous pouvez toujours écrire votre propre événement et vous inscrire au panneau. Un échantillon de code plus complet serait génial.

Je suis toujours un peu incertain de ce que vous faites exactement, mais ça va. Je pense que l’approche la plus flexible consiste à créer votre propre événement personnalisé. En dehors de toute classe, créez un délégué:

 public delegate void WelcomeClick(object sender, EventArgs e); 

Dans Welcome, vous devez créer le gestionnaire d’événement, qu’il soit statique ou partiel:

 public event WelcomeClick OnClick; 

Dans l’événement Button Click à l’accueil, vous pouvez simplement appeler cet événement avec les mêmes parameters:

 if (OnClick != null) OnClick(sender, e);