使用两个数据表,按 ID 和计数分组,然后减去,然后更新行
Using two datatables, group by ID and count, then subtract, then update rows
我将 Visual Studio 与 vb.net、asp.net 和网络表单一起使用。
我填充了两个数据表并将一些值放入两个复选框列表(填充可用复选框列表和填充活动复选框列表)。一切都很好。
这是我遇到的问题,需要帮助。
第一步:在“可用”中,我有一个名为 ID 的列。 ID 值是唯一的,如 1、2、3、4 等。在 Active 中,我有对应的 ID,但可以有多个,例如 1、1、2、3、1、4 等。所以我需要做的是计算每个 ID 中有多少个处于活动状态。比如1,1,2,3,1,4中有3个1,1个2,1个3,1个4,怎么办?
第二步:完成后,我需要做减法。我需要查看 MaxAccount 是什么(例如 5)并从步骤 1 中减去它。例如,如果 MaxAccount 是 5 并且我有三个 1,则 5 - 3 = 2。
第三步:我需要用第 2 步中的值更新 AccountTotal。
您可以看到我尝试在 UpdateAccountTotal() 上对此进行编码,但只是卡住了。
更新 AccountTotal
Private Function UpdateAccountTotal() As DataTable
Dim dtDefaultAvailable As New DataTable
dtDefaultAvailable = ViewState("vsDefaultAvailable")
Dim dtDefaultActive As New DataTable
dtDefaultActive = ViewState("vsDefaultActive")
Dim dtDefaultAmount As New DataTable
ViewState("vsDefaultAmounts") = dtDefaultAmount
For Each rowAvailable In dtDefaultAvailable.Rows
Dim maxAccount = rowAvailable("MaxAccount").ToString()
'For Each rowActive In dtDefaultActive.Rows
'Dim ID = rowAvailable("ID").ToString()
'Dim countID = ID.Count
Next
End Function
我可能不会这样做,但是:
For Each rowAvailable as DataRow In dtDefaultAvailable.Rows
Dim maxAccount = DirectCast(rowAvailable("MaxAccount"), Integer) 'it's an int, right?
'step 2 and 3
rowAvailable("AccountTotal") = maxAccount - dtDefaultActive.Rows.Cast(Of DataRow).Count(Function(r) r("ID").Equals(rowAvailable("ID")))
Next
至于我会怎么做:
- 创建数据集类型文件
- 在可视化设计器中,为 Available 创建一个数据表,为 Active 创建一个数据表
- 创建一个 DataRelation,其中 Active 是 Available 的子项(Available ID 是 PK,Active.AvailableId 是 FK)
- 在 Available 中创建一个列,表达式为
[MaxAccount] - COUNT(Child.Id)
视觉上设计的强类型数据表在代码中使用起来要好得多。如果您的数据表是强类型的,代码将如下所示:
For Each rowAvailable In dtDefaultAvailable
'step 2 and 3
rowAvailable.AccountTotal = rowAvailable.MaxAccount - dtDefaultActive.Count(Function(r) r.ID = rowAvailable.ID)
Next
当一切都不是一个对象时,通过字符串访问并需要转换时,混乱就少得多了。而且 Intellisense 工作了..
我将 Visual Studio 与 vb.net、asp.net 和网络表单一起使用。
我填充了两个数据表并将一些值放入两个复选框列表(填充可用复选框列表和填充活动复选框列表)。一切都很好。
这是我遇到的问题,需要帮助。
第一步:在“可用”中,我有一个名为 ID 的列。 ID 值是唯一的,如 1、2、3、4 等。在 Active 中,我有对应的 ID,但可以有多个,例如 1、1、2、3、1、4 等。所以我需要做的是计算每个 ID 中有多少个处于活动状态。比如1,1,2,3,1,4中有3个1,1个2,1个3,1个4,怎么办?
第二步:完成后,我需要做减法。我需要查看 MaxAccount 是什么(例如 5)并从步骤 1 中减去它。例如,如果 MaxAccount 是 5 并且我有三个 1,则 5 - 3 = 2。
第三步:我需要用第 2 步中的值更新 AccountTotal。
您可以看到我尝试在 UpdateAccountTotal() 上对此进行编码,但只是卡住了。
更新 AccountTotal
Private Function UpdateAccountTotal() As DataTable
Dim dtDefaultAvailable As New DataTable
dtDefaultAvailable = ViewState("vsDefaultAvailable")
Dim dtDefaultActive As New DataTable
dtDefaultActive = ViewState("vsDefaultActive")
Dim dtDefaultAmount As New DataTable
ViewState("vsDefaultAmounts") = dtDefaultAmount
For Each rowAvailable In dtDefaultAvailable.Rows
Dim maxAccount = rowAvailable("MaxAccount").ToString()
'For Each rowActive In dtDefaultActive.Rows
'Dim ID = rowAvailable("ID").ToString()
'Dim countID = ID.Count
Next
End Function
我可能不会这样做,但是:
For Each rowAvailable as DataRow In dtDefaultAvailable.Rows
Dim maxAccount = DirectCast(rowAvailable("MaxAccount"), Integer) 'it's an int, right?
'step 2 and 3
rowAvailable("AccountTotal") = maxAccount - dtDefaultActive.Rows.Cast(Of DataRow).Count(Function(r) r("ID").Equals(rowAvailable("ID")))
Next
至于我会怎么做:
- 创建数据集类型文件
- 在可视化设计器中,为 Available 创建一个数据表,为 Active 创建一个数据表
- 创建一个 DataRelation,其中 Active 是 Available 的子项(Available ID 是 PK,Active.AvailableId 是 FK)
- 在 Available 中创建一个列,表达式为
[MaxAccount] - COUNT(Child.Id)
视觉上设计的强类型数据表在代码中使用起来要好得多。如果您的数据表是强类型的,代码将如下所示:
For Each rowAvailable In dtDefaultAvailable
'step 2 and 3
rowAvailable.AccountTotal = rowAvailable.MaxAccount - dtDefaultActive.Count(Function(r) r.ID = rowAvailable.ID)
Next
当一切都不是一个对象时,通过字符串访问并需要转换时,混乱就少得多了。而且 Intellisense 工作了..