2009-11-03 4 views
1

J'ai 3 requêtes SQL similaires qui ramèneront chacune 1 enregistrement avec 5 champs.Existe-t-il un moyen facile de remplir un tableau HTML avec SQL dans ASP.NET 2.0?

Je souhaite afficher verticalement chacun de ces trois enregistrements dans un tableau HTML.

Évidemment, je n'ai pas besoin de tri ou de pagination, donc je ne veux pas gaspiller de frais généraux sur un gridView.

<table> 
     <tr><td>Last</td><td>Col1</td><td>Col2</td><td>Col3</td></tr> 
     <tr><td>First</td><td>Col1</td><td>Col2</td><td>Col3</td></tr> 
     <tr><td>Middle</td><td>Col1</td><td>Col2</td><td>Col3</td></tr> 
     <tr><td>Gender</td><td>Col1</td><td>Col2</td><td>Col3</td></tr> 
     <tr><td>Birth Date</td><td>Col1</td><td>Col2</td><td>Col3</td></tr> 
    </table> 

Je veux Col1, Col2 et Col3 pour afficher les résultats de leurs requêtes SQL respectives.

Quel est le moyen le plus simple d'y parvenir et pourriez-vous donner un exemple?

Répondre

1
 ' 
     'begin sample data 
     Dim dt As New DataTable 
     dt.Columns.Add("Last") 
     dt.Columns.Add("First") 
     dt.Columns.Add("Middle") 
     dt.Columns.Add("Gender") 
     dt.Columns.Add("Birth Date") 
     ' 
     Dim dr1 As DataRow = dt.NewRow 
     dr1("Last") = "apple" 
     dr1("First") = "is" 
     dr1("Middle") = "red" 
     dr1("Gender") = "male" 
     dr1("Birth Date") = "2009" 
     ' 
     Dim dr2 As DataRow = dt.NewRow 
     dr2("Last") = "banana" 
     dr2("First") = "is" 
     dr2("Middle") = "yellow" 
     dr2("Gender") = "female" 
     dr2("Birth Date") = "2010" 
     ' 
     Dim dr3 As DataRow = dt.NewRow 
     dr3("Last") = "cherry" 
     dr3("First") = "is" 
     dr3("Middle") = "pink" 
     dr3("Gender") = "both" 
     dr3("Birth Date") = "2011" 
     'end sample data 
     ' 
     ' 
     Dim sb As New StringBuilder 
     sb.Append("<table border='1'>") 
     sb.Append("<tr>") 
     sb.Append(String.Format("<td><b>Last</b></td><td>{0}</td><td>{1}</td><td>{2}</td>", dr1("Last"), dr2("Last"), dr3("Last"))) 
     sb.Append("</tr>") 
     sb.Append("<tr>") 
     sb.Append(String.Format("<td><b>First</b></td><td>{0}</td><td>{1}</td><td>{2}</td>", dr1("First"), dr2("First"), dr3("First"))) 
     sb.Append("</tr>") 
     sb.Append("<tr>") 
     sb.Append(String.Format("<td><b>Middle</b></td><td>{0}</td><td>{1}</td><td>{2}</td>", dr1("Middle"), dr2("Middle"), dr3("Middle"))) 
     sb.Append("</tr>") 
     sb.Append("<tr>") 
     sb.Append(String.Format("<td><b>Gender</b></td><td>{0}</td><td>{1}</td><td>{2}</td>", dr1("Gender"), dr2("Gender"), dr3("Gender"))) 
     sb.Append("</tr>") 
     sb.Append("<tr>") 
     sb.Append(String.Format("<td><b>Birth Date</b></td><td>{0}</td><td>{1}</td><td>{2}</td>", dr1("Birth Date"), dr2("Birth Date"), dr3("Birth Date"))) 
     sb.Append("</tr>") 
     sb.Append("<table>") 
     ' 
     Response.Write(sb.ToString) 
0

Il n'est pas clair si vos séries de données sont en lignes ou en colonnes, mais le Repeater est proche de ce que vous voulez, si vos enregistrements sont en lignes.

2

Comme ils ont tous les mêmes champs, UNION ensemble et donnent le résultat que la source d'une commande de grille ou répéteur:

<asp:SqlDataSource ID="MyData" runat="server" ConnectionString="..." 
    SelectCommand=" (Query1) UNION (Query2) UNION (Query3) " /> 

<asp:GridView ID="ResultGrid" runat="server" DataSourceID="MyData" /> 
+0

Merci Joel, Mais est-ce que ça ne listait pas les enregistrements horizontalement? J'ai du mal à le décrire correctement. Chaque requête SQL va retourner un Nom, Prénom, Deuxième prénom, Sexe et D.O.B. Les premiers résultats de requêtes SQL remplaceront "Col1" dans l'exemple de code fourni. – MWill

