2009-09-05 3 views
2

Je programme normalement en C++, donc tout ce truc DataSource/DataSet/Binding me déroute. J'espère que vous pouvez aider les gars.Utilisation d'une source de données avec un TextBox

Fondamentalement, j'écris un éditeur pour un format de fichier basé sur XML (en particulier, OFX, pour les données financières). J'ai utilisé xsd.exe sur mon schéma pour désérialiser les fichiers chargés dans des classes anciennes sympas. J'ai découvert DataGridView, qui est génial, que je peux juste définir sa propriété DataSource à l'une des collections qui m'intéresse (en particulier, la liste des transactions), et quand je fouille avec les valeurs, ces changements se reflètent dans le chargement fichier désérialisé, que je peux ensuite sérialiser sur enregistrer. Mais quand je veux 'mapper' juste une simple chaîne à un TextBox (par exemple le numéro de compte), je ne peux pas utiliser cette méthode intelligente à TextBoxes ne semble pas avoir un membre DataSource ... Utilisation de leur propriété 'Text' définit simplement le texte une fois et ne reflète pas les modifications apportées à l'objet sous-jacent, l'enregistrement doit donc d'abord saisir les valeurs du contrôle. Je voudrais que ce soit automatique comme pour le DataGridView.

J'ai essayé de jongler avec les DataBindings mais je ne sais pas quoi utiliser comme propertyName ou DataMember, donc je ne suis pas sûr que ce soit ce que je suis censé être à l'aide:

accountNumberTextBox.DataBindings.Add(new Binding("???", myDocument.accountNumber, "???"); 

Est-ce que je manque quelque chose de vraiment évident? J'espere!

Répondre

4

Qu'est-ce que vous êtes absent est que string s sont immuables dans .NET. Ainsi, pour qu'une liaison ait du sens, la valeur string doit être encapsulée par autre chose. Le système de liaison de données puis remplace la chaîne existante par une nouvelle chaîne lorsque l'utilisateur entre une valeur.

L'autre élément qui encapsule le string peut être un ou une ancienne classe qui inclut une notification de modification. La meilleure façon de fournir cette notification de modification consiste à implémenter l'interface INotifyPropertyChanged.

Par exemple:

public class Document : INotifyPropertyChanged 
{ 
    private string _accountNumber; 

    public string AccountNumber 
    { 
     get { return _accountNumber; } 
     set 
     { 
      if (_accountNumber != value) 
      { 
       _accountNumber = value; 
       //this tells the data binding system that the value has changed, so the interface should be updated 
       OnPropertyChanged("AccountNumber"); 
      } 
     } 
    } 

    //raised whenever a property value on this object changes. The data binding system attaches to this event 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged: 

     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Ainsi, vos données hook-up de liaison ressemblerait à ceci:

var document = ...; //get document from somewhere 
//bind the Text property on the TextBox to the AccountNumber property on the Document 
textBox1.DataBindings.Add("Text", document, "AccountNumber"); 
+0

Ah, le problème avec cela est que la classe contenant la chaîne que je veux lier est générée. Y a-t-il un moyen de le faire de manière moins intrusive? –

+0

@Pierre: merci, corrigé –

+1

@Ben: vous pouvez générer la logique de notification de modification ou écrire une classe qui enveloppe votre objet de données et ajoute une notification de modification pour les besoins de la liaison de données dans l'interface utilisateur. –

2
accountNumberTextBox.DataBindings.Add("Text", 
             myDocumnt.Tables["your_table"], 
             "table_field"); 

Exemple,

DataSet ds = new DataSet("DB"); 
DataTable dt = new DataTable("myTable"); 
dt.Columns.Add("Name"); 
dt.Rows.Add("PP"); 
dt.Rows.Add("QQ"); 
ds.Tables.Add(dt); 

textBox1.DataBindings.Add("Text", ds.Tables["myTable"], "Name"); 
+0

C'est ce que je ne comprends pas; tous les trucs DataSet/DataTable. J'ai effectivement juste une chaîne que je veux utiliser comme DataSource; dois-je mettre cela dans un DataTable à une colonne et à une rangée dans un DataSet à une table pour le rechercher? –

Questions connexes