日期: 2023.10.12 星期二
作業
設計一輸入體重,單位可用英鎊或體重與一身高可用公分或英寸,計算 BMI
的值與並顯示其 BMI
值所代表的意義(太瘦或過胖),使用類別方式(例如 BMI
)設計,其屬性有*性別、身高、體重,方法計算 BMI
值與顯示 BMI
值代表的意義。
控制項: DropdownList
下拉式選單
- 建立新專案: 檔案 > 新增 > 專案
- 於專案項目上,滑鼠右鍵選擇加入
Web 表單
指定項目的名稱:WebForm1
即表單項目名稱
-
WebForm1
上,滑鼠右鍵,選擇設計工具檢視,進入設計界面
-
控制項上,選擇
DropdownList
,裡面有許多內容,將選擇到的內容顯示出來。DropdownList1
Label.Text = ""
-
編輯項目
-
讓
DropdownList
選擇切換項目後能具有像網頁Sublime
按鈕的功能,Button
預設本身有PostBack
功能,但一般控制項並沒有此功能,
,如果需具有這功能,需要勾選啟用AutoPostBack
。如此它就能在選項後提交這資料給伺服器後,在要求去執行WebForm1.aspx
的功能。
PostBack
意指當在 Html 頁面按下Submit
時,會把表單的資料提交給伺服器,要求它要去執行WebForm1.aspx
-
當按下下拉式選單後,就去執行指定的事件程序。
-
滑鼠指向
DropdownList
控制項後,雙擊進入SelectIndexChanged
事件進行編成:protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { //選擇到對應到的項目值 //Label1.Text = DropDownList1.SelectedValue; //或被選擇到的那一個 ListItem Label1.Text = DropDownList1.SelectedItem.Value; }
-
- 輸出結果
PageLoad 事件
- 前言
Asp.Net
引擎,當所有需要的控制項物件都產生後,就會自動呼叫PageLoad
事件。 -
示範案例: 同一例子,先將
DropdownList
中的所有ListItem
都刪除,改在PageLoad
事件發生時再入其值。
-
編輯
PageLoad
事件程序protected void Page_Load(object sender, EventArgs e) { //執行 PageLoad事件之前,DropdownList 物件已經產生,這物件中有一屬性elList 物件 ListItem item1 = new ListItem(); ListItem item2 = new ListItem(); item1.Text = "Find"; item1.Value = "discover something"; item2.Text = "Kill"; item2.Value = "Let someone die"; DropDownList1.Items.Add(item1); DropDownList1.Items.Add(item2); }
-
執行專案,結果中發現問題:
DropdownList
在選擇項目後,項目內容重複一直增加。
原因: 每一次做
PostBack
都會呼叫伺服器,而伺服器會執行WebForm1.asxp
,所以會去執行PageLoad
事件。
解決: 判斷侍讀是第一次呼叫PostBack
,任何一WebForm
上有一屬性IsPostback
,這屬性如果是第一次呼叫會是false
,如果曾經有呼叫過WebForm1.aspx
它就會變成true
;將程式修改成:protected void Page_Load(object sender, EventArgs e) { //沒做過 Postback if (!this.IsPostBack) { //執行 PageLoad事件之前,DropdownList 物件已經產生,這物件中有一屬性是 ItelList 物件 ListItem item1 = new ListItem(); ListItem item2 = new ListItem(); item1.Text = "Find"; item1.Value = "discover something"; item2.Text = "Kill"; item2.Value = "Let someone die"; DropDownList1.Items.Add(item1); DropDownList1.Items.Add(item2); } }
-
再次執行專案
-
這兩種做法差異性:
第一種作法: 在設計階段,ListItem
就已經產生放入DropdownList
物件中,PageLoad
階段並沒有做任何事。
第二種作法: 一樣,當使用者呼叫WebFor.aspx
時,會先產生DropdownList
控制項物件,然後才呼叫PageLoad
事件,在這時才加入ListItem
到DropdownList
物件裏。 -
如何刪除列表項目
DropDownList1.Items.Remove(item2);
StateManagement 狀態管理
-
前言
一般情況下只會使用到一個網頁,若要網頁跟網頁之間資料做傳遞。因為頁面為 statelesss 狀態WebForm1 —–>
/
/
/ Server
WebForm2 —–>Server 接收 Client 端請求後處理將結果回傳給 Client 端後就會與 Client 斷線,無法保存 Client 端任何資料。為了解決這問題(跨網頁與跨不同的 PostBack 之間資料傳遞問題)有四種技術
-
範例: 計算按了幾次 (即 PostBack 做了幾次),使用單一網頁,不同時間的 PostBBack,希望能保存變數值
步驟: 加一新 WerForm2 表單
Label1 顯次目前第幾次
Button1 每按一次就回到伺服器,要求在執行 WebForm2 得到 PostBack -
結論: 按下 Button 後, PostBack 一次, Label1 的值加一,使用 State Management 技術的 ViewState(像一個 colletion, 類似一個 list, 更像 Java 的資料型別 Dictionary(不同於 list 的索引只能為整數,但字典的索引值可以為為字或其他資料類型)狀態管理技術完成該功能
Button1_Click(){ int counter; }
WebForm1.aspx.cs
Page_Load(){ if ( !this.IsPostBack){ /* 說明 Dictionary 是一個泛型的 class,泛型中須提供兩個資料類型 <資料類型 index, 資料類型 value> Dictionary<string, string> dd = new Dictionary<string, string>(); // () 符號指建構子 dd["find"] = "Discover"; dd["kill"] = ",,,"; view stage 是 .NetFramework 預設的 Dictionary */ //自動建立 ListItem ListItem1 w1 = new ListItem(); ListItem1 w2 = new ListItem(); w1.Text ="item1"; w2.Text ="item2"; DropDownList1.Items.Add(w1); DropDownList1.Items.Add(w2); } }
WebForm2.aspx.cs
Button1_Click(){ int counter; //不存在該物件 ViewState["counter"] 時 if(ViewState["counter"] == null){ counter = 1; }else{ counter = (int) ViewState["counter"] + 1; } //做完之後重新設定(刷新) ViewStage 的值 ViewState["counter"] = counter; Label1.Text = counter.ToString(); }
測試
WebForm2
表單,按下Button1
驗證結果。
留言