如何绑定没有强类型属性的自定义类

时间:2009-03-10 07:06:38

标签: .net asp.net vb.net data-binding

嘿伙计们,这是我的要求:

我需要一个只有一个Public属性且没有Public方法的简单类(最终的Class会更复杂,但是为了测试,这就是我所需要的)

该属性为“项目”,并将“字符串”作为参数。它会根据参数返回“ String ”。

然后,我希望能够将此对象的实例添加到列表数组,然后将其绑定到转发器或的的ListView ...

...最重要的是,我希望能够通过Eval函数引用我的简单类中的值:

<%#Eval(“** SomeIDString ”)%> **。

以下是我的问题:

  1. 除非我将属性声明为默认属性,否则我无法绑定...为什么?

  2. 当我使用“ Eval ”时,我在“[some property]不存在”行中出现错误。确实没有,因为所有内容都是通过 Item 属性访问的。如果我将“ Eval ”替换为“ Container.DataItem ”,它就能正常工作。

  3. 那么,有没有办法使用 Eval 而不是 Container.DataItem ?我宁愿没有让我的类继承任何其他类,因为我想保持它不受任何属性和/或方法的影响。

    我需要实现哪些接口?

    另外,我想使用 Eval 的原因是,尽可能多,我想使这个类简单,所以编码器不需要担心特殊情况。我只是希望它能够工作,就像 DataTable 类一样,但是实现起来更简单,更轻量化。

    欢呼声

3 个答案:

答案 0 :(得分:1)

这个Andy上有很多教程!你看了/搜索过它们吗?

你所说的是你只想创建一个Object(类)并将其用作数据控件的DataSource,如果你不想在代码中做任何事情,你总是可以使用ObjectDataSource。 p>

答案 1 :(得分:1)

您的问题源于使用参数化属性(也就是使用字符串参数的属性)。参数化属性通常只有在它们是默认属性并且公开某个对象的索引集合时才有意义。 (参见C# indexers)C#允许仅允许索引器参数化,而VB在此限制上更放松。

假设有如下课程:

Public Class TempClass
  Private strItem As New StringDictionary()

  Public Property Item(ByVal s As String) As String
    Get
      Return strItem(s)
    End Get
    Set(ByVal value As String)
      strItem(s) = value
    End Set
  End Property
End Class

Eval函数需要有效公共属性的名称。使用参数化属性时,签名与您在Eval函数中指定的签名不同。如果您使用以下语法:

<asp:Label ID="lbl1" runat="server" Text='<%#Eval("Item(""a"")")%>' />

......它没有解决。

您的解决方案有三个方面:

一个。评估为什么需要对此属性进行参数化。如果它传递了一个可以从集合中查找的密钥,那对我来说是有意义的。

湾不使用Eval关键字,而是使用扩展语法并手动执行转换:

<asp:Label ID="lbl1" runat="server" Text='<%#CType(Container.DataItem, MyCustomClass).Item("a") %>' />

℃。还要考虑如何将不同的密钥传递给Repeater中的每条记录。如果接受整数索引,这可能是理想的,这样我们就可以将它链接到转发器的行号。修改上述类如下:

Public Class TempClass
  Private strItems(3) As String

  Public Sub New()
    strItems(0) = "x"
    strItems(1) = "y"
    strItems(2) = "z"
  End Sub

  Public Property Items(ByVal i As Integer) As String
Get
      Return strItems(i)
End Get
Set(ByVal value As String)
      strItems(i) = value
End Set
  End Property
End Class

然后我们可以按如下方式在数组中呈现相应的项:

<asp:Label ID="lbl1" runat="server" Text='<%#CType(Container.DataItem, TempClass).Items(Container.ItemIndex) %>' />

根据要求编辑:


d)修改类以使用Default属性:

Default Public Property Item(ByVal s As String) As String
  Get
    Return strItem(s)
  End Get
  Set(ByVal value As String)
    strItem(s) = value
  End Set
End Property

数据绑定现在变为:

<span><%#Eval("(a)")%></span>
<asp:Label ID="lbl2" runat="server" Text='<%#Eval("(b)")%>' />

答案 2 :(得分:0)

除非您使用对象数据源,否则无法在类上使用Eval。

"Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control."