使用结构或二维数组作为RDLC的源

时间:2014-03-05 18:17:29

标签: vb.net encryption rdlc

我已经完成了一些谷歌搜索,但找不到具体的东西可以继续推进,所以我在这里。

我有日期字段,我正在运行WHERE子句,并根据该字段返回字段。日期字段已加密,因此我不得不采取其他方法。

    Dim aEmpList(dt.Rows.Count, 5) As String
    Try
        lCount = 0
        For i As Integer = 0 To dt.Rows.Count - 1
            If clsEncrypt.DecryptData(dt.Rows(i)(3)) >= 19500101 Then
                aEmpList(lCount, 0) = clsEncrypt.DecryptData(dt.Rows(i)(0))
                aEmpList(lCount, 1) = clsEncrypt.DecryptData(dt.Rows(i)(1))
                aEmpList(lCount, 2) = clsEncrypt.DecryptData(dt.Rows(i)(2))
                aEmpList(lCount, 3) = clsEncrypt.DecryptData(dt.Rows(i)(3))
                aEmpList(lCount, 4) = clsEncrypt.DecryptData(dt.Rows(i)(4))
                lCount = lCount + 1
            End If
        Next
    Catch ex As Exception
        MessageBox.Show(e.ToString())
    End Try

clsEncrypt是加密/解密类。

字段是员工名字,姓氏和出生日期 - 它们都是加密的。 我试图找到所有出生的员工>= 19500101,并将该数据作为报告返回。

我创建了一个Structure并将数据作为数组放入结构myStructure

'Define a structure to be used as source for data grid view.
Structure mystructure
    Private mDim1 As String
    Private mDim2 As String
    Private mDim3 As String
    Private mDim4 As String
    Private mDim5 As String
    Public Property Dim1() As String
        Get
            Return mDim1
        End Get
        Set(ByVal value As String)
            mDim1 = value
        End Set
    End Property
    Public Property Dim2() As String
        Get
            Return mDim2
        End Get
        Set(ByVal value As String)
            mDim2 = value
        End Set
    End Property
    Public Property Dim3() As String
        Get
            Return mDim3
        End Get
        Set(ByVal value As String)
            mDim3 = value
        End Set
    End Property
    Public Property Dim4() As String
        Get
            Return mDim4
        End Get
        Set(ByVal value As String)
            mDim4 = value
        End Set
    End Property
    Public Property Dim5() As String
        Get
            Return mDim5
        End Get
        Set(ByVal value As String)
            mDim5 = value
        End Set
    End Property
End Structure

我填充结构以加载到DataGridView中以实现可视化目的:

    'populate structure with aEmpList array
    Dim myarr(dt.Rows.Count) As mystructure
    Try
        For i As Integer = 0 To lCount - 1
            myarr(i) = New mystructure With {.Dim1 = aEmpList(i, 0).ToString, .Dim2 = aEmpList(i, 1).ToString, .Dim3 = aEmpList(i, 2).ToString, .Dim4 = aEmpList(i, 3).ToString, .Dim5 = aEmpList(i, 4).ToString}
        Next
    Catch ex As Exception
        MessageBox.Show(e.ToString())
    End Try
DataGridView1.DataSource = myarr

现在我已经提供了足够的背景,有谁知道我的下一步应该是什么? 我不确定如何或者是否应该将结构加载到DataSet() [如果可能的话]或类似的东西。

2 个答案:

答案 0 :(得分:1)

我认为你正在尝试创建一个业务类,因此应该使用引用类型(Class)而不是值类型(Structure)。因此,“下一步行动”是将您的结构更改为类,实施INotifyPropertyChangedIEditableObjectIChangeTrackingIRevertibleChangeTracking,并创建BindingList(Of T)拿着你的物品。

答案 1 :(得分:0)

所以,这种傻逼,但我明白了。正如问题标题所说 - 我实际上放弃了数组部分,因为它所做的只是让我感到困惑,我采用了以下解决方案:

    Dim dt As New DataTable
    Dim dts As DataSet = New DataSet()
    With comm
        .CommandText = "SELECT EMPL_ID, EMPL_FIRST_NM, EMPL_LAST_NM, BEG_DT, END_DT FROM EMPL"
    End With

    Dim adapter As New SqlDataAdapter(comm)
    adapter.Fill(dts)                    'Fill DT with Query results

    dt.Load(dts.CreateDataReader())

    Me.reportViewer1.RefreshReport()
    Dim dts2 As New DataSet()

    dts2 = dts.Clone
    Try
        Dim m As Integer
        m = 0
        For i As Integer = 0 To dts.Tables(0).Rows.Count - 1
            If clsEncrypt.DecryptData(dts.Tables(0).Rows(i)(3)) >= "20130101" Then
                dts2.Tables(0).Rows.Add()
                dts2.Tables(0).Rows(m)(0) = clsEncrypt.DecryptData(dts.Tables(0).Rows(i)(0))
                dts2.Tables(0).Rows(m)(1) = clsEncrypt.DecryptData(dts.Tables(0).Rows(i)(1))
                dts2.Tables(0).Rows(m)(2) = clsEncrypt.DecryptData(dts.Tables(0).Rows(i)(2))
                dts2.Tables(0).Rows(m)(3) = clsEncrypt.DecryptData(dts.Tables(0).Rows(i)(3))
                dts2.Tables(0).Rows(m)(4) = clsEncrypt.DecryptData(dts.Tables(0).Rows(i)(4))
                'dts2.Tables(0).Rows.Add(dts.Tables(0).Rows(i).cl)
                m = m + 1
            End If
        Next
    Catch ex As Exception
        MessageBox.Show(e.ToString())
    End Try

    Dim rds As ReportDataSource = New ReportDataSource("DataSetDateOfBirthTest", dts2.Tables(0))
    With reportViewer1
        .LocalReport.DataSources.Clear()
        .LocalReport.DataSources.Add(rds)
        .RefreshReport()
    End With