J'ai une forme avec une arborescence d'une part d'un côté. Selon quel nœud est sélectionné, je souhaite afficher un contenu différent à droite. Pour conserver le code et les contrôles gérables, mon plan était d'isoler le contenu en formulaires séparés et d'afficher le formulaire à l'intérieur d'un panneau.
Dans mon événement après la vision de l'arborescence, j'ai essayé d'instantimer le formulaire, et je me présente le parent à un panneau, mais je reçois Une exception "La commande de haut niveau ne peut pas être ajoutée à un contrôle.": p> Ce n'est pas une configuration MDI, mais j'ai essayé de définir la propriété MDIParrent des formulaires sur le formulaire parent , puis définissant la propriété parente de la forme du formulaire au panneau, mais je reçois une exception "formulaire spécifié comme étant le MDIParent pour ce formulaire n'est pas un MDicontainer. Nom du paramètre: valeur": p> Form frmShow = new MyForm();
frmShow.MdiParent = this;
frmShow.Parent = this.pnlConfigure;
5 Réponses :
et afficher le formulaire à l'intérieur d'un panneau p> blockQuote>
Non, ne fais pas ça. Utilisez UserControls au lieu de formulaires. Créer / concevoir un UserControl fonctionne comme une forme et cela résoudra tous vos problèmes (ici). P>
Vous feriez mieux de créer chaque panneau en tant que usercontrol code>. Ce sont comme des formulaires, mais sans les éléments de la fenêtre. P>
Ensemble frmshow.toplevel = false code> si vous souhaitez toujours utiliser un formulaire au lieu d'un usercontrol pour une raison quelconque. P>
Juste pour l'enregistrement, c'est possible. Vous pouvez transformer un formulaire en une commande enfant en définissant sa propriété Toplevel sur False. Comme ceci:
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) {
switch (e.Node.Name) {
case "Node0": embedForm(new Form2()); break;
// etc..
}
}
private void embedForm(Form frm) {
// Remove any existing form
while (panel1.Controls.Count > 0) panel1.Controls[0].Dispose();
// Embed new one
frm.TopLevel = false;
frm.FormBorderStyle = FormBorderStyle.None;
frm.Dock = DockStyle.Fill;
frm.Visible = true;
panel1.Controls.Add(frm);
}
Merci d'avoir posté ceci - j'accepte que l'OP devrait utiliser UserControls plutôt que des formes, mais j'ai un cas complètement différent dans lequel j'ai besoin de mettre le parent d'une forme et que cette petite pépite est ce qui a sauvé la journée!
J'ai constaté que l'utilisation de cette technique signifie que votre commande de tabulation est gâchée. Vous avez l'onglet du parent à intégré, puis il ne part jamais. La solution consiste à utiliser un UserControl et l'ordre des onglets fonctionne correctement.
private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
ucAdmin ucA = new ucAdmin(); //ucAdmin is a user control u had created.
ucA.Visible = true;
ucA.Dock = DockStyle.Fill;
this.pnlMain.Controls.Clear(); // pnlMain is the location u are going to display this user control.
this.pnlMain.Controls.Add(ucA);
}
Bienvenue à Stackoverflow! Veuillez fournir une brève description sur le code ci-dessus pour améliorer la précision du poste :)
Changé pour utiliser UserControls à la place!
Ok, et cela a-t-il résolu les problèmes?
@Henk - Oui. Les contrôles des utilisateurs ont été la bonne façon d'aller, les formulaires ont été une approche MissGuided, j'aurais dû le voir de commencer.
@Jeremy Comment avez-vous ajouté le DockPanel dans un UserControl? J'essaie que et quand j'ajoute les formulaires à la DockPanel, je reçois cette erreur: "Formulaire parent invalide. Lors de l'utilisation de style de document DockingMDI ou SystemMDI, la commande DockPanel doit être la commande enfant du formulaire de conteneur MDI principal.". Et cela semble correct parce que nous ne pouvons pas définir d'UserControl en tant que MDicontainer. Pouvez-vous me donner un indice à ce sujet s'il vous plaît?
@Olarumircea J'ai la même exception et je me suis débarrassé de la propriété de DockPanel "DocumentStyle" à "DockingWindow".