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

  • 相关阅读:
    区分nil Nil NULL和NSNill(Objective C语言)(转)
    iOS 中DLog 用法
    web开发中因为导包顺序不同而出错
    用java程序复制UTF-8文件后开头出现?号
    java使用dom4j解析xml
    Json的解析与封装
    java读取properties配置文件
    关于代码注释的一些问题
    当没有给字符串留''的位置的后果
    service()和doGet()和doPost()
  • 原文地址:https://www.cnblogs.com/jiutianxingchen/p/4315213.html
Copyright © 2011-2022 走看看