С# - привязка TextBox к целому числу
Как связать TextBox с целым числом? Например, блок привязки к textBox1.
public partial class Form1 : Form
{
int unit;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
textBox1.DataBindings.Add("Text", unit, "???");
}
Ответы
Ответ 1
Это должно быть публичное свойство экземпляра; в этом случае "this" будет достаточно:
public int Unit {get;set;}
private void Form1_Load(object sender, EventArgs e)
{
textBox1.DataBindings.Add("Text", this, "Unit");
}
Для двустороннего уведомления вам потребуется либо UnitChanged
, либо 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);
}
}
}
Если вы не хотите его публичного API, вы можете где-то его скрыть:
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");
}
Информация о событиях "информация о событиях" выглядит примерно так:
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);
Ответ 2
Вы можете использовать источник привязки (см. комментарий). Самое простое изменение:
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");
}
}
Тем не менее, вы получите некоторую концептуальную ясность, если немного выделите данные:
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");
}
}
НТН. Модификаторы доступа для заметок не указаны.
Ответ 3
Одна из вещей, которые мне нравится делать, - создать слой "презентация" для формы. Именно в этом слое я объявляю свойства, привязанные к элементам управления формы. В этом случае элемент управления представляет собой текстовое поле.
В этом примере у меня есть форма с текстовым полем для отображения IP-адреса
![enter image description here]()
Теперь мы создаем источник привязки через свойства текстового поля. Выберите DataBindings- > Text. Нажмите стрелку вниз; выберите "Добавить источник данных проекта".
![enter image description here]()
Запустится мастер создания источника данных. Выберите объект. Нажмите "Далее".
![enter image description here]()
Теперь выберите класс, у которого есть свойство, которое будет ограничено текстовым полем. В этом примере я выбрал PNetworkOptions. Выберите "Готово", чтобы завершить работу мастера. Источник BindingSource не будет создан.
![enter image description here]()
Следующий шаг - выбрать фактическое свойство из связанного класса. Из DataBindings- > Text выберите downarrow и выберите имя свойства, которое будет привязано к текстовому поле.
![enter image description here]()
В классе, у которого есть ваше свойство, INotifyPropertyChanged должен быть реализован для двусторонней связи для поля 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");
}
}
}
}
В конструкторе формы мы должны конкретно определить привязку
Binding IPAddressbinding = mskTxtIPAddress.DataBindings.Add("Text", _NetOptions, "IPAddress",true,DataSourceUpdateMode.OnPropertyChanged);