|
以前做過一個項目中要求當填寫聯(lián)系人的時候,點擊 一個按鈕后彈出一個子窗口,選中子窗口中的聯(lián)系人后,將選中的聯(lián)系人的值填充到父窗口來,當時以為很簡單,但一做起來就發(fā)現(xiàn)不是很好下手,最近,當我看到一篇寫ASP.NET的回傳機制的文章后,終于有一點頭緒了,于是就做了一個類似的小例子,就是在一個窗口中點擊一個按鈕后彈出一個子窗口然后將選中的子窗口的值填充到父窗口的一個TextBox中,詳細說明如下: 1.首先是父窗口中我只定義了一個Button和一個TextBox,具體代碼如:(父窗口叫WebForm1.aspx) 下面是.aspx頁面上的代碼: <%@ 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>![]() 這個父窗口(WebForm1.aspx.cs)的后臺CS里面的代碼如下: using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls;![]() namespace Wtest![]() ...{![]() /**//// <summary> /// WebForm1 的摘要說明。 /// </summary> public class WebForm1 : System.Web.UI.Page![]() ...{ protected System.Web.UI.HtmlControls.HtmlInputButton Button1; protected System.Web.UI.WebControls.TextBox TextBox1; private void Page_Load(object sender, System.EventArgs e)![]() ...{ // 在此處放置用戶代碼以初始化頁面 if (Request["__EVENTTARGET"]=="userName")![]() ...{ string userName = Request["__EVENTARGUMENT"].ToString(); Page.RegisterStartupScript("DisplayName","<script language='javascript'>DisplayName('"+ userName +"');</script>"); } }![]() ![]() Web 窗體設計器生成的代碼#region Web 窗體設計器生成的代碼 override protected void OnInit(EventArgs e)![]() ...{ // // CODEGEN: 該調用是 ASP.NET Web 窗體設計器所必需的。 // InitializeComponent(); base.OnInit(e); } ![]() /**//// <summary> /// 設計器支持所需的方法 - 不要使用代碼編輯器修改 /// 此方法的內容。 /// </summary> private void InitializeComponent()![]() ...{ this.Button1.ServerClick += new System.EventHandler(this.Button1_ServerClick); this.Load += new System.EventHandler(this.Page_Load);![]() } #endregion![]() private void Button1_ServerClick(object sender, System.EventArgs e)![]() ...{ } } }![]()
2.然后就是彈出的子窗口的代碼(test.aspx): 首先是頁面上的代碼:
<%@ 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>![]()
接著是該子窗口的后臺CS代碼: using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls;![]() namespace Wtest![]() ...{![]() /**//// <summary> /// test 的摘要說明。 /// </summary> public class test : System.Web.UI.Page![]() ...{ protected System.Web.UI.WebControls.ListBox ListBox1; protected System.Web.UI.WebControls.Button Button1; private void Page_Load(object sender, System.EventArgs e)![]() ...{ // 在此處放置用戶代碼以初始化頁面 }![]() ![]() Web 窗體設計器生成的代碼#region Web 窗體設計器生成的代碼 override protected void OnInit(EventArgs e)![]() ...{ // // CODEGEN: 該調用是 ASP.NET Web 窗體設計器所必需的。 // InitializeComponent(); base.OnInit(e); } ![]() /**//// <summary> /// 設計器支持所需的方法 - 不要使用代碼編輯器修改 /// 此方法的內容。 /// </summary> private void InitializeComponent()![]() ...{ this.Button1.Click += new System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load);![]() } #endregion![]() private void Button1_Click(object sender, System.EventArgs e)![]() ...{ Page.RegisterStartupScript("SetLinkMan","<script language='javascript'>setName('"+ ListBox1.SelectedValue +"');</script>"); } } }![]()
我再來詳細的說明一下上面的代碼的意思: 其實這個例子的原理是利用了ASP.NET的回發(fā)機制做的(doPostBack),我們找到,在一個aspx頁面中只要有回發(fā) 控件,則在生成了aspx頁面中產生出這樣子一段代碼:
<input type="hidden" name="__EVENTTARGET" value="" /> <input type="hidden" name="__EVENTARGUMENT" value="" />![]() <script language="javascript" type="text/javascript"> <!--![]() function __doPostBack(eventTarget, eventArgument) ...{ var theform;![]() if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) ...{ theform = document.Form1; }![]() else ...{ theform = document.forms["Form1"]; } theform.__EVENTTARGET.value = eventTarget.split("$").join(":"); theform.__EVENTARGUMENT.value = eventArgument; theform.submit(); } // --> </script>我們正是利用了這樣一個機制,來將彈出窗口的值傳回到父窗口中來,其實在子窗口中,我們只是 將獲取到的值利用window.opener.init("要傳送的值")這個方法將值發(fā)到父窗口中,但實際是回發(fā)后父窗口 并沒有馬上獲取到這個從其子窗口傳回來的值,在這里,我們是利用了一個__doPostBack()函數(shù)來讓 父窗口獲取得到這個值的,因為只要有回發(fā)操作發(fā)生,都會調用這個__doPostBack()函數(shù),正是利用 ASP.NET的這一機制,使我們可以獲取到從子窗口傳回來的值。 注意:我剛開始做的時候發(fā)現(xiàn)頁面上并沒有__doPostBack()這個方法,后來google一下才知道必須有 能夠觸發(fā)回發(fā)機制產生的控件才會產生該方法,我當時的父窗口的Button是用的客戶端控件,所以 不會產生doPostBack函數(shù),因為服務器端的Button可以觸發(fā)回發(fā)產生,所以我讓這個Button的屬性 設置為runat='server',于是就可以產生回發(fā)了,但是如果你頁面上沒有button而你又想讓頁面回發(fā),其實 還有一種方法就是 將某個服務器控件的AutoPostBack設置為True就可以了,比如說一個TextBox想這樣 設置以后也可以產生回發(fā)。 |
|
|
來自: 昵稱11448503 > 《編程開發(fā)》