2017-10-07 3 views
2

J'ai deux formulaires (Form1 et Form2) que je souhaite passer une chaîne de caractères entre après la fin d'un processus sur Form1.Passage de données entre des formulaires à l'aide de gestionnaires d'événements personnalisés

Sur Form1, il existe une zone de texte que je voudrais mettre à jour avec cette chaîne de caractères. Sur Form2, j'ai une zone de liste qui contient les valeurs qui seront éventuellement chargées dans cette zone de texte sur Form1 après chaque processus qui se termine. Fondamentalement, ce que je suis en train de faire est de mettre en file d'attente la chaîne suivante qui sera placée dans la zone de texte sur Form1.

J'ai essayé la création d'une propriété publique à Form2 comme on le voit ci-dessous:

public string NextString { get { return ListBox1.Items[ListBox1.TopIndex].ToString(); } } 

Puis, dans Form1:

Form2 frm = new Form2(); 
string next = frm.NextString; 
TextBox1.Text = next; 

Et presto. Sauf non. Cela ne fonctionnait pas pour moi, malheureusement. J'ai fait quelques recherches et j'ai vu que cette méthode n'était pas tout à fait la meilleure pratique et j'ai lu que l'utilisation de gestionnaires d'événements était l'approche la plus pratique. J'ai donc fait des recherches sur ceux-ci. Je sais que je dois créer une nouvelle classe EventArgs, un nouvel événement public, une méthode de déclenchement, comment je veux gérer l'événement, puis la méthode du gestionnaire dans Form1. This post is where I read into that.

J'ai joué avec la manipulation de la réponse en fonction de mes besoins:

public class StringEventArgs : EventArgs 
{ 
    public string NextString { get; set; } 
    public StringEventArgs(string data) 
    { 
     NextString = data; 
    } 
} 

Un nouvel événement:

public event EventHandler<ListEventArgs> NewFileAdded; 

C'est là que je me suis perdu. J'ai du mal à comprendre ce qui se passe maintenant. Si quelqu'un peut m'aider à accomplir ce que j'essaie de faire, je serais très reconnaissant!

+0

utilisez-vous MVVM, ou est-ce que tout ceci est fait derrière le code? –

+0

Tout ceci est fait sur le fichier code-behind –

+0

Quand est-ce que Form2 est ouvert? –

Répondre

2

Inutile de créer votre propre classe Args. Vous pouvez accomplir cela en utilisant un Action auquel s'abonne Form2.

Quelque chose comme:

public class Form1 
{ 
    private Form2 _form2; 

    public event Action<string> NextStringChanged; 

    public class Form1() 
    { 
     _form2 = new Form2(this); 
    } 

    private void LongProcess() 
    { 
     _form2.Show(); 

     // do long process 

    if (NextStringChanged != null) 
    { 
     NextStringChanged.Invoke(ListBox1.Items[ListBox1.TopIndex].ToString()); 
    } 
    } 
} 

public class Form2 
{ 
    public class Form2(Form1 form1) 
    { 
     form1.NextStringChanged += OnNextStringChanged; 
    } 

    private void OnNextStringChanged(string value) 
    { 
     // Update WPF user control here 
    } 
} 
+0

Je ne suis pas sûr si cela ferait une différence dans cette solution, mais la zone de liste où je voudrais saisir la valeur suivante se trouve sur Form2. Il semble que cela ait pu changer les deux. Néanmoins, quand j'ai essayé d'implémenter ceci, j'ai eu "Aucune surcharge pour 'OnNextStringChanged' correspond au délégué 'Action'". Des idées? –

+0

désolé, voir mise à jour. Notez que dans Form1, il est maintenant Action

+0

Je pense que vous avez inversé Form1 et Form2. La zone de liste est située sur Form2. Form2 est le formulaire auxiliaire et Form1 est le formulaire principal. –

0

Il y a plusieurs façons de transmettre des données entre les différentes formes, vérifier cela:

  1. d'abord créer la chaîne que vous souhaitez partager Form2:

public string NextString { get { return ListBox1.Items[ListBox1.TopIndex].ToString(); } }

  1. pour accéder à cette utilisation de chaîne ce code:

string Testing = ((Form2)Application.Current.Windows[2]).NextString;

post-scriptum vous devrez peut-être utiliser un numéro d'index différent pour Form2 car je ne suis pas sûr exactement où il se trouve dans votre application.

+0

Pour cela, j'obtiens application ne contient pas une définition de courant. Le framework .NET cible est 4.6.1, si cela peut vous aider. –