2009-04-28 11 views
1

Je sais comment manipuler une zone de texte sur un formulaire, à partir d'un formulaire, mais je ne sais pas comment manipuler une zone de texte d'une classe dans son propre fichier à un formulaire. Est-ce que quelqu'un peut m'expliquer comment j'écrirais un délégué & un CallBack afin que je puisse simplement appeler une méthode d'une classe dans un fichier différent, et changer des trucs sur une boîte de texte d'un formulaire différent?En C#, comment utiliser un délégué pour manipuler un formulaire à partir d'une classe personnalisée que j'ai créée?

Je ne vois pas comment je pourrais expliquer cela mieux. Merci pour toute aide!

+0

Ceci est similaire à: http://stackoverflow.com/questions/717454/accessing-class-members-with-invoke-from-a-different-thread-in-c, http://stackoverflow.com/ questions/717264/c-accédant-forme-membres-d'une autre-classe, http://stackoverflow.com/questions/717074/how-to-access-form-objects-from-another-cs-file-in- c – Groo

+0

Ouais ils sont similaires mais ils ne m'aident pas vraiment. Merci pour l'aide cependant, j'espère que quelqu'un peut jeter une réponse bientôt. – OneShot

Répondre

3

Votre classe ne doit pas modifier le formulaire.

Toutefois, vous pouvez créer un délégué ou un événement dans votre classe et laisser votre classe déclencher cet événement lorsqu'une action doit être effectuée. Votre formulaire peut attacher un eventhandler à cet événement et exécuter l'action appropriée.

Par exemple:

class MyClass 
{ 
    public event EventHandler DoSomething; 

    public void DoWork() 
    { 
     // do some stuff 

     // raise the DoSomething event. 
     OnDoSomething(EventArgs.Empty); 
    } 

    protected virtual void OnDoSomething(EventArgs args) 
    { 
     // This code will make sure that you have no IllegalThreadContext 
     // exceptions, and will avoid race conditions. 
     // note that this won't work in wpf. You could also take a look 
     // at the SynchronizationContext class. 
     EventHandler handler = DoSomething; 
     if(handler != null) 
     { 
      ISynchronizeInvoke target = handler.Target as ISynchronizeInvoke; 

      if(target != null && target.InvokeRequired) 
      { 
       target.Invoke (handler, new object[]{this, args}); 
      } 
      else 
      { 
       handler(this, args); 
      } 
     } 
    } 
} 

Et, dans votre formulaire, vous faites ceci:

MyClass c = new MyClass(); 
c.DoSomething += new EventHandler(MyClass_DoSomething); 
c.DoWork(); 

private void MyClass_DoSomething(object sender, EventArgs e) 
{ 
    // Manipulate your form 
    textBox1.Text = " ... "; 
} 

Lorsque vous voulez transmettre des données de votre classe à votre formulaire, vous pouvez utiliser du délégué générique EventHandler et créez votre propre classe EventArgs, qui contient les informations dont votre formulaire a besoin.

public class MyEventArgs : EventArgs 
{ 
    public string SomeData 
    { get; 
     private set; 
    } 

    public MyEventArgs(string s) 
    { 
     this.SomeData = s; 
    } 
} 

Alors biensur, vous devrez utiliser le générique eventhandler dans votre classe, et transmettre les données appropriées dans le constructeur de votre propre classe EventArgs. Dans eventhandler, vous pouvez ensuite utiliser ces données.

+0

Est-ce déjà threadsafe ou est-ce que todo signifie que vous ne l'avez pas encore fait? J'ai aussi besoin que ça soit thread safe, ça te dérangerait de jeter ça? – OneShot

+0

Pour sécuriser les threads, vous devez vérifier si vous devez ou non appeler l'eventhandler. Je vais modifier le code ... –

+0

Merci beaucoup! Je vais voir si je peux le faire fonctionner maintenant. – OneShot