asp.net中父子页面通过gridview中的按钮事件进行回传值的问题
这两天写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中的按钮事件进行回传值的问题的更多相关文章
- js微信禁用右上角的分享按钮,和vue中微信页面禁用右上角的分享按钮的问题
1.隐藏微信网页右上角的按钮 document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() { // 通过下面这个 ...
- GridView里的按钮事件
http://www.cnblogs.com/insus/archive/2012/09/22/2697862.html using System;using System.Collections.G ...
- iframe父子页面之间相互调用元素和函数
<!doctype html> <html> <head> <meta http-equiv="Content-Type" content ...
- 如何在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 ...
- .net dataGridView当鼠标经过时当前行背景色变色;然后【给GridView增加单击行事件,并获取单击行的数据填充到页面中的控件中】
1.首先在前台dataGridview属性中增加onRowDataBound属性事件 2.然后在后台Observing_RowDataBound事件中增加代码 protected void Obser ...
- Asp.Net中动态页面转静态页面
关于在Asp.Net中动态页面转静态页面的方法网上比较多.结合实际的需求,我在网上找了一些源代码,并作修改.现在把修改后的代码以及说明写一下. 一个是一个页面转换的类,该类通过静态函数Changfil ...
- webform工程中aspx页面为何不能调用appcode文件夹下的类(ASP.NET特殊文件夹的用法)
App_code 只有website类型的工程才有效. App_Code 下创建的.cs文件仅仅是“内容”不是代码.你设置那个文件为“编译”就行了. 其他特殊文件夹 1. Bin文件夹 Bin文件夹包 ...
- ASP.NET中实现页面间的参数传递
ASP.NET中实现页面间的参数传递 编写人:CC阿爸 2013-10-27 l 近来在做泛微OA与公司自行开发的系统集成登录的问题.在研究泛微页面间传递参为参数,综合得了解了一下现行页面间传参 ...
- 关于在asp.net的web页面中的全局变量问题
在asp.net的web页面中是不是没有全局变量?有的,在Class类内部的都是,只不过在WebWofm程式中跟WinForm和Console程式有些区别,当页面刷新时,它们的值不会保持,依然会再次初 ...
随机推荐
- VS2013添加NuGet的方法
1.工具->扩展和更新->联机 2.右上角搜索框搜索NuGet,选择NuGet Package Manager for Visual Studio 2013,安装后重启VS 下面通过添加N ...
- Ubuntu下fcitx安装。(ibus不会用)
1 安装命令: sudo apt-get install fcitx-table-wbpy 2 然后将语言支持中的键盘输入方式系统选项,选为fcitx. 3 注销系统后即可使用.
- Configuring Report Manager
Steps to configure and get Reports in Report manager. 1. Enable getting Reports in Report Manager. ...
- Linux基础知识-文件管理
Linux目录与路径 cd:切换目录 例如:cd ~willhua,则回到用户willhua的主文件夹 cd ~或者cd,则表示回到自己的的主文件夹 cd -,则表示回到上个目录 pwd:显示目前 ...
- 图片来自腾讯,未经授权不可引用,js解决方法
问题记录,解决后来更新 js伪造Referer, 外链图片让用户浏览时,不发送 referer 字段给原网站的方法 A 网站引用了 B 站的 图片 <img src="b_url&qu ...
- android 客户端支付宝 php服务器端编写
生成私钥 输入“genrsa -out rsa_private_key.pem 1024”命令,回车后,在当前 bin 文件目 录中会新增一个 rsa_private_key.pem 文件,其文件为原 ...
- Java输出1~1000之间所有可以被3整除又可以被5整除的数
主要在于判断是否能被整除,思路是用取余运算符%,取余结果为0就表示能被整除. 代码如下: public class NumDemo { public static void main(String a ...
- 【Django】Apache上运行单个Django项目,mod_wsgi配置
1 安装环境 操作系统:Ubuntu 12.04 LTS 32 位(安装在VMware虚拟机中) python 版本: Python 2.7.3 Django版本 >>> djang ...
- Python 有哪些优点?为何要学Python?
1. 支持OOP编程 从根本上讲Python仍是一种面向对象的语言,支持多态.继承等高级概念,在Python里使用OOP十分容易 没有C++.Java那样复杂,但不必做Python下OOp高手,够 ...
- Java当中的I/O的字节流
I/O是input/output的缩写,即输入输出系统. I/O操作即从数据源中读取数据,以及将数据写入到数据目的地中.读的来源(如文件.键盘.网络)和写的目的地(如文件.屏幕.网络)分为很多种. 数 ...