[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 494
  • Last Modified:

Databound DataGridView not refreshing correctly

I have a form that contains a datagridview with it's datasource set to a bindinglist(of T) and several controls.  When a row is selected in the datagridview, I bind that row's DataBoundItem properties to the controls.  When I need a new record, the user clicks an "Add New" button which in turn adds a record the BindingList(of T).  All of this works and I see the new row in the datagridview, however; when I edit the values using the controls, the datagridview only reflects the first value I change.  If I then change rows in the datagridview or highlight the current row, the values update.  How can I get the datagridview to keep in sync with the underlying datasource?

A short example:
Imports System.ComponentModel

Public Class frmMisc
Private Class Test
        Public Sub New()
        End Sub

        Public Sub New(ByVal one As String,
                       ByVal two As String)
            Me.One = one
            Me.Two = two
        End Sub

        Public Property One
        Public Property Two
    End Class

    Private _data As BindingList(Of Test)


    Private Sub Misc_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        _data = New BindingList(Of Test)
        _data.Add(New Test("1", "2"))
        DataGridView1.DataSource = _data
    End Sub

    Private Sub DataGridView1_RowEnter(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.RowEnter
        Dim row As Test = DataGridView1.Rows(e.RowIndex).DataBoundItem
        If row IsNot Nothing Then
            TextBox1.DataBindings.Clear()
            TextBox1.DataBindings.Add("Text", row, "One")
            TextBox2.DataBindings.Clear()
            TextBox2.DataBindings.Add("Text", row, "Two")
        End If
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        _data.Add(New Test)
    End Sub
End Class

Open in new window


I didn't include the designer code for brevity.

Thanks,
Lance
0
melance42
Asked:
melance42
  • 2
  • 2
2 Solutions
 
grayeCommented:
You need to add the WithEvents key word when defining your BindingList.  For example:

Private WithEvents _data As BindingList(Of Test)

http://msdn.microsoft.com/en-us/library/aty3352y(v=VS.90).aspx
0
 
melance42Author Commented:
Graye,
I added the WithEvents key word and it I still don't see the data grid view syncing with the object.  Am I going to have to force a data refresh in the data grid view inside of the BindingList events?  It seems there should be a way to do this without having to force the binding to update manually.

Thanks,
Lance

You need to add the WithEvents key word when defining your BindingList.  For example:

Private WithEvents _data As BindingList(Of Test)

http://msdn.microsoft.com/en-us/library/aty3352y(v=VS.90).aspx
0
 
grayeCommented:
There's a pretty good example at the bottom of this page.  It shows how to configure the bindinglist to allow add/remove and to raise events upon changes

http://msdn.microsoft.com/en-us/library/ms132679.aspx
0
 
melance42Author Commented:
Graye,
Thanks for the link.  It still isn't acting in the exact manner that I would like, however; if I handle the validated event of my detail controls and call the ResetBindings method things seem to work well enough.  I just hate to have to handle all of those events.

Thanks,
Lance
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now