
No consigo obtener el formulario donde se encuentra un ToolStripDropDown
Publicado por Teodoro (1 intervención) el 17/08/2021 14:08:20
Hola a tod@s:
He creado una aplicación "Windows Forms (.NET Framework)" programada en c# que tiene múltiples formularios. En todos ellos he incluido una barra de herramientas ToolStrip. Los eventos click de todos los botones de todos los formularios llaman al mismo método, y necesito obtener el nombre del formulario desde el que se ha pulsado el botón correspondiente.
Cuando las opciones del ToolStrip son simples ToolStripButton, no tengo problemas para obtener el formulario de llamada, pero cuando la opción pulsada pertenece a un ToolStripDropDown, no consigo de ninguna forma obtener dicho formulario.
He creado un proyecto simple para reproducir la situación. Tiene un sólo formulario en el que se ha incluido un ToolStrip llamado "tstBarraHerramientas" y el código que incluyo a continuación.
He probado de 6 formas distintas (Intento 1, 2, ... 6 en el código), pero de ninguna de ellas consigo obtener el formulario de llamada. Por supuesto no puedo usar "this", ya que aunque en este proyecto de prueba está todo incluido dentro de la misma clase/fichero, en el proyecto definitivo, como ya he dicho antes, tengo múltiples formularios y una clase en un fichero independiente que controla el evento click de todos los botones y sólo dispongo del parámetro "sender" para obtener todos los controles que necesito.
Seguramente la solución sea fácil, pero ya he hecho mil pruebas y ninguna de ellas me funciona. Espero que alguien me pueda ayudarme. Muchas gracias de antemano.
He creado una aplicación "Windows Forms (.NET Framework)" programada en c# que tiene múltiples formularios. En todos ellos he incluido una barra de herramientas ToolStrip. Los eventos click de todos los botones de todos los formularios llaman al mismo método, y necesito obtener el nombre del formulario desde el que se ha pulsado el botón correspondiente.
Cuando las opciones del ToolStrip son simples ToolStripButton, no tengo problemas para obtener el formulario de llamada, pero cuando la opción pulsada pertenece a un ToolStripDropDown, no consigo de ninguna forma obtener dicho formulario.
He creado un proyecto simple para reproducir la situación. Tiene un sólo formulario en el que se ha incluido un ToolStrip llamado "tstBarraHerramientas" y el código que incluyo a continuación.
He probado de 6 formas distintas (Intento 1, 2, ... 6 en el código), pero de ninguna de ellas consigo obtener el formulario de llamada. Por supuesto no puedo usar "this", ya que aunque en este proyecto de prueba está todo incluido dentro de la misma clase/fichero, en el proyecto definitivo, como ya he dicho antes, tengo múltiples formularios y una clase en un fichero independiente que controla el evento click de todos los botones y sólo dispongo del parámetro "sender" para obtener todos los controles que necesito.
Seguramente la solución sea fácil, pero ya he hecho mil pruebas y ninguna de ellas me funciona. Espero que alguien me pueda ayudarme. Muchas gracias de antemano.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
using System;
using System.Windows.Forms;
namespace EjemploToolStripDropDown
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//*** Creamos el menú con 3 opciones y un submenú con 2 más
private void Form1_Load(object sender, EventArgs e)
{
//*** Nombre del formulario
this.Name = "frmFormularioEjemplo";
this.Text = "Formulario de ejemplo";
//*** Opción simple 1
ToolStripButton objBotón1 = new ToolStripButton();
objBotón1.Text = "Opción simple 1";
tstBarraHerramientas.Items.Add(objBotón1);
//*** Opción simple 2
ToolStripButton objBotón2 = new ToolStripButton();
objBotón2.Text = "Opción simple 2";
tstBarraHerramientas.Items.Add(objBotón2);
//*** Opción simple 3
ToolStripButton objBotón3 = new ToolStripButton();
objBotón3.Text = "Opción simple 3";
tstBarraHerramientas.Items.Add(objBotón3);
//*** Submenú con 2 opciones
ToolStripDropDownButton objSubmenú = new ToolStripDropDownButton();
ToolStripDropDown objOpcionesSubmenú = new ToolStripDropDown();
ToolStripButton objBotónWord = new ToolStripButton();
objBotónWord.Text = "Exportar a Word";
objOpcionesSubmenú.Items.Add(objBotónWord);
ToolStripButton objBotónExcel = new ToolStripButton();
objBotónExcel.Text = "Exportar a Excel";
objOpcionesSubmenú.Items.Add(objBotónExcel);
objSubmenú.DropDown = objOpcionesSubmenú;
objSubmenú.Text = "Submenú de exportaciones";
tstBarraHerramientas.Items.Add(objSubmenú);
//*** Eventos Click de todos los botones (todos llaman al mismo evento)
objBotón1.Click += eClicBotones;
objBotón2.Click += eClicBotones;
objBotón3.Click += eClicBotones;
objBotónWord.Click += eClicBotones;
objBotónExcel.Click += eClicBotones;
}
//*** Evento que controla los Click en los botones
//*** ... se usa para muchos formularios y en realidad se encuentra en una clase/fichero distinto,
//*** ... pero por simplicidad se ha incluido en este formulario
private void eClicBotones(object sender, EventArgs e)
{
//*** Declaración e inicialización de variables
ToolStripButton objbotón = (ToolStripButton)sender; // Botón pulsado
ToolStripDropDown objSubmenú; // Submenú ToolStripDropDown
ToolStripItem objOpción; // Opción del menú
ToolStrip tstBarra; // Barra de herramientas
Form frmFormulario; // Formulario actual
//*** Obtenemos la Barra de herramientas y su formulario
//*** ... Si es un ToolStripDropDown NO consigo obtener el formulario de ninguna forma
if (objbotón.IsOnDropDown)
{
//Intento 1
tstBarra = (ToolStrip)objbotón.Owner;
frmFormulario = (Form)tstBarra.Parent; //Devuelve null
//Intento 2
tstBarra = (ToolStrip)objbotón.Owner;
frmFormulario = (Form)tstBarra.FindForm(); //Devuelve null
//Intento 3
objSubmenú = (ToolStripDropDown)objbotón.Owner;
//tstBarra = (ToolStrip)objSubmenú.Owner; //La propiedad Owner no existe para ToolStripDropDown
//frmFormulario = (Form)tstBarra.Parent;
//Intento 4
objSubmenú = (ToolStripDropDown)objbotón.Owner;
tstBarra = (ToolStrip)objSubmenú.Parent; //Devuelve siempre null
//frmFormulario = (Form)tstBarra.Parent; //Daría error
//Intento 5
objSubmenú = (ToolStripDropDown)objbotón.Owner;
frmFormulario = (Form)objSubmenú.FindForm(); //Devuelve siempre null
//Intento 6
objSubmenú = (ToolStripDropDown)objbotón.Owner;
objOpción = (ToolStripItem)objSubmenú.OwnerItem; //Devuelve siempre null
//tstBarra = (ToolStrip)objOpción.Owner; //Daría error
//frmFormulario = (Form)tstBarra.Parent; //Daría error
}
//*** ... Si es un ToolStripButton normal funciona perfectamente
else
{
tstBarra = (ToolStrip)objbotón.Owner;
frmFormulario = (Form)tstBarra.Parent;
}
//*** Mostramos el nombre del formulario
if (frmFormulario == null)
MessageBox.Show("NO se ha encontrado el formulario");
else
MessageBox.Show(frmFormulario.Name);
}
}
}
Valora esta pregunta


0