2008-09-07 5 views
3

Je voudrais utiliser un composant qui expose la propriété de source de données, mais au lieu de fournir la source de données avec la liste entière des objets, je voudrais utiliser seulement un objet simple. Est-ce qu'il y a un moyen de faire ça ?Comment pouvez-vous databind un seul objet dans .NET?

Le composant mentionné est DevExpress.XtraDataLayout.DataLayoutControl - ce n'est pas du tout pertinent pour la question.

Répondre

8

La liaison de données attend un objet IEnumerable, car il l'énumère tout comme une boucle foreach. Pour ce faire, enveloppez simplement votre objet unique dans un IEnumerable.

Même cela fonctionnerait:

DataBindObject.DataSource = new List<YourObject>().Add(YourObjectInstance); 
+2

Ou 'DataBindObject.DataSource = new Liste () {} YourObjectInstance,' pourrait convenir mieux –

+1

'Liste . Add' renvoie 'void' pas un' IEnumerable', donc l'exemple résulterait en une erreur de compilation. –

1

En ASP.NET2.0 vous pouvez utiliser les collections génériques pour faire de ce seul objet une liste d'un seul objet dans ce que vous pouvez DataBind à tout contrôle du serveur en utilisant l'objectdatasource, par exemple

List<clsScannedDriverLicense> DriverLicenses = new 
List<clsScannedDriverLicense>(); 
//this creates a generic collection for you that you can return from 
//your BLL to the ObjectDataSource 
DriverLicenses.Add(TheOneObjectThatYouHaveofType_c lsDriverLicense); 

Ensuite, votre ObjectDataSource ressemblerait que:

<asp:ObjectDataSource ID="odsDL" runat="server" 
SelectMethod="OrdersByCustomer" 
TypeName="YourBLL.UtiltiesClassName" 
DataObjectTypeName="clsScannedDriverLicense"> 
</asp:ObjectDataSource> 

Source

+0

Une note de côté, mais les gens utilisent vraiment ObjectDataSource? Je n'ai jamais vu une seule utilisation en dehors des exemples MS ... C'est tellement moche. – FlySwat

+0

ObjectDataSource était un copier-coller de la source citée. Je ne l'ai presque jamais vu à l'état sauvage. – Espo

1

Je ne pense pas que vous avez beaucoup d'autre choix que d'utiliser une classe qui implémente IEnumerable <T>. Même si la propriété DataSource était assez intelligente pour prendre un objet scalaire, elle le convertirait probablement en interne en un vecteur.

Je considérerais cependant l'utilisation d'un simple tableau plutôt que d'une liste <T> car cela réduirait le nombre d'allocations de mémoire. Si vous n'aimez pas la syntaxe du tableau (et aussi pour augmenter la lisibilité), vous pouvez utiliser une méthode d'assistance:

T [] DataSourceHelper :: ToVector (T scalaire) { return new T [] {scalaire}; }

0

En utilisant dans mon FormView:

databoundControl.DataSource = new [] { singleObject }; 
databoundControl.DataBind(); 
Questions connexes