Gil
Gil

Reputation: 33

Datagridview bound to object - Making the new rows appear blank

I have a Datagridview that changes its content according to a selection the user makes in a listBox. The DGV consits of 2 comboboxes (Country, Product) and 1 textbox (Quantity).

I've created a class combined of 3 integers. This class is used as a type of list, which is the datasource for the DGV. There is also another list containing the prior list, so I have a list of datasources.

The DGV's datasource is a BindingSource that changes whenever the SelectedIndex of the listBox is fired.

My problem occurs whenever a new row is added to the DGV: I use the BindingSource.AddNew which calls the constructor of the class, but it must assign values to each item in the class. That way, whenever I click any cell in the DGV I don't get a blank row. Moreover, when the BS changes and then returned, another row is added.

What I want to get is a blank row - empty comboboxes and textbox.

Thanks for your help!

The class:

    Public Class PoList
    Private _CountryID As Integer
    Private _ProductID As Integer
    Private _Quantity As Integer

    Public Sub New(ByVal CountryID As Integer, ByVal ProductID As Integer, ByVal Quantity As Integer)
        _CountryID = CountryID
        _ProductID = ProductID
        _Quantity = Quantity
    End Sub

    Private Sub New()
        _CountryID = 1
        _ProductID = 2
        _Quantity = Nothing
    End Sub

    Public Property CountryID() As Integer
        Get
            Return _CountryID
        End Get
        Set(ByVal value As Integer)
            _CountryID = value
        End Set
    End Property

    Public Property ProductID() As Integer
        Get
            Return _ProductID
        End Get
        Set(ByVal value As Integer)
            _ProductID = value
        End Set
    End Property

    Public Property Quantity() As Integer
        Get
            Return _Quantity
        End Get
        Set(ByVal value As Integer)
            _Quantity = value
        End Set
    End Property

    Public Shared Function CreateNewPoList() As PoList
        Return New PoList
    End Function
End Class

Private Sub List_AddRow(ByVal sender As Object, ByVal e As AddingNewEventArgs) Handles AllListBindingSource.AddingNew
    e.NewObject = PoList.CreateNewPoList
End Sub

Creating a new inner list:

AllList.Add(New List(Of PoList))
AllListBindingSource.AddNew()
AllListBindingSource.DataSource = AllList(TableCounter)
AddPoDetails.DataSource = AllListBindingSource

SelectedIndexChanged event:

AllListBindingSource.DataSource = AllList(AddPoList.SelectedIndex)
AddPoDetails.DataSource = Nothing
AddPoDetails.DataSource = AllListBindingSource

Upvotes: 0

Views: 1101

Answers (1)

WozzeC
WozzeC

Reputation: 2660

Right, lets see if I can help you. As I interpret it you have a list filled with lists. These lists don't know their own identity and is based on the current index in the list.

First of I wouldn't use Bindingsource.AddNew I would add the new object straight to the list instead.

AllList(TableCounter).Add(New Polist())

This way you know exactly how many objects has been created, by using events you aren't quite sure are you. To refresh the list do this:

AllListBindingSource.ResetBindings(true)

Which will update your DGV with the new line.

Now you need to restructure your class since when you create a new Polist you set a value to nothing. This will crash your table. What you need to do is this:

Private _Quantity As String

Public Property Quantity() As String
        Get
           Return _Quantity
        End Get
        Set(ByVal value As String)
           _Quantity = value
        End Set
End Property

Using a string is the only way for you to get a blank textbox, I would recommend you to have 0 as default if you are using Quantity as an integer (which you should). Your constructor needs to be changed to this:

Private Sub New()
  _CountryID = 0            
  _ProductID = 0            
  _Quantity = ""
End Sub

In your combobox columns you have to add a blank item in the top (I'm guessing your adding them manually), should be possible by having a blank row in the top of the items.

Upvotes: 0

Related Questions