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.
Vous pouvez obtenir le contrôle parent en utilisant Control.Parent
.
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);
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
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.
public MyForm ParentForm { get; set; }
à votre UserControl
ListBox
s'appelle listBox1
sinon changer le nomMyForm
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");
}
}
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.
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!
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;
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.
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";
}
}
}
((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