2009-03-10 8 views
2

hey les gars, voici mes exigences:Comment lier une classe personnalisée sans propriétés fortement typées

je besoin d'une classe simple avec une seule propriété publique et aucune méthode publique (la dernière classe sera plus complexe , mais pour tester c'est tout ce que je dois)

La propriété est « article » et prend une « chaîne » comme paramètre. Il renvoie un "String" basé sur le paramètre.

Je veux alors être en mesure d'ajouter des instances de cet objet à une Liste ou tableau, puis associez à un répéteur ou ListView ...

... plus surtout, je veux être en mesure de se référer à des valeurs alors dans ma classe simple via la fonction Eval:

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

Voici mes problèmes:

  1. Je ne peux pas du tout Liez à moins que je déclare l'article propriété comme Par défaut propriété ... pourquoi? Quand j'utilise "Eval", j'obtiens une erreur dans les lignes de "[une propriété] n'existe pas". en effet, ce n'est pas le cas, car tout est accessible via la propriété Item. il fonctionne alors si je remplace "Eval" avec "Container.DataItem".

Alors, est-il un moyen d'utiliser Eval au lieu de Container.DataItem? Je préférerais que ma classe n'hérite d'aucune autre classe parce que je veux la garder propre des propriétés et/ou des méthodes supurfulous.

Y a-t-il des interfaces à implémenter?

Aussi, la raison pour laquelle je veux utiliser Eval, est que, autant que possible, je veux rendre l'utilisation de cette classe simple, de sorte que le codeur n'a pas besoin de s'inquiéter des cas spéciaux. Je veux juste que cela fonctionne, un peu comme la classe DataTable, mais avec une implémentation plus simple et plus légère.

acclamations

Répondre

1

Votre problème provient de l'utilisation d'une propriété paramétrée (qui utilise également un paramètre de chaîne). Les propriétés paramétrées n'ont généralement de sens que lorsqu'elles sont des propriétés par défaut et exposent une collection indexée d'un objet. (Voir C# indexers) C# permet seulement de paramétrer l'indexeur alors que VB est plus relâché sur cette restriction.

En supposant une classe telle que:

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 

La fonction Eval nécessite le nom d'une propriété publique valide. Lorsque vous utilisez une propriété paramétrée, la signature est différente de ce que vous pouvez spécifier dans une fonction Eval. Si vous utilisez la syntaxe suivante:

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

... Il ne résout pas. Votre solution est triple:

a. Évaluez pourquoi vous devez paramétrer cette propriété. Il serait logique pour moi si une clé est passée qu'elle peut chercher dans une collection.

b. Au lieu d'utiliser le mot-clé Eval, utilisez la syntaxe étendue et d'effectuer la coulée manuellement:

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

c. Pensez également à la façon dont vous passeriez une clé différente pour chaque enregistrement dans le répéteur. Cela peut être idéal si un index entier est accepté à la place afin que nous puissions le lier au numéro de ligne du répéteur. Modification de la classe ci-dessus comme suit:

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 

On peut alors rendre l'élément approprié dans le tableau comme suit:

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

Edité sur demande:


d) Classe modifié pour utiliser une propriété par défaut:

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 

Databinding devient:

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

Merci Cerebrus. Donc, je suppose que la ligne de fond est, je ne peux pas utiliser l'Eval plus simple. Tu as raison, j'ai besoin d'une propriété paramétrée. Je suppose que ce que je voulais était un comportement similaire à un DataRow dans un DataTable, où vous pouvez utiliser Eval. Mais alors le DataRow nécessite beaucoup de frais généraux ...? – andy

+0

Cerebrus, comme question de suivi: Lorsque j'essaie de Lier la même liste de mes Classes simples à une grille avec des colonnes générées automatiquement, j'obtiens que "grid n'a pas de propriétés ou d'attributs". Quel est le travail autour ... dois-je céder à un DataTable? Bravo – andy

+0

@Andy: Le comportement Datarow est possible car il expose la valeur dans le ColumnName passé en tant que la propriété par défaut. Si vous modifiez la classe ci-dessus pour imiter cela, vous n'avez pas besoin d'utiliser le nom de propriété "Item". Par conséquent, vous pouvez utiliser Eval ("a") dans ce cas. – Cerebrus

0

Sauf si vous utilisez une source de données d'objet que vous ne pouvez pas utiliser Eval sur une classe.

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

C'est une déclaration erronée. Eval() n'a rien à voir avec le contrôle ObjectDataSource. Vous pouvez toujours lier un contrôle à une classe IEnumerable. – Cerebrus

+0

ouais, juste pour clarifier, ma classe va dans une liste, et ensuite est assignée à la source de données d'un répéteur. – andy

+0

Eh bien, le message d'erreur ci-dessus vient de ASP.NET. C'est juste comme ça que j'ai interprété le message. –

1

il ya tant de tutoriels sur ce Andy! Avez-vous regardé/recherché?Ce que vous dites est que vous voulez simplement créer un objet (classe) et l'utiliser comme DataSource d'un Data Control, vous pouvez toujours utiliser ObjectDataSource si vous ne voulez pas faire des choses dans le code.

+0

hey balexande, merci pour votre aide. Oui, j'ai cherché mais je n'ai rien trouvé qui traite des particularités de mon problème. En outre, je me demande si vous avez mal compris mon problème, car les avantages de ObjectdataSource ne sont pas pertinents. – andy

+0

Bien sûr, j'ai fait ... les didacticiels que je veux dire concernent les objets de données, comme construire une classe que vous pouvez lier à tout, j'aime particulièrement ceux qui contiennent des astuces 3.5SP1, il suffit de télécharger ce code et de trouver par vous-même, voir les objets SalesPerson/DAO: http: // is.gd/mPXv – balexandre

+0

cool! va le vérifier, merci l'homme – andy

Questions connexes