7
votes

Parent un formulaire à un panneau

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> xxx pré>

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 commentaires

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".


5 Réponses :


3
votes

et afficher le formulaire à l'intérieur d'un panneau

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).


0 commentaires

3
votes

Vous feriez mieux de créer chaque panneau en tant que usercontrol . Ce sont comme des formulaires, mais sans les éléments de la fenêtre.


0 commentaires

1
votes

Ensemble frmshow.toplevel = false si vous souhaitez toujours utiliser un formulaire au lieu d'un usercontrol pour une raison quelconque.


0 commentaires

22
votes

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);
    }


2 commentaires

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.



1
votes
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);
}

1 commentaires

Bienvenue à Stackoverflow! Veuillez fournir une brève description sur le code ci-dessus pour améliorer la précision du poste :)