2009-09-30 4 views
14

Comment lier une zone de texte à un entier? Par exemple, une unité de liaison à textBox1.C# - Reliure TextBox à un nombre entier

public partial class Form1 : Form 
{ 
    int unit; 

    public Form1() 
    { 
     InitializeComponent(); 


    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     textBox1.DataBindings.Add("Text", unit, "???"); 
    } 
+1

est ce Winforms? – Natrium

+5

Il dérive de la classe Form. – rahul

Répondre

21

Il devrait s'agir d'une propriété publique d'une instance; dans ce cas, le « cela » suffirait:

public int Unit {get;set;} 
private void Form1_Load(object sender, EventArgs e) 
{ 
    textBox1.DataBindings.Add("Text", this, "Unit"); 
} 

Pour la notification dans les deux sens, vous aurez besoin soit UnitChanged ou INotifyPropertyChanged:

private int unit; 
public event EventHandler UnitChanged; // or via the "Events" list 
public int Unit { 
    get {return unit;} 
    set { 
     if(value!=unit) { 
      unit = value; 
      EventHandler handler = UnitChanged; 
      if(handler!=null) handler(this,EventArgs.Empty); 
     } 
    } 
} 

Si vous ne voulez pas le public API, vous pouvez l'envelopper dans un type caché quelque part:

class UnitWrapper { 
    public int Unit {get;set;} 
} 
private UnitWrapper unit = new UnitWrapper(); 
private void Form1_Load(object sender, EventArgs e) 
{ 
    textBox1.DataBindings.Add("Text", unit, "Unit"); 
} 

Pour info, les choses est quelque chose comme "la liste des événements":

private static readonly object UnitChangedKey = new object(); 
    public event EventHandler UnitChanged 
    { 
     add {Events.AddHandler(UnitChangedKey, value);} 
     remove {Events.AddHandler(UnitChangedKey, value);} 
    } 
    ... 
    EventHandler handler = (EventHandler)Events[UnitChangedKey]; 
    if (handler != null) handler(this, EventArgs.Empty); 
+0

Marc, je ne peux pas trouver plus d'informations à propos de cette astuce lorsque vous nommez votre événement 'xxxChanged' pour la propriété' xxx' et ensuite il est géré derrière la scène. Pouvez-vous poster un lien ou au moins comment l'astuce est appelée? Merci – pkuderov

+1

Cela fait partie de l'implémentation PropertyDescriptor - fondamentalement, il cherche un modèle d'événements * Changed. Cependant, vous pouvez aussi utiliser les attributs INotifyPropertyChanged –

+0

attributs lorsque la classe 'xxxAttribute' peut être utilisée alors que' xxx' est bien écrit dans msdn. Mais ce comportement est vraiment caché. J'ai essayé de google plus d'informations à ce sujet, mais échoué (peut-être parce mot «changé» puzzles requête de recherche) :) de toute façon, thx encore – pkuderov

5

Vous pouvez utiliser une source de liaison (voir le commentaire). Le plus simple changement:

public partial class Form1 : Form 
{ 
    public int Unit { get; set; } 
    BindingSource form1BindingSource; 

    private void Form1_Load (...) 
    { 
     form1BindingSource.DataSource = this; 
     textBox1.DataBindings.Add ("Text", form1BindingSource, "Unit"); 
    } 
} 

Cependant, vous gagnerez un peu de clarté conceptuelle si vous séparez les données un peu:

public partial class Form1 : Form 
{ 
    class MyData { 
     public int Unit { get; set; } 
    } 

    MyData form1Data; 
    BindingSource form1BindingSource; 

    private void Form1_Load (...) 
    { 
     form1BindingSource.DataSource = form1Data; 
     textBox1.DataBindings.Add ("Text", form1BindingSource, "Unit"); 
    } 
} 

HTH. Notez que les modificateurs d'accès ont été omis.

+0

Le changement de Marc Gravell est plus simple et semble bien. J'ai l'habitude de lier tout à des objets de BindingSource sur des principes généraux; il est là, il est construit à cet effet, pourrait aussi bien l'utiliser. – XXXXX

+0

BindingSource agit uniquement comme un niveau d'abstraction; vous pouvez lier directement aux instances et aux listes. –

+0

Je ne suis pas sûr de ce que vous entendez par * purement * comme niveau d'abstraction; Il y a du code dans BindingSource qui fait des choses, comme gérer la monnaie. – XXXXX

4

L'une des choses que je préfère faire est de créer la couche « présentation » pour la forme. C'est dans cette couche que je déclare les propriétés liées aux contrôles du formulaire. Dans ce cas, le contrôle est une zone de texte.

Dans cet exemple, j'ai une forme avec une zone de texte pour afficher une adresse IP

enter image description here

Nous créons maintenant la source de liaison à travers les propriétés de zone de texte. Sélectionnez DataBindings-> Text. Cliquez sur la flèche vers le bas sélectionnez "Ajouter une source de données de projet".

enter image description here

Cela démarre que l'Assistant source de données. Sélectionnez un objet Hit "Suivant".

enter image description here

Maintenant, sélectionnez la classe qui a la propriété qui sera limitée à la zone de texte. Dans cet exemple, j'ai choisi PNetworkOptions. Sélectionnez Terminer pour terminer l'assistant. Le BindingSource ne sera pas créé.

enter image description here

L'étape suivante consiste à sélectionner la propriété réelle de la classe liée. Depuis DataBindings-> Text, sélectionnez le downarrow et sélectionnez le nom de la propriété qui sera lié à la zone de texte.

enter image description here

Dans la classe qui a votre propriété, doit INotifyPropertyChanged mis en œuvre pour la communication 2 voies pour le champ Adresse IP

public class PNetworkOptions : IBaseInterface, INotifyPropertyChanged 
{ 
    private string _IPAddress; 


    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

    public string IPAddress 
    { 
     get { return _IPAddress; } 
     set 
     { 
      if (value != null && value != _IPAddress) 
      { 
       _IPAddress = value; 
       NotifyPropertyChanged("IPAddress"); 
      } 
     } 
    } 
} 

Dans le constructeur de forme, nous devons définir plus précisément la liaison

Binding IPAddressbinding = mskTxtIPAddress.DataBindings.Add("Text", _NetOptions, "IPAddress",true,DataSourceUpdateMode.OnPropertyChanged); 
Questions connexes