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

Posted

技术标签:

【中文标题】Datagridview 绑定到对象 - 使新行显示为空白【英文标题】:Datagridview bound to object - Making the new rows appear blank 【发布时间】:2012-12-03 11:31:59 【问题描述】:

我有一个 Datagridview,它根据用户在列表框中所做的选择来更改其内容。 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

【问题讨论】:

编辑我的帖子。希望我得到所有相关的行 您能否提供有关如何创建 DGV 组合框列以及项目表的外观的 sn-p? 【参考方案1】:

好吧,让我看看能不能帮你。 正如我所解释的那样,您有一个充满列表的列表。这些列表不知道自己的身份,并且基于列表中的当前索引。

首先我不会使用 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

在您的组合框列中,您必须在顶部添加一个空白项目(我猜您是手动添加的),应该可以通过在项目顶部添加一个空白行来实现。

【讨论】:

感谢您的快速回答!问题是这些组合框绑定到数据表,并且值不能是字符串 - 它们必须是整数。 所以你说的是你想要一个空白文本框和空白组合框。但是您已经设置了整个内容,因此不允许使用空白文本框和空白组合框。你在你的逻辑中看到问题了吗? 我的两分钱,要么完全改变设置,要么决定一个你可以认为是空白的默认状态。 我正在尝试实现与将其绑定到 DataTable 时相同的行为。那时您的组合框会充满项目,但会显示第一个空项目。

以上是关于Datagridview 绑定到对象 - 使新行显示为空白的主要内容,如果未能解决你的问题,请参考以下文章

无法刷新绑定到 DataTable 的 DataGridView

c# datagridview主要方法

C# DataGridView控件动态添加新行

在按钮单击时在有界 dataGridView 中添加新行

将对象数组绑定到 DataGridView 控件

将实体框架对象绑定到 Datagridview C#