การรวมข้อมูลหลายช่องใน UI ไม่ได้อัปเดต

ฉันมี winform ที่มีbindingsourceซึ่งแหล่งข้อมูลเป็นชุดข้อมูลที่พิมพ์ ฉันได้ผูกกล่องข้อความสองกล่องไว้ในคอลัมน์เดียวกันของนักออกแบบ เมื่อฉันอัปเดตกล่องข้อความคอลัมน์ DataRow ใน DatSet จะได้รับการอัปเดตอย่างถูกต้อง แต่ค่ากล่องข้อความอื่นในแบบฟอร์มไม่ได้รับการอัพเดต

ฉันพลาดอะไรไป? ฉันจะรับ databindings เพื่ออัปเดตกล่องข้อความที่สองได้อย่างไร

หมายเหตุ: นี่เป็นตัวอย่างง่ายๆ ที่ฉันต้องทำสิ่งนี้ เนื่องจากในแอปพลิเคชันจริง เนื่องจากตัวควบคุมหนึ่งสามารถแก้ไขได้โดยผู้ใช้ ส่วนอีกตัวควบคุมหนึ่งเป็นอินพุตในตัวควบคุมแบบผสมสำหรับการคำนวณ

// Taken from InitializeComponent()
this.productsBindingSource.DataMember = "Products";    
this.productsBindingSource.DataSource = this.dataSet1;
this.textBox1.DataBindings.Add(new Binding("Text", this.productsBindingSource, "UnitsInStock", true, DataSourceUpdateMode.OnPropertyChanged));
this.textBox2.DataBindings.Add(new Binding("Text", this.productsBindingSource, "UnitsInStock", true, DataSourceUpdateMode.OnPropertyChanged));

// Taken from Form Load Event          
DataSet1TableAdapters.ProductsTableAdapter adapter = new DataSet1TableAdapters.ProductsTableAdapter();
adapter.Fill(dataSet1.Products);

person John Hunter    schedule 08.03.2011    source แหล่งที่มา


คำตอบ (2)


มีบทความเกี่ยวกับ MSDN ซึ่งอาจช่วยได้ - ดู อย่างไร ถึง: ตรวจสอบให้แน่ใจว่าการควบคุมหลายรายการที่เชื่อมโยงกับแหล่งข้อมูลเดียวกันยังคงซิงโครไนซ์อยู่

โดยพื้นฐานแล้ว คุณต้องตั้งค่าตัวจัดการเหตุการณ์สำหรับเหตุการณ์ BindingComplete ของ BindingSource (ดังที่คุณได้ดำเนินการไปแล้ว คุณจะต้องตั้งค่า FormattingEnabled เป็น True เพื่อให้สิ่งนี้ทำงานได้)

จากนั้นในตัวจัดการเหตุการณ์ BindingComplete คุณมีรหัสนี้:

    private void productsBindingSource_BindingComplete(object sender, BindingCompleteEventArgs e)
        {
            // Check if the data source has been updated, 
            // and that no error has occured.
            if (e.BindingCompleteContext == BindingCompleteContext.DataSourceUpdate && e.Exception == null)
            {
                // End the current edit.
                e.Binding.BindingManagerBase.EndCurrentEdit();
            }
        }
person stuartd    schedule 08.03.2011
comment
น่าเสียดายที่สิ่งนี้ใช้ไม่ได้สำหรับฉัน เนื่องจากตัวควบคุมแบบผสมจะคำนวณใหม่ ซึ่งเขียนฟิลด์อื่นกลับไปยังแหล่งข้อมูลที่ทำให้เกิดการวนซ้ำ นอกจากนี้ รู้สึกเหมือนเป็นการแฮ็กเล็กน้อยในการดำเนินการทั้งแถวทุกครั้งที่คุณแก้ไขคุณสมบัติเดียว - person John Hunter; 08.03.2011

ดังนั้นวิธีแก้ปัญหาของฉันคือการใช้ INotifyPropertyChanged ในคลาส Typed Data Row เนื่องจากผู้ออกแบบเปิดเผยเป็นคลาสบางส่วนซึ่งค่อนข้างตรงไปตรงมาจากนั้นตั้งค่าแหล่งข้อมูลของ Bindingsource ให้เป็นแถวข้อมูลนั่นเอง

public partial class MyDataRow : INotifyPropertyChanged
{
    public void AddEventHandler()
    {
        this.Table.ColumnChanged += new System.Data.DataColumnChangeEventHandler(Table_ColumnChanged);
    }

    void Table_ColumnChanged(object sender, System.Data.DataColumnChangeEventArgs e)
    {
        OnPropertyChanged(e.Column.ColumnName);
    }
    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion
}

รหัสในการผูกข้อมูล

MyDataRow row = <Get Current Row>;
row.AddEventHandler();
bindingSource1.DataSource = row;
person John Hunter    schedule 09.03.2011