gridview展开嵌套显示
最近实在是太忙了,好几个月没有更新博客了,近来项目需要用到GRIDVIEW嵌套的,在这里跟大家分享一下,大家如有更好的解决方案,请不吝贴出。在ASP.NET中,GridView嵌套可以显示当前选定的父记录同时显示其子记录。例如,你可以创建按条件查找出相应项目的管理项目列表,同时可展开项目查看目前该项目进展到哪一阶段了。(如下图)
而这一使用的基本技术就是为父表创建一个GridView,它的每行又嵌入一个GridView,这些子GridView使用TemplateField来插入到父GridView中。唯一需要注意的是,不能在绑定父GridView的同时绑定子GridView,因为此时父行还没有被创建。而子GridView需要等待父GridView的DataBound时间发生。
在这个示例中父GridView定义了自动产生列( AutoGenerateColumns="True"),我这里实际上使用了两个子GridView.
<asp:TemplateColumn HeaderText="OPHist">
<HeaderStyle Width="40px" CssClass="12-head-pt"></HeaderStyle>
<ItemTemplate>
<asp:Image ID="XXX" runat="server" ImageUrl="../image/plus.gif" AlternateText="ProjectHistory">
</asp:Image>
<asp:DataGrid ID="grdOPHistory" Style="left: 50px" runat="server" AutoGenerateColumns="True"
BorderColor="MintCream" BorderWidth="1px" BackColor="White" CellPadding="1" ForeColor="Black">
<SelectedItemStyle ForeColor="GhostWhite" BackColor="#CCCCCC"></SelectedItemStyle>
<HeaderStyle Font-Bold="True" Width="40px" ForeColor="White" BackColor="#ff6666"></HeaderStyle>
</asp:DataGrid>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Status">
<HeaderStyle Width="40px" CssClass="12-head-pt"></HeaderStyle>
<ItemTemplate>
<asp:Image ID="SHOW" runat="server" ImageUrl="../image/plus.gif" AlternateText="ProjectDetail">
</asp:Image>
<asp:DataGrid ID="grdProjectDetail1" onitemdatabound="grdProjectDetail1_ItemDataBound" Style="left: 50px" runat="server" AutoGenerateColumns="True">
<ItemStyle BackColor="#B3D7F1"></ItemStyle>
<HeaderStyle Font-Bold="True" Font-Size="10" Height="20px" ForeColor="black" CssClass="A"
BackColor="#4791C5"></HeaderStyle> </asp:DataGrid>
</ItemTemplate>
</asp:TemplateColumn>
这些GRIDVIEW都没有直接指定数据源。而是采用编程的形式来实现。下面贴出父GRIDVIEW的DataBound事件。
private void grdProject_ItemDataBound(object sender, DataGridItemEventArgs e)
{
if (e.Item.DataItem is DataRowView)
{
string bindSql = @"EXEC SSM_SP_GETDTL @PROJECTNUM='" + ((Label)e.Item.FindControl("PROJECTNUM")).Text.Trim() + "', @REV='" + ((Label)e.Item.FindControl("REV")).Text.Trim() + "'";
base.doDataBind((DataGrid)e.Item.FindControl("grdProjectDetail1"), bindSql);
((DataGrid)e.Item.FindControl("grdProjectDetail1")).Style.Add("display", "none");
bindSql = @"EXEC SSM_SP_GETOPHIST @PROJECTNUM='" + ((Label)e.Item.FindControl("PROJECTNUM")).Text.Trim() + "', @REV='" + ((Label)e.Item.FindControl("REV")).Text.Trim() + "'";
base.doDataBind((DataGrid)e.Item.FindControl("grdOPHistory"), bindSql);
((DataGrid)e.Item.FindControl("grdOPHistory")).Style.Add("display", "none");
if (e.Item.FindControl("SHOW") != null)
{
((Image)e.Item.FindControl("SHOW")).Attributes.Add("onclick", "HierarGrid_toggleRow(this,'grdProjectDetail1')");
}
if (e.Item.FindControl("XXX") != null)
{
((Image)e.Item.FindControl("XXX")).Attributes.Add("onclick", "HierarGrid_toggleRow(this,'grdOPHistory')");
}
if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
{
string str2 = ((Label)e.Item.FindControl("PROJECTNUM")).Text.Trim();
string str3 = ((Label)e.Item.FindControl("REV")).Text.Trim();
ImageButton image = (ImageButton)e.Item.FindControl("btnEdit");
image.Attributes.Add("onclick", "window.open('SSMProjectDetail.aspx?PROJECTNUM=" + str2 + "&REV=" + str3 + "&Mode=Edit','_blank','top=10,left=10,width=1100,height=900,scrollbars=yes,resizable=yes')"); }
}
}
其实说白了也不难,但说不难也不容易。关键是前台面的HierarGrid_toggleRow怎么写。现将代码帖出,有不明白的地方请留言,如对您有帮助,请给个赞。
function HierarGrid_toggleRow(sender, grd) {
if (sender == null)
return;
var state = 1;
//if the hidden row has not already been generated, clone the panel into a new row
var existingRow = window.document.getElementById(sender.id + "showRow");
if (existingRow == null) {
//getting a reference to the table
var table = GetParentElementByTagName(sender, "TABLE");
var index = GetParentElementByTagName(sender, "TR").sectionRowIndex + 1;
//concatenate name of hidden panel => replace "Icon" from sender.id with "Panel"\n
if (grd == "grdProjectDetail1") {
rowDivName = HierarGrid_ReplaceStr(sender.id, "SHOW", grd);
}
else {
rowDivName = HierarGrid_ReplaceStr(sender.id, "XXX", grd);
}
var rowDiv = window.document.getElementById(rowDivName);
//adding new row to table
var newRow = table.insertRow(index);
newRow.id = sender.id + "showRow";
//adding new cell to row
var newTD = document.createElement("TD");
if (table.rows[0].cells[0].colSpan > 1)
newTD.colSpan = table.rows[0].cells[0].colSpan;
else
newTD.colSpan = table.rows[0].cells.length;
var myTD = newRow.appendChild(newTD);
//clone Panel into new cell
var copy = rowDiv;
copy.style.display = "";
myTD.innerHTML = copy.outerHTML;
rowDiv.parentNode.removeChild(rowDiv);
sender.src = HierarGrid_ReplaceStr(sender.src, "plus", "minus");
state = 1;
}
else {
if (existingRow.style.display == "none") {
existingRow.style.display = "";
sender.src = HierarGrid_ReplaceStr(sender.src, "plus", "minus");
state = 1;
}
else {
existingRow.style.display = "none";
sender.src = HierarGrid_ReplaceStr(sender.src, "minus", "plus");
state = 0;
}
}
// ChangeRowState(sender, state);
}
function HierarGrid_ReplaceStr(orgString, findString, replString) {
pos = orgString.lastIndexOf(findString);
return orgString.substr(0, pos) + replString + orgString.substr(pos + findString.length);
}
function GetParentElementByTagName(element, tagName) {
var element = element;
while (element.tagName != tagName)
element = element.parentNode;
return element;
}
gridview展开嵌套显示的更多相关文章
- 鼠标指向GridView某列显示DIV浮动列表
需求: 当GRIDVIEW数据列过多,不方便全部显示在同一行或者一些子信息需要鼠标指向某关键列GRIDVIEW的时候显示其子信息. 设计:先把需要显示的浮动数据一次过抓取出来.而不是鼠标指向的时候才从 ...
- GridView 根据要求显示指定值
最近在写一个小项目用来练手恢复一下功力的,在Users表中有一个用户字段是状态,我使用"0"表示启用,“1”表示禁用, 存到数据库中, 由于之前有一段时间没写代码了,所以有点生疏了 ...
- [置顶] gridview中嵌套gridview(并实现子gridview的数据绑定),页面传值,加密,数据绑定
先来张效果图 gridview 中嵌套gridview的原理是这样的,在父gridview中建一个摸板列,然后再模版列当中在放入子gridview,然后再父gridview的OnRowDataBoun ...
- VUE Node模式下,如何改变菜单的颜色,如何将超长文字缩略显示,在鼠标进入后展开全部显示,鼠标移出则恢复缩略显示
VUE Node模式下,如何改变菜单的颜色,如何将超长文字缩略显示,在鼠标进入后展开全部显示,鼠标移出则恢复缩略显示: “事件”引起变量值的变化,系统引擎自动根据变量值的变化刷新页面 在VUE Nod ...
- Python代码阅读(第11篇):展开嵌套列表
Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的代码实现了展开嵌套列表的功能,将一个嵌套的list展开成一个一维list(不改变原有列表的顺序). 本篇阅读的代 ...
- ScrollView嵌套ListView、GridView,进入页面显示的位置并不是在最顶部,而是在中间部分问题
在Android项目的开发中,经常会遇到一些布局,可能需要在ScrollView中嵌套ListView或.GridView来实现, 是在使用的过程总又遇到了一个新的问题,就是如果在ScrollView ...
- (转)解决ScrollView嵌套ListView或者GridView导致只显示一行的方法
即动态获取ListView和GridView的高度 一.对于ListView ListView listview= new ListView(this); setListViewHeightBased ...
- Android RecyclerView 动画展开item显示详情
stackoverflow上看到这个问题,答主给了个demo http://stackoverflow.com/questions/27446051/recyclerview-animate-item ...
- GridView控件显示图片
与图片的二进制数据库存储和显示 1.将图片以二进制存入数据库 2.读取二进制图片在页面显示 3.设置Image控件显示从数据库中读出的二进制图片 4.GridView中ImageField以URL方式 ...
随机推荐
- 简单的自动化运维工具(shell+except+whiptail+功能模块化函数+循环)
简单的自动化运维工具(shell+except+whiptail+功能模块化函数+循环) http://www.cnblogs.com/M18-BlankBox/p/5881700.html
- Win10下Anaconda3安装CPU版本TensorFlow并使用Pycharm开发
环境:windows10 软件:Anaconda3 1.安装Anaconda 选择相应的Anaconda进行安装,下载地址点击这里,下载对应系统版本的Anaconda3. 运行 开始菜单->An ...
- Makefile系列之三 : 变量
一.变量的基础 变量在声明时需要给予初值,而在使用时,需要给在变量名前加上“$”符号,但最好用小括号“()”或是大括号“{}”把变量给包括起来.如果你要使用真实的“$”字符,那么你需要用“$$”来表示 ...
- MyEclipse部署项目报"Add Deployment". Invalid Subscription Level - Discontinuing this MyEclipse
"Add Deployment". Invalid Subscription Level - Discontinuing this MyEclipse 猜测应该是MyEclipse ...
- Java Redis 连接池 Jedis 工具类
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import redis.clients.jedis.Jedis; import re ...
- Context-Aware Network Embedding for Relation Modeling
Context-Aware Network Embedding for Relation Modeling 论文:http://www.aclweb.org/anthology/P17-1158 创新 ...
- MYSQL表中向SET类型的字段插入值时值之间不能有空格
MYSQL 中有一种数据类型是 SET,首先我们查看一个包含 SET 类型字段的表结构: 接下来我们向表中插入数据: 按照上面的语句插入数据发现报错了,于是去掉了插入值之间的空格,然后插入成功:
- selenium+python自动化80-文件下载(不弹询问框)【转载】
转至博客:上海-悠悠 前言 上一篇是点弹出框上的按钮去保存文件,本篇介绍一种更加优雅的方法,加载Firefox和Chrome的配置文件,不弹出询问框后台下载. 一.FirefoxProfile 1.点 ...
- Restful Framework (四)
目录 一.分页 二.视图 三.路由 四.渲染器 一.分页 回到顶部 试问如果当数据量特别大的时候,你是怎么解决分页的? 方式a.记录当前访问页数的数据id 方式b.最多显示120页等 方式c.只显示上 ...
- 181. Employees Earning More Than Their Managers
The Employee table holds all employees including their managers. Every employee has an Id, and there ...