这两天写BS程序,遇到父子页面传值的问题,以前没写过web系统,用了几天时间才将问题解决,总结下记录下来:

问题描述:

父页面A中有一个gridview,每行6个列,有5列中均有一个按钮,单击按钮,会根据列的不同进入不同的子页面,在子页面中有获取数据,并返回父页面的gridview中对应的行的对应列中。

问题关键在于如果确定点击的是gridview的哪一行的哪个按钮,因为数据回传的时候,还要放入该行的该列中。

所以需要考虑一下几个方面:

1、动态添加行,以及各行的各列中的按钮

2、点击某行某列的按钮时,弹出子页面

3、子页面,确定数据后,回传到父页面

4、父页面获取到回传值后,在不刷新(或者说是看起来不刷新)的情况下,将值存入gridview的某行某列中。

5、一个按钮回传完成后,可以直接去点击该行的另外一个按钮,而不需要考虑上下移动滚动条。(数据重新绑定会出现该问题)

6、我的父子页面都需要从不同数据库中获取数据,所以尽可能在后台完成数据的获取,这样将来修改时比较方便。

解决思路:

利用var xxx=window.showModalDialog("xxxx.aspx");和window.returnValue='aaaaaa';获取返回值,保存进父页面的一个隐藏域中,在按钮事件中,将该隐藏域的值,保存进gridview的某行某列中。

实例:

父页面A:

1、AAA.aspx:

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">
<title>父页面A</title>
<base target="_self"><%--注意:父子页面都必须有--%>

</head>
<body>
<form id="form1" runat="server">
<div>

<input id="lbHid" type="hidden" runat="server"/>

<asp:GridView ID="gv_show" runat="server" Width="100%" CellPadding="4"
ForeColor="#333333" AutoGenerateColumns="false" Visible="true" onrowcreated="gv_show_RowCreated"
 onrowdatabound="gv_show_RowDataBound" >

<Columns>

<asp:TemplateField HeaderText="序号" Visible="true">
<ItemStyle HorizontalAlign="Center" Width="10%"></ItemStyle>
<ItemTemplate>
<asp:Label ID="lblIndex" runat="server">
<%#Container.DataItemIndex +1 %>
</asp:Label>
</ItemTemplate>
</asp:TemplateField>

<asp:TemplateField HeaderText="备注">
<ItemStyle HorizontalAlign="left" Width="20%"></ItemStyle>
<ItemTemplate>
<asp:Label ID ="lb_Fexp" Width="80%" runat="server" Text='<%#Eval("FEXP") %>' Visible="true" ></asp:Label>
<asp:Button ID ="btn_Fexp" Width="20px" runat="server" Text="." CommandName="Fexp" />
</ItemTemplate>
</asp:TemplateField>

</Columns>
<EmptyDataTemplate>
<div class="emptyDataTemplateStyle" style="text-align:center;vertical-align:middle">
<br /><br /><br />暂无数据
</div>
</EmptyDataTemplate>
</asp:GridView>

</div>
</form>
</body>

</html>

2、AAA.aspx.cs:

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{

ShowData();
}
}

/// <summary>
/// 获取显示数据
/// </summary>

private void ShowData()
{

DataTable dtDetail =null;//获取显示数据,自己设置

this.gv_show.DataSource = dtDetail;
this.gv_show.DataBind();

}

protected void gv_show_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
Button btn = (Button)e.Row.FindControl("btn_Fexp");
if (btn != null)
{//摘要
btn.CommandArgument = e.Row.RowIndex.ToString();
btn.Click += new EventHandler(BtnFexp_Click);//执行服务器事件
}

}

}

/// <summary>
/// 单击摘要
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>

private void BtnFexp_Click(object sender, EventArgs e)
{
Button button = (Button)sender;
GridViewRow gvr = (GridViewRow)button.Parent.Parent;

Label label = (Label)gvr.FindControl("lb_Fexp");
label.Text = this.lbHid.Value.ToString();//将隐藏域中的值赋值到会计科目列中
}

protected void gv_show_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)//判定当前的行是否属于datarow类型的行
{

//行号
int iRowIdex = e.Row.RowIndex;

//摘要
Button btn = (Button)e.Row.FindControl("btn_Fexp");
if (btn != null)
{//打开新页面,并返回值到隐藏域中
btn.Attributes.Add("onclick", "var xxx=window.showModalDialog('BBB.aspx');document.all('lbHid').value=xxx;");
}

}

}

3、BBB.aspx:

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>基础设置-凭证模板维护-明细-选择摘要内容</title>
<base target="_self">

</head>
<body>
<form id="form1" runat="server">
<div>

<asp:TextBox ID="tb1" runat="server" Text="测试摘要内容" CssClass="TextBoxSkin"></asp:TextBox>

<asp:Button ID="btnSure" runat="server" Text="确定" CssClass="buttonSkin" onclick="btnSure_Click" />

</div>
</form>
</body>
</html>

4、BBB.aspx.cs:

protected void Page_Load(object sender, EventArgs e)
{

}
/// <summary>
/// 确定
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnSure_Click(object sender, EventArgs e)
{
string returnName = tb1.Text.Trim();
ClientScript.RegisterStartupScript(this.GetType(), "", "<script language='javascript'>window.returnValue='" + returnName + "';window.close();</script>");
}

完成。

以上实例中,没有添加各个页面的引用,不过我再拷贝代码时,尽可能将用到的引用都去除了,应该不会应该演示,所以在测试时仅需要将(2)中的获取显示数据的dtDetail的内容加上即可直接运行。

功能:

