2010-12-07 4 views
2

Je voudrais savoir comment communiquer entre les formulaires en utilisant C#?Communication entre les formulaires

Dans Visual Basic, il était plus facile puisque chaque forme avait sa propre instance, avec C#, il est différent.

Dans la configuration de classe I Program une variable publique et statique qui détiennent ma forme:

public static FormProcess2 frmProcess2 = null; 

Puis, dans la méthode Main je crée la forme et le montrer jusqu'à:

frmProcess2 = new FormProcess2(); 
frmProcess2.ShowDialog(); 

Maintenant, quand ce formulaire se charge, il charge un processus d'arrière-plan qui traite les fichiers XML. Et la méthode qui traitent tous les fichiers sont dans un autre nom de classe XMLParser. Ainsi, dans le BackgroundWorkerdoWork je charge cette méthode par:

XMLParser.Start(); 

Maintenant, la question est, comment je peux modifier les frmProcess2 contrôles dans la classe XMLParser? Je voulais qu'il montre ce qui est en train d'être mis à jour en changeant le texte de l'étiquette et en y mettant une belle barre de progression.

Mais je ne peux pas accéder aux Program.frmProcess2 contrôles, tout ce que je peux accéder est c'est seulement par défaut ...

Répondre

3

bien vous pouvez utiliser des délégués à la communication entre les formes de fenêtres. Vérifier http://www.c-sharpcorner.com/uploadfile/mosessaur/winformsdelegates09042006094826am/winformsdelegates.aspx

Pour les délégués

EDIT

Vérifier délégués (Guide de programmation C#)

http://msdn.microsoft.com/en-us/library/ms173171%28VS.80%29.aspx

Création et événements personnalisés délégués en C#

http://www.csharphelp.com/2007/02/creating-custom-delegates-and-events-in-c/

Introduction aux délégués et événements

http://www.csharp-station.com/Tutorials/lesson14.aspx

+0

Je ne ai jamais utilisé les délégués avant, puis-je faire mon propre délégué? – foX092

+0

Par exemple, en créant un délégué général, dans ce script, je ne mettrai à jour qu'une étiquette et pourrait faire quelques changements sur une grille. – foX092

+2

oui vous pouvez le faire. essayez-le mon pote. =) – Singleton

1

Je ne pense pas que sa communication intra-forme que vous avez besoin. Son fil conducteur pour former la communication dont vous avez besoin.

Dans votre frmProcess2 abonnez-vous à l'événement BackgroundWorker.ProgressChanged. De votre méthode doWork soulevez périodiquement cet événement.

page 45 de Joseph Albahari Threading in C# a un excellent exemple

2

Pour accéder à vos contrôles d'interface utilisateur qui sont en cours d'exécution sous les fils de l'interface utilisateur, vous devez faire fonction de délégué pour accéder aux contrôles de l'interface utilisateur, becoz commandes de 1 fil ne peut pas être consulté par d'autres threads, dans votre cas, votre thread d'arrière-plan veut accéder aux contrôles de thread UI, cela peut être fait en créant une fonction de délégué.

//sample delegate function 
    //this function is to request i.e invoke UI thread controls 
    private void deleteGridRow() 
    { 
     if (autoGridView.InvokeRequired) 
     { 
      autoGridView.Invoke(new Action(delegate() { deleteGridRow(); })); 
     } 
     else 
      autoGridView.Rows.RemoveAt(0); 
    } 

cette fonction, vous devez appeler l'intérieur backgroundworker1_DoWork(){deleteGridRow();} et vous pouvez l'utiliser pour le statut:

private void backThread_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     lableStatus.Text = "your status" 
    } 

BACKGROUNDWORKER:MSDN

+0

Mon problème est que je ne peux pas communiquer dans le formulaire déjà créé, je jette un coup d'oeil dans l'exemple de formulaire de délégué, semble que c'est ce que je devrais utiliser. – foX092

+0

Action nécessite un type, dans ce cas devrait être quoi? – foX092