2010-06-01 14 views
7

Qualcuno può, per favore, farmi sapere da qualche codice come posso chiamare una funzione situata nella classe Form da un'altra classe?Chiamata di una funzione nella classe Form da un'altra classe, C# .NET

Alcuni codici saranno di grande aiuto!

grazie

EDIT: Questo è il mio codice corrente

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"); 
    } 
} 

il problema che sto avendo è con frmMain.

+0

Eventuali duplicati di [componente maschera di Access da un'altra classe] (http://stackoverflow.com/questions/6803970/access-form-component-from -un'altra classe) – Ash

risposta

10

Un modo rapido e sporco consiste nel creare un riferimento del MainForm nel file Program.cs come elencato sopra.

In alternativa è possibile creare una classe statica per gestire le chiamate di nuovo al vostro form principale:

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); 
      } 

     } 

Mettere il sopra in vostro file MainForm.cs all'interno dello spazio dei nomi, ma separata dalla classe MainForm.
Quindi metti questa chiamata all'evento nella tua classe principale MainForm.cs.

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

Quindi, quando si inizializza MainForm.cs, aggiungere questo handle di eventi al modulo.

 UpdateStatusBarMessage.OnNewStatusMessage += UpdateStatusBarMessage_OnNewStatusMessage; 

In ogni UserControl o forma associata con la forma (MDI) che si desidera chiamare, solo noi il seguente ...

 UpdateStatusBarMessage.ShowStatusMessage ("Hello World!"); 

Perché è statica può essere chiamato da qualsiasi punto il tuo programma

+0

grazie! Ho provato la tua opzione, ma sto ricevendo un errore in "OnNewStatusMessage (strMessage);" dicendo che OnNewStatusMessage non è impostato su un'istanza di un oggetto – mouthpiec

+0

ho dimenticato di copiare parte del tuo codice! problema risolto!;) – mouthpiec

+0

Volevo solo dire TY TY TY TY TY TY TY lol Da quando ho imparato come scrivere i miei controlli, e li uso, e non ingombrare il mio modulo principale con il codice che non dovrebbe essere lì, questa discussione mi ha aiutato moltissimo in tanti modi bravi! Bravo! –

1

Sarà necessario creare una nuova istanza di modulo e quindi chiamarla utilizzando l'istanza. Se è statico, puoi chiamarlo semplicemente chiamando Form1.Method().

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

Suggerirei di spostare questo metodo comune in un'altra classe.

Se è un metodo comune da utilizzare nell'interfaccia utente, creare una classe Form di base e derivare tutti i moduli con questa classe di modulo di base. Ora sposta questo metodo comune nel modulo base. È quindi possibile utilizzare il metodo da qualsiasi modulo derivato da esso.

3

È abbastanza facile. O passare un riferimento ad una forma esistente nella chiamata, o di creare una nuova istanza del modulo e quindi chiamare il metodo come qualsiasi altro:

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

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

o renderlo un metodo statico in modo da non dover crea un'istanza (ma non sarà in grado di modificare le finestre dei moduli aperti).

UPDATE

Sembra che la classe ImageProcessing mai ottiene un riferimento al form. Vorrei cambiare il codice di un po ':

class ImageProcessing 
{ 
    private frmMain _form = null;  

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

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

E poi una piccola tweek nel costruttore Forma:

ImageProcessing IP = new ImageProcessing(this); 
+0

grazie, ma come chiamerei la funzione DoSomethingElse? Il mio problema è cosa scrivere nella "forma"? Sto cercando di inserire il nome del modulo ma sto ricevendo un errore che il nome del modulo è un tipo ma usato come variabile – mouthpiec

+0

@mouthpiec - Se pubblichi parte del tuo codice esistente, potremmo essere in grado di darti un'idea migliore cosa devi fare. –

+0

Inserisci il tuo codice, devi fare qualcosa di molto sbagliato per ottenere l'errore del compilatore. –

1

Se il metodo non è legato al l'interfaccia utente, una dal vostro esempio ho capito che non è , puoi creare un'altra classe che conterrà questo metodo e quindi usarla nella classe Form e in qualsiasi altra posizione in cui desideri utilizzarla.

1

Si può fare in modo semplice:

1- creare classe pubblica e definire variabile statica pubblico come questo:

class Globals 
{ 
    public static Form1 form; 
} 

2- in funzione di carico a forma scrivere questa linea:

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

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

3- infine, nella classe personalizzata è possibile richiamare tutte le funzioni pubbliche all'interno del modulo:

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

Spero che questo codice sarà utile a voi :)

Problemi correlati