Как связать пользовательский класс без строго типизированных свойств - PullRequest
2 голосов
/ 10 марта 2009

Эй, ребята, вот мои требования:

Мне нужен простой класс только с одним публичным свойством и без методов Public (конечный класс будет более сложным, но для тестирования это все, что мне нужно)

Свойство имеет значение " Item " и принимает в качестве параметра " String ". Возвращает « String » на основе параметра.

Затем я хочу добавить экземпляры этого объекта в список или массив , а затем связать его с Repeater или ListView ...

... самое главное, я хочу иметь возможность ссылаться на значения в моем простом классе с помощью функции Eval:

<% # Eval ("** SomeIDString </strong>")%> **.

Вот мои проблемы:

  1. Я не могу связать вообще, если не объявил свойство Item как свойство По умолчанию ... почему?

  2. Когда я использую " Eval ", я получаю сообщение об ошибке в строках "[какое-то свойство] не существует". на самом деле это не так, потому что все доступно через свойство Item . тогда он сработает, если я заменю « Eval » на « Container.DataItem ».

Итак, есть ли способ использовать Eval вместо Container.DataItem ? Я бы не хотел, чтобы мой класс наследовал какие-либо другие классы, потому что я хочу сохранить его в чистоте от лишних свойств и / или методов.

Есть ли интерфейсы, которые мне нужно реализовать?

Кроме того, причина, по которой я хочу использовать Eval , заключается в том, что, насколько это возможно, я хочу сделать использование этого класса простым, чтобы кодировщику не приходилось беспокоиться об особых случаях. Я просто хочу, чтобы он работал, как класс DataTable , но с гораздо более простой и легкой реализацией.

ура

Ответы [ 3 ]

1 голос
/ 10 марта 2009

оооочень много уроков по этому Энди! Вы искали / искали их?

То, что вы говорите, это то, что вы просто хотите создать объект (класс) и использовать его в качестве источника данных элемента управления данными, вы всегда можете использовать ObjectDataSource, если не хотите что-то делать в коде.

1 голос
/ 10 марта 2009

Ваша проблема возникает из-за использования параметризованного свойства (которое также использует строковый параметр). Параметризованные свойства обычно имеют смысл только тогда, когда они являются свойствами по умолчанию и предоставляют индексированную коллекцию некоторого объекта. (См. 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") %>' />

с. Также подумайте, как бы вы передавали разные ключи каждой записи в репитере. Это может быть идеально, если вместо этого принимается целочисленный индекс, чтобы мы могли связать его с номером строки повторителя. Модифицируем вышеуказанный класс следующим образом:

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 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)")%>' />
0 голосов
/ 10 марта 2009

Если вы не используете объектный источник данных, вы не можете использовать Eval в классе.

"Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...