C # - привязка 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, "???");
    }
 Natrium30 сент. 2009 г., 13:16
это Winforms?
 rahul30 сент. 2009 г., 13:17
Это происходит от класса Form.

Ответы на вопрос(3)

тое изменение:

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

НТН. Примечание модификаторы доступа опущены.

 XXXXX30 сент. 2009 г., 13:24
Марк ГравеллСмена проще и, кажется, хорошо. Я'm в привычке связывать все с объектами BindingSource на общих принципах; Это'там, этоs построен для этой цели, может также использовать его.
 Marc Gravell30 сент. 2009 г., 13:27
BindingSource действует исключительно как уровень абстракции; Вы можете связать напрямую как с экземплярами, так и со списками.
 Marc Gravell30 сент. 2009 г., 13:38
Валютой управляет менеджер валют, который вы получаете по умолчанию при привязке к /IListIListSource; вы просто получаетеБольше контролировать сBindingSource, Так что, если вам это нужно, отлично!BindingSource также предоставляет точки для управления созданием новых элементов для списков, но вы можете сделать это многими другими способами, включая простую реализацию правильныхComponentModel интерфейсы.
 XXXXX30 сент. 2009 г., 14:47
В самом деле. Вы получаете больше контроля, BindingSource дешев в реализации,Является частью стандартной структуры и построен именно для этой цели. Я согласен: ты неиметь использовать BindingSource, но по указанным выше причинам я предпочитаю использовать его, если нетНеопровержимая причина.
 XXXXX30 сент. 2009 г., 13:29
Я не уверен, что вы подразумеваете подчисто как уровень абстракции; там'Фактический код в BindingSource, который выполняет такие вещи, как управление валютой.
Решение Вопроса

в этом случаеэтот" будет достаточно:

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);
 pkuderov22 авг. 2013 г., 19:36
Марк, я могубольше информации об этом трюке, когда вы называете свое событиеxxxChanged для собственностиxxx а затем он обрабатывается за сценой. Можете опубликовать ссылку или хотя бы как называется трюк? Спасибо
 Marc Gravell22 авг. 2013 г., 21:03
@pkuderov theАтрибут - это поведение компилятора - * Изменено применяется во время выполнения. Другие включают такие вещи, как ShouldSerialize  - опять это применяется PropertyDescriptor
 Marc Gravell22 авг. 2013 г., 20:11
Это часть реализации PropertyDescriptor - в основном он ищет шаблон * Измененных событий. Тем не менее, вы также можете обычно использовать INotifyPropertyChanged
 pkuderov22 авг. 2013 г., 20:50
атрибуты именования, когдаxxxAttribute класс может быть использован тогда как разxxx хорошо написано в MSDN. Но это поведение действительно скрыто. Я'мы пытались получить в Google дополнительную информацию об этом, но не смогли (возможно, потому что слово 'изменилось» поиск головоломок) :) в любом случае, спасибо еще раз

которые мне нравится делать, это создаватьпрезентация» слой для формы. Именно в этом слое я объявляю свойства, которые привязаны к элементам управления в форме. В этом случае элемент управления представляет собой текстовое поле.

В этом примере у меня есть форма с текстовым полем для отображения IP-адреса

Теперь мы создадим источник привязки через свойства текстового поля. Выберите DataBindings->Текст. Нажмите стрелку вниз; Выбрать 'Добавить источник данных проекта ».

Это запустит мастер источника данных. Выберите объект. Удар 'Следующий'.

Теперь выберите класс, у которого есть свойство, которое будет ограничено текстовым полем. В этом примере я выбралPNetworkOptions, Выберите Готово, чтобы завершить работу мастера. BindingSource не будет создан.

Следующим шагом является выбор фактического свойства из связанного класса. Из DataBindings->Текст, выберите стрелку вниз и выберите имя свойства, которое будет связано с текстовым полем.

В классе, имеющем ваше свойство, 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);

Ваш ответ на вопрос