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方式 ...
随机推荐
- 一文看懂IC芯片生产流程:从设计到制造与封装
http://blog.csdn.net/yazhouren/article/details/50810114 芯片制造的过程就如同用乐高盖房子一样,先有晶圆作为地基,再层层往上叠的芯片制造流程后,就 ...
- http状态码+http请求方式
一.http状态码 2开头 (请求成功)表示成功处理了请求的状态代码. 200 (成功) 服务器已成功处理了请求. 通常,这表示服务器提供了请求的网页. 201 (已创建) 请求成功并且服 ...
- C中级 数据序列化简单使用和讨论 (二)
引言 - 一种更好的方式 其实不管什么语言, 开发框架都会遇到序列化问题. 序列化可以理解为A 和 B 交互的一种协议. 很久以前利用 printf 和 scanf 的协议实现过一套序列化问题. C ...
- 关于 拼接 url 连接 参数的问题(爬虫)。
比如这里 我找的 后台请求的json的链接: 第一页: http://www.igoldenbeta.com:8080/cn-jsfund-server-mobile/bkt/api?appkey=1 ...
- ZOJ-3318
Strange Country Time Limit: 1 Second Memory Limit: 32768 KB There are n cities in the dream cou ...
- tomcat - gc日志输出
原创 2017年01月04日 14:32:37 2090 tomcat/bin catalina.sh JAVA_OPTS='-server -Xms4g -Xmx4g -Xss256k -XX:Pe ...
- Django视图之ORM数据库查询操作API
查询表记录 查询相关API 操作:models.表名.objects.方法() all(): 查询所有结果 filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 get(**kwar ...
- python import模块的搜索路径
当在py代码中import所依赖的模块时, python是从哪里找到这些模块呢,即模块的搜索路径是啥? 默认情况下,Python解释器会搜索当前目录.所有已安装的内置模块和第三方模块,搜索路径存放在s ...
- Raspberry Pi Finder
这是 meelo 原创的 玩转树莓派 系列文章 作为一名新手,你可能苦恼与如何寻找树莓派的IP地址.要想寻找IP地址,在不同的连接状况下,的方法是不一样的,这在其它教程里有作详细介绍(使用路由器连接树 ...
- WPF Binding 的顺序问题
做了一个Win 8 Store APP,其中有一个List Box,从另外一个Page Navigate到这个Page之后,需要自动选中 List Box中的一项. 开始是这么写的 <ListB ...