AAA页面中有gridview,其中每行有2列:一列是序号,一列是备注+按钮;点击每行的按钮,可以弹出一个新页面BBB。

BBB中有一个textBox和一个按钮;点击该按钮,可以将textBox中的内容,放入到AAA页面的按钮对应单元格中。

注意:

1、<base target="_self">。这句话一定要在父子页面都加上,要不然会出现问题。

2、父页面要保存gridview数据,需要用session["dtData"]将gridview的数据传入到子页面,在子页面中重新赋值,最后在父页面中保存session["dtData"]的值。

3、我试过直接把gridview的数据源传到子页面,赋值后回传到父页面,在重新绑定gridview的数据源,也可以实现功能,唯一的问题是,当记录行比较多的时候,重新绑定后,页面会自动显示在滚动条的最上面,没找到怎么定位到具体的某行中。(我的实际应用中,每行是由5个按钮列的,每个按钮都有获取数据值的功能,所以重新绑定这种方法,对我而言不实用),不过点击某个按钮,添加或删除行时,重新绑定的方法还是不多的。

asp.net中父子页面通过gridview中的按钮事件进行回传值的问题的更多相关文章

  1. js微信禁用右上角的分享按钮,和vue中微信页面禁用右上角的分享按钮的问题

    1.隐藏微信网页右上角的按钮 document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() { // 通过下面这个 ...

  2. GridView里的按钮事件

    http://www.cnblogs.com/insus/archive/2012/09/22/2697862.html using System;using System.Collections.G ...

  3. iframe父子页面之间相互调用元素和函数

    <!doctype html> <html> <head> <meta http-equiv="Content-Type" content ...

  4. 如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites]

    如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites] 一.布局页面介绍[Abo ...

  5. .net dataGridView当鼠标经过时当前行背景色变色;然后【给GridView增加单击行事件,并获取单击行的数据填充到页面中的控件中】

    1.首先在前台dataGridview属性中增加onRowDataBound属性事件 2.然后在后台Observing_RowDataBound事件中增加代码 protected void Obser ...

  6. Asp.Net中动态页面转静态页面

    关于在Asp.Net中动态页面转静态页面的方法网上比较多.结合实际的需求,我在网上找了一些源代码,并作修改.现在把修改后的代码以及说明写一下. 一个是一个页面转换的类,该类通过静态函数Changfil ...

  7. webform工程中aspx页面为何不能调用appcode文件夹下的类(ASP.NET特殊文件夹的用法)

    App_code 只有website类型的工程才有效. App_Code 下创建的.cs文件仅仅是“内容”不是代码.你设置那个文件为“编译”就行了. 其他特殊文件夹 1. Bin文件夹 Bin文件夹包 ...

  8. ASP.NET中实现页面间的参数传递

    ASP.NET中实现页面间的参数传递   编写人:CC阿爸 2013-10-27 l  近来在做泛微OA与公司自行开发的系统集成登录的问题.在研究泛微页面间传递参为参数,综合得了解了一下现行页面间传参 ...

  9. 关于在asp.net的web页面中的全局变量问题

    在asp.net的web页面中是不是没有全局变量?有的,在Class类内部的都是,只不过在WebWofm程式中跟WinForm和Console程式有些区别,当页面刷新时,它们的值不会保持,依然会再次初 ...

随机推荐

  1. Unable to add App ID because the '10' App ID limit in '7' days has been exceeded.

    Unable to add App ID because the '10' App ID limit in '7' days has been exceeded. 官方的原因是对bundle iden ...

  2. Windows Phone 开发起步之旅之一 平台环境的搭建

    最近大家都在写博客园的技术文章,按耐不住了,也把自己平时学习中遇到和学习到的一些东西写出来,供大家分享也好,自己留个纪念也好,有个可以查看的东西. 言归正传,随着微软对Windows Phone的投入 ...

  3. Javascript 命名空间模式

    命名空间是通过为项目或库创建一个全局对象,然后将所有功能添加到该全局变量中.通过减少程序中全局变量的数量,实现单全局变量,从而在具有大量函数.对象和其他变量的情况下不会造成全局污染,同时也避免了命名冲 ...

  4. javscript处理XML DOM(待续)

    1.加载并解析XML文件 function loadXMLFile(url){ var xmldoc if(window.ActiveXObject){ xmldoc = new ActiveXObj ...

  5. Windows和Linux下Mysql 重置root 密码

    Windows系统下一:进入Windows窗口cmd命令行下,停止mysql服务: net stop mysql二:进入mysql的安装目录下,进去bin目录mysqld-nt.exe --skip- ...

  6. 代码快捷键的设置读取App.config方法

    附件下载:http://files.cnblogs.com/files/qtiger/ShortcutAchieve.zip 代码实现最重要(增加引用using System.Configuratio ...

  7. Dev的DocumentManager添加窗体

    1.DocumentManager要设置自己的MdiParent属性 2.主窗体设置IsMidContainer为True 3.要生成的窗体设置MdiParent为主窗体 4.正常创建窗体,然后就可以 ...

  8. BufferedInputSream和BufferedOutputSream,,,

    package cd.itcast.bufferinputstream; import java.io.BufferedInputStream; import java.io.File; import ...

  9. Kafka入门学习随记(二)

    ====Kafka消费者模型 参考博客:http://www.tuicool.com/articles/fI7J3m --分区消费模型 分区消费架构图 图中kafka集群有两台服务器(Server), ...

  10. salt-ssh安装及简单使用

    需要 salt-master 0.17以上版本支持 1.安装 相关依赖包可查看requirements.txt Jinja2 M2Crypto msgpack-python pycrypto PyYA ...