Binding data to form controls

  • Thread starter Dries De Rudder
  • Start date
D

Dries De Rudder

Hi,

I am trying to bind an object to form controls. I've got an object
MyObject which has some properties e.g. ID.

I've got a form, Form1, that contains a textbox ,TextBox1, now I want to
bind the value of the ID-property of a MyObject-object to the TextBox1.

I've tried doing this:

- Form1 has a private field 'private MyObject myObject;'
- Form1 has a public property 'public MyObject MyObject' to get and set
the value of 'myObject'.
- in the Form1 constructor I placed:
this.TextBox1.DataBindings.Add("Text",this.myObject,"ID");

I expected this to work, but when I change the value of the MyObject
property of Form1, de value of TextBox1 is not updated to the value of
the new MyObject.ID property.

What is the best way to bind the values of an object's properties to
form controls?

thanks in advance,
Dries
 
M

Marc Gravell

See my post titled "Re: Databinding to business object" on the 1st Dec;
basically:

* To get the UI to update based on values, you need to correctly implement
the INotifyPropertyChanged interface
* You may (not 100% sure) get better results binding to a BindingSource
rather than the object directly, and then adding your object to the
BindingSource via a List<T> of your object(s)

Marc
 
M

Marc Gravell

Re-reading your post, and seeing that it is the *instance* that is changing,
and not properties, then definitely the BindingSource option will help; full
example (which works with both instance and property changes) follows - just
put in a Main method;

The "Reset" button changes the instance; the "Append" button changes a value
on the current instance. Note that this would also work (without changes)
with a form that supports navigation of multiple items - just instead of
completely wiping _source, just .Add() a new member.

Hope this helps,

Marc

public class MyClass : INotifyPropertyChanged {
private string _myField = string.Empty;
public string MyProperty {
get { return _myField; }
set {
if (_myField != value) {
_myField = value;
OnPropertyChanged("MyProperty");
}
}
}
protected void OnPropertyChanged(string propertyName) {
if (PropertyChanged != null)
PropertyChanged(this, new
PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
public class Form1 : Form {
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Button reset, append;
private BindingSource _source;
public Form1() {
// designer init: put a textbox and 2 buttons on the form
InitializeComponent();
// initialise the data-bindings
_source = new BindingSource();
_source.DataSource = typeof(MyClass);
_source.CurrentChanged += new
EventHandler(_source_CurrentChanged);
textBox1.DataBindings.Add("Text", _source, "MyProperty");
// setup events on 2 buttons
reset.Click += delegate { Instance = new MyClass(); };
append.Click+=delegate {Instance.MyProperty+="a";};
// setup an initial object
Instance = new MyClass();
}

void _source_CurrentChanged(object sender, EventArgs e) {
_instance = (MyClass)_source.Current;
}
private MyClass _instance;
public MyClass Instance {
get { return _instance; }
set {
if (!ReferenceEquals(value, _instance)) {
_source.DataSource = new List<MyClass>(new MyClass[] {
value });
}
}
}

private void InitializeComponent() {
textBox1 = new System.Windows.Forms.TextBox();
reset = new System.Windows.Forms.Button();
append = new System.Windows.Forms.Button();
textBox1.Location = new System.Drawing.Point(20, 20);
reset.Location = new System.Drawing.Point(20, 50);
reset.Text = "Reset";
append.Location = new System.Drawing.Point(20, 80);
append.Text = "Append";
Controls.AddRange(new Control[] {textBox1,reset,append});
}
}
 
D

Dries De Rudder

The BindingSource works perfect!!

thanks a lot

Marc said:
Re-reading your post, and seeing that it is the *instance* that is changing,
and not properties, then definitely the BindingSource option will help; full
example (which works with both instance and property changes) follows - just
put in a Main method;

The "Reset" button changes the instance; the "Append" button changes a value
on the current instance. Note that this would also work (without changes)
with a form that supports navigation of multiple items - just instead of
completely wiping _source, just .Add() a new member.

Hope this helps,

Marc

public class MyClass : INotifyPropertyChanged {
private string _myField = string.Empty;
public string MyProperty {
get { return _myField; }
set {
if (_myField != value) {
_myField = value;
OnPropertyChanged("MyProperty");
}
}
}
protected void OnPropertyChanged(string propertyName) {
if (PropertyChanged != null)
PropertyChanged(this, new
PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
public class Form1 : Form {
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Button reset, append;
private BindingSource _source;
public Form1() {
// designer init: put a textbox and 2 buttons on the form
InitializeComponent();
// initialise the data-bindings
_source = new BindingSource();
_source.DataSource = typeof(MyClass);
_source.CurrentChanged += new
EventHandler(_source_CurrentChanged);
textBox1.DataBindings.Add("Text", _source, "MyProperty");
// setup events on 2 buttons
reset.Click += delegate { Instance = new MyClass(); };
append.Click+=delegate {Instance.MyProperty+="a";};
// setup an initial object
Instance = new MyClass();
}

void _source_CurrentChanged(object sender, EventArgs e) {
_instance = (MyClass)_source.Current;
}
private MyClass _instance;
public MyClass Instance {
get { return _instance; }
set {
if (!ReferenceEquals(value, _instance)) {
_source.DataSource = new List<MyClass>(new MyClass[] {
value });
}
}
}

private void InitializeComponent() {
textBox1 = new System.Windows.Forms.TextBox();
reset = new System.Windows.Forms.Button();
append = new System.Windows.Forms.Button();
textBox1.Location = new System.Drawing.Point(20, 20);
reset.Location = new System.Drawing.Point(20, 50);
reset.Text = "Reset";
append.Location = new System.Drawing.Point(20, 80);
append.Text = "Append";
Controls.AddRange(new Control[] {textBox1,reset,append});
}
}

See my post titled "Re: Databinding to business object" on the 1st Dec;
basically:

* To get the UI to update based on values, you need to correctly implement
the INotifyPropertyChanged interface
* You may (not 100% sure) get better results binding to a BindingSource
rather than the object directly, and then adding your object to the
BindingSource via a List<T> of your object(s)

Marc
 
M

Marc Gravell

you're welcome

Dries De Rudder said:
The BindingSource works perfect!!

thanks a lot

Marc said:
Re-reading your post, and seeing that it is the *instance* that is
changing, and not properties, then definitely the BindingSource option
will help; full example (which works with both instance and property
changes) follows - just put in a Main method;

The "Reset" button changes the instance; the "Append" button changes a
value on the current instance. Note that this would also work (without
changes) with a form that supports navigation of multiple items - just
instead of completely wiping _source, just .Add() a new member.

Hope this helps,

Marc

public class MyClass : INotifyPropertyChanged {
private string _myField = string.Empty;
public string MyProperty {
get { return _myField; }
set {
if (_myField != value) {
_myField = value;
OnPropertyChanged("MyProperty");
}
}
}
protected void OnPropertyChanged(string propertyName) {
if (PropertyChanged != null)
PropertyChanged(this, new
PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
public class Form1 : Form {
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Button reset, append;
private BindingSource _source;
public Form1() {
// designer init: put a textbox and 2 buttons on the form
InitializeComponent();
// initialise the data-bindings
_source = new BindingSource();
_source.DataSource = typeof(MyClass);
_source.CurrentChanged += new
EventHandler(_source_CurrentChanged);
textBox1.DataBindings.Add("Text", _source, "MyProperty");
// setup events on 2 buttons
reset.Click += delegate { Instance = new MyClass(); };
append.Click+=delegate {Instance.MyProperty+="a";};
// setup an initial object
Instance = new MyClass();
}

void _source_CurrentChanged(object sender, EventArgs e) {
_instance = (MyClass)_source.Current;
}
private MyClass _instance;
public MyClass Instance {
get { return _instance; }
set {
if (!ReferenceEquals(value, _instance)) {
_source.DataSource = new List<MyClass>(new MyClass[]
{ value });
}
}
}

private void InitializeComponent() {
textBox1 = new System.Windows.Forms.TextBox();
reset = new System.Windows.Forms.Button();
append = new System.Windows.Forms.Button();
textBox1.Location = new System.Drawing.Point(20, 20);
reset.Location = new System.Drawing.Point(20, 50);
reset.Text = "Reset";
append.Location = new System.Drawing.Point(20, 80);
append.Text = "Append";
Controls.AddRange(new Control[] {textBox1,reset,append});
}
}

See my post titled "Re: Databinding to business object" on the 1st Dec;
basically:

* To get the UI to update based on values, you need to correctly
implement the INotifyPropertyChanged interface
* You may (not 100% sure) get better results binding to a BindingSource
rather than the object directly, and then adding your object to the
BindingSource via a List<T> of your object(s)

Marc


Hi,

I am trying to bind an object to form controls. I've got an object
MyObject which has some properties e.g. ID.

I've got a form, Form1, that contains a textbox ,TextBox1, now I want to
bind the value of the ID-property of a MyObject-object to the TextBox1.

I've tried doing this:

- Form1 has a private field 'private MyObject myObject;'
- Form1 has a public property 'public MyObject MyObject' to get and set
the value of 'myObject'.
- in the Form1 constructor I placed:
this.TextBox1.DataBindings.Add("Text",this.myObject,"ID");

I expected this to work, but when I change the value of the MyObject
property of Form1, de value of TextBox1 is not updated to the value of
the new MyObject.ID property.

What is the best way to bind the values of an object's properties to
form controls?

thanks in advance,
Dries
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top