2010-06-01 52 views
7

Puede alguien por favor hágamelo saber por algún código cómo puedo llamar a una función se encuentra en la clase Form de otra clase?Llamar a una función en la clase Form de otra clase, C# .NET

Algunos código será de gran ayuda!

gracias

EDIT: Este es mi código actual

public partial class frmMain : Form 
{ 
    //*******Class Instances******* 
    ImageProcessing IP = new ImageProcessing(); 


    //******************** 
    public void StatusUpdate(string text) 
    { 
     tlsStatusLabel.Text = text; 
    }// 


    public frmMain() 
    { 
     InitializeComponent();    
    }// 
} 


class ImageProcessing 
{ 

    private void UpdateStatusLabel(frmMain form, string text) 
    { 
     form.StatusUpdate(text); 
    }// 

    private UpdateLabel() 
    { 
     UpdateStatusLabel(frmMain, "Converting to GreyScale"); 
    } 
} 

El problema que estoy teniendo es con frmMain.

+0

duplicado posible de [componente forma del acceso de otra clase] (http://stackoverflow.com/questions/6803970/access-form-component-from -otra clase) – Ash

Respuesta

10

Una manera rápida y sucia es crear una referencia de la MainForm en su archivo Program.cs como se indica anteriormente.

Como alternativa, puede crear una clase estática para manejar las llamadas de nuevo a su forma principal:

public delegate void AddStatusMessageDelegate (string strMessage); 

    public static class UpdateStatusBarMessage 
     { 

     public static Form mainwin; 

     public static event AddStatusMessageDelegate OnNewStatusMessage; 

     public static void ShowStatusMessage (string strMessage) 
      { 
      ThreadSafeStatusMessage (strMessage); 
      } 

     private static void ThreadSafeStatusMessage (string strMessage) 
      { 
      if (mainwin != null && mainwin.InvokeRequired) // we are in a different thread to the main window 
       mainwin.Invoke (new AddStatusMessageDelegate (ThreadSafeStatusMessage), new object [] { strMessage }); // call self from main thread 
      else 
       OnNewStatusMessage (strMessage); 
      } 

     } 

Poner lo anterior en su archivo MainForm.cs dentro del espacio de nombres, pero separado de su clase MainForm.
A continuación, coloque esta llamada de evento en su clase principal de MainForm.cs.

 void UpdateStatusBarMessage_OnNewStatusMessage (string strMessage) 
    { 
      m_txtMessage.Caption = strMessage; 
    } 

Luego, al inicializar MainForm.cs, agregue este identificador de evento a su formulario.

 UpdateStatusBarMessage.OnNewStatusMessage += UpdateStatusBarMessage_OnNewStatusMessage; 

En cualquier control de usuario o de forma asociada con la forma (MDI) que desea llamar, sólo nos lo siguiente ...

 UpdateStatusBarMessage.ShowStatusMessage ("Hello World!"); 

Debido a que es estática que se puede llamar desde cualquier parte tu programa

+0

gracias! He intentado su opción pero me aparece un error en "OnNewStatusMessage (strMessage);" diciendo que OnNewStatusMessage no está configurado para una instancia de un objeto – mouthpiec

+0

me olvidé de copiar parte de tu código! problema resuelto!;) – mouthpiec

+0

Solo quería decir TY TY TY TY TY TY TY TY jaja. Desde que aprendí cómo escribir mis propios controles, y usarlos, y no abarrotar mi formulario principal con código que no debería estar ahí, este hilo me ha ayudado de muchas maneras. Bravo! –

1

Usted tendrá que crear una nueva instancia de formulario y luego llamarlo utilizando la instancia. Si es estático, puede llamarlo llamando a Form1.Method().

Form1 form1 = new Form1(); 
form1.Method(); 

Le sugiero que mueva este método común a alguna otra clase.

Si se trata método común para ser utilizado en la interfaz de usuario a continuación, crear una clase de formulario base y derivar todas sus formas con esta clase de formulario base. Ahora mueva este método común a la forma base. A continuación, puede utilizar el método de cualquiera de los formularios derivados de él.

3

Es bastante fácil. O bien pasar una referencia a un formulario existente en la convocatoria, o crear una nueva instancia de su forma y luego llame a su método como cualquier otro:

public class MyForm : Form 
{ 
    public void DoSomething() 
    { 
     // Implementation 
    } 
} 

public class OtherClass 
{ 
    public void DoSomethingElse(MyForm form) 
    { 
     form.DoSomething(); 
    } 
} 

O que sea un método estático por lo que no tiene que crear una instancia (pero no podrá modificar las ventanas de formulario abierto).

ACTUALIZACIÓN

Parece que la clase ImageProcessing nunca se obtiene una referencia a la forma. Me gustaría cambiar el código levemente:

class ImageProcessing 
{ 
    private frmMain _form = null;  

    public ImageProcessing(frmMain form) 
    { 
     _form = form; 
    } 

    private UpdateStatusLabel(string text) 
    { 
     _form.StatusUpdate(text); 
    } 
} 

Y entonces un pequeño tweek en el Formulario de constructor:

ImageProcessing IP = new ImageProcessing(this); 
+0

gracias, pero ¿cómo llamaría a la función DoSomethingElse? Mi problema es qué escribir en la "forma"? Estoy tratando de insertar el nombre del formulario, pero me aparece un error que dice que el nombre del formulario es un tipo pero se usa como variable – mouthpiec

+0

@mouthpiec - Si publica algo de su código actual, podríamos darle una mejor idea de Qué necesitas hacer. –

+0

Publique su código, debe hacer algo incorrecto para obtener ese error de compilación. –

1

Si el método no está relacionado con la interfaz de usuario, una de su ejemplo Entiendo que no es , puede crear otra clase que contendrá este método y luego usarlo en su clase de Formulario y en cualquier otro lugar donde desee usarlo.

1

Puede hacerlo de una manera sencilla:

1- crear clase pública y definir variable estática pública como esto:

class Globals 
{ 
    public static Form1 form; 
} 

2- en función de la carga en la forma de escribir esta línea:

public partial class Form1 : Form 
{ 
    private void Form1_Load(object sender, EventArgs e) 
    { 
     Globals.form= this; 
    } 

    public void DoSomthing() 
    { 
     ............ 
    } 
} 

3- por último, en la clase personalizada puede llamar a todas las funciones públicas en el interior de la forma:

public class MyClass 
{ 
    public void Func1() 
    { 
     Globals.form.DoSomthing(); 
    } 
} 

espero que este código será útil para usted :)

Cuestiones relacionadas