2010-01-27 5 views
0

Si j'ai un dictionnaire dans une classe statique qui est mis à jour aléatoirement avec des données, comment puis-je passer ce dictionnaire au formulaire principal pour l'afficher dans une vue de grille si la forme principale n'est pas statique? Certes, si je crée une nouvelle instance de la mainform, je vais avoir plusieurs mainforms chaque fois que j'essaie de le faire (toutes les 15 secondes) et je vais perdre des données ...... non?C# WinForms Passage du dictionnaire de la classe statique à la classe non statique Classe

Répondre

1

Laissant les commentaires sur votre conception (urgh ... désolé ne pouvait pas aider que) la chose bon marché et facile est de donner à votre updater statique votre forme principale et laisser la classe statique mettre à jour votre forme manuellement.

public static class OmfgUpdater 
{ 
    private static MyForm _mainForm; 
    public static void RegisterForm(MyForm form) 
    { 
    _mainForm = form; 
    } 

    /*however this is done in your class*/ 
    internal static void Update(Dictionary<string,string> updates) 
    { 
    _mainForm.Update(updates); 
    } 
} 

public class MyForm : Form 
{ 

    public MyForm() 
    { 
    OmfgUpdater.RegisterForm(this); 
    } 

    public void Update(Dictionary<string,string> updates) 
    { 
    /* oh look you got updates do something with them */ 
    } 
} 
+0

+1 pour le nom de la classe. Les règles de Snark! – MusiGenesis

0

Avertissement 1: La déclaration dans votre question: « si je crée une nouvelle instance de la mainform j'avoir plusieurs mainforms chaque fois que j'essaie de le faire (toutes les 15 secondes) et je vais perdre des données ... ...droite?" n'est pas du tout clair pour moi. Je vais répondre ici en interprétant votre déclaration que vous voulez un dictionnaire statique en ce sens que vous voulez un et un seul, peu importe combien d'autres formes pourraient être lancées par une instance d'application. Clause de non-responsabilité 2: Le code que je montre ici est destiné à contraster avec la réponse de Will où la classe statique met à jour le formulaire principal. Et la réponse ici n'aborde pas du tout la liaison dynamique (liaison de données): il n'y a pas de code ici pour l'utilisateur qui effectue une modification sur le formulaire dans DataGridView, et dont la propagation est inversée pour mettre à jour le dictionnaire sous-jacent.

En supposant que vous voulez un et unique, un dictionnaire par instance d'application: Si vous avez une classe statique public qui est titulaire d'une instance statique publique d'un dictionnaire comme:

public static class DictionaryResource 
{ 
    // make dictonary internal so the only way to access it is through a public property 
    internal static Dictionary<string, int> theDictionary = new Dictionary<string, int>(); 

    // utility methods : 

    // 1. add a new Key-Value Pair (KVP) 
    public static void AddKVP(string theString, int theInt) 
    { 
     if (! theDictionary.ContainsKey(theString)) 
     { 
      theDictionary.Add(theString, theInt); 
     }  
    } 

    // 2. delete an existing KVP 
    public static void RemoveKVP(string theString) 
    { 
     if (theDictionary.ContainsKey(theString)) 
     { 
      theDictionary.Remove(theString); 
     } 
    } 

    // 3. revise the value of an existing KVP 
    public static void ChangeDictValue(string theString, int theValue) 
    { 
     if(theDictionary.ContainsKey(theString)) 
     { 
      theDictionary[theString] = theValue; 
     } 
    } 

    // expose the internal Dictionary via a public Property 'getter 
    public static Dictionary<string,int> TheDictionary 
    { 
     get { return theDictionary; } 
    } 
} 

À ce moment-là, vous pouvez obtenir mise à jour dynamique du contenu du dictionnaire sur un formulaire soit par des techniques DataBinding, soit en définissant des événements personnalisés dans les méthodes de la classe statique qui sont déclenchées: ces événements sont ensuite souscrits sur le formulaire et lorsque vous interceptez ces changements dans le Formulaire, vous pouvez ensuite prendre des mesures pour mettre à jour la représentation que vous avez sur le formulaire.

Voici un exemple de la définition d'un événement personnalisé dans la classe statique:

// delegate signature 
    public delegate void addKVP(string sender, int value); 

    // delegate instance 
    public static event addKVP KeyValuePairAdded; 

    // delegate run-time dispatcher 
    public static void OnKVPAdded(string sender, int theInt) 
    { 
     if (KeyValuePairAdded != null) 
     { 
      KeyValuePairAdded(sender, theInt); 
     } 
    } 

Puis, comme un exemple de la façon dont vous vous abonnez à cet événement personnalisé dans un formulaire: dans ce cas dans le « cas de charge: Où vous avez défini le gestionnaire de l'événement ... dans le formulaire ....comme:

private void DictionaryResource_KeyValuePairAdded(string theString, int theInt) 
    { 
     Console.WriteLine("dict update : " + theString + " : " + theInt); 
    } 

Un test typique de validation exécutée dans le code du formulaire peut avoir des appels tels que:

 DictionaryResource.AddKVP("hello", 100); 
     DictionaryResource.AddKVP("goodbye", 200); 

De toute évidence, vous devez modifier ce code dans le gestionnaire du formulaire qui justs imprime un rapport à la console maintenant pour modifier votre DataGridView sur le formulaire, ou toute autre représentation que vous créez sur le formulaire (s).

Questions connexes