GridView多行嵌套(整行)
使用用户控件实现,外层GridView和内层GridView个使用一个用户控件。
ucChildGridView.ascx
前台
代码
1 <%@ Control Language="C#" AutoEventWireup="true" CodeFile="ucParentGridView.ascx.cs"
2 Inherits="多层嵌套整行嵌套_ucParentGridView" %>
3 <link href="~/CSS/Gridview.css" rel="stylesheet" type="text/css" />
4 <div id="container">
5 <asp:GridView ID="ParentGridView" AllowPaging="true" BorderColor="Black" OnRowDataBound="ParentGridView_RowDataBound"
6 runat="server" AutoGenerateColumns="False" Font-Size="12px" Width="530px" AllowSorting="True"
7 OnRowCreated="ParentGridView_RowCreated">
8 <Columns>
9 <asp:BoundField DataField="CategoryID" HeaderText="编号" ReadOnly="True" />
10 <asp:BoundField DataField="CategoryName" HeaderText="类别" ReadOnly="True" />
11 <asp:TemplateField ShowHeader="False">
12 <ItemTemplate>
13 <asp:LinkButton ID="LinkButton1" CommandArgument='<%# Bind("CategoryID") %>' OnClick="linkAssemblyDetail_OnClick"
14 runat="server" Text="Detail"></asp:LinkButton>
15 </ItemTemplate>
16 </asp:TemplateField>
17 </Columns>
18 <HeaderStyle BackColor="Azure" Font-Size="12px" HorizontalAlign="Center" />
19 <RowStyle HorizontalAlign="Center" />
20 <PagerStyle HorizontalAlign="Center" />
21 </asp:GridView>
22 </div>
23
2 Inherits="多层嵌套整行嵌套_ucParentGridView" %>
3 <link href="~/CSS/Gridview.css" rel="stylesheet" type="text/css" />
4 <div id="container">
5 <asp:GridView ID="ParentGridView" AllowPaging="true" BorderColor="Black" OnRowDataBound="ParentGridView_RowDataBound"
6 runat="server" AutoGenerateColumns="False" Font-Size="12px" Width="530px" AllowSorting="True"
7 OnRowCreated="ParentGridView_RowCreated">
8 <Columns>
9 <asp:BoundField DataField="CategoryID" HeaderText="编号" ReadOnly="True" />
10 <asp:BoundField DataField="CategoryName" HeaderText="类别" ReadOnly="True" />
11 <asp:TemplateField ShowHeader="False">
12 <ItemTemplate>
13 <asp:LinkButton ID="LinkButton1" CommandArgument='<%# Bind("CategoryID") %>' OnClick="linkAssemblyDetail_OnClick"
14 runat="server" Text="Detail"></asp:LinkButton>
15 </ItemTemplate>
16 </asp:TemplateField>
17 </Columns>
18 <HeaderStyle BackColor="Azure" Font-Size="12px" HorizontalAlign="Center" />
19 <RowStyle HorizontalAlign="Center" />
20 <PagerStyle HorizontalAlign="Center" />
21 </asp:GridView>
22 </div>
23
后台
代码
1 public partial class 多层嵌套整行嵌套_ucParentGridView : System.Web.UI.UserControl
2 {
3 private int ShowDetailRowKey
4 {
5 get
6 {
7 if (ViewState["ShowDetailRowKey"] == null)
8 {
9 return -1;
10 }
11 else
12 {
13 return int.Parse(ViewState["ShowDetailRowKey"].ToString());
14 }
15 }
16 set
17 {
18 ViewState["ShowDetailRowKey"] = value;
19 }
20 }
21
22 protected void Page_Load(object sender, EventArgs e)
23 {
24 if (!IsPostBack)
25 {
26 bindParent();
27 }
28 }
29
30 /// <summary>
31 /// 数据绑定
32 /// </summary>
33 public void bindParent()
34 {
35 string sqlStr = "select * from Categories";
36 DataSet myds = Common.dataSet(sqlStr);
37 ParentGridView.DataSource = myds;
38 ParentGridView.DataKeyNames = new string[] { "CategoryID" };
39 ParentGridView.DataBind();
40 }
41
42 /// <summary>
43 /// 在每一行绑定数据时,判断是否需要创建子表
44 /// </summary>
45 /// <param name="sender"></param>
46 /// <param name="e"></param>
47 protected void ParentGridView_RowDataBound(object sender, GridViewRowEventArgs e)
48 {
49 foreach (TableCell tc in e.Row.Cells)
50 {
51 tc.Attributes["style"] = "border-color:Black";
52 }
53 }
54
55 protected void linkAssemblyDetail_OnClick(object sender, EventArgs e)
56 {
57
58 LinkButton btn = (LinkButton)sender;
59
60 if (btn.CommandArgument != string.Empty)
61 {
62 int key = int.Parse(btn.CommandArgument);
63
64 if (key == ShowDetailRowKey)
65 {
66
67 ShowDetailRowKey = -1;
68
69 bindParent();
70
71 }
72 else
73 {
74 ShowDetailRowKey = key;
75
76 bindParent();
77 }
78 }
79 }
80
81 private void CreateDetailRow(GridViewRow gridRow)
82 {
83 if (RowIsCollasped(gridRow))
84 {
85 GridViewRow row = new GridViewRow(gridRow.RowIndex, -1, DataControlRowType.DataRow, DataControlRowState.Normal);
86
87 //TableCell cell = new TableCell();
88 //row.Cells.Add(cell);
89
90 TableCell cell2 = new TableCell();
91 cell2.Attributes["colspan"] = (this.ParentGridView.Columns.Count).ToString();
92
93 ucChildGridView ucChildGV = (ucChildGridView)LoadControl("ucChildGridView.ascx");
94
95 ucChildGV.CategoryID = int.Parse(this.ParentGridView.DataKeys[gridRow.RowIndex].Value.ToString());
96 ucChildGV.BindGridView();
97
98 cell2.Controls.Add(ucChildGV);
99 row.Cells.Add(cell2);
100
101
102 this.ParentGridView.Controls[0].Controls.AddAt(gridRow.RowIndex + 2, row);
103
104 }
105 }
106
107 private bool RowIsCollasped(GridViewRow row)
108 {
109 return this.ShowDetailRowKey == int.Parse(this.ParentGridView.DataKeys[row.RowIndex].Value.ToString()) ? true : false;
110 }
111
112 protected void ParentGridView_RowCreated(object sender, GridViewRowEventArgs e)
113 {
114 if (e.Row.RowType == DataControlRowType.Pager)
115 {
116 for (int i = 0; i < this.ParentGridView.Rows.Count; i++)
117 {
118 this.CreateDetailRow(this.ParentGridView.Rows[i]);
119 }
120 }
121 }
122 }
123
2 {
3 private int ShowDetailRowKey
4 {
5 get
6 {
7 if (ViewState["ShowDetailRowKey"] == null)
8 {
9 return -1;
10 }
11 else
12 {
13 return int.Parse(ViewState["ShowDetailRowKey"].ToString());
14 }
15 }
16 set
17 {
18 ViewState["ShowDetailRowKey"] = value;
19 }
20 }
21
22 protected void Page_Load(object sender, EventArgs e)
23 {
24 if (!IsPostBack)
25 {
26 bindParent();
27 }
28 }
29
30 /// <summary>
31 /// 数据绑定
32 /// </summary>
33 public void bindParent()
34 {
35 string sqlStr = "select * from Categories";
36 DataSet myds = Common.dataSet(sqlStr);
37 ParentGridView.DataSource = myds;
38 ParentGridView.DataKeyNames = new string[] { "CategoryID" };
39 ParentGridView.DataBind();
40 }
41
42 /// <summary>
43 /// 在每一行绑定数据时,判断是否需要创建子表
44 /// </summary>
45 /// <param name="sender"></param>
46 /// <param name="e"></param>
47 protected void ParentGridView_RowDataBound(object sender, GridViewRowEventArgs e)
48 {
49 foreach (TableCell tc in e.Row.Cells)
50 {
51 tc.Attributes["style"] = "border-color:Black";
52 }
53 }
54
55 protected void linkAssemblyDetail_OnClick(object sender, EventArgs e)
56 {
57
58 LinkButton btn = (LinkButton)sender;
59
60 if (btn.CommandArgument != string.Empty)
61 {
62 int key = int.Parse(btn.CommandArgument);
63
64 if (key == ShowDetailRowKey)
65 {
66
67 ShowDetailRowKey = -1;
68
69 bindParent();
70
71 }
72 else
73 {
74 ShowDetailRowKey = key;
75
76 bindParent();
77 }
78 }
79 }
80
81 private void CreateDetailRow(GridViewRow gridRow)
82 {
83 if (RowIsCollasped(gridRow))
84 {
85 GridViewRow row = new GridViewRow(gridRow.RowIndex, -1, DataControlRowType.DataRow, DataControlRowState.Normal);
86
87 //TableCell cell = new TableCell();
88 //row.Cells.Add(cell);
89
90 TableCell cell2 = new TableCell();
91 cell2.Attributes["colspan"] = (this.ParentGridView.Columns.Count).ToString();
92
93 ucChildGridView ucChildGV = (ucChildGridView)LoadControl("ucChildGridView.ascx");
94
95 ucChildGV.CategoryID = int.Parse(this.ParentGridView.DataKeys[gridRow.RowIndex].Value.ToString());
96 ucChildGV.BindGridView();
97
98 cell2.Controls.Add(ucChildGV);
99 row.Cells.Add(cell2);
100
101
102 this.ParentGridView.Controls[0].Controls.AddAt(gridRow.RowIndex + 2, row);
103
104 }
105 }
106
107 private bool RowIsCollasped(GridViewRow row)
108 {
109 return this.ShowDetailRowKey == int.Parse(this.ParentGridView.DataKeys[row.RowIndex].Value.ToString()) ? true : false;
110 }
111
112 protected void ParentGridView_RowCreated(object sender, GridViewRowEventArgs e)
113 {
114 if (e.Row.RowType == DataControlRowType.Pager)
115 {
116 for (int i = 0; i < this.ParentGridView.Rows.Count; i++)
117 {
118 this.CreateDetailRow(this.ParentGridView.Rows[i]);
119 }
120 }
121 }
122 }
123
ucChildGridView.ascx
前台
代码
1 <%@ Control Language="C#" AutoEventWireup="true" CodeFile="ucChildGridView.ascx.cs"
2 Inherits="ucChildGridView" %>
3 <asp:GridView ID="ChildGridView" runat="server" AllowPaging="True" PageSize="3" AutoGenerateColumns="False"
4 BorderColor="Black" OnRowDataBound="ChildGridView_RowDataBound" Width="241px">
5 <Columns>
6 <asp:BoundField DataField="ProductID" HeaderText="编号" ReadOnly="True" />
7 <asp:BoundField DataField="ProductName" HeaderText="名称" ReadOnly="True" SortExpression="ProductName" />
8 </Columns>
9 <HeaderStyle BackColor="Azure" Font-Size="12px" HorizontalAlign="Center" />
10 <RowStyle HorizontalAlign="Center" />
11 <PagerStyle HorizontalAlign="Center" />
12 </asp:GridView>
13
2 Inherits="ucChildGridView" %>
3 <asp:GridView ID="ChildGridView" runat="server" AllowPaging="True" PageSize="3" AutoGenerateColumns="False"
4 BorderColor="Black" OnRowDataBound="ChildGridView_RowDataBound" Width="241px">
5 <Columns>
6 <asp:BoundField DataField="ProductID" HeaderText="编号" ReadOnly="True" />
7 <asp:BoundField DataField="ProductName" HeaderText="名称" ReadOnly="True" SortExpression="ProductName" />
8 </Columns>
9 <HeaderStyle BackColor="Azure" Font-Size="12px" HorizontalAlign="Center" />
10 <RowStyle HorizontalAlign="Center" />
11 <PagerStyle HorizontalAlign="Center" />
12 </asp:GridView>
13
后台
代码
1 public partial class ucChildGridView : System.Web.UI.UserControl
2 {
3 public int CategoryID
4 {
5 get
6 {
7 if (ViewState["CategoryID"] == null)
8 {
9 return 0;
10 }
11 else
12 {
13 return int.Parse(ViewState["CategoryID"].ToString());
14 }
15 }
16 set
17 {
18 ViewState["CategoryID"] = value;
19 }
20 }
21
22 protected void Page_Load(object sender, EventArgs e)
23 {
24 if (!IsPostBack)
25 {
26 BindGridView();
27 }
28 }
29
30 protected void ChildGridView_RowDataBound(object sender, GridViewRowEventArgs e)
31 {
32 foreach (TableCell tc in e.Row.Cells)
33 {
34 tc.Attributes["style"] = "border-color:Black";
35 }
36
37 }
38
39 public void BindGridView()
40 {
41 string sqlStr = "select * from Products where CategoryID=" + this.CategoryID.ToString();
42 DataSet myds = Common.dataSet(sqlStr);
43
44 this.ChildGridView.DataSource = myds.Tables[0];
45 this.ChildGridView.DataBind();
46 }
47 }
48
2 {
3 public int CategoryID
4 {
5 get
6 {
7 if (ViewState["CategoryID"] == null)
8 {
9 return 0;
10 }
11 else
12 {
13 return int.Parse(ViewState["CategoryID"].ToString());
14 }
15 }
16 set
17 {
18 ViewState["CategoryID"] = value;
19 }
20 }
21
22 protected void Page_Load(object sender, EventArgs e)
23 {
24 if (!IsPostBack)
25 {
26 BindGridView();
27 }
28 }
29
30 protected void ChildGridView_RowDataBound(object sender, GridViewRowEventArgs e)
31 {
32 foreach (TableCell tc in e.Row.Cells)
33 {
34 tc.Attributes["style"] = "border-color:Black";
35 }
36
37 }
38
39 public void BindGridView()
40 {
41 string sqlStr = "select * from Products where CategoryID=" + this.CategoryID.ToString();
42 DataSet myds = Common.dataSet(sqlStr);
43
44 this.ChildGridView.DataSource = myds.Tables[0];
45 this.ChildGridView.DataBind();
46 }
47 }
48