How do I add a new row to a binding source

Ken picture Ken · Aug 11, 2016 · Viewed 13.7k times · Source

I am trying to programmatically add a new row to a binding source . I know calling the bsSource.AddNew() adds a new row which I cast as a DataRowView and I set my values. My problem is this - the DataRowView.Row shows a RowState of detached. I do not want it to be detached ; I believe it should show added - I also do NOT want it to commit the change to the database (There is a very valid reason for this). I want to pick the time for that later. My code is as follows:

private Sub AddToRelationSource(binID As Integer, gradeID As Integer, IsChecked As Boolean)
            Dim drv As DataRowView = DirectCast(bsBinGrades.AddNew(), DataRowView)


            drv.Row("IsSelected") = IsChecked
            drv.Row("BinID") = binID
            drv.Row("GradeID") = gradeID
    ' I tried drv.EmdEdit(0 drv.Row.EndEdit() - Row State still shows detached

End Sub

Answer

Ken picture Ken · Aug 15, 2016

The BindingSource AddNew method does not actually add a new record to the underlying datasource , it simply adds it to the bindingsource as a detached item. When using the datatabel as a datasource I needed to get the datatable and use the AddRow() method - this properly set the value in my bindingsource to added so that when the changes would be committed to the database on bindingsource.Update() method.

The code I used:

    Dim drv As DataRowView = DirectCast(bsData.AddNew(), DataRowView)

    drv.BeginEdit()

    drv.Row.BeginEdit()

    drv.Row("IsSelected") = IsChecked

    drv.Row.EndEdit()

    drv.DataView.Table.Rows.Add(drv.Row)

The last line is what actually added the item to the datasource - I misunderstood BindingSource.AddNew() .