Q : 我動態產生了數個 TextBox在畫面上,
希望每寫完一項(按下Enter鍵),就會自動跳去下一個格(即 .Focus()方法)
例如:寫完TextBox1,按下Enter,就會自動跳去下一個(TextBox2)....以此類推。
A : 要做這件事以前,有不少基本功夫要先打穩馬步
這個範例應該是初學者不宜。
關於「動態」產生ASP.NET控制項,您可以參閱我以前整理的文章
主要的技巧可以參閱我的書本 -- ASP.NET專題實務(松崗出版)
上集,第三章的 PlaceHolder
下集,動態問卷產生系統
這些文章在我的網站上也能找到。
**************************
*** 入 門 篇
**************************
如果您連靜態網頁上的、固定的 TextBox都做不到這個功能 --
寫完TextBox1,按下Enter,就會自動跳去下一個(TextBox2)....以此類推。
那也不要指望「動態產生TextBox」....畢竟功力有別。
連基本的都做不到,不要想一步登天(不會走,就想飛?)
HTML畫面上,可以設計五個 TextBox,都設定 AutoPostBack 搭配 TextChanged事件
您當然可以撰寫這種程式啦,我不怪你(畢竟是初學者)
一樣可以正常運作
////************************************************************************
////**** 冗長、重複的程式碼 ****
////************************************************************************
// protected void TextBox1_TextChanged(object sender, EventArgs e)
// {
// TextBox2.Focus();
// }
// protected void TextBox2_TextChanged(object sender, EventArgs e)
// {
// TextBox3.Focus();
// }
// protected void TextBox3_TextChanged(object sender, EventArgs e)
// {
// TextBox4.Focus();
// }
// protected void TextBox4_TextChanged(object sender, EventArgs e)
// {
// TextBox5.Focus();
// }
但你有沒有發現這種寫法,程式碼幾乎一模一樣,不能濃縮一下,好可惜。
我把所有的 Textchanged事件指向同一個,比較簡單
(請看書本上集第三章的介紹,我上課會教。這是重點!)
1.<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True" OnTextChanged="TextBox1_TextChanged"></asp:TextBox>
<br />
2.<asp:TextBox ID="TextBox2" runat="server" AutoPostBack="True" OnTextChanged="TextBox1_TextChanged"></asp:TextBox>
<br />
3.<asp:TextBox ID="TextBox3" runat="server" AutoPostBack="True" OnTextChanged="TextBox1_TextChanged"></asp:TextBox>
<br />
4.<asp:TextBox ID="TextBox4" runat="server" AutoPostBack="True" OnTextChanged="TextBox1_TextChanged"></asp:TextBox>
<br />
5.<asp:TextBox ID="TextBox5" runat="server"></asp:TextBox>(不設定、沒事件)
後置程式碼如下,改成VB語法應該很簡單吧。
protected void TextBox1_TextChanged(object sender, EventArgs e)
{
// 為了避免重複寫多個 TextBox的 TextChanged事件,而內容幾乎一樣,所以改成這樣。
TextBox TB = (TextBox)sender;
if(TB.UniqueID.Length == 8)
{
String ID_no = TB.UniqueID.Substring(7, 1);
// 抓取 TextBox ID最後的流水號,例如 TextBox「1」
TextBox TBnext = (TextBox)Page.Form.FindControl("TextBox" + (Convert.ToInt32(ID_no) + 1).ToString());
//上集 第十八章的範例有提到,多重檔案、批次上傳。
TBnext.Focus();
}
}
這裡也用到我慣用的技巧 -- 字串相連與流水號
OK,如果程式會跑了,那我們把範例改呈「動態」產生 TextBox再來試試看
**************************
*** 進 階 篇
**************************
牢記前輩給我們的指導:
動態加入控制項,可以寫在 Page_Init事件裡面
protected override void OnInit(EventArgs e)
{
for (int i = 1; i <= 5; i++ )
{
TextBox TB = new TextBox();
TB.ID = "TextBox" + i;
TB.Text = "動態產生" + i;
TB.AutoPostBack = true;
TB.TextChanged += new System.EventHandler(this.TextBox1_TextChanged);
// HOW TO:在執行階段時動態繫結 ASP.NET Web 網頁中的事件處理常式
Page.Form.Controls.Add(TB);
}
base.OnInit(e);
}
至於 TextBox1_TextChanged事件跟上一個範例一樣,COPY過來就能用。在此不贅述。
可能的 Bug與改進方式:
...................................................................................................................................
關於 .Focus()方法,雖然ASP.NET也有提供,但 Server端的語法會導致畫面一直閃爍(PostBack)
改用 JavaScript也可以做到,並解決這個問題
ASP.NET搭配 JavaScript可以參閱這篇文章:http://www.dotblogs.com.tw/hatelove/archive/2009/10/28/11325.aspx
或是
黯然銷魂 之 網頁繪製圖表 Google Charts with JavaScript....與ASP.NET網頁結合 (ClientScriptManager.RegisterStartupScript 方法)
...................................................................................................................................
這個問題是讀者來信詢問,我臨時寫出的範例
分享一點想法,給大家參考(或許是一個方向)
沒法保證 100% OK,或是 您COPY去用一個字都不用改
更沒法保證範例 "絕對" 完美囉
範例下載:
相關的文章: