¿Sabes qué es la composición sobre herencia?
En el formulario donde tienes MasterReset
deberías hacer algo como esto:
Supongamos que en su segundo formulario tiene algo como esto, y supongamos que su "formulario principal" se llamará "MasterForm".
public partial class Form1 : Form
{
private MasterForm _masterForm;
public Form1(MasterForm masterForm )
{
InitializeComponent();
_masterForm = masterForm;
}
}
Aquí está el código en su clase masterForm:
private void button2_Click(object sender, EventArgs e)
{
Form1 form1 = new Form1(this);
}
Aquí está en su formulario1:
private void btn_MasterReset_Click(object sender, EventArgs e)
{
_masterForm.MasterReset();
}
¡Espero que esto ayude!
Esto funcionó para mí:en su clase de programa, declare una instancia estática de Main (la clase, es decir) llamada Form
. Luego, al comienzo del Main
método, use Form = new Main();
Así que ahora, al iniciar su aplicación, use Application.Run(Form);
public static Main Form;
static void Main() {
Form = new Main();
Application.Run(Form)
}
Ahora, llamar a una función desde otro formulario es simple.
Program.Form.MasterReset(); //Make sure MasterReset is a public void
Hay múltiples soluciones posibles. Pero el problema en sí surge del mal diseño. Si necesita que muchos accedan a algo, entonces ¿por qué debería pertenecer a alguien? Sin embargo, si desea informar algo sobre cualquier cosa, utilice eventos.
Tu error es que estás creando otra instancia de form1
, por lo tanto MasterReset
está operando con formulario, que ni siquiera se muestra.
Qué puedes hacer:
-
Haga (como sugiere Ravshanjon) una clase separada para manejar eso
MasterReset
(y tal vez algo más). Pero también añádele un evento.form1
yform2
pueden suscribirse y cada vez que cualquiera de ellos llame alMasterReset
- ambos reaccionarán . -
Cree una dependencia de formulario (como sugirió BRAHIM Kamel):cuando cree
form2
, luego páseleform1
instancia (como parámetro del constructor o configurando una propiedad pública), para poder llamar a métodos públicos no estáticos deform1
. -
Como un rápido, pero relativamente legítimo solución, haga este método
static
:
private static Form1 _instance;
public Form1()
{
InitializeComponents();
_instance = this;
}
public static void MasterReset()
{
// alot of code
_instance.listView1.Clear();
// alot of code
}
de esta manera puedes llamar a MasterReset
desde cualquier otra forma como esta Form1.MasterReset()
. La desventaja de este método es que no puede tener más de una instancia de form2
(que es más probable de todos modos).