Obtener acceso al control padre desde control de usuario-C#
Cómo obtengo acceso a los controles padre de control de usuario en C# (winform). Estoy usando el siguiente código, pero no es aplicable en todos los controles de tipos, como ListBox.
Control[] Co = this.TopLevelControl.Controls.Find("label7", true);
Co[0].Text = "HelloText"
En realidad, tengo que agregar elementos en Listbox colocados en el 'Formulario' padre desde un control de usuario.
8 answers
Descripción
Puede obtener el control padre usando Control.Parent
.
Muestra
Así que si tienes un Control colocado en un formulario this.Parent
sería tu Formulario.
Dentro de su Control usted puede hacer
Form parentForm = (this.Parent as Form);
Más información
Actualización después de un comentario de Farid-ur-Rahman (Él estaba haciendo la pregunta)
Mi Control y un listbox (ListBox1) son lugares en un Formulario (Form1). Tengo que agregar elemento en un ListBox1 cuando el usuario presiona un botón colocado en mi Control.
Tienes dos formas posibles de hacerlo.
1. Usa "Control".Padre
Muestra
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");
}
O
2.
- poner una propiedad
public MyForm ParentForm { get; set; }
a suUserControl
- establezca la propiedad en su Formulario
- suponiendo que su
ListBox
se llamalistBox1
de lo contrario cambiar el nombre
Muestra
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");
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-11 16:23:41
Puede usar el control .Parent para obtener el padre del control o Control .FindForm para obtener el primer padre Form
el control está activado. Hay una diferencia entre los dos en términos de encontrar formas, por lo que uno puede ser más adecuado para usar que el otro.:
El valor de la propiedad Padre del control puede no ser el mismo que el Formulario devuelto por el método FindForm. Por ejemplo, si un control RadioButton es contenido dentro de un control GroupBox, y el GroupBox está en un Forma, el padre del control RadioButton es el GroupBox y el GroupBox el Padre de control es la Forma.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-11 14:10:08
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-11 14:10:23
Control tiene una propiedad llamada Parent, que le dará el control parent. http://msdn.microsoft.com/en-us/library/system.windows.forms.control.parent.aspx
Eg Control p = this.Parent;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-11 14:10:59
No es ideal, pero prueba esto...
Cambie la clase usercontrol a Component (En el editor de código), cree la solución y elimine todo el código con errores (Relacionados con usercontrols pero no disponibles en los componentes, por lo que el depurador se queja de ello)
Cambie el usercontrol de nuevo a la clase usercontrol...
Ahora reconoce el nombre y la propiedad principal, pero muestra el componente como no visual, ya que ya no se puede diseñar.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-18 22:28:05
Una forma genérica de obtener un padre de un control que he usado es:
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));
}
Necesita un poco de trabajo (por ejemplo, devolver null si no se encuentra o error) ... pero con suerte podría ayudar a alguien.
Uso:
var parent = currentControl.GetParentOfType<TypeWanted>();
Disfrute!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-23 14:14:40
((frmMain)this.Owner).MyListControl.Items.Add("abc");
Asegúrese de proporcionar el nivel de acceso que desea en las propiedades de modificadores que no sean Privadas para MyListControl
en frmMain
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-23 16:16:27
Si desea obtener cualquier padre por cualquier control hijo, puede usar este código, y cuando encuentres la UserControl / Formulario / Panel u otros a los que puedes llamar funnctions o establecer / obtener valores:
Control myControl= this;
while (myControl.Parent != null)
{
if (myControl.Parent!=null)
{
myControl = myControl.Parent;
if (myControl.Name== "MyCustomUserControl")
{
((MyCustomUserControl)myControl).lblTitle.Text = "FOUND IT";
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-03 14:46:15