将详细报告绑定到具有存储在字典中的属性的 class 模型(VB.NET,Devexpress)

Bind a detail report to a class model with properties stored in a Dictionary (VB.NET, Devexpress)

我正在尝试 Devexpress 中的示例

Dim binding As New XRBinding("Text", dsProducts1, "Products.UnitPrice")

但是我的模型没有在 class 中明确写入它们的属性。它需要一个方法 GetProperty("column_name_here") 来获取它的数据。我想知道 XRBinding 的第三个参数是否可以是一个方法?喜欢:

Dim binding As New XRBinding("Text", dsProducts1, product.GetProperty("name"))

附加信息:

我的所有模型 classes 都扩展了这个 Dao class,它负责在数据库中获取数据。 Dao class 有一个受保护的变量作为字典(字符串,对象)来存储数据库中的值(键=列名,值=列行值)。

现在当我想在数据库中获取一些东西时,我只调用

Dim user As New User // this class extends the Dao class

Dim userId = user.GetProperty("id") // Method to get the value from Dictionary, first parameter is the Dictionary key or column name from the DB

我这样做是为了不必创建每个模型 class 并设置那个 class 的属性,因为它有点麻烦。

似乎无法绑定到某些方法。我建议你看看 ExpandoObject 动态 class。 class 的成员可以在运行时添加。此 class 实现 IDictionary(Of String, Object) 接口,您可以使用该接口从 Dictionary(Of String, Object).

生成属性

示例如下:

基础 Dao class 实施示例 Dictionary(Of String, Object) 属性:

Public Class Dao
    Private _values As Dictionary(Of String, Object)

    Public Sub New()
        _values = New Dictionary(Of String, Object)
    End Sub

    Public Overridable Sub Fill(index As Integer)
        _values.Clear()

        _values.Add("ID", index)
        _values.Add("Product", "Banana " & index)
        _values.Add("Price", 123.45 + index)
    End Sub

    Protected ReadOnly Property Values As Dictionary(Of String, Object)
        Get
            Return _values
        End Get
    End Property
End Class

Dao class 后代的示例 DynamicValues 属性 其中 returns ExpandoObject 基于 Dictionary(Of String, Object)(您必须省略 属性):

的类型
Public Class DynamicDao
    Inherits Dao

    Private _dynamicValues As ExpandoObject

    Public Overrides Sub Fill(index As Integer)
        MyBase.Fill(index)

        _dynamicValues = New ExpandoObject()

        Dim keyValues = DirectCast(_dynamicValues, IDictionary(Of String, Object))

        For Each pair In Values
            keyValues.Add(New KeyValuePair(Of String, Object)(pair.Key, pair.Value))
        Next
    End Sub

    Public ReadOnly Property DynamicValues ' <= There is no type. In hint is displayed «As Object».
        Get
            Return _dynamicValues
        End Get
    End Property
End Class

DynamicDao class 在 XtraReport 中的用法:

Dim list = New List(Of DynamicDao)

For index% = 0 To 9
    Dim dao = New DynamicDao()
    dao.Fill(index%)

    list.Add(dao)
Next

Dim labelID = New XRLabel()
labelID.DataBindings.Add(New XRBinding("Text", Nothing, "DynamicValues.ID"))

Dim labelProduct = New XRLabel()
labelProduct.DataBindings.Add(New XRBinding("Text", Nothing, "DynamicValues.Product"))
labelProduct.LeftF = 50

Dim labelPrice = New XRLabel()
labelPrice.DataBindings.Add(New XRBinding("Text", Nothing, "DynamicValues.Price"))
labelPrice.LeftF = 150

Dim detail = New DetailBand()
detail.Controls.Add(labelID)
detail.Controls.Add(labelProduct)
detail.Controls.Add(labelPrice)

Dim report = New XtraReport()
report.Bands.Add(detail)
report.DataSource = list

report.ShowRibbonPreview()