2009-09-30 21 views
14

Come associare un TextBox a un numero intero? Ad esempio, unità vincolante a textBox1.C# - Associazione di TextBox a un numero intero

public partial class Form1 : Form 
{ 
    int unit; 

    public Form1() 
    { 
     InitializeComponent(); 


    } 

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

è questo Winforms? – Natrium

+5

Deriva dalla classe Form. – rahul

risposta

21

Dovrebbe essere una proprietà pubblica di un'istanza; in questo caso, il "questo" sarebbe sufficiente:

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

Per la notifica a due vie, è necessario sia UnitChanged o 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); 
     } 
    } 
} 

Se non si vuole che il pubblico API, si poteva avvolgerlo in un tipo nascosto da qualche parte:

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"); 
} 

Per info, il "eventi lista" roba più o meno così:

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, non riesco a trovare più informazioni su quel trucco quando dai il nome al tuo evento 'xxxChanged' per proprietà' xxx' e poi viene gestito dietro la scena. Puoi pubblicare un link o almeno come viene chiamato il trucco? Grazie – pkuderov

+1

Questo fa parte dell'implementazione PropertyDescriptor, in pratica cerca un modello di * Eventi modificati. Tuttavia, si può anche usare solitamente il trucco di denominazione degli attributi di INotifyPropertyChanged –

+0

quando si può usare la classe 'xxxAttribute', dato che' xxx' è scritto bene in msdn. Ma questo comportamento è davvero nascosto. Ho provato a google qualche informazione in più ma non è riuscito (forse perché la parola 'cambia' query di ricerca dei puzzle) :) comunque, grazie ancora – pkuderov

5

È possibile utilizzare una sorgente di associazione (vedere il commento). Il cambiamento più semplice è:

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"); 
    } 
} 

Tuttavia, è possibile ottenere un po 'di chiarezza concettuale se separare i dati un po':

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. Notare i modificatori di accesso omessi.

+0

Il cambiamento di Marc Gravell è più semplice e sembra soddisfacente. Ho l'abitudine di legare tutto a oggetti BindingSource su principi generali; è lì, è costruito per questo scopo, potrebbe anche usarlo. – XXXXX

+0

BindingSource agisce esclusivamente come livello di astrazione; puoi associare direttamente a entrambe le istanze e gli elenchi. –

+0

Non sono sicuro di cosa intendi con * puramente * come livello di astrazione; c'è codice effettivo in BindingSource che fa cose, come gestire la valuta. – XXXXX

4

Una delle cose che mi piace fare è creare il livello "presentazione" per il modulo. È in questo livello che dichiaro le proprietà associate ai controlli sul modulo. In questo caso, il controllo è una casella di testo.

In questo esempio ho un modulo con una casella di testo per visualizzare un indirizzo IP

enter image description here

Ora creare l'origine vincolante attraverso le proprietà della casella di testo. Seleziona DataBindings-> Text. Fai clic sulla freccia giù; seleziona "Aggiungi origine dati progetto".

enter image description here

questo modo si avvia che guidata origine dati. Seleziona oggetto. Premi "Avanti".

enter image description here

Ora selezionare la classe che ha la proprietà che verrà delimitata alla casella di testo. In questo esempio, ho scelto PNetworkOptions. Seleziona Fine per terminare la procedura guidata. BindingSource non verrà creato.

enter image description here

Il passo successivo è quello di selezionare l'effettiva proprietà dalla classe legata. Da DataBindings-> Text, seleziona downarrow e seleziona il nome della proprietà che verrà associato alla casella di testo.

enter image description here

Nella classe che ha il vostro immobile, INotifyPropertyChanged must implementato per la comunicazione a 2 vie per IP campo Indirizzo

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"); 
      } 
     } 
    } 
} 

Nel costruttore modulo, dobbiamo definire in modo specifico il legame

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