我需要在html表中显示数据库中的数据。我目前正在使用ListView控件。
我希望最终的HTML表格能够呈现如下内容,其中某些行的rowspan
属性大于1。原因是某些字段有多行信息,但对应于相同的逻辑条目。
例如:
|---------|---------|----------|----------|
| data | data |data | data |
| | |----------| |
| | |data | |
| | |----------| |
| | |data | |
|---------|---------|----------|----------|
| data | data |data | data |
| | |----------| |
| | |data | |
| | |----------| |
| | |data | |
|---------|---------|----------|----------|
| data | data |data | data |
| | |----------| |
| | |data | |
| | |----------| |
| | |data | |
| | |----------| |
| | |data | |
| | |----------| |
| | |data | |
|---------|---------|----------|----------|
在ASP.net中实现此目的的最简单方法是什么?
答案 0 :(得分:6)
ListView
的解决方案不太优雅。主要思想是在Repeater
中使用ListView
并绑定所有子数据(我的意思是示例中第三列的数据),除了第一个记录。
<asp:ListView runat="server" ID="lstData">
<LayoutTemplate>
<table>
<asp:PlaceHolder runat="server" ID="itemPlaceholder" />
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td <%# GetRowspan((int)Eval("Data.Length")) %>>
<%# Eval("FirstName") %>
</td>
<td <%# GetRowspan((int)Eval("Data.Length")) %>>
<%# Eval("LastName") %>
</td>
<td>
<%# GetFirst((IEnumerable<string>)Eval("Data")) %>
</td>
<td <%# GetRowspan((int)Eval("Data.Length")) %>>
<%# Eval("Country") %>
</td>
</tr>
<asp:Repeater runat="server"
DataSource=<%# GetRest((IEnumerable<string>)Eval("Data")) %>>
<ItemTemplate>
<tr>
<td>
<%# Container.DataItem %>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:ListView>
和代码背后:
public override void DataBind()
{
var item1 = new { FirstName = "John", LastName = "Doe",
Data = new[] { "first", "second", "third" }, Country = "US" };
var item2 = new { FirstName = "Jane", LastName = "Doe",
Data = new string[] { }, Country = "CA" };
var item3 = new { FirstName = "Joe", LastName = "Public",
Data = new[] { "first", "second", "third", "fourth" }, Country = "US" };
lstData.DataSource = new[] { item1, item2, item3 };
lstData.DataBind();
}
protected string GetRowspan(int length)
{
if (length == 0)
return string.Empty;
else
return string.Format("rowspan='{0}'", length);
}
protected string GetFirst(IEnumerable<string> data)
{
return data.FirstOrDefault();
}
protected IEnumerable<string> GetRest(IEnumerable<string> data)
{
if (data.Any())
return data.Skip(1);
else
return Enumerable.Empty<string>();
}
以您想要的格式输出数据。
但如果不需要使用ListView
,您可以查看GridView
。使用它有更优雅的方法 - ASP.NET GridView RowSpan using RowCreated Event - How to add Table Dynamic RowSpan with GridView文章。
答案 1 :(得分:0)
protected override void RenderContents(HtmlTextWriter output)
{
var builder = new StringBuilder();
builder.Append("<table>");
for(int i=0;i<dt1.rows.count;i++)
{
builder.Append("<tr>");
builder.Append("<td>");
builder.Append(dt1.rows[i].ToString());
builder.Append("</td>");
builder.Append("<td>");
builder.Append(dt1.rows[i].ToString());
builder.Append("</td>");
builder.Append("</td>");
builder.Append("<table>");
builder.Append("<tr>");
for(int j=0;i<dt2.rows.count;j++)
{
builder.Append("<td>");builder.Append(dt2.rows[j].ToString());
builder.Append("</td>");
}
builder.Append("</tr>");
builder.Append("</table>");
builder.Append("</tr>");
}
builder.Append("</table>");
output.Write(builder.ToString());
}
假设dt1为table1,dt2为内部表... 所以这种方法会帮助你...