以前做過一個(gè)項(xiàng)目中要求當(dāng)填寫聯(lián)系人的時(shí)候,點(diǎn)擊
一個(gè)按鈕后彈出一個(gè)子窗口,選中子窗口中的聯(lián)系人后,將選中的聯(lián)系人的值填充到父窗口來,當(dāng)時(shí)以為很簡(jiǎn)單,但一做起來就發(fā)現(xiàn)不是很好下手,最近,當(dāng)我看到一篇寫ASP.NET的回傳機(jī)制的文章后,終于有一點(diǎn)頭緒了,于是就做了一個(gè)類似的小例子,就是在一個(gè)窗口中點(diǎn)擊一個(gè)按鈕后彈出一個(gè)子窗口然后將選中的子窗口的值填充到父窗口的一個(gè)TextBox中,詳細(xì)說明如下:
1.首先是父窗口中我只定義了一個(gè)Button和一個(gè)TextBox,具體代碼如:(父窗口叫WebForm1.aspx)
下面是.aspx頁(yè)面上的代碼:

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Wtest.WebForm1" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

<HTML>

<HEAD>

<title>WebForm1</title>

<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">

<meta content="C#" name="CODE_LANGUAGE">

<meta content="JavaScript" name="vs_defaultClientScript">

<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">

<script type="text/javascript">

function OpenWindow()

...{
window.open('test.aspx','','height=200,width=200,left=200,top=150,location=no,menubar=no,resizable=false,scrollbars=yes,status=no,titlebar=no,toolbar=no');
}

function init(userName)

...{
__doPostBack("userName",userName);
}
function DisplayName(para)

...{
document.getElementById('<%= TextBox1.ClientID%>').value = para;
}
</script>

</HEAD>

<body MS_POSITIONING="GridLayout">

<form id="Form1" runat="server">

<input id="Button1" style="Z-INDEX: 101; LEFT: 216px; POSITION: absolute; TOP: 152px" onclick="OpenWindow();"

type="button" value="打開" name="btnOk" runat="server">

<asp:TextBox id="TextBox1" style="Z-INDEX: 102; LEFT: 272px; POSITION: absolute; TOP: 152px"

runat="server"></asp:TextBox></form>

</body>

</HTML>

這個(gè)父窗口(WebForm1.aspx.cs)的后臺(tái)CS里面的代碼如下:
2.然后就是彈出的子窗口的代碼(test.aspx):
首先是頁(yè)面上的代碼:

<%@ Page language="c#" Codebehind="test.aspx.cs" AutoEventWireup="false" Inherits="Wtest.test" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

<HTML>

<HEAD>

<title>test</title>

<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">

<meta content="C#" name="CODE_LANGUAGE">

<meta content="JavaScript" name="vs_defaultClientScript">

<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">

<script type="text/javascript">

function Close()

...{
window.close();
window.opener.focus();
return false;
}
function setName(userName)

...{
window.opener.init(userName);
Close();
}
</script>

</HEAD>

<body MS_POSITIONING="GridLayout">

<form id="Form1" method="post" runat="server">

<table cellSpacing="0" cellPadding="0" width="95%" align="center">

<tr>

<td align="center">

<table width="80%" border="1" cellpadding="0" cellspacing="0" bgcolor="#f6f6f6">

<tr>

<td height="60">

<asp:listbox id="ListBox1" Width="100%" runat="server" Height="176px">

<asp:ListItem Value="hekai">何凱</asp:ListItem>

<asp:ListItem Value="wuyu">吳禹</asp:ListItem>

<asp:ListItem Value="gaochao">高超</asp:ListItem>

<asp:ListItem Value="zs">張松</asp:ListItem>

<asp:ListItem Value="dc">蠹蟲</asp:ListItem>

<asp:ListItem Value="zhouXX">周星星</asp:ListItem>

<asp:ListItem Value="XiMu">西木</asp:ListItem>

</asp:listbox></td>

</tr>

</table>

</td>

</tr>

<tr>

<td height="36" align="center">

<asp:button id="Button1" runat="server"

Text="確定"></asp:button>

</td>

</tr>

</table>

</form>

</body>

</HTML>

接著是該子窗口的后臺(tái)CS代碼:
我再來詳細(xì)的說明一下上面的代碼的意思:
其實(shí)這個(gè)例子的原理是利用了ASP.NET的回發(fā)機(jī)制做的(doPostBack),我們找到,在一個(gè)aspx頁(yè)面中只要有回發(fā)
控件,則在生成了aspx頁(yè)面中產(chǎn)生出這樣子一段代碼:
我們正是利用了這樣一個(gè)機(jī)制,來將彈出窗口的值傳回到父窗口中來,其實(shí)在子窗口中,我們只是
將獲取到的值利用window.opener.init("要傳送的值")這個(gè)方法將值發(fā)到父窗口中,但實(shí)際是回發(fā)后父窗口
并沒有馬上獲取到這個(gè)從其子窗口傳回來的值,在這里,我們是利用了一個(gè)__doPostBack()函數(shù)來讓
父窗口獲取得到這個(gè)值的,因?yàn)橹灰谢匕l(fā)操作發(fā)生,都會(huì)調(diào)用這個(gè)__doPostBack()函數(shù),正是利用
ASP.NET的這一機(jī)制,使我們可以獲取到從子窗口傳回來的值。
注意:我剛開始做的時(shí)候發(fā)現(xiàn)頁(yè)面上并沒有__doPostBack()這個(gè)方法,后來google一下才知道必須有
能夠觸發(fā)回發(fā)機(jī)制產(chǎn)生的控件才會(huì)產(chǎn)生該方法,我當(dāng)時(shí)的父窗口的Button是用的客戶端控件,所以
不會(huì)產(chǎn)生doPostBack函數(shù),因?yàn)榉?wù)器端的Button可以觸發(fā)回發(fā)產(chǎn)生,所以我讓這個(gè)Button的屬性
設(shè)置為runat='server',于是就可以產(chǎn)生回發(fā)了,但是如果你頁(yè)面上沒有button而你又想讓頁(yè)面回發(fā),其實(shí)
還有一種方法就是 將某個(gè)服務(wù)器控件的AutoPostBack設(shè)置為True就可以了,比如說一個(gè)TextBox想這樣
設(shè)置以后也可以產(chǎn)生回發(fā)。