web-dev-qa-db-fra.com

Accédez au contrôle parent à partir du contrôle utilisateur - C #

Comment puis-je accéder aux contrôles parents du contrôle utilisateur en C # (winform). J'utilise le code suivant mais il n'est pas applicable sur tous les types de contrôles tels que ListBox.

Control[] Co = this.TopLevelControl.Controls.Find("label7", true);
Co[0].Text = "HelloText"

En fait, je dois ajouter des éléments dans la zone de liste placée sur le "formulaire" parent à partir d'un contrôle utilisateur.

29
Farid-ur-Rahman

La description

Vous pouvez obtenir le contrôle parent en utilisant Control.Parent.

Échantillon

Donc, si vous avez un contrôle placé sur un formulaire this.Parent serait votre formulaire.

Dans votre contrôle, vous pouvez faire

Form parentForm = (this.Parent as Form);

Plus d'information

Mise à jour après un commentaire de Farid-ur-Rahman ( Il posait la question)

Mon contrôle et une zone de liste (listBox1) sont tous deux placés sur un formulaire (Form1). Je dois ajouter un élément dans une listBox1 lorsque l'utilisateur appuie sur un bouton placé dans mon contrôle.

Vous avez deux façons possibles de faire cela.

1. Utilisez `Control.Parent

Échantillon

MyUserControl

    private void button1_Click(object sender, EventArgs e)
    {
        if (this.Parent == null || this.Parent.GetType() != typeof(MyForm))
            return;

        ListBox listBox = (this.Parent as MyForm).Controls["listBox1"] as ListBox;
        listBox.Items.Add("Test");
    }

ou

2.

  • mettre une propriété public MyForm ParentForm { get; set; } à votre UserControl
  • définissez la propriété dans votre formulaire
  • en supposant que votre ListBox s'appelle listBox1 sinon changer le nom

Échantillon

MyForm

public partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        this.myUserControl1.ParentForm = this;
    }
}

MyUserControl

public partial class MyUserControl : UserControl
{
    public MyForm ParentForm { get; set; }

    public MyUserControl()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (ParentForm == null)
            return;

        ListBox listBox = (ParentForm.Controls["listBox1"] as ListBox);
        listBox.Items.Add("Test");

    }
}
52
dknaack

Vous pouvez utiliser Control.Parent pour obtenir le parent du contrôle ou Control.FindForm pour obtenir le premier parent Form le contrôle est activé. Il existe une différence entre les deux en termes de recherche de formulaires, l'un peut donc être plus adapté à l'utilisation que l'autre .:

La valeur de la propriété Parent du contrôle peut ne pas être identique au formulaire renvoyé par la méthode FindForm. Par exemple, si un contrôle RadioButton est contenu dans un contrôle GroupBox et que le GroupBox est sur un formulaire, le parent du contrôle RadioButton est le GroupBox et le parent du contrôle GroupBox est le formulaire.

10
keyboardP

Une façon générique d'obtenir un parent d'un contrôle que j'ai utilisé est:

public static T GetParentOfType<T>(this Control control)
{
    const int loopLimit = 100; // could have outside method
    var current = control;
    var i = 0;

    do
    {
        current = current.Parent;

        if (current == null) throw new Exception("Could not find parent of specified type");
        if (i++ > loopLimit) throw new Exception("Exceeded loop limit");

    } while (current.GetType() != typeof(T));

    return (T)Convert.ChangeType(current, typeof(T));
}

Cela nécessite un peu de travail (par exemple, retourner null s'il n'est pas trouvé ou une erreur) ... mais j'espère que cela pourrait aider quelqu'un.

Usage:

var parent = currentControl.GetParentOfType<TypeWanted>();

Prendre plaisir!

2
Ruskin

Vous pouvez obtenir le parent d'un contrôle via

myControl.Parent

Voir MSDN: Control.Parent

2
chaosr

Le contrôle a une propriété appelée Parent, qui donnera le contrôle parent. http://msdn.Microsoft.com/en-us/library/system.windows.forms.control.parent.aspx

par exemple Control p = this.Parent;

2
Sprintstar

Pas idéal, mais essayez ceci ...

Remplacez usercontrol par la classe Component (dans l'éditeur de code), générez la solution et supprimez tout le code contenant des erreurs (lié aux contrôles utilisateur mais non disponible dans les composants, le débogueur s'en plaint)

Remplacez usercontrol par la classe usercontrol ...

Maintenant, il reconnaît le nom et la propriété parent, mais affiche le composant comme non visuel car il n'est plus concevable.

1
Tery Aldon

Si vous souhaitez obtenir un parent par n'importe quel contrôle enfant, vous pouvez utiliser ce code, et lorsque vous trouvez UserControl/Form/Panel ou d'autres que vous pouvez appeler des fonctions ou set/get values:

Control myControl= this;
while (myControl.Parent != null)
{

    if (myControl.Parent!=null)
    {
        myControl = myControl.Parent;
        if  (myControl.Name== "MyCustomUserControl")
        {
            ((MyCustomUserControl)myControl).lblTitle.Text = "FOUND IT";
        }
    }

}
0
daniele3004
((frmMain)this.Owner).MyListControl.Items.Add("abc");

Assurez-vous de fournir le niveau d'accès souhaité dans les propriétés des modificateurs autres que Privé pour MyListControl dans frmMain

0
Asaf