我有3个类似的SQL查询,每个查询将带回5个字段的1条记录。
我想在HTML表格中垂直显示这3条记录。
显然我不需要排序或分页,所以我不想在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>
我希望Col1,Col2和Col3显示各自SQL查询的结果。
最简单的方法是什么?你能提供一个例子吗?
答案 0 :(得分:2)
由于它们都具有相同的字段,UNION
它们在一起并将结果设置为网格控件或转发器的源:
<asp:SqlDataSource ID="MyData" runat="server" ConnectionString="..."
SelectCommand=" (Query1) UNION (Query2) UNION (Query3) " />
<asp:GridView ID="ResultGrid" runat="server" DataSourceID="MyData" />
答案 1 :(得分:1)
在您的服务层中,您应该运行3个查询并拥有3个唯一的结果集(希望您使用datareaders
而不是datatables
并构建实际对象)然后在获得数据后再创建一个新的List<MyObject>
,它匹配您在表上所需的范围,并从结果集中构建该集合。然后,您可以将干净的List<MyObject>
数据绑定到gridview
,repeater
,listview
或类似控件,以生成html输出。
我建议将ListView
控件用于所有目的,因为它允许您生成所需的确切html,并提供使用gridview控件获得的所有功能,可轻松配置交替行,数据绑定事件等。
我的两分钱:从外面看起来总是很难理解推理特别是因为我们都不想在这里透露太具体的业务用法,但看起来你的数据设计是什么实际上是有缺陷的,这就是难以在屏幕上表现的原因。
答案 2 :(得分: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)
答案 3 :(得分:0)
目前尚不清楚您的数据系列是在行还是列中,但如果您的记录在行中,则Repeater
接近您想要的数据。
答案 4 :(得分:0)
Gridview上默认情况下不启用排序和分页,因此没有理由不使用它。
但是,您可以考虑使用ListView control,这样可以更好地控制模板。
答案 5 :(得分:0)
如果您使用的是SQL Server 2005+,可以尝试首先在查询中使用UNPIVOT选项,如下所示:
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;
返回如下结果:
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
然后,您可以将gridView与该数据源中自动生成的列一起使用。