2009-09-30 24 views
14

¿Cómo vincular un TextBox a un número entero? Por ejemplo, vinculando unidad a textBox1.C# - Vinculando TextBox a un entero

public partial class Form1 : Form 
{ 
    int unit; 

    public Form1() 
    { 
     InitializeComponent(); 


    } 

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

es esto Winforms? – Natrium

+5

Se deriva de la clase Form. – rahul

Respuesta

21

Tendría que ser una propiedad pública de una instancia; en este caso, el "este" sería suficiente:

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

Para la notificación de dos vías, necesitará ya sea 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); 
     } 
    } 
} 

Si no quieren que en el público API, se podría envolverlo en un tipo escondido en alguna 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"); 
} 

Para información, la "lista de eventos" cosas más o menos así:

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, no puedo encontrar más información acerca de ese truco cuando se nombra el evento 'xxxChanged' para la propiedad' xxx' y luego se maneja detrás de la escena. ¿Puedes publicar un enlace o al menos cómo se llama el truco? Gracias – pkuderov

+1

Eso es parte de la implementación de PropertyDescriptor, básicamente busca un patrón de * Eventos modificados. Sin embargo, también puede utilizar normalmente los atributos de INotifyPropertyChanged –

+0

cuando se puede usar la clase 'xxxAttribute' ya que' 'xxx' está bien escrito en msdn. Pero este comportamiento está realmente oculto. He intentado buscar más información al respecto, pero ha fallado (tal vez porque la palabra 'cambió' la búsqueda). De todos modos, thx nuevamente – pkuderov

5

Puede usar una fuente de enlace (ver comentario). El cambio más simple es:

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

Sin embargo, obtendrá un poco de claridad conceptual si separa los datos de un bit:

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. Note los modificadores de acceso omitidos.

+0

El cambio de Marc Gravell es más simple y parece estar bien. Tengo el hábito de vincular todo a los objetos de BindingSource en principios generales; está ahí, está construido para este propósito, bien podría usarlo. – XXXXX

+0

BindingSource actúa puramente como un nivel de abstracción; puede enlazar directamente a ambas instancias y listas. –

+0

No estoy seguro de lo que quiere decir con * puramente * como un nivel de abstracción; hay código real en BindingSource que hace cosas, como administrar moneda. – XXXXX

4

Una de las cosas que me gusta hacer es crear una capa de "presentación" para el formulario. Es en esta capa que declaro las propiedades que están vinculadas a los controles en el formulario. En este caso, el control es un cuadro de texto.

En este ejemplo tengo un formulario con un cuadro de texto para mostrar una dirección IP

enter image description here

Ahora vamos a crear el origen de enlace a través de las propiedades de cuadro de texto. Seleccione DataBindings-> Text. Haga clic en la flecha hacia abajo; seleccione 'Agregar fuente de datos del proyecto'.

enter image description here

Esto se pone en marcha ese mago de origen de datos. Seleccionar objeto. Presiona 'Siguiente'.

enter image description here

Ahora seleccione la clase que tiene la propiedad de que se limita a la caja de texto. En este ejemplo, elegí PNetworkOptions. Seleccione Finalizar para finalizar el asistente. BindingSource no se creará.

enter image description here

El siguiente paso es seleccionar la propiedad real de la clase ligada. Desde DataBindings-> Text, seleccione el downarrow y seleccione el nombre de propiedad que se vinculará al cuadro de texto.

enter image description here

En la clase que tiene su propiedad, INotifyPropertyChanged necesidad implementado para la comunicación de 2 vías para el campo Dirección 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"); 
      } 
     } 
    } 
} 

En constructor del formulario, tenemos que definir específicamente la

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