warum GetChanges gibt etwas (wenn auf eine Eigenschaft gebunden ist), selbst wenn es keine Änderungen an Datentabelle?

StackOverflow https://stackoverflow.com/questions/408607

  •  03-07-2019
  •  | 
  •  

Frage

Bound GetChanges gibt immer etwas, wenn sie ein UserControl Eigentum gebunden (auch auf einem einfachen)

ich eine UserControl gemacht haben, aus irgendeinem Grund ohne mein Wissen, wenn ich eine DataColumn meiner Kontrolle Eigentum der dataSet1.GetChanges() immer etwas zurückgeben gebunden, auch um die Säule zu meiner Kontrolle gebunden wurde nicht verändert.

Was ist die mögliche Ursache, warum GetChanges immer etwas zurückgeben?

Hier ist ein einfaches Snippet die Bindung / GetChanges Problem zu reproduzieren:


using System;

using System.Data;

using System.Windows.Forms;


namespace BindingBug
{

    public partial class Form1 : Form
    {

        DataSet _ds = new DataSet();

        void GetData()
        {           
            var t = new DataTable
            {
                TableName = "beatles",
                Columns =
                {
                    {"lastname", typeof(string)},
                    {"firstname", typeof(string)},
                    {"middlename", typeof(string)}
                }
            };


            t.Rows.Add("Lennon", "John", "Winston");
            t.Rows.Add("McCartney", "James", "Paul");

            _ds.Tables.Add(t);            
        }

        public string Hey { set; get; }

        public Form1()
        {
            InitializeComponent();

            var tLastname = new TextBox { Top = 100 };
            var tFirstname = new TextBox { Top = 130 };

            this.Controls.Add(tLastname);
            this.Controls.Add(tFirstname);

            GetData();


            tLastname.DataBindings.Add("Text", _ds.Tables["beatles"], "lastname");
            tFirstname.DataBindings.Add("Text", _ds.Tables["beatles"], "firstname");

            // if the following line is commented 2nd:Has Changes == false
            this.DataBindings.Add("Hey", _ds.Tables["beatles"], "middlename");


            _ds.AcceptChanges();


            MessageBox.Show("1st:Has Changes = " + _ds.HasChanges().ToString()); 

            var bDetectChanges = new Button { Top = 160, Text = "Detect Changes" };
            bDetectChanges.Click += 
                delegate 
                {
                    this.BindingContext[_ds.Tables["beatles"]].EndCurrentEdit();
                    MessageBox.Show("2nd:Has Changes = " +  (_ds.GetChanges() != null).ToString()); 
                };

            this.Controls.Add(bDetectChanges);

        }    
    }
} //namespace BindingBug
War es hilfreich?

Lösung

ich in der Lage war, das Problem heute zu lösen, ist der Schlüssel, was den Binding des EndCurrentEdit bewusst zu machen, wenn der Wert wirklich geändert. dafür müssen wir System.ComponentModel.INotifypropertychanged auf unserer Kontrolle implementieren. Ich sah nur die Lösung von hier: http: // msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.propertychanged.aspx

hoffen, dass diese anderen helfen können, ihre eigenen Einstellungen vornehmen, die Flagge falsch Änderung Status auf GetChanges ()

Umsetzung
public partial class Form1 : Form, System.ComponentModel.INotifyPropertyChanged
{
    //----------- implements INotifyPropertyChanged -----------


    // wish C# has this VB.NET's syntactic sugar
    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; // implements INotifyPropertyChanged.PropertyChanged 

    //----------- start of Form1  ----------


    DataSet _ds = new DataSet();



    void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
    }



    void GetData()
    {

        var t = new DataTable
        {
            TableName = "beatles",
            Columns =
            {
                {"lastname", typeof(string)},
                {"firstname", typeof(string)},
                {"middlename", typeof(string)}
            }
        };


        t.Rows.Add("Lennon", "John", "Winston");
        t.Rows.Add("McCartney", "James", "Paul");

        t.Columns["middlename"].DefaultValue = "";

        _ds.Tables.Add(t);            
    }



    string _hey = "";
    public string Hey 
    { 
        set 
        {
            if (value != _hey)
            {
                _hey = value;
                NotifyPropertyChanged("Hey");
            }
        } 
        get 
        {                

            return _hey;  
        } 
    }



    public Form1()
    {
        InitializeComponent();



        var tLastname = new TextBox { Top = 100 };
        var tFirstname = new TextBox { Top = 130 };

        this.Controls.Add(tLastname);
        this.Controls.Add(tFirstname);

        GetData();



        tLastname.DataBindings.Add("Text", _ds.Tables["beatles"], "lastname");
        tFirstname.DataBindings.Add("Text", _ds.Tables["beatles"], "firstname");

        this.DataBindings.Add("Hey", _ds.Tables["beatles"], "middlename");


        _ds.AcceptChanges();




        MessageBox.Show("1st:Has Changes = " + _ds.HasChanges().ToString());

        var bDetectChanges = new Button { Top = 160, Text = "Detect Changes" };
        bDetectChanges.Click +=
            delegate
            {
                this.BindingContext[_ds.Tables["beatles"]].EndCurrentEdit();
                MessageBox.Show("2nd:Has Changes = " + (_ds.GetChanges() != null).ToString());

            };

        this.Controls.Add(bDetectChanges);

    }

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top