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 绑定到对象 - 使新行显示为空白的主要内容,如果未能解决你的问题,请参考以下文章