2010-04-01 9 views
5

Totale n00b in C# e gli eventi anche se ho programmato per un po '.C#: serve una delle mie classi per attivare un evento in un'altra classe per aggiornare una casella di testo

Ho una classe contenente una casella di testo. Questa classe crea un'istanza di una classe di gestore di comunicazioni che riceve frame dalla porta seriale. Tutto questo funziona perfettamente.

Ogni volta che viene ricevuto un frame e vengono estratti i suoi dati, voglio che un metodo venga eseguito nella mia classe con la casella di testo per aggiungere i dati del frame alla casella di testo.

Così, senza pubblicazione di tutto il mio codice che ho la mia classe di form ...

public partial class Form1 : Form 
{ 
    CommManager comm; 

    public Form1() 
    { 
     InitializeComponent(); 
     comm = new CommManager(); 

    } 

    private void updateTextBox() 
    { 
     //get new values and update textbox 
    } 
    . 
    . 
    . 

e ho la mia classe CommManager

class CommManager 
{ 
    //here we manage the comms, recieve the data and parse the frame 
} 

SO ... in sostanza, quando mi parse che frame, ho bisogno del metodo updateTextBox dalla classe form per essere eseguito. Immagino che sia possibile con gli eventi, ma non riesco a farlo funzionare.

Ho provato ad aggiungere un gestore di eventi nella classe del form dopo aver creato l'istanza di CommManager come qui di seguito ...

comm = new CommManager(); 
comm.framePopulated += new EventHandler(updateTextBox); 

... ma io devo fare questo torto, come il compilatore non piace ...

Qualche idea ?!

+0

Che cosa è l'errore del compilatore? –

+0

Inoltre, è possibile pubblicare la proprietà/le funzioni di gestione degli eventi Comm manager per framePopulated –

+0

È possibile incollare la definizione delegata di "framePopulated"? –

risposta

10

Il codice dovrebbe essere simile:

public class CommManager() 
{ 
    delegate void FramePopulatedHandler(object sender, EventArgs e); 

    public event FramePopulatedHandler FramePopulated; 

    public void MethodThatPopulatesTheFrame() 
    { 
     FramePopulated(); 
    } 

    // The rest of your code here. 
} 

public partial class Form1 : Form  
{  
    CommManager comm;  

    public Form1()  
    {  
     InitializeComponent();  
     comm = new CommManager();  
     comm.FramePopulated += comm_FramePopulatedHander; 
    }  

    private void updateTextBox()  
    {  
     //get new values and update textbox  
    } 

    private void comm_FramePopulatedHandler(object sender, EventArgs e) 
    { 
     updateTextBox(); 
    } 
} 

Ed ecco un link per l'evento .NET Naming Linee guida citate nei commenti:

MSDN - Event Naming Guidelines

+0

Dalle linee guida per la denominazione degli eventi di MSDN: "Non utilizzare un prefisso o suffisso nella dichiarazione di eventi sul tipo. Ad esempio, utilizzare Chiudi anziché OnClose." –

+0

Ci scusiamo per un'altra domanda, ma ogni volta che popolo la mia cornice, faccio semplicemente una chiamata a FramePopulated per attivare l'evento? – Matt

+0

@Matt Sì. L'ho aggiunto al codice sopra. –

2

Here si dispone di "L'esempio di eventi C# più semplice immaginabile".

+0

Riesci a riscrivere? Non posso dire se stai cercando di collegarmi a qualcosa o cosa .... – Matt

+0

"Qui" è il link alla risorsa. – thelost

0

Sì - modificare la firma del updateTextBox a:

private void updateTextBox(object sender, Eventargs ea) 

Anche se questo potrebbe non essere il miglior design. Le cose sarebbero guardare un po 'più ordinato, se hai scritto un gestore di eventi corretta, e quindi chiamato updateTextBox da lì ...

1

    public partial class Form1: Form 
    { 
     CommManager comm; 

     public Form1() 
     { 
      InitializeComponent(); 
      comm = new CommManager(); 
      comm.OnFramePopulated += new EventHandler(updateTextBox); 
     } 

     private void updateTextBox(object sender, EventArgs ea) 
     { 
      //update Textbox 
     } 
    } 

    class CommManager 
    { 
     public EventHandler OnFramePopulated; 

     public void PopulateFrame() 
     { 
      OnFramePopulated(this, null); 
     } 
    } 
Problemi correlati