2012-09-08 102 views
1

我想问一些关于数据集和Crystal Reports的帮助。将ListView的内容插入数据集

我在DataSet中有两个DataTable,即DeliveredItems和DeliveryDetails。我所遇到的问题是在DeliveredItems部分,其中我有在该行的错误:

dataSet.Tables("DeliveredItems").Rows.Add(row) 

这给了我:

"The row already belongs to this table." 

而调整后的代码,它返回一个错误:

"Object reference not set to an instance of an object." 

我的目标是让ListView的所有项目及其子项在数据集内显示在Crystal Report上。这里是我的代码:

Private Sub CreateReport() 

    'Initialize the needed objects for report document. 
    Dim myDeliveryReport As New rptDeliveryReceipt 
    Dim row As DataRow = Nothing 
    Dim row2 As DataRow = Nothing 
    Dim dataSet As New DataSet 
    Dim counter As Integer = lviDeliveryList.Items.Count 
    Dim tempCount As Integer = 0 
    Dim listViewItems As New ListViewItem() 

    'Create a new DataTable named Delivery Details 
    dataSet.Tables.Add("DeliveryDetails") 

    'Create columns for the new DataTable named Delivery Details. 
    With dataSet.Tables(0).Columns 

     .Add("deliveryClientName", Type.GetType("System.String")) 
     .Add("deliveryClientStreetAddress", Type.GetType("System.String")) 
     .Add("deliveryClientCity", Type.GetType("System.String")) 
     .Add("deliveryDRNumber", Type.GetType("System.String")) 
     .Add("deliveryDate", Type.GetType("System.String")) 
     .Add("deliveryPONumber", Type.GetType("System.String")) 

    End With 

    'Initialize and insert delivery heading to the DataTable. 
    row = dataSet.Tables(0).NewRow 
    row(0) = txtDeliveryTargetClient.Text 
    row(1) = txtDeliveryClientAddress.Text 
    row(2) = txtDeliveryClientCity.Text 
    row(3) = txtDRNumber.Text 
    row(4) = dtpDeliveryDate.Value.ToString 
    row(5) = txtDRPO.Text 
    dataSet.Tables(0).Rows.Add(row) 

    'Create another DataTable called DeliveredItems 
    dataSet.Tables.Add("DeliveredItems") 

    'Create columns for the new DataTable named DeliveryItems. 
    With dataSet.Tables(1).Columns 

     .Add("deliveryCatNumber", Type.GetType("System.String")) 
     .Add("deliveryItemDescription", Type.GetType("System.String")) 
     .Add("deliveryItemQuantity", Type.GetType("System.String")) 
     .Add("deliveryItemUnit", Type.GetType("System.String")) 
     .Add("deliveryItemDetails", Type.GetType("System.String")) 

    End With 

    row = Nothing 
    row = dataSet.Tables(1).NewRow 

    'Store every data in an array for insertion. 
    Dim deliveredItemsCount As Integer = lviDeliveryList.Items.Count 
    Dim tempArray() As String 
    ReDim tempArray(5) 
    Dim deliveryListViewItem As New ListViewItem() 

    For counter = 0 To deliveredItemsCount 

     deliveryListViewItem = lviDeliveryList.Items.Item(counter) 
     tempArray(0) = lviDeliveryList.Items.Item(counter).ToString 
     tempArray(1) = deliveryListViewItem.SubItems(1).ToString 
     tempArray(2) = deliveryListViewItem.SubItems(2).ToString 
     tempArray(3) = deliveryListViewItem.SubItems(3).ToString 
     tempArray(4) = deliveryListViewItem.SubItems(4).ToString 

     'Insert new records to the DeliveredItems. 
     row2(0) = tempArray(0) 
     row2(1) = tempArray(1) 
     row2(2) = tempArray(2) 
     row2(3) = tempArray(3) 
     row2(4) = tempArray(4) 
     dataSet.Tables("DeliveredItems").Rows.Add(row) 

     For counterClear = 0 To (deliveredItemsCount - 1) 
      tempArray(counter) = Nothing 
     Next counterClear 

     row2 = Nothing 

    Next counter 

    'Set Data Sources for the Crystal Report. 
    myDeliveryReport.SetDataSource(dataSet) 
    frmDeliveryReceiptReport.crvDeliveryReceipt.ReportSource = myDeliveryReport 

    'Dispose after using. 
    dataSet.Dispose() 
    dataSet = Nothing 

End Sub 

回答

0

在这一行

dataSet.Tables("DeliveredItems").Rows.Add(row) 

要添加的行不是2行和2行永远不会初始化 我想你想做的事:

For counter = 0 To deliveredItemsCount 

    deliveryListViewItem = lviDeliveryList.Items.Item(counter) 
    tempArray(0) = lviDeliveryList.Items.Item(counter).ToString 
    ..... 

    row2 = dataSet.Tables("DeliveredItems").NewRow 
    row2(0) = tempArray(0) 
    ...... 
    dataSet.Tables("DeliveredItems").Rows.Add(row2) 

作为最后的注意。我想你可以避免tempArray ...直接从deliveryListViewItem设置row2的值。 (删除最后清除数组)