展开前效果图:
展开后效果图:
JS(此部分最重要):
<script type="text/javascript" language="javascript">
var gridViewList = new Array();
var objDiv;
var objImageButton;
function expandcollapse(obj,obj2)//obj是Div的ID obj2是imageButton
{
var div = document.getElementById(obj);
objDiv = obj;
objImageButton = obj2;
for(i=0;i<gridViewList.length;i++){
if(gridViewList[i].id==obj){//如果以及存在这个对象 则跳出
break;
}
}
if(i == gridViewList.length){//说明没有找到 则新加一个
var newObj = new Object();
newObj.id = obj;
newObj.buttonId=obj2.id;
if(div.style.display == null || div.style.display==""){
div.style.display = "none";//指定对象的可见状态
newObj.display = "none";
}else{
newObj.display= div.style.display;
}
gridViewList.push(newObj);//记录这个对象
}
return true;
}
function SetGridViewState(){//obj是Div的ID obj2是imageButton
for(i=0;i<gridViewList.length;i++){
if(gridViewList[i].id==objDiv){//如果以及存在这个对象 则改变该对象的显示状态
if(gridViewList[i].display == "none"){
document.getElementById(objDiv).style.display = "block";
document.getElementById(gridViewList[i].buttonId).src="../Images/Right/minus.gif";
gridViewList[i].display = "block";
}else{
document.getElementById(objDiv).style.display = "none";
gridViewList[i].display = "none";
document.getElementById(gridViewList[i].buttonId).src="../Images/Right/plus.gif";
}
}else{
document.getElementById(gridViewList[i].id).style.display =gridViewList[i].display;
if(gridViewList[i].display=="block")
{
document.getElementById(gridViewList[i].buttonId).src="../Images/Right/minus.gif";
}
else{
document.getElementById(gridViewList[i].buttonId).src="../Images/Right/plus.gif";
}
}
}
}
function ClearState()
{
if(gridViewList!=null&&gridViewList.length>0)
{
gridViewList.splice(0,gridViewList.length);
}
}
function SetImageState(){
for(i=0;i<gridViewList.length;i++){
var obj = document.getElementById(gridViewList[i].id);
var obj2 = document.getElementById(gridViewList[i].buttonId);
if(obj != null && obj2 != null){
if(gridViewList[i].display=="block")
{
obj.style.display="block";
obj2.src="../Images/Right/minus.gif";// 链接“—”图片 表示已经展开
}
else{
obj.style.display="none";
obj2.src="../Images/Right/plus.gif";链接“+”图片 用于展开第一层
}
}
}
}
</script>
ASPX代码:
<asp:GridView ID="GridProCost" CssClass="gridViewFold" runat="server" EmptyDataText="未查询到满足条件的数据"
GridLines="None" BorderStyle="Outset" AutoGenerateColumns="False" OnRowDataBound="GridProCost_RowDataBound"
OnRowCommand="GridProCost_RowCommand" OnPreRender="GridProCost_PreRender">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:ImageButton ID="ibtnProId" runat="server" ImageAlign="top" Width="11px" Height="11px"
CssClass="imgStyle" ImageUrl="~/Images/Right/plus.gif" OnClick="btnPrject_Click"
OnClientClick='<%# "expandcollapse(/"divClass"+ Eval("ProjectId")+"/",this)" %>'
CommandArgument='<%# ((GridViewRow)Container).RowIndex %>' /> --绑定“+”表示可以展开, 绑定父GridView中数据的关键值 即ID
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="项目编号">
<ItemTemplate>
<asp:Label runat="server" ID="LblProjectNo" Text='<%# Bind("ProjectNo") %>'></asp:Label>
</ItemTemplate>
<HeaderStyle Wrap="False" />
</asp:TemplateField>
<asp:TemplateField HeaderText="项目名称">
<ItemTemplate>
<asp:HiddenField ID="HidProId" Value='<%# Eval("ProjectId")%>' runat="server" />
<asp:Label ID="Label1" runat="server" Text='<%# CheckProjectName(Eval("ProjectName")) %>'></asp:Label>
</ItemTemplate>
<HeaderStyle Wrap="False" />
</asp:TemplateField>
<asp:TemplateField HeaderText="预计时间">
<ItemTemplate>
<asp:Label ID="Label4" runat="server" Text='<%# Bind("Plandate") %>'></asp:Label>
</ItemTemplate>
<ItemStyle Width="180px" />
<HeaderStyle Wrap="False" />
</asp:TemplateField>
<asp:TemplateField HeaderText="责任人">
<ItemTemplate>
<asp:Label ID="Label5" runat="server" Text='<%# Bind("DutyPerson") %>'></asp:Label>
</ItemTemplate>
<ItemStyle Width="60px" />
<HeaderStyle Wrap="False" />
</asp:TemplateField>
<asp:TemplateField HeaderText="审核状态">
<ItemTemplate>
<asp:Label ID="LblStatus" runat="server" Text='<%# CheckVerifyStatus(Eval("VerifyStatus")) %>'></asp:Label>
</ItemTemplate>
<ItemStyle Width="60px" />
<HeaderStyle Wrap="False" />
</asp:TemplateField>
<asp:TemplateField HeaderText="执行状态">
<ItemTemplate>
<asp:Label runat="server" ID="Lbl2Status" Text='<%# CheckStatus(Eval("Status"))%>'></asp:Label>
</ItemTemplate>
<ItemStyle Width="60px" />
<HeaderStyle Wrap="False" />
</asp:TemplateField>
<asp:TemplateField HeaderText="期初金额(万元)">
<ItemTemplate>
<asp:Label ID="Label6" runat="server" Text='<%# SubMoney(Eval("MB")) %>'></asp:Label>
</ItemTemplate>
<ItemStyle HorizontalAlign="Right" Width="100px" />
<HeaderStyle Wrap="False" />
</asp:TemplateField>
<asp:TemplateField HeaderText="拨入金额(万元)">
<ItemTemplate>
<asp:Label ID="Label7" runat="server" Text='<%# SubMoney(Eval("SumMD")) %>'></asp:Label>
</ItemTemplate>
<ItemStyle HorizontalAlign="Right" Width="90px" />
<HeaderStyle Wrap="False" />
</asp:TemplateField>
<asp:TemplateField HeaderText="支出金额(万元)">
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# SubMoney(Eval("SumMC")) %>'></asp:Label>
</ItemTemplate>
<ItemStyle HorizontalAlign="Right" Width="90px" />
<HeaderStyle Wrap="False" />
</asp:TemplateField>
<asp:TemplateField HeaderText="可用余额(万元)">
<ItemTemplate>
<asp:Label ID="Label8" runat="server" Text='<%# SubMoney(Eval("Bal")) %>'></asp:Label>
</ItemTemplate>
<ItemStyle HorizontalAlign="Right" Width="100px" />
<HeaderStyle Wrap="False" />
</asp:TemplateField>
<asp:TemplateField HeaderText="操作">
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CssClass="Updatebutton" CausesValidation="False"
CommandName="Add1" CommandArgument='<%# ((GridViewRow)Container).RowIndex %>'
OnClientClick='<%# "return AddCostRecord("+Eval("ProjectId")+")" %>' Text="添加"></asp:LinkButton>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" Width="60px" />
<HeaderStyle HorizontalAlign="Center" Wrap="False" />
</asp:TemplateField>
<asp:TemplateField> --将子GridView放在最后一列的模板中
<ItemTemplate>
<tr>
<td colspan="100%" align="left" style="border: none;">
<div id="divClass<%# Eval("ProjectId") %>" style="display: none; position: relative;
left: 15px; overflow: auto; width: 100%">
<asp:GridView ID="GridCostInfo" Width="97%" runat="server" OnRowDataBound="GridCostInfo_RowDataBound"
AutoGenerateColumns="False" ShowFooter="true" CssClass="gvFold" EmptyDataText="未查询到满足条件的数据">
<Columns>
<asp:TemplateField HeaderText="拨入金额(万元)">
<ItemTemplate>
<asp:HiddenField ID="HidMB" runat="server" Value='<%# Bind("MB", "{0:f2}") %>' />
<asp:Label ID="LblMD" runat="server" Text='<%# Bind("MD", "{0:f2}") %>'></asp:Label>
<asp:HiddenField ID="HidCostId" Value='<%# Eval("CostId")%>' runat="server" />
<asp:HiddenField ID="HidStatus2" runat="server" Value='<%# Bind("Status") %>' />
</ItemTemplate>
<HeaderStyle Wrap="False" />
<ItemStyle HorizontalAlign="Right" Width="100px" />
</asp:TemplateField>
<asp:TemplateField HeaderText="支出金额(万元)">
<ItemTemplate>
<asp:Label ID="LblMC" runat="server" Text='<%# Bind("MC", "{0:f2}") %>'></asp:Label>
</ItemTemplate>
<HeaderStyle Wrap="False" />
<ItemStyle HorizontalAlign="Right" Width="100px" />
</asp:TemplateField>
<asp:TemplateField HeaderText="金额方向">
<ItemTemplate>
<asp:Label ID="LblAR" runat="server" Text='<%# CheckAR(Eval("AR")) %>'></asp:Label>
</ItemTemplate>
<HeaderStyle Wrap="False" />
</asp:TemplateField>
<asp:TemplateField HeaderText="操作人">
<ItemTemplate>
<asp:Label ID="LblOpt" runat="server" Text='<%# Bind("OptName") %>'></asp:Label>
</ItemTemplate>
<HeaderStyle Wrap="False" />
</asp:TemplateField>
<asp:TemplateField HeaderText="操作日期">
<ItemTemplate>
<asp:Label ID="LblDate" runat="server" Text='<%# Bind("dDate","{0:yyyy-MM-dd}") %>'></asp:Label>
</ItemTemplate>
<HeaderStyle Wrap="False" />
<ItemStyle Width="100px" />
</asp:TemplateField>
<asp:TemplateField HeaderText="备注信息">
<ItemTemplate>
<asp:Label ID="LblRemark" runat="server" Text='<%# Bind("Remark") %>'></asp:Label>
</ItemTemplate>
<HeaderStyle Wrap="False" />
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</td>
</tr>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
ASPX.CS代码:
/// <summary>
/// 控制父GridView中展开子GridView
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnPrject_Click(object sender, EventArgs e) --展开父GridView中某行数据,执行绑定子GridView
{
GridRowCount = int.Parse(((ImageButton)sender).CommandArgument.ToString());
ImageButton IBProId = GridProCost.Rows[GridRowCount].Cells[0].FindControl("ibtnProId") as ImageButton;
if (IBProId.ImageUrl.Contains("minus.gif"))
{
IBProId.ImageUrl = "~/Images/Right/plus.gif";
}
else
{
IBProId.ImageUrl = "~/Images/Right/minus.gif";
}
BindCostInfo();--绑定子GridView中的数据
ScriptManager.RegisterClientScriptBlock(UpdatePanel1, UpdatePanel1.GetType(), DateTime.Now.ToString(),
"<script language='javascript'>SetGridViewState();</script>", false);
}
protected void GridProCost_PreRender(object sender, EventArgs e)
{
ScriptManager.RegisterClientScriptBlock(UpdatePanel1, UpdatePanel1.GetType(), DateTime.Now.ToString(), "<script language='javascript'>SetImageState();</script>", false);
}