2009-09-30 14 views
14

Jak powiązać TextBox z liczbą całkowitą? Na przykład, jednostka wiążąca do textBox1.C# - Wiązanie pola tekstowego do liczby całkowitej

public partial class Form1 : Form 
{ 
    int unit; 

    public Form1() 
    { 
     InitializeComponent(); 


    } 

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

czy to jest WinForm? – Natrium

+5

Wywodzi się z klasy Form. – rahul

Odpowiedz

21

Musiałaby być własnością publiczną instancji; w tym przypadku, „to” wystarczy:

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

Na zgłoszenia dwukierunkowy, trzeba albo UnitChanged lub 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); 
     } 
    } 
} 

Jeśli nie chcą go na publicznej API, można owinąć je w ukrytym gdzieś Typ:

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

Dla informacji, „wydarzenia lista” rzeczy wychodzi coś takiego:

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, nie mogę znaleźć więcej informacji na temat tej sztuczki, gdy nazwiesz wydarzenie 'xxxChanged' dla właściwości' xxx', a następnie jest obsługiwane za sceną. Czy możesz opublikować link lub przynajmniej jak nazywa się sztuczkę? Dzięki – pkuderov

+1

Jest to część implementacji PropertyDescriptor - w zasadzie szuka wzorca * Zmienionych zdarzeń. Jednak zazwyczaj można również użyć atrybutu nazwania atrybutów INotifyPropertyChanged –

+0

, gdy można użyć klasy 'xxxAttribute', ponieważ tylko' xxx' jest dobrze napisane w msdn. Ale to zachowanie jest naprawdę ukryte. Próbowałem google trochę więcej informacji o tym, ale nie powiodło się (może dlatego, że słowo "zmieniono" zapytanie wyszukiwania zagadek) :) tak czy inaczej, thx ponownie – pkuderov

5

Możesz użyć źródła powiązania (patrz komentarz). Najprostszą zmianą jest:

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

jednak zyskasz pewne koncepcyjne jasności jeśli oddzielić dane nieco:

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. Zwróć uwagę na modyfikatory dostępu.

+0

Zmiana Marca Gravella jest prostsza i wydaje się być w porządku. Mam nawyk wiązania wszystkiego z obiektami BindingSource na ogólnych zasadach; jest tam, jest zbudowany w tym celu, może równie dobrze z niego korzystać. – XXXXX

+0

BindingSource działa wyłącznie jako poziom abstrakcji; możesz wiązać bezpośrednio do obu instancji i list. –

+0

Nie jestem pewien, co masz na myśli przez * czysto * jako poziom abstrakcji; W BindingSource jest rzeczywisty kod, który wykonuje różne czynności, na przykład zarządza walutą. – XXXXX

4

Jedną z rzeczy, które lubię robić, jest stworzenie warstwy "prezentacji" dla formularza. Na tej warstwie deklaruję właściwości, które są związane z kontrolkami w formularzu. W tym przypadku formantem jest pole tekstowe.

W tym przykładzie mam formularz z pola tekstowego, aby wyświetlić adres IP

enter image description here

Teraz utworzyć źródło wiążące dzięki właściwości tekstowym. Wybierz DataBindings-> Text. Kliknij strzałkę w dół; wybierz "Dodaj źródło danych projektu".

enter image description here

ten rozpoczyna się, że kreatora źródła danych. Wybierz obiekt. Hit "Dalej".

enter image description here

teraz wybrać klasę, która ma tę właściwość, że będzie ograniczony do pola tekstowego. W tym przykładzie wybrałem PNetworkOptions. Wybierz Zakończ, aby zakończyć działanie kreatora. Źródło BindingSource nie zostanie utworzone.

enter image description here

Następnym krokiem jest wybranie rzeczywistą właściwość związaną z klasą. Z DataBindings-> Text wybierz downarrow i wybierz nazwę właściwości, która będzie związana z polem tekstowym.

enter image description here

w klasie, która ma swoją nieruchomość, INotifyPropertyChanged koniecznością wdrożone do komunikacji 2-way na polu

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

adres IP w konstruktorze formy, musimy wyraźnie określić wiążącego

Binding IPAddressbinding = mskTxtIPAddress.DataBindings.Add("Text", _NetOptions, "IPAddress",true,DataSourceUpdateMode.OnPropertyChanged); 
Powiązane problemy