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.

Author: CAbbott, 2012-01-11

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 su UserControl
  • establezca la propiedad en su Formulario
  • suponiendo que su ListBox se llama listBox1 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");

    }
}
 49
Author: dknaack,
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.

 9
Author: keyboardP,
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

Puede obtener el Padre de un control a través de

myControl.Parent

Véase MSDN: Control.Padre

 2
Author: chaosr,
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;

 2
Author: Sprintstar,
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.

 1
Author: Tery Aldon,
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!

 1
Author: Ruskin,
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

 0
Author: Asaf,
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";
        }
    }

}
 0
Author: daniele3004,
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