persisting Bindinglist of Business Objects back to the databse

3 posts, 0 answers
  1. Jonathan
    Jonathan avatar
    134 posts
    Member since:
    Sep 2007

    Posted 21 Feb 2012 Link to this post

    In this online doc topic: http://www.telerik.com/help/winforms/gridview-populating-with-data-binding-to-bindinglist.html

    it shows how to bind a bindinglist of business objects to the gridview.  I can see that the ListChanged event can be trapped for insert and delete and changes persisted to the database.  my question is:  how does one persist edits made in the grid that immeditaly update the underlying binding list back to the database?  what bindinglist event should I subscribe to for the update?  how do I get the index of the edited row from this event?

    Do you have an working example of persisting a gridview/bindinglist back to a database without using a LINQ context or an ORM?

    Thanks,
    Jonathan
  2. Jonathan
    Jonathan avatar
    134 posts
    Member since:
    Sep 2007

    Posted 21 Feb 2012 Link to this post

    Oh I see in the article below states:

    "business object type that implements INotifyPropertyChanged and the list will automatically convert the PropertyChanged events to ListChanged events"

    so that means I can ge the update too. cool! 

    http://msdn.microsoft.com/en-us/library/xz45s2bh.aspx


  3. Julian Benkov
    Admin
    Julian Benkov avatar
    1135 posts

    Posted 23 Feb 2012 Link to this post

    Hello Jonathan,

    You can read also our article about this topic here. The other alternative method for updating is to use a set of events of RadGridView control to achieve auto save functionality. Here is a sample:

    using System;
    using System.Data;
    using System.Windows.Forms;
    using System.Collections.Generic;
    using System.ComponentModel;
     
    namespace Lab
    {
        public partial class AutoSavingDataForm : Form
        {
            private List<DataRowView> lastRemovedRows = new List<DataRowView>();
     
            public AutoSavingDataForm()
            {
                InitializeComponent();
     
                this.radGridView1.UserAddedRow += new Telerik.WinControls.UI.GridViewRowEventHandler(radGridView1_UserAddedRow);
                this.radGridView1.UserDeletingRow += new Telerik.WinControls.UI.GridViewRowCancelEventHandler(radGridView1_UserDeletingRow);
                this.radGridView1.UserDeletedRow += new Telerik.WinControls.UI.GridViewRowEventHandler(radGridView1_UserDeletedRow);
                this.radGridView1.CurrentRowChanged += new Telerik.WinControls.UI.CurrentRowChangedEventHandler(radGridView1_CurrentRowChanged);
                this.radGridView1.CellValueChanged += new Telerik.WinControls.UI.GridViewCellEventHandler(radGridView1_CellValueChanged);
     
                this.radGridView1.RowsChanged += new Telerik.WinControls.UI.GridViewCollectionChangedEventHandler(radGridView1_RowsChanged);
            }
     
            private void Form18_Load(object sender, EventArgs e)
            {
                // TODO: This line of code loads data into the 'adventureWorksDataSet.Contact' table. You can move, or remove it, as needed.
                this.contactTableAdapter.FillBy(this.adventureWorksDataSet.Contact, null);
            }
     
            void radGridView1_RowsChanged(object sender, Telerik.WinControls.UI.GridViewCollectionChangedEventArgs e)
            {
                if (e.Action == Telerik.WinControls.Data.NotifyCollectionChangedAction.Add)
                {
                    //your logic here...
                }
            }
     
            void radGridView1_CellValueChanged(object sender, Telerik.WinControls.UI.GridViewCellEventArgs e)
            {
                IEditableObject editbaleObject = e.Row.DataBoundItem as IEditableObject;
                if (editbaleObject != null)
                {
                    editbaleObject.EndEdit();
                }
     
                //update data
                DataRowView dataRowView = e.Row.DataBoundItem as DataRowView;
                if (dataRowView != null)
                {
                    this.contactTableAdapter.Update(dataRowView.Row);
                }
            }
     
            void radGridView1_UserDeletingRow(object sender, Telerik.WinControls.UI.GridViewRowCancelEventArgs e)
            {
                for (int i = 0; i < e.Rows.Length; i++)
                {
                    DataRowView dataRowView = e.Rows[i].DataBoundItem as DataRowView;
                    if (dataRowView != null)
                    {
                        this.lastRemovedRows.Add(dataRowView);
                    }
                }
            }
     
            void radGridView1_CurrentRowChanged(object sender, Telerik.WinControls.UI.CurrentRowChangedEventArgs e)
            {
                if (e.OldRow == null)
                {
                    return;
                }
     
                DataRowView dataRowView = e.OldRow.DataBoundItem as DataRowView;
                if (dataRowView != null)
                {
                    DataRow dataRow = dataRowView.Row;
                    if ( dataRow.RowState == DataRowState.Modified)
                    {
                        this.contactTableAdapter.Update(dataRow);
                    }
                }
            }
     
            void radGridView1_UserDeletedRow(object sender, Telerik.WinControls.UI.GridViewRowEventArgs e)
            {
                DataRow[] rows = new DataRow[this.lastRemovedRows.Count];
     
                for (int i = 0; i < this.lastRemovedRows.Count; i++)
                {
                    rows[i] = this.lastRemovedRows[i].Row;
                }
     
                this.contactTableAdapter.Update(rows);
                this.lastRemovedRows.Clear();
            }
     
            void radGridView1_UserAddedRow(object sender, Telerik.WinControls.UI.GridViewRowEventArgs e)
            {
                DataRow[] rows = new DataRow[e.Rows.Length];
                for (int i = 0; i < e.Rows.Length; i++)
                {
                    DataRowView dataRowView = e.Rows[i].DataBoundItem as DataRowView;
                    if (dataRowView != null)
                    {
                        rows[i] = this.lastRemovedRows[i].Row;
                    }
                }
     
                this.contactTableAdapter.Update(rows);
            }
        }
    }

    I hope this helps.

    Regards,
    Julian Benkov
    the Telerik team
    RadControls for WinForms Q1'12 release is now live! Check out what's new or download a free trial >>
Back to Top