2009-02-08 12 views
4

Je n'ai pas réussi à trouver un exemple sur la façon de convertir une instance matricielle de types définis par l'utilisateur en données (C# ADO.Net) - Je veux utiliser la datatable pour lier des données ASP.Net contrôles liés (par exemple gridview). Quelqu'un pourrait-il fournir un échantillon ou me recommander à quelques échantillons simples?C# convertir un tableau d'objets en datatable

Une autre question est, si c'est un must pour convertir en datatable afin de se lier aux contrôles dans ASP.Net? Pourrais-je être lié à un tableau de types définis par l'utilisateur?

merci à l'avance, George

+0

Si vous faites un 'GridView1.DataSource = Array' et que vous n'avez rien affiché, notez que vous devez aussi faire' GridView1.DataBind() 'après cela. – PUG

Répondre

3

Non, vous n'avez pas besoin d'un DataTable pour faire la liaison - en fait, la plupart de liaison est basé objet maintenant, en particulier avec LINQ (qui génère un modèle d'objet, pas un DataTable). Utilisez simplement les noms de propriétés publiques (de votre classe) en tant que membres de données pour différentes colonnes, etc.

+0

Bonjour Marc, heureux de vous voir ici. :-) Désolé, je ne peux pas utiliser LINQ pour des raisons non-techniques. Y a-t-il d'autres solutions pour moi si je n'utilise pas DataTable/DataSet? – George2

1

Je suggère d'utiliser la classe ObjectDataSource pour faire ce que vous voulez. Vous n'aurez alors plus du tout besoin d'utiliser un DataTable et vous pourrez toujours obtenir une liaison de données. ObjectDataSource vous permet d'exposer les types définis par l'utilisateur à la liaison de données, et peu importe comment les types sont obtenus; ils n'ont pas besoin de provenir d'une base de données, si c'est ce dont vous avez besoin.

+0

J'ai lu le lien que vous avez recommandé. Actuellement, mon application est à 3 niveaux, ASP.Net - Web Service - Base de données. Dans l'exemple du lien, ASP.Net interroge directement la source de données, ce qui constitue une violation de mon objectif de conception, à savoir que la couche de service Web se situe entre l'accès aux données moyen et transparent. Commentaires ou meilleurs échantillons? – George2

+0

L'exemple auquel vous faites référence est celui qui fait référence à EmployeeLogic? Si c'est le cas, modifiez l'implémentation de la méthode GetAllEmployees() pour appeler le service Web à l'aide d'un SqlDataSource. ObjectDataSource fonctionne avec n'importe quel type d'objet, ce qui vous permet d'obtenir les données de n'importe où. –

3

J'avais la même exigence et j'ai trouvé un bel article sur Pauls Blog. Vous pouvez jeter un oeil sur le lien suivant si vous avez encore le voulait

http://weblogs.asp.net/psperanza/archive/2005/05/18/407389.aspx

Voici le code que je l'ai utilisé dans mon projet. Hope qui aide

Public Function ConvertArrayToDatatable(ByVal arrList As ArrayList) As DataTable 
    Dim dt As New DataTable 
    Try 
     If arrList.Count > 0 Then 
      Dim arrype As Type = arrList(0).GetType() 
      dt = New DataTable(arrype.Name) 

      For Each propInfo As PropertyInfo In arrype.GetProperties() 
       dt.Columns.Add(New DataColumn(propInfo.Name)) 
      Next 

      For Each obj As Object In arrList 
       Dim dr As DataRow = dt.NewRow() 

       For Each dc As DataColumn In dt.Columns 
        dr(dc.ColumnName) = obj.GetType().GetProperty(dc.ColumnName).GetValue(obj, Nothing) 
       Next 

       dt.Rows.Add(dr) 
      Next 
     End If 

     Return dt 
    Catch ex As Exception 
     Return dt 
    End Try 

End Function 
0

En ce qui concerne le commentaire « ne peut pas utiliser LINQ pour des raisons non techniques »:

Je suppose que vous ne voulez pas utiliser LINQ to SQL puisque vous voulez maintenir vos trois architecture en ligne. Mais vous ne savez peut-être pas que vous pouvez utiliser LINQ to Objects, ce qui vous donnerait la flexibilité que vous recherchez. Supposons que vous ayez une méthode de niveau intermédiaire: Liste Tier2.SomeMethod(). Vous pouvez affecter cette valeur de retour de cette méthode en tant que source de données GridView, puis spécifier des méthodes/propriétés SomeObject dans le contrôle GridView: gvSomeGridView.DatasSource = Tier2.SomeMethod(); gvSomeGridView.DataBind(); En outre, vous pouvez ensuite récupérer SomeObject à partir du DataItem dans les rappels GridView.

HTH.

Questions connexes