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个按钮列的,每个按钮都有获取数据值的功能,所以重新绑定这种方法,对我而言不实用),不过点击某个按钮,添加或删除行时,重新绑定的方法还是不多的。

时间: 2024-10-31 20:43:59

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

asp.net 页面屏蔽回车触发button按钮事件

一,原理 深层次来说这不是 ASP.NET 的问题, 而是 html form. 的 submit 按钮就是如何设计的. 当你的光标焦点进入某个表单元素的时候,会激活该表单中第一个(流布局顺从左到右,从上至下) type=submit 的按钮(假如有),等待响应回车事件,并提交该form. 二.方法: 修改 button 呈现方式 UseSubmitBehavior="false",把所有的button全部都设置完后,即可屏蔽回车键,提交form了. 如: <tr><

android实现ListView或GridView中item的倒数功能

有时在开发中可能会遇到当未到某个时间时需要让ListView或GridView中的相应item进行倒数的需求,此时,如果还是按照常见的ListView或GridView的Adapter的写法+计时功能来实现的话,则当滚动ListView或GridView的时候,item就可能会出现复用问题(即不需要进行倒数或当前item的倒数已经结束了,却还会出现倒数的现象),因此,为了解决这种问题,需要进行倒数时,重新遍历当前对象的集合,然后让每个对象的相应时间值减1,最后再通过Adapter的notifyD

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

1 <!doctype html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 5 <meta name="Keywords" content=""> 6 <meta name="Description" con

ASP.NET GridView中加入RadioButton不能单选的解决方案

今天开发碰见一个问题,就是当GridView中加入一个包含RadioButton的模板列,结果一运行.....天啊,单选按钮可以多选了! 囧啊!为了演示一下我今天的错误我还是模拟一个功能场景吧,我要实现的功能是显示一个包含单选按钮的学生信息列表,选择一行后将详细信息显示出来~! 1.问题展现 ①首先准备一个GridView用来展示学生的基本信息与最重要的单选按钮,代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 <asp:GridView ID="GridView1&q

《转载》ASP.NET GridView中文本内容无法换行(自动换行/正常换行)

ASP.NET GridView中文本内容无法换行(自动换行/正常换行) 作者: 字体:[增加 减小] 类型:转载 用GridView来显示课程表,每个单元格的内容包括课程名.上课地点.教师姓名,然后我想让它们分行显示,感兴趣的朋友可以了解下,或许对你有所帮助 最近做项目的时候,遇到这样一个问题:我用GridView来显示课程表,每个单元格的内容包括课程名.上课地点.教师姓名,然后我想让它们分行显示,效果如下图: 可是呢,GridView太顽强了,不管我拼接字符串时用“\r\n”还是"<b

asp.net中listview下嵌套gridview

最近在上软件工程实践课程,想做一个类似于QQ空间或者朋友圈一样的效果.即显示所有好友发送的动态以及动态下回复的信息. 自己YY了一种方法,一开始以为不能达到效果,研究了2个小时终于实现了,感觉效果还是很棒棒的,拿来分享一下.神犇请绕道吧~~ listview可以自己排版布局,我们用listview来显示动态发送者的头像,昵称以及发送时间. 那回复怎么办呢? gridview的布局与回复较像,效果也比较好.那就用gridview来做回复部分好了. 主要思路就是上图,黑色的由listview显示,红

ASP.NET GridView中文本内容无法换行

第一类:自动换行 GridView默认是自动换行,就是说当显示的字符串比较长的时候,GridView会自动换行. 如果我们不想让它自动换行,在页面后台添加如下代码即可: //正常换行 GridView1.Attributes.Add("style","word-break:keep-all;word-wrap:normal"); 第二类:正常换行 1.应该使用 "<br/>" 2.①如果你绑定字段为设置模版列,那么把对应的BoundF

如何在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] 一.布局页面介绍[About Layout Pages] 很多网站有些内容需要显示在各个页面中,比如Header,Footer或者告诉用户已经登录的部分.ASP.NET允许你创建一个单独的文件来包含文本.标签和代码的内容块,从而搭建一个风格整齐的网站.接下来你就可以将这个内容块插入到任何你想要让它展示的页面中.采用这种方法

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

App_code 只有website类型的工程才有效. App_Code 下创建的.cs文件仅仅是“内容”不是代码.你设置那个文件为“编译”就行了. 其他特殊文件夹 1. Bin文件夹 Bin文件夹包含应用程序所需的,用于控件.组件或者需要引用的任何其他代码的可部署程 序集.该目录中存在的任何.dll文 件将自动地链接到应用程序. 2. App_Browser文件夹 该可选的文件夹包含.browser文件..browser文件描述浏览器(不管是移动设备浏览器,还 是台式机浏览器)的特 征和功能.