showModalDialog打开的窗口关闭时会运行父窗口的load事件,也就是自动刷新的。前段时间碰到个问题,要求关闭时不允许刷新父窗口,试了很多方法,总算找到个只适用我那个页面的方法。不是用js代码,因为都是asp.net服务器端代码,js不太好实现。今天遇到个新问题,父窗口里有个gridview,使用SqlDataSource控件绑定数据。页面上还有一个按钮,点击后用showModalDialog打开窗口,在showModalDialog页面中删除了数据源的一条记录,关闭子窗口,但问题是,父窗口的gridview怎么也不刷新。测试了关闭showModalDialog窗口确实运行了父窗口的load事件,在load里手动写上gridview的databind()方法也无效。请教了!

解决方案 »

  1.   

    是不是加了
    if(!IsPostBack)
    {}
      

  2.   

    你没有理解showModalDialog的运行机制,可参考
    http://dotnet.aspx.cc/article/49ml4ao8-5pb3-4kny-njzd-ljoioxv4m1x4/read.aspx
    http://blog.csdn.net/net_lover/archive/2002/09/24/6910.aspx
      

  3.   

    孟老大都出来了,谢谢。
    我看了那两篇贴子。以前也看过。不过我觉得我的问题跟那里面的内容没有什么关系。
    我现在是在子窗口中改变了数据库的内容,关闭子窗口后,回到父窗口,父窗口中其他的控件内容都按照自己的load事件里的程序重新初始化了,但gridview没有改变,而查看数据库,确实已经改变了,也就是说,gridview没有刷新,怎样使他刷新,我觉得和showModalDialog的关系不是非常大。
    烦孟老大再看看。
      

  4.   

    看看我的
    父页面
     function OpenNewDialogBox()
    {
    var varURL = DialogBox.aspx?DialogURL=子页面.aspx"
    var varOptions = "dialogWidth:"+dialogWidth+"px;dialogHeight:"+dialogHeight+"px;status:no;resizable: Yes;scroll:Yes;help:NO";

    var array =   new Array();       array[0] = ""; 
    array[1] = window;

    var rtvalue = window.showModalDialog(varURL,array,varOptions);
    if(rtvalue==true )
    {
     document.getElementById("btn_hide").click();
    }

    }
      

  5.   

    DialogBox.aspx
    <body MS_POSITIONING="GridLayout">

        <form id="Form1" method="post" runat="server">
    <IFRAME src="<%=Request.QueryString["DialogURL"].ToString().Replace("@", "&")%>" id="frmdialogcontent" scrolling="Yes" name="frmdialogcontent" style="Z-INDEX: 1; VISIBILITY: visible; WIDTH: 100%; HEIGHT: 100%; BACKGROUND-COLOR: #ffdabe" frameBorder="0">
    </IFRAME>
         </form>

      </body>
      

  6.   

    btn_hide 是一个button 不能隐藏 可以把宽度设置为 0px
    子页面关闭时候
    Page.RegisterStartupScript("Close","<script language='javascript'>window.close();window.returnValue=true;</script");
      

  7.   

    andlee(钢球) :谢谢。我的问题不是打开与关闭子窗口,也不是传递参数。是父窗口的gridview刷新,不用客户端js,只有服务器端写到客户端的几句打开与关闭的js语句。
      

  8.   

    document.getElementById("btn_hide").click()
    里面的 btn_hide 里面写 你的gridview绑定事件不就可以刷新 ?
    btn_hide是一个服务器端的Button啊!
      

  9.   

    andlee(钢球) 好像懂你的意思了,是利用按钮点击后会自动刷新页面?
    你上面的父页面的代码是客户端的js代码吧? 我的这个gridview中每行都有个按钮用来打开子窗口,对按钮所在行进行编辑,按钮的事件中有获取本行关键字的服务器端程序。所以不太好把打开子窗口的程序完全写成js代码放在客户端。我在服务器端写的:
    Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim url As String = "window.showModalDialog('2.aspx?AdType1ID=" + sender.parent.parent.cells(0).text+ "','','dialogWidth:300px;dialogHeight:300px;dialogLeft:400px;dialogTop:300px;status:0;scroll:no;menubar:no;help:no;');"
            Response.Write("<script language='javascript'>" & url & "</script>")
    End Subsender.parent.parent.cells(0).text是获取本行关键字段的值再帮我看看
      

  10.   

    代码贴出来吧(简单的代码,是个例子,实际不是做编辑操作):
    1.aspx(父窗口,一个SqlDataSource连接数据源,一个GridView,显示数据,每行有个linkbutton,点击后打开子窗口2.aspx):
    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="1.aspx.vb" Inherits="Approve_1" %>
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head id="Head1" runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnStr %>"
                SelectCommand="SELECT * FROM [AdType1]">
            </asp:SqlDataSource>
            <asp:Button ID="Button1" runat="server" Text="Button" />
            <asp:GridView ID="GridView_Approve" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataKeyNames="AdType1ID" DataSourceID="SqlDataSource1">
                <Columns>
                    <asp:BoundField DataField="AdType1ID" HeaderText="AdType1ID" InsertVisible="False"
                        ReadOnly="True" SortExpression="AdType1ID" />
                    <asp:BoundField DataField="AdType1Name" HeaderText="AdType1Name" SortExpression="AdType1Name" />
                    <asp:TemplateField HeaderText="操作">
                        <ItemTemplate>
                            <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">编辑</asp:LinkButton>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
        </form>
    </body>
    </html>
      

  11.   

    1.aspx.vb:Imports System.Web
    Imports System.Collections
    Imports System.Data
    Imports System.Data.sqlclient
    Partial Class Approve_1
        Inherits System.Web.UI.Page
        Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            Dim url As String = "window.showModalDialog('2.aspx?AdType1ID=" + sender.parent.parent.cells(0).text + "','','dialogWidth:300px;dialogHeight:300px;dialogLeft:400px;dialogTop:300px;status:0;scroll:no;menubar:no;help:no;');"
            Response.Write("<script language='javascript'>" & url & "</script>")
        End Sub
    End Class
      

  12.   

    前台:<%@ Page Language="VB" AutoEventWireup="false" CodeFile="1.aspx.vb" Inherits="Approve_1" %>
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head id="Head1" runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnStr %>"
                SelectCommand="SELECT * FROM [AdType1]">
            </asp:SqlDataSource>
            <asp:Button ID="Button1" runat="server" Text="Button" />
            <asp:GridView ID="GridView_Approve" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataKeyNames="AdType1ID" DataSourceID="SqlDataSource1">
                <Columns>
                    <asp:BoundField DataField="AdType1ID" HeaderText="AdType1ID" InsertVisible="False"
                        ReadOnly="True" SortExpression="AdType1ID" />
                    <asp:BoundField DataField="AdType1Name" HeaderText="AdType1Name" SortExpression="AdType1Name" />
                    <asp:TemplateField HeaderText="操作">
                        <ItemTemplate>
                            <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click" OnClientClick="window.showModalDialog('2.aspx?AdType1ID=" + <%# Eval("AdType1ID")%>+ "','','dialogWidth:300px;dialogHeight:300px;dialogLeft:400px;dialogTop:300px;status:0;scroll:no;menubar:no;help:no;');">编辑</asp:LinkButton>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
        </form>
    </body>
    </html>后台
    Imports System.Collections
    Imports System.Data
    Imports System.Data.sqlclient
    Partial Class Approve_1
        Inherits System.Web.UI.Page
        Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            这里写重新绑定GirdView...
        End Sub
    End Class
      

  13.   

    注意 LinkButton1 的 OnClientClick 事件
      

  14.   

    include_me(头文件):LinkButton1_Click中写GridView_Approve.databind()?试过没用,注意 LinkButton1 的 OnClientClick 事件,什么意思?在他的客户端单击事件中写什么?
      

  15.   

    <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click" OnClientClick="window.showModalDialog('2.aspx?AdType1ID=" + <%# Eval("AdType1ID")%>+ "','','dialogWidth:300px;dialogHeight:300px;dialogLeft:400px;dialogTop:300px;status:0;scroll:no;menubar:no;help:no;');">编辑</asp:LinkButton>
      

  16.   

    还有个页面的程序:
    2.aspx(子窗口,一个文本框,一个按钮)
    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="2.aspx.vb" Inherits="Approve_2" %>
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head id="Head1" runat="server">
        <title></title>
        <base target="_self"/>
        <meta http-equiv="pragma" content="no-cache"/> 
    </head>
    <body>2.aspx.vb:
    Imports System.Web
    Imports System.Collections
    Imports System.Data
    Imports System.Data.sqlclient
    Imports AdCensor.BusinessLogic
    Imports AdCensor.DataAccess
    Partial Class Approve_2
        Inherits System.Web.UI.Page    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            DA_Approve.DA_UpdateAdType1(Request.QueryString("AdType1ID"), TextBox1.Text)
            Response.Write("<script language='javascript'>self.close()</script>")
        End Sub
    End Class
        <form id="form1" runat="server">
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <asp:Button ID="Button1" runat="server" Text="Button" />
        </form>
    </body>
    </html>DA_Approve.DA_UpdateAdType1()是调用数据层的函数操作数据库
      

  17.   

    include_me(头文件) 的意思是说:OnClientClick中写打开窗口的代码,LinkButton1_Click服务器端写绑定gridview吗?
    试过没用,按钮按下去,不管服务器段还是客户端的程序都一起运行的啊,没法控制子窗口关闭了后再让gridview重新绑定。很奇怪的问题,在page_load事件中写databind()都没用。
      

  18.   

    具体弹出的2.aspx里如何操作数据对1.aspx来说没关系.
    1.aspx里只管弹出2.aspx,然后在弹出的2.aspx关闭后重新绑定要GridView就好.按我先前发的代码应该可以实现的,不知你有没有拿去测试.. 
    空谈是没用的 - 用事实说话[引用广告词] :)
      

  19.   

    我想是不是gridview的什么特殊原因,2.aspx关闭后确实执行了1.aspx的page_load事件,如果1.aspx中有其他文本框之类的控件,都会按照page_load里的程序进行初始化,唯独gridview还是原来的,即使在page_load里写GridView_Approve.databind()都没效果如果在1.aspx中放一个按钮,按钮里写GridView_Approve.databind() 点击后他才重新绑定数据
      

  20.   

    网页的一次回发都会引发 page_load ,属正常现象.1. 确定前台 LinkButton1 中 OnClientClick 事件已添加客户端处理(OnClientClick="window.showModalDialog...").2. 把你的 page_load 里写的 GridView_Approve.databind() 去掉,移到 LinkButton1_Click 事件处理方法中.断下 LinkButton1_Click 事件代码看是否被执行.运行,再试...
      

  21.   

    感谢include_me(头文件),解决了。你的思路正确!开始不成功的问题在于OnClientClick="window.showModalDialog('2.aspx?AdType1ID=" + <%# Eval("AdType1ID")%>+...当中<%# Eval("AdType1ID")%>获取不到本行AdType1ID的值,只是获取到他的字段名。
    搞了半天,最后在gridview的RowDataBound事件中指定刚生成的行中LinkButton1的OnClientClick的代码,此时可以获取刚生成的行中AdType1ID的值。
    真的很搞人的问题。
      

  22.   

    前台绑定部分可以写成这样,用 RowDataBound 会觉得有点麻烦.
    OnClientClick='<%# "window.showModalDialog(\"2.aspx?AdType1ID=" + Eval("AdType1ID") + "\");"%>'
      

  23.   

    这样写,绑定不到,我也试过,他不会把本行的AdType1ID绑定过来。即使在RowDataBound中也不能用AdType1ID,绑定不到,只能靠他生成本行后,在本行内findcontrol,获取已经生成的AdType1ID的值,或者是制定本行哪个cell中的文本。