在模板容器中,放置GridView控件,形成"表中表"的效果,这样可以实现各种复杂的表格效果,下面介绍的"表中表"最适合显示主从表中的数据。
新建一个ASp.NET网站,在Default.aspx页面中添加如下代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "[http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd](http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd)">
<html xmlns="[http://www.w3.org/1999/xhtml](http://www.w3.org/1999/xhtml)" >
<head runat="server">
<title>GridView显示主从表数据</title>
<style type="text/css">
.PlusMouse{cursor:pointer;}
.Show{display:block;}
.Hide{display:none;}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" ShowHeader="false" OnRowDataBound="GridView1_RowDataBound">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<div>
<asp:ImageButton ID="imgPlus" runat="server" ImageUrl="~/images/plus.gif" CssClass="PlusMouse" />
<asp:Label ID="lblName" runat="server" Text=""></asp:Label>
</div>
<asp:Panel ID="panelOrder" runat="server" CssClass="Hide" HorizontalAlign="right">
<asp:GridView ID="gvOrder" runat="server" AutoGenerateColumns="false" OnRowDataBound="gvOrder_RowDataBound">
<Columns>
<asp:TemplateField HeaderText="">
<ItemTemplate>
<asp:Image ID="imgShipState" runat="server" />
</ItemTemplate>
<ItemStyle Width="20px" />
</asp:TemplateField>
<asp:BoundField DataField="OrderID" HeaderText="订单ID">
<ItemStyle Width="60px" />
</asp:BoundField>
<asp:BoundField DataField="CompanyName" HeaderText="顾客公司">
<ItemStyle Width="150px" />
</asp:BoundField>
<asp:BoundField DataField="OrderDate" DataFormatString="{0:yyyy-MM-dd}" HeaderText="订货日期">
<ItemStyle Width="150px" />
</asp:BoundField>
<asp:BoundField DataField="ProductName" HeaderText="产品名称">
<ItemStyle Width="300" />
</asp:BoundField>
</Columns>
</asp:GridView>
</asp:Panel>
</ItemTemplate>
<ItemStyle Width="700px" />
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</form>
</body>
</html>
在Default.aspx.cs文件中添加如下代码:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Text;
public partial class _Default : System.Web.UI.Page
{
private string conString = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];
protected void Page_Load(object sender, EventArgs e)
{
BindEmployee();
}
//获取一个DataTable
private DataTable GetDataTable(string strSQL)
{
SqlConnection con = new SqlConnection(conString);
con.Open();
SqlDataAdapter da = new SqlDataAdapter(strSQL,con);
DataTable dt = new DataTable();
da.Fill(dt);
con.Close();
return dt;
}
private void BindEmployee()
{
string strSQL = "select * from Employees";
this.GridView1.DataSource = this.GetDataTable(strSQL);
this.GridView1.DataBind();
}
private void BindGridOrder(string EmployeeID, GridView gv)
{
StringBuilder strSQL = new StringBuilder();
strSQL.Append("select top 5 t1.OrderID,t1.OrderDate,t1.RequiredDate,t1.ShippedDate,t2.CompanyName,t4.ProductName ");
strSQL.Append(" from Orders t1 ");
strSQL.Append(" left join Customers t2 on t1.CustomerID=t2.CustomerID ");
strSQL.Append(" left join [Order Details] t3 on t1.OrderID = t3.OrderID ");
strSQL.Append(" left join Products t4 on t3.ProductID = t4.ProductID ");
strSQL.AppendFormat(" where t1.EmployeeID='{0}'", EmployeeID);
gv.DataSource = this.GetDataTable(strSQL.ToString());
gv.DataBind();
}
//主表的数据绑定
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType != DataControlRowType.DataRow)
return;
DataRowView drv = (DataRowView)e.Row.DataItem;
Label lblName = (Label)e.Row.FindControl("lblName");
lblName.Text = drv["TitleOfCourtesy"].ToString() + drv["FirstName"].ToString();
string pid = e.Row.FindControl("panelOrder").ClientID;
ImageButton imgPlus = (ImageButton)e.Row.FindControl("imgPlus");
imgPlus.Attributes.Add("bz","0");
imgPlus.OnClientClick = "if(this.bz=='0'){ document.getElementById('"+pid+"').className='Show';this.bz='1';}else{ document.getElementById('"+pid+"').className='Hide';this.bz='0';}return false;";
GridView gv = (GridView)e.Row.FindControl("gvOrder");
this.BindGridOrder(drv["EmployeeID"].ToString(), gv);
}
//从表的数据绑定
protected void gvOrder_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType != DataControlRowType.DataRow)
return;
DataRowView drv = (DataRowView)e.Row.DataItem;
DateTime requiredDate = DateTime.Parse(drv["RequiredDate"].ToString());
DateTime shippedDate = requiredDate;
try
{
shippedDate = DateTime.Parse(drv["ShippedDate"].ToString());
}
catch
{
}
int days = requiredDate.Subtract(shippedDate).Days;
Image imgState = (Image)e.Row.FindControl("imgShipState");
if (days < 10)
{
imgState.ImageUrl = "./images/1.gif";
}
else if (days < 20)
{
imgState.ImageUrl = "./images/2.gif";
}
else
{
imgState.ImageUrl = "./images/3.gif";
}
}
}
页面显示效果如下![](https://box.kancloud.cn/2016-02-18_56c56191832e9.gif)
:
- 前言
- asp.net利用GridView&quot;表中表&quot;实现主从表数据
- asp.net TreeView动态绑定数据库显示数据
- asp.net图片验证码
- asp.net中利用Lucene.net实现检索并对检索关键字高亮显示
- asp.net时间控件之用法
- asp.net 水晶报表使用总结
- asp.net frameset里一个frame中获取下拉框、单选框的值并作为参数传递到另一个frame里并显示结果
- asp.net中zedgraph柱状图的使用总结
- asp.net Repeater控件用法----一列数据在Repeater中每行显示固定记录方法
- asp.net 服务器端Label控件字间距调整的一种简单方案
- asp.net 利用HttpWebRequest自动获取网页编码并获取网页源代码
- asp.net中去除字符串中的所有空格字符
- ASP.NET中数据控件中的LinkButton控件点击时更换颜色
- asp.net中一个页面跳转,后一个页面操作内容后返回先前页面,并使得先前页面数据刷新
- asp.net 使用FileUpload控件上传并显示图片
- asp.net中用于显示包含html标记的服务器端控件 Literal
- asp.net 鼠标移入Repeater某一行时改变颜色并且checkbox列被选中
- asp.net web数据库控件内table(包括嵌套table)的边线问题
- asp.net 实现获取一个集合数组中出现次数最多的元素
- asp.net DataList控件分页代码
- asp.net 操作INI配置文件类
- asp.net 操作Excel表数据导入到SQL Server数据库
- asp.net jquery ajax数据操作 DropDownList级联
- asp.net 在线用户列表统计
- asp.net TreeView动态添加
- asp.net 上传大文件大小控制方案
- ASP.NET中利用Repeater实现增删改操作
- ASP.NET中DateTime可空值的设置方法
- ASP.NET &lt;a&gt;&lt;/a&gt;标记href传递多个参数
- asp.net DropDownList中内容伪树状展示
- aspx页面中点击按钮传递给Silverlight,并且页面不刷新
- asp.net 利用微软数据访问类库结合AjaxPro实现无刷新下拉框级联
- asp.net 服务器控件LinkButton等在后台代码中设置js事件或添加css样式
- asp.net 长表单填写水平滚动条滑动效果
- asp.net 之StringBuilder 去除重复数据
- asp.net Repeater等数据控件模版内部2个DropDownList控件级联
- asp.net 网站暂停访问之添加一个html文件(app_offline.htm)
- asp.net 解决文件上传大小的限制
- asp.net RadGrid分页功能扩展Demo
- asp.net frameset 框架页面伸缩功能实现
- asp.net 图片批量上传预览,在Silverlight页面中读取并滚动显示
- asp.net IE下div背景图片100%拉伸填充,可以缩放
- asp.net 根据值不同,在绑定时显示不同颜色
- asp.net+js方式实现的幻灯图片效果展示
- asp.net 向Oracle数据库表的Clob字段中写入文本编辑器中输入的大段文字信息
- asp.net 网页中播放mp4文件,IIS中设置MIME类型
- asp.net加载新浪方式的图片轮播
- asp.net 在使用母版页的子页面cs后台代码中控制母版页中的登录控件显示
- asp.net 购物网站倒计时功能
- asp.net Oracle数据库左侧目录树及右侧数据绑定及分页
- asp.net 内容页访问母版页中的控件
- asp.net 文件上传和下载管理源码
- asp.net Repeater控件内容上下滚动播放
- asp.net 邮件发送提醒功能(接收方包括QQ邮箱等)
- asp.net中分页控件AspNetPager美化样式
- asp.net 右下角弹出新提醒信息提示框
- asp.net表单验证和弹出框artDialog使用分享(资源整合)
- asp.net 2个ListBox之间转移数据的实现
- asp.net使用echarts展示图表数据
- asp.net中利用jquery zTree异步加载数据
- asp.net中DataTable和List&lt;T&gt;之间相互转换
- asp.net中利用NPOI导出数据到excel中
- asp.net中Repeater中嵌套Repeater来显示跟外层Repeater数据相关的其他信息
- asp.net 利用jquery让登录页面垂直居中显示
- asp.net 利用多表联合查询进行汇总统计
- asp.net 中RadioButtonList的选项改变事件处理(采用jquery操作)
- asp.net 中点击按钮弹出模式对话框,选择值后返回到页面中(window.showModalDialog实现)
- asp.net GridView列数据鼠标移入显示提示信息
- asp.net table表格表头及列固定实现
- asp.net 利用IHttpModule和IRequiresSessionState控制入口登录开发错误解决办法
- asp.net Web项目中使用Log4Net进行错误日志记录
- asp.net web开发中使用的Web弹窗/层的Layer使用介绍
- asp.net 调用echarts显示图表控件随浏览器自适应解决方案
- asp.net开发中利用jquery来实现滚动下拉标题浮动固定显示
- asp.net web开发中使用JS百度地图信息弹出窗中显示echarts图
- asp.net Repeater拖拽实现排序并同步排序字段到数据库中
- asp.net中获取Layer弹出层返回值