HTML页面技巧大全

target="_blank">在新窗口打开</a> 这样打开的,那么两个窗口之间没有任何关系,所以无法实现刷新打开新页面的窗口的要求。
A2:
使用Response.Write("<script language='javascript'>window.opener.location.href = window.opener.location.href;window.close();</script>");

A2:
这个问题,呵呵~~~~其实是老问题了~~~~~

1 首先如果你父页面中,提交过,有本页提交,即IsPostBack = ture .那么子窗体中用javaScript 的
window.opener.location.reload();方法就会出现IE讨厌的网页刷新重试按钮.

2 .除非你父窗体中没有本页提交,都是通过href = ....._blank 出去的,在子页面中使用
reload()是没有问题.

A3:
这个问题我这几天在研究,关于刷新父页面的法子是可以办到的。我是使用打开模态对话框提交自动关闭然后自动刷新父页面。
因为我不知道你说的“用datagrid的超级链接”这个链接文本是数据绑定的还是固定的链接。这两个链接要用到不同的事件处理模块。
假设你的这个链接是你的DataGrid的第三列,是修改按钮。代码如下:

html代码中加入:
<script language="javascript">
<!--
  function OpenEditWin(strID)
  {
     var url; // 定义你要打开的页面位置,假设是editdata.aspx
     url = 'editdata.aspx?ID=" + strID;
     var me;
     // 把父页面窗口对象当作参数传递到对话框中,以便对话框操纵父页自动刷新。
     me = window;
     // 打开对跨框的第三个参数要设定与editdata.aspx一样的大小。
     window.showModalDialog(url,me,'dialogWidth:580px;dialogHeight:520px;help:no;status:no')
   }
//-->
</script>
上面的js代码是让DataGrid的超链接调用的,参数是查询字符串关键字,让editdata.aspx获得。

然后是后台代码:
假设使用<asp:HyperLink)标签,name 是lnkEdit
首先必须在“Web 窗体设计器生成的代码”的“InitializeComponent()”中加入DataGrid的事件处理程序(DataGrid名称为MyDataGrid):
this.MyDataGrid.ItemDataBound += new DataGridItemEventHandler(this.MyDataGrid_ItemDataBound);
然后vs.net会自动生成一个MyDataGrid_Itemcreated方法,在里面添加:

private void MyDataGrid_ItemDataBound(object sender, DataGridItemEventArgs e)
{
    if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.alternatingItem)
    {
        for(int i=0;i<MyDataGrid.Items.Count;i++) // 循环查找所有DataGrid所有行
        {
         HyperLink lnk;
         lnk = (HyperLink)MyDataGrid.Items[i].Cells[2].FindControl("lnkEdit");
         // 现在,找到了链接,可以加东西了。
         // 首先获得记录主健
         string str = MyDataGrid.DataKeys[i].ToString();
         lnk.NavigateUrl = "#"; //表示内部链接
         // 注意,下面这行代码调用写好的js,并且把参数传递进去。
         lnk.Attributes.Add("onclick","javascript:OpenEditWin('" + str + "')");
         }
    }

上面的方法就是在DataGrid数据绑定后,强行修改链接字段的内容。

下面是dataedit.aspx的内容:
这个页面实际上是一个模态对话框,这种对话框要注意两个难点:
1 提交自动打开新窗口
2 对父窗口的引用无效(即使用window.opener操作无效)

接上:
解决第一个问题花了我好长时间,我在网上查找了好多资料,解决办法无非是下面两种:
1 在<head></head>内加入:<base target="_self">
2 在打开的模态对话框中使用<iframe>框架,在框架内使用.aspx文件,文件的提交target使用<iframe>的名称。即模态对话框不直接打开.aspx文件,而是打开含有框架的文件,在框架里面使用aspx文件。
以上两种办法我都用了,不管用。第一种办法我用了,表单提交的时候仍然打开新窗口。第二种办法也不可取,因为我要向模态对话框打开的文件传递查询字符串,而这个文件无法把这个字符串传递到框架内包含的文件中。
我解决这个问题还是使用js脚本,模态对话框直接打开.aspx文件,正常使用.aspx?ID=XXX这样的方式,在这个.aspx文件中加入js代码:
<script language="javascript">
<!--
   function onsubmit() // 定义表单提交事件发生的时候怎样处理
   {
      document.Form1.target="_self";
   }
//-->
</script>
上面的代码就是当表单提交的时候强制提交目标为本页,即使用对话框处理提交,而不是打开新页面。我注意到了,所有模态对话框自动打开新页面都是标单提交造成的。
然后就可以加入<asp:button>控件,处理数据库操作了,操作完毕以后,与贴主一样,向页面写入js代码,关闭本对话框并刷新父页面
后台代码
private void btnSubmit_Click(object sender,EvengArgs e)
{
   // 前面是数据库操作
   // 成功后,写
   Response.Write("<script language=\"javascript\">\r\n");
   Response.Write("<!--\r\n");
   Response.Write("if(dialogArguments != null){\r\n");
   // 注意上面的dialogArguments,就是父页面showModalDialog()的第二个参数。
   // 就是父页面的window对象引用。
   Response.Write("dialogArguments.location.reload(true);\r\n");
   // 上面就是刷新父页的代码,相当于在父页上使用
   // window.location.reload(true);代码
   // Response.Write("window.close();}"); // 关闭对话框
   // Response.Write("//-->\r\n</script>"); //关闭脚本块
}
上面的代码就是关闭对
文章出处:DIY部落(http://www.diybl.com/course/1_web/webjs/20071021/78923_4.html)

加支付宝好友偷能量挖...


评论(0)网络
阅读(122)喜欢(1)HTML/CSS兼容/XML