Problem with DataBindings, please explain

public partial class Form1 : Form { MyClass myClass = new MyClass("one", "two"); public Form1() { InitializeComponent(); textBox1.DataBindings.Add("Text", myClass, "Text1", false, DataSourceUpdateMode.Never); textBox2.DataBindings.Add("Text", myClass, "Text2", false, DataSourceUpdateMode.Never); } private void saveButton_Click(object sender, EventArgs e) { myClass.Text1 = textBox1.Text; myClass.Text2 = textBox2.Text; //textBox1.DataBindings["Text"].WriteValue(); //textBox2.DataBindings["Text"].WriteValue(); } } public class MyClass : INotifyPropertyChanged { private string _Text1; private string _Text2; public event PropertyChangedEventHandler PropertyChanged; public string Text1 { get { return _Text1; } set { _Text1 = value; OnPropertyChanged(new PropertyChangedEventArgs("Text1")); } } public string Text2 { get { return _Text2; } set { _Text2 = value; OnPropertyChanged(new PropertyChangedEventArgs("Text2")); } } public MyClass(string text1, string text2) { Text1 = text1; Text2 = text2; } protected void OnPropertyChanged(PropertyChangedEventArgs e) { if (PropertyChanged != null) PropertyChanged(this, e); } } 

I think I understand what I'm trying to achieve. I want my form to save the changes made in my two TextBox es to myClass . But whenever I press the save button after editing both text fields and saveButton_Click is called, the second textBox2 Text returns to the original text (โ€œtwoโ€). I tried using the Binding WriteValue function, but the same thing happens. Using .net 4.0.

Edit Thanks for your answers, but I don't need workarounds. I can find them myself. I just need to understand a little better how binding works. I would like to understand why this is happening?

+4
source share
2 answers

Apparently, updating any value in the data source will update all the bindings. This explains the behavior (setting myClass.Text1 causes myClass.Text1 be updated with the current value myClass.Text2 ). Unfortunately, a few posts I could find simply said, "how does it work."

One way to handle this is to create a BindingSource , set BindingSource.DataSource = myClass , and then bind your text fields to BindingSource .

BindingSource raises ListChanged events if the main data source is a list and items are added, deleted, etc., or if the properties of the DataSource changed. You can suppress these events by setting BindingSource.RaiseListChangedEvents to false , which allows you to set multiple properties on myClass without updating the data binding of the associated controls.

 public partial class Form1 : Form { MyClass myClass = new MyClass("one", "two"); BindingSource bindingSource = new BindingSource(); public Form1() { InitializeComponent(); bindingSource.DataSource = myClass; textBox1.DataBindings.Add("Text", bindingSource, "Text1", true, DataSourceUpdateMode.Never); textBox2.DataBindings.Add("Text", bindingSource, "Text2", true, DataSourceUpdateMode.Never); } private void button1_Click(object sender, EventArgs e) { bindingSource.RaiseListChangedEvents = false; myClass.Text1 = textBox1.Text; myClass.Text2 = textBox2.Text; bindingSource.RaiseListChangedEvents = true; } } 

NTN

+5
source

You need to change the way data is bound. Try it.

 MyClass myClass = new MyClass("one", "two"); public Form1() { InitializeComponent(); textBox1.DataBindings.Add("Text", myClass, "Text1", false, DataSourceUpdateMode.OnPropertyChanged); textBox2.DataBindings.Add("Text", myClass, "Text2", false, DataSourceUpdateMode.OnPropertyChanged); } private void saveButton_Click(object sender, EventArgs e) { // your object should already have new text values entered. // Save your object! //myClass.Text1 = textBox1.Text; //myClass.Text2 = textBox2.Text; //textBox1.DataBindings["Text"].WriteValue(); //textBox2.DataBindings["Text"].WriteValue(); } 

The key is DataSourceUpdateMode, this will allow the text property of the text field to be cascaded into your custom object whenever the property changes. Hope this helps.

[change]

I believe what you need to do to achieve what you are asking for: TextBox1.DataBindings[0].ControlUpdateMode = ControlUpdateMode.Never This link should contain additional information.

+1
source

All Articles