Obtener un control de Windows Forms por nombre en C#

Resuelto asked hace 15 años • 14 respuestas

Tengo un ToolStripMenuItemllamado myMenu. ¿Cómo puedo acceder a esto así?

/* Normally, I would do: */
this.myMenu... etc.

/* But how do I access it like this: */
String name = myMenu;
this.name...

Esto se debe a que estoy generando ToolStripMenuItems dinámicamente a partir de un archivo XML y necesito hacer referencia a los MenuItems por sus nombres generados dinámicamente.

 avatar Oct 08 '09 16:10
Aceptado

Utilice el método Control.ControlCollection.Find .

Prueba esto:

this.Controls.Find()
Adriaan Stander avatar Oct 08 '2009 09:10 Adriaan Stander
string name = "the_name_you_know";

Control ctn = this.Controls[name];

ctn.Text = "Example...";
vaNIts avatar Oct 28 '2009 18:10 vaNIts

Suponiendo que tiene el menuStripobjeto y el menú tiene solo un nivel de profundidad, use:

ToolStripMenuItem item = menuStrip.Items
    .OfType<ToolStripMenuItem>()
    .SelectMany(it => it.DropDownItems.OfType<ToolStripMenuItem>())
    .SingleOrDefault(n => n.Name == "MyMenu");

Para niveles de menú más profundos, agregue más operadores SelectMany en la declaración.

Si desea buscar todos los elementos del menú en la franja, utilice

ToolStripMenuItem item = menuStrip.Items
    .Find("MyMenu",true)
    .OfType<ToolStripMenuItem>()
    .Single();

Sin embargo, asegúrese de que cada menú tenga un nombre diferente para evitar excepciones generadas por duplicados de claves.

Para evitar excepciones, puede usar FirstOrDefaulten lugar de SingleOrDefault/ Singleo simplemente devolver una secuencia si tiene Nameduplicados.

dmihailescu avatar May 11 '2011 16:05 dmihailescu