2010-02-03 6 views
2

J'ai une forme avec beaucoup de TextBoxes et il y a aussi beaucoup de threads dans mon programme qui ont besoin de lire le contenu de ces TextBoxes (paramètres). Comme je ne peux pas accéder aux contrôles d'autres threads, j'ai décidé de créer une classe spéciale qui contiendra tous les paramètres, et si l'utilisateur en change, le contrôle appellera l'événement OnTextChanged et changera la valeur correspondante dans la classe. Mais si j'utilise cette approche, il y aura beaucoup de gestionnaires semblables Tike ceComment lier les propriétés du contrôle aux variables en C#?

private void txtCrap1_TextChanged(object sender, EventArgs e) 
{ 
    Settings.Crap1 = txtCrap1.Text; 
} 

Ce que je veux est de faire quelque chose comme ça

private void SetUpControlBindings() 
{ 
    AddBinding(txtCrap1, Settings.Crap1); 
    AddBinding(txtCrap2, Settings.Crap2); 
} 
private void AddBinding(object control, object value) 
{ 
    //Add entry to some kind of dictionary 
} 
private void UpdateValue(object sender, EventArgs e) 
{ 
    if (sender is TextBox) 
    { 
    //Search it in dictionary and change appropriate value 
    } 
} 

Mais je ne peux pas trouver tous les pointeurs de variables C# Des idées comment faire cela?

P.S. Je ne peux pas utiliser la réflexion puisque mon code sera obscurci après la compilation

upd: En fait, mon programme est un peu plus compliqué. Je n'ai pas seulement des boîtes de texte, mais des CheckBox, des NumericUpDowns etc. Je veux aussi que ma classe Settings contienne des objets supplémentaires comme des Lists.

Répondre

0

Rendez votre objet Settings soutenu par un Dictionary<string, string> qui mappe les noms des zones de texte sur leurs valeurs.

Par exemple:

readonly Dictionary<string, string> values = new Dictionary<string, string>(); 
public void AddBinding(TextBox box) { 
    box.Change += TextBox_Change; 
    values.Add(box.Name, box.Value); 
} 

void TextBox_Change(object sender, EventArgs e) { 
    var box = (TextBox)sender; 
    values[box.Name] = box.Value; 
} 

//Properties: 
public string Prop1 { get { return values["textBox1"]; } } 
//Where textBox1 is the name of the textbox 

Remarque

Pour utiliser sur plusieurs threads, vous aurez besoin d'utiliser un ReaderWriterLockSlim.

+0

En fait, mon programme est un peu plus compliqué. Je n'ai pas seulement des boîtes de texte, mais des CheckBox, des NumericUpDowns etc. Je veux aussi que ma classe Settings contienne des objets supplémentaires comme des Lists. – Poma

+0

Vous pouvez toujours le faire en utilisant plusieurs gestionnaires de changement de dictionnaires avec des surcharges 'AddBinding' séparées. – SLaks

0

Créez un DataTable avec une colonne pour chaque TextBox, ajoutez-y une seule ligne et utilisez la liaison de données Windows Forms normale. Ensuite, il suffit de traiter le DataRow comme un dictionnaire.

+0

En fait, mon programme est un peu plus compliqué. Je n'ai pas seulement des boîtes de texte, mais des CheckBox, des NumericUpDowns etc. Je veux aussi que ma classe Settings contienne des objets supplémentaires comme des Lists. – Poma

+0

Je n'ai pas d'environnement de développement à portée de main pour l'instant, mais votre question est essentiellement "comment réécrire la liaison de données de Windows Forms", et je vous dis que vous n'en avez pas besoin. La classe BindingSource vous permet de vous lier parfaitement à un objet. Croyez-moi, j'ai écrit des programmes très compliqués avec CheckBoxes, RadioButtons, CheckedListBoxes, DateTimePickers et un éditeur dynamique de mise en évidence de la syntaxe LINQ-to-SQL, tous utilisant une liaison de données standard prête à l'emploi. –

1

La façon dont je résoudrais normalement quelque chose comme ceci est en utilisant des liaisons de données.

txtCrap1.DataBindings.Add("Text", Settings, "Crap1"); 
chkCrap2.DataBindings.Add("Checked", Settings, "Crap2"); 

Le problème est bien sûr l'obfuscation. Mais quand vous obscurcissez, vous pouvez exclure des choses, comme des classes entières, des méthodes ou des propriétés. Si possible, vous pouvez exclure les propriétés de la classe Settings de l'obfuscation, puis être en mesure d'utiliser des liaisons de données normales. La façon dont vous excluez une propriété dépend du cadre d'obfuscation que vous utilisez.

Questions connexes