+0

Jetez un coup d'œil aux propriétés Datalist et RepeatDirection. – Steve

1

Dans votre couche de service, vous devez exécuter les 3 requêtes et votre 3 ensembles de résultats uniques (nous espérons utiliser datareaders au lieu de datatables et de construire des objets réels) et puis après avoir des données, vous créez un nouveau List<MyObject> qui correspond à la portée que vous voulez sur votre table et construire cette collection à partir de vos ensembles de résultats. Ensuite, vous pouvez databind votre List<MyObject> propre à votre gridview, repeater, listview ou un contrôle similaire pour générer la sortie html.

Je recommande d'utiliser le contrôle ListView à toutes fins utiles, car il vous permet de générer le code HTML exact que vous voulez et offre toutes les fonctionnalités que vous obtenez avec le contrôle GridView de lignes alternées facilement configurables, les événements de liaison de données, etc.

My Two Cents: Il est toujours difficile de comprendre le raisonnement de l'extérieur, surtout qu'aucun d'entre nous ne veut révéler une utilisation commerciale trop spécifique, mais il semble que votre conception de données soit défectueuse, c'est pourquoi il est difficile représenter à l'écran.

+0

Hey Chris, ouais je ne veux pas entrer dans trop de détails mais c'est essentiellement un outil d'audit. Il y aura des centaines de champs quand j'aurai fini et j'ai décidé de les afficher verticalement pour qu'il soit plus facile de voir les différences, et les utilisateurs défileront vers le bas plutôt que vers la droite. Aussi parce que je prévois d'avoir des tonnes de données sur cette page, je veux le faire aussi léger que possible, d'où mon éviter le gridView. Aussi n'est pas le ListView seulement disponible si je fais le saut à .NET 3.5? Malheureusement, je dois créer ceci avec 2.0. – MWill

+0

Oui ListView est 3.5, désolé, il est difficile pour moi d'imaginer que les entreprises ne sont toujours pas mises à jour à 3.5 lorsque le lancement de 4.0 commence à se faire sentir. –

+0

Parlez-moi de ça :( – MWill

0

Le tri et la pagination ne sont pas activés par défaut sur un Gridview, il n'y a donc aucune raison de ne pas en utiliser un à cause de cela. Cependant, vous pouvez envisager d'utiliser le ListView control, ce qui vous donne plus de contrôle sur la création de modèles.

0

Si vous utilisez SQL Server 2005+ vous pouvez essayer d'utiliser l'option UNPIVOT sur votre première requête comme ceci:

create table #mydata 
    (
    id   integer, 
    fld1   varchar(15), 
    fld2   varchar(15), 
    fld3   varchar(15), 
    fld4   varchar(15), 
    fld5   varchar(15) 
    ) 
go 
insert into #mydata values (1,'fld 1 - rec 1','fld 2 - rec 1','fld 3 - rec 1','fld 4 - rec 1','fld 5 - rec 1') 
insert into #mydata values (1,'fld 1 - rec 2','fld 2 - rec 2','fld 3 - rec 2','fld 4 - rec 2','fld 5 - rec 2') 
insert into #mydata values (1,'fld 1 - rec 3','fld 2 - rec 3','fld 3 - rec 3','fld 4 - rec 3','fld 5 - rec 3') 
go 

--Unpivot the table. 
SELECT idc, field, value 
FROM 
    (SELECT cast(id as varchar(5)) idc, fld1, fld2, fld3, fld4, fld5 from #mydata) d 
UNPIVOT 
    (Value FOR field IN (fld1, fld2, fld3, fld4, fld5) 
)AS unpvt; 

renvoie les résultats comme:

idc    value   
----- ---------- --------------- 
1  fld1  fld 1 - rec 1 
1  fld2  fld 2 - rec 1 
1  fld3  fld 3 - rec 1 
1  fld4  fld 4 - rec 1 
1  fld5  fld 5 - rec 1 
1  fld1  fld 1 - rec 2 
1  fld2  fld 2 - rec 2 
1  fld3  fld 3 - rec 2 
1  fld4  fld 4 - rec 2 
1  fld5  fld 5 - rec 2 
1  fld1  fld 1 - rec 3 
1  fld2  fld 2 - rec 3 
1  fld3  fld 3 - rec 3 
1  fld4  fld 4 - rec 3 
1  fld5  fld 5 - rec 3 

Ensuite, vous pouvez utilisez un gridView avec des colonnes générées automatiquement à partir de cette source de données.

Questions connexes