C sharp - No consigo obtener el formulario donde se encuentra un ToolStripDropDown

 
Vista:
sin imagen de perfil

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.

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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder