2012-06-26 3 views
1

J'ai besoin de quelques conseils pour la conception suivante.Garder la trace de plus de 40 valeurs de contrôle

J'ai un contrôle onglet qui contient diverses zones de groupe. Dans la zone de groupe, des contrôles spécifiques se rapportent à cette zone de groupe. Par exemple:

enter image description here

Maintenant, chaque fois qu'une modification est apportée à aucun contrôle dans la zone de groupe, la valeur de la commande doit être suivi, car à la fin du cycle demande d'exécution, les données de contrôle devront être enregistré dans un fichier contenant cette valeur. Un exemple de fichier est:

HOT_STANDBY_FEATURE_ENABLE [val from control here]

HEART_BEAT_DIGITAL_OUTPUT [val from control here] ....

Une conception que je pense a un autre qui a seulement des propriétés que les ensembles forment la boîte de groupe chaque fois qu'un événement ValueChanged se produit sur une contrôle.

code Exemple:

class ConfigurationValues 
{ 
    public int HotStandbyValue { get; set; } 
    public int HeartBeatDigitalOutputValue { get; set; } 
    //...add all other controls here 
} 

L'inconvénient que je vois à cela est qu'il ya 40 contrôles sur cette page onglet, donc je dois saisir manuellement chaque propriété. Lorsque le fichier doit être généré à la fin du cycle d'exécution de l'application, j'ai une méthode qui obtient la valeur du besoin de contrôle.

Exemple:

private void GenerateFile() 
{ 
    string[] file = 
    "HOT_STANDBY_FEATURE_ENABLE " + ConfigurationTabSettings.HotStandbyValue; 
} 

Une autre considération de la conception que je dois faire est que chaque fois qu'un utilisateur clique sur « Fichier de configuration ouverte », les valeurs du fichier à partir du disque doivent être chargés dans les propriétés de sorte que le formulaire peut prendre ces données au démarrage et remplir les contrôles dans les zones de groupe avec leurs valeurs respectives.

Toutes les suggestions sur cette conception seraient grandement appréciées. Je sais que ce n'est pas le moyen le plus efficace de le faire et je ne suis pas le programmeur le plus expérimenté, donc tous les mots-clés Google que je peux rechercher seraient très bien aussi.

Répondre

2

Vous aurez besoin de lier les contrôles texte ou propriétés Valeur à les propriétés de votre classe ConfigurationValues

ConfigurationValues cv = Repository.ReadConfigValues(); 

numPulseFilterDelay.DataBindings.Add("Value", cv, "PulseFilterDelay"); 

// Add the rest of your control bindings here 

sur la btnSave_Click() de votre formulaire, mettre fin à l'édition en cours sur la forme et enregistrer les valeurs config

void btnSave_Click(object sender, EventArgs e) 
{ 
    BindingContext[cv].EndCurrentEdit(); // Commits all values to the underlying data source 
    Repository.SaveConfigValues(cv); 
} 

Dans votre classe référentiel, vous aurez besoin des méthodes pour charger() et Save() les données. Vous pouvez mettre le code XmlSerialization ici, ou écrire votre propre format (en fonction de vos besoins)

public class Repository 
{ 
    public static ConfigurationValues LoadConfigValues() 
    { 
    var cv = new ConfigurationValues(); 

    string[] lines = File.ReadAllLines("values.cfg"); 
    foreach (string cfg in lines) 
    { 
     string[] nameValue = cfg.Split(new char[] { ' ' }); // To get label/value 

     if (nameValue[0] == "HOT_STANDBY_FEATURE_ENABLE") 
      cv.HotStandbyFeatureEnable = nameValue[1]; 
     else if (nameValue[0] == "SOME_OTHER_PROPERTY") 
      cv.SomeOtherProperty = nameValue[2]; 
     // Continue for all properties 
    } 

    return cv; 
    } 


    public static void SaveConfigValues(ConfigurationValues cv) 
    { 
    var builder = new StringBuilder(); 
    builder.AppendFormat("HOST_STANDBY_FEATURE_ENABLE {0}\r\n", cv.HostStandbyFeatureEnable); 
    // Add the rest of your properties 

    File.WriteAllText("values.cfg", builder.ToString()); 
    } 
} 
+0

Merci pour l'écriture Mangist. Après avoir réalisé que je peux utiliser XML pour enregistrer et charger les paramètres de configuration, je vais essayer d'utiliser cette méthode pour charger les contrôles. Je lis à propos de DataBinding et trouve cela confus pour le moment. – brazc0re

+1

L'utilisation de DataBinding est beaucoup plus facile et plus lisible que la lecture de vos propriétés ConfigurationValues ​​et la définition manuelle des propriétés Text sur les contrôles. Lorsque vous allez enregistrer vos données, vous devez les lire dans l'objet ConfigurationValues. Tout ceci est géré automatiquement par le framework si vous utilisez la liaison. Bonne chance! – Mangist

+0

Mangist, après avoir expérimenté l'exemple DataBinding que vous avez écrit, c'est le meilleur moyen pour moi d'y aller. Comme vous l'avez mentionné, le cadre de liaison rend la lecture de la valeur "Texte" beaucoup plus facile. – brazc0re

3

Vous pouvez xml serialise et xml deserialise votre classe ConfigurationValues ​​plutôt que d'écrire manuelle « générer un fichier » et « lire le fichier » méthodes

http://support.microsoft.com/kb/815813

+0

Un modèle MVVM vous aiderait dans ce cas. Avoir toutes les données dans le modèle et le rendre XML Serialiazable.Et liez l'interface utilisateur (vue) au modèle et vous êtes prêt à aller – Soundararajan

+0

Le fichier généré ne sera pas au format XML; Cependant, je vois une utilisation de sérialiser XML pour enregistrer les fichiers de configuration au format XML et de lire le fichier XML pour charger les contrôles. – brazc0re

Questions connexes