لماذا GetChanges بإرجاع شيء (عندما يتجهون إلى خاصية) حتى لو كانت هناك أي تغييرات على DataTable و؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

وGetChanges ملزمة دوما بإرجاع شيء عندما يتجهون إلى العقار UserControl (حتى على واحد بسيط)

ولقد جعلت من UserControl، لسبب غير معروف لللي، عندما كنت منضما إلى DataColumn ممتلكاتي التحكم في dataSet1.GetChanges() دوما بإرجاع شيء، حتى العمود المنضم لإرادتي لم يتغير.

ما هو السبب المحتمل لماذا GetChanges دوما بإرجاع شيء؟

وفيما يلي مقتطف بسيط لإنتاج ملزمة / GetChanges المشكلة:


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
هل كانت مفيدة؟

المحلول

وكنت قادرا على حل المشكلة اليوم، والشيء الرئيسي هو جعل EndCurrentEdit وBindingContext في علم إذا كانت قيمة <م> حقا تغير. لهذا، يجب علينا أن ننفذ System.ComponentModel.INotifypropertychanged على سيطرتنا. رأيت فقط الحل من هنا: HTTP: // msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.propertychanged.aspx

ونأمل أن يكون هذا يمكن أن يساعد الآخرين تنفيذ الضوابط الخاصة بها العلم الذي الخطأ <م> تغير حالة على GetChanges ()

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

    }

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top