Datagridview绑定到对象 - 使新行显示为空白

时间:2012-12-03 11:32:00

标签: vb.net datagridview datagridviewcombobox

我有一个Datagridview,它根据用户在listBox中所做的选择来更改其内容。 DGV由2个组合框(国家,产品)和1个文本框(数量)组成。

我创建了一个由3个整数组成的类。 此类用作列表类型,它是DGV的数据源。 还有另一个包含先前列表的列表,所以我有一个数据源列表。

DGV的数据源是一个BindingSource,每当触发listBox的SelectedIndex时它就会发生变化。

每当向DGV添加新行时,都会出现问题: 我使用BindingSource.AddNew来调用类的构造函数,但它必须为类中的每个项目赋值。这样,每当我点击DGV中的任何单元格时,我都不会得到空行。 此外,当BS更改然后返回时,会添加另一行。

我想得到的是一个空行 - 空组合框和文本框。

感谢您的帮助!

班级:

    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

创建新的内部列表:

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

SelectedIndexChanged事件:

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

1 个答案:

答案 0 :(得分:0)

是的,让我们看看我是否可以帮到你。 正如我解释它,你有一个列表填充列表。这些列表不知道自己的身份,并且基于列表中的当前索引。

首先我不会使用Bindingsource.AddNew我会将新对象直接添加到列表中。

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

通过使用您不太确定的事件,您可以确切地知道已创建了多少对象。 要刷新列表,请执行以下操作:

AllListBindingSource.ResetBindings(true)

这将使用新行更新您的DGV。

现在您需要重新构建类,因为在创建新Polist时,您将值设置为空。这会使你的桌子崩溃。你需要做的是:

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

使用字符串是获取空白文本框的唯一方法,如果您使用Quantity作为整数(我应该使用),我建议您默认为0。您的构造函数需要更改为:

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

在你的组合框列中,你必须在顶部添加一个空白项目(我猜你手动添加它们),应该可以在项目顶部添加一个空行。