asp.net利用GridView"表中表"实现主从表数据

简介:       在模板容器中,放置GridView控件,形成"表中表"的效果,这样可以实现各种复杂的表格效果,下面介绍的"表中表"最适合显示主从表中的数据。

      在模板容器中,放置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">

<html xmlns="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";
        }
    }

   
}
页面显示效果如下:

                                              

相关文章
|
7月前
mvc.net分页查询案例——DLL数据访问层(HouseDLL.cs)
mvc.net分页查询案例——DLL数据访问层(HouseDLL.cs)
|
2月前
|
SQL XML 关系型数据库
入门指南:利用NHibernate简化.NET应用程序的数据访问
【10月更文挑战第13天】NHibernate是一个面向.NET的开源对象关系映射(ORM)工具,它提供了从数据库表到应用程序中的对象之间的映射。通过使用NHibernate,开发者可以专注于业务逻辑和领域模型的设计,而无需直接编写复杂的SQL语句来处理数据持久化问题。NHibernate支持多种数据库,并且具有高度的灵活性和可扩展性。
41 2
|
4月前
|
开发框架 .NET 数据库连接
闲话 Asp.Net Core 数据校验(三)EF Core 集成 FluentValidation 校验数据例子
闲话 Asp.Net Core 数据校验(三)EF Core 集成 FluentValidation 校验数据例子
|
5月前
|
开发框架 JSON 前端开发
利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理
利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理
|
4月前
|
开发框架 前端开发 算法
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
|
7月前
|
存储 测试技术 计算机视觉
高维数据惩罚回归方法:主成分回归PCR、岭回归、lasso、弹性网络elastic net分析基因数据
高维数据惩罚回归方法:主成分回归PCR、岭回归、lasso、弹性网络elastic net分析基因数据
|
7月前
|
SQL 数据库
使用ADO.NET查询和操作数据
使用ADO.NET查询和操作数据
|
7月前
|
SQL 开发框架 .NET
ASP.NET WEB+EntityFramework数据持久化——考核练习库——1、用户管理系统(考点:查询列表、增加、删除)
ASP.NET WEB+EntityFramework数据持久化——考核练习库——1、用户管理系统(考点:查询列表、增加、删除)
121 0
|
7月前
|
SQL 开发框架 前端开发
ASP.NET WEB项目中GridView与Repeater数据绑定控件的用法
ASP.NET WEB项目中GridView与Repeater数据绑定控件的用法
85 0
|
7月前
|
SQL 开发框架 .NET
ASP.NET Web——GridView完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能
ASP.NET Web——GridView完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能
83 0