# C# WindowsForm 解題
>撰寫人[name=AmiYaku1049] [首頁--天空路1049號](https://skys-kid-lai.github.io/1004/)
>>最後編輯[time=Sat, Jun 25, 2022 9:09 PM]
## 題目敘述:
1.設計點餐應用程式
2.系統包含5個頁面
(1)登入頁面:帳號為學號,密碼為學號後四碼
(2)主頁面:登入完成後可以看到帳號個人資料-->班級、學號、姓名
(3)點餐頁面:此頁面需包含品名、數量、金額
(4)訂購完成頁面:此頁面需包含品名、數量(不可修改)、金額(不可修改) 、訂購人姓名、單號、聯繫電話、訂購時間
(5)訂購紀錄頁面:可透過變數儲存相關訊息,點選按鈕後直接輸出紀錄
使用技巧:
>分頁
>List儲存資料
## 方案總管
>
1. 登入頁面(Login.cs)
2. 主頁面(MainWelcome.cs)
3. 點餐頁面(OrderForm.cs)
4. 訂購完成頁面(Complete.cs)
5. 訂購紀錄頁面(FinalCheck.cs)
## 登入頁面(Login.cs)
### UI設計介面
> 
- 元件
```label```:顯示"Account:"以及"PassWord:"
```TextBox```:輸入帳號密碼,並在程式碼中判斷依照題目指示輸入正確的帳號密碼
```Button```:點擊後前往主頁面
- Object's Name
```txt_account```:輸入帳號
```txt_password```:輸入密碼
```botton1```:登入按鈕(我剛剛才發現沒有改到ㅋㅋㅋ)
### 程式碼設計(使用註解解釋程式碼)
```c=
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace _1110832059_FinalExam
{
public partial class Login : Form
{
public Login()
{
InitializeComponent();
//將密碼做防窺,輸入時更換成'●'
txt_password.PasswordChar = '●';
}
private void button1_Click(object sender, EventArgs e)
{
//宣告彈出視窗
DialogResult dia;
//在此假設學號:1110832059,密碼:2059
String t_account = "1110832059";
String t_password = "2059";
//帳號輸入錯誤或是密碼輸入錯誤,彈出視窗顯示錯誤訊息
if ((txt_account.Text != t_account) || (txt_password.Text != t_password))
{
dia = MessageBox.Show("Your Account or Password is not correct !", "Remind from kvjk_2125", MessageBoxButtons.OK, MessageBoxIcon.Error);
//清空使用者輸入的內容
txt_account.Clear();
txt_password.Clear();
}
//帳號輸入正確訊息
else
{
//彈出視窗顯示登入成功
dia = MessageBox.Show("Sign in suceesfully !", "Remind from kvjk_2125", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
//如果使用者點選彈出視窗的OK
if (dia == DialogResult.OK)
{
//隱藏登入頁面(Login)
this.Hide();
//宣告主頁面,並傳送帳號名稱至主頁面
MainWelcome stunum = new MainWelcome(txt_account.Text);
//顯示主頁面(MainWindow)
stunum.ShowDialog();
//清空使用者輸入
txt_account.Clear();
txt_password.Clear();
}
}
}
}
}
```
## 主頁面(MainWindow.cs)
### UI設計介面
> 
- 元件
```groupBox```:將題目要求顯示的文字集合顯示在裡面
```label```:顯示題目要求之學號、班級、姓名
```Button```:選擇登出或是往下點餐
- Object's Name
```lab_stunum```:從登入頁面傳過來的帳號名稱(學號)
```btn_logout```:登出按鈕
```btn_goOrder```:前往點餐
### 程式碼設計(使用註解解釋程式碼)
```c=
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace _1110832059_FinalExam
{
public partial class MainWelcome : Form
{
public MainWelcome()
{
InitializeComponent();
}
//創建一個建構式能夠獲取從登入頁面傳送來的字串
public MainWelcome(string account)
{
//接取傳送值的函式一定要加這行程式碼
InitializeComponent();
//將顯示帳號(學號)的label接取從登入頁面傳送來的值
lab_stunum.Text = account;
}
//前往點餐頁面(MainWindow)的按鈕被點擊
private void btn_goOrder_Click(object sender, EventArgs e)
{
//宣告彈出視窗
DialogResult dia;
//彈出視窗顯示是否前往點餐頁面(OrderForm)
dia = MessageBox.Show("Did you want to order alcohol ? ", "Remind from kvjk_2125", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
//如果使用者點選彈出視窗的OK
if (dia == DialogResult.OK)
{
//宣告點餐頁面(OrderForm)
OrderForm order = new OrderForm();
//顯示點餐頁面(OrderForm)
order.Show();
//關閉主頁面(MainWindow)
this.Close();
}
}
//登出按鈕被點擊
private void btn_logout_Click(object sender, EventArgs e)
{
//宣告彈出視窗
DialogResult dia;
//彈出視窗顯示是否登出,並前往登入頁面(Login)
dia = MessageBox.Show("Did you want to logout ? ", "Remind from kvjk_2125", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
if (dia == DialogResult.OK)
{
Login back = new Login();
back.Show();
this.Close();
}
}
}
}
```
## 點餐頁面(OrderForm.cs)
### UI設計
> 
- 元件
```TextBox```:輸入商品數量。要記得控制輸入的量,如果遇到喜歡開玩笑的老師,就會問你"我可以買99999999999999999999..."對就是這樣
```label```:顯示商品項目。另外因為很懶的關係,直接將設品預設成350元,若是想要不同的價格,可以將商品價格獨自放在一個label,計算數量時,將商品數量的TextBox.Text乘上價格的label.Text。寫作:```Toatl = TextBox.Text*label.Text;```
```Button```:確認輸入品項數量正確
- Object's Name
```txt_marPrice```:第一項品項的數量
```txt_beepPrice```:第二項品項的數量
```txt_sprPrice```:第三項品項的數量
```btn_check```:確認輸入品項是否正確
### 程式碼設計(使用註解解釋程式碼)
```c=
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace _1110832059_FinalExam
{
public partial class OrderForm : Form
{
string txttotal;
int price = 0;
public OrderForm()
{
InitializeComponent();
}
private void btn_check_Click(object sender, EventArgs e)
{
int mar = 0, beep = 0, spr = 0;
//以字串型態儲存數量
string marPrice = txt_marPrice.Text,
beepPrice = txt_beepPrice.Text,
sprPrice = txt_sprPrice.Text;
//尋找數量可能出現的錯誤,文字類型的錯誤
//三個選項空格Trim
if (marPrice.Trim() == "" || beepPrice.Trim() == "" || sprPrice.Trim() == "")
{
DialogResult dia;
dia = MessageBox.Show("You have no edit your choose ! ", "Remind from kvjk_2125", MessageBoxButtons.OK, MessageBoxIcon.Warning);
txt_marPrice.Text = "0";
txt_beepPrice.Text = "0";
txt_sprPrice.Text = "0";
}
//輸入不是數字
else if(marPrice.All(char.IsDigit) != true || beepPrice.All(char.IsDigit) != true || sprPrice.All(char.IsDigit) != true)
{
DialogResult dia;
dia = MessageBox.Show("You escribe somthing is not a number ! ", "Remind from kvjk_2125", MessageBoxButtons.OK, MessageBoxIcon.Warning);
txt_marPrice.Text = "0";
txt_beepPrice.Text = "0";
txt_sprPrice.Text = "0";
}
//沒有以上錯誤
else
{
//以整數型態儲存數量
mar = Int32.Parse(marPrice);
beep = Int32.Parse(beepPrice);
spr = Int32.Parse(sprPrice);
//數字類型的錯誤
//都沒有變動
if (mar == 0 && beep == 0 && spr == 0)
{
DialogResult dia;
dia = MessageBox.Show("You have no edit your choose ! ", "Remind from kvjk_2125", MessageBoxButtons.OK, MessageBoxIcon.Warning);
txt_marPrice.Text = "0";
txt_beepPrice.Text = "0";
txt_sprPrice.Text = "0";
}
//負數
else if (mar < 0 || beep < 0 || spr < 0)
{
DialogResult dia;
dia = MessageBox.Show("Here have something smaller than 0 ! ", "Remind from kvjk_2125", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
//大於5
else if (mar > 5 || beep > 5 || spr > 5)
{
DialogResult dia;
dia = MessageBox.Show("Don't bigger than 5 ! ", "Remind from kvjk_2125", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
//送出到下個畫面
else
{
if (mar != 0)
{
txttotal += lab_mar.Text + " quantity : " + mar + " price : " + mar * 350 + "\r\n";
}
if (beep != 0)
{
txttotal += lab_beep.Text + " quantity : " + beep + " price : " + beep * 350 + "\r\n";
}
if (spr != 0)
{
txttotal += lab_spr.Text + " quantity : " + spr + " price : " + spr * 350 + "\r\n";
}
txttotal += "\r\nTotal : " + (mar * 350 + beep * 350 + spr * 350) + " dollars\r\n";
DialogResult dia;
dia = MessageBox.Show("Here check your order form : \n" + txttotal, "Remind from kvjk_2125", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
if (dia == DialogResult.OK)
{
this.Close();
Complete sucess = new Complete(txttotal);
sucess.Show();
txt_marPrice.Text = "0";
txt_beepPrice.Text = "0";
txt_sprPrice.Text = "0";
}
txttotal = "";
}
}
}
}
}
```
## 訂購完成頁面(Complete.cs)
### UI設計
> 
- 元件
```groupBox```:將使用者的訂單內容顯示在此
```label```:顯示訂單內容、時間,提示輸入。題目有說不能讓使用者更改內容,因此這邊直接使用label顯示訂單資訊
```TextBox```:輸入姓名、電話
```Button```:按鈕確認輸入,並前往訂購紀錄
- Object's Name
```lab_value```:單號。這裡是用時間當單號,記錄到毫秒
```lab_order```:將前一頁傳過來的訂單內容傳到這裡
```lab_timer```:顯示時間(停止狀態)
```txt_name```:輸入訂購人姓名
```txt_phone```:輸入訂購人電話。在程式碼中,判斷電話號碼是否09開頭,且十位數
```button1```:又忘記換名稱了...點擊按鈕前往訂購紀錄頁面
### 程式碼設計(使用註解解釋程式碼)
```c=
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace _1110832059_FinalExam
{
public partial class Complete : Form
{
string text_form;
public Complete()
{
InitializeComponent();
}
public Complete(string order)
{
InitializeComponent();
lab_order.Text = order;
}
private void Complete_Load(object sender, EventArgs e)
{
//單號設定,因為時間紀錄單位越小,越不容易跟其他筆資料衝撞,所以這裡使用時間當單號
lab_value.Text = DateTime.Now.ToString("yyyyMMddHHmmssff");
//時間
lab_timer.Text = DateTime.Now.ToString("yyyy/MM/dd/ HH:mm:ss");
}
private void button1_Click(object sender, EventArgs e)
{
string phone = txt_phone.Text;
//判斷是否有尚未填寫的個人資料
if(txt_name.Text.Trim() == "" || txt_phone.Text.Trim() == "")
{
DialogResult dia;
dia = MessageBox.Show("Something you're not edit it ! ", "Remind from kvjk_2125", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
//判斷電話號碼是否填寫錯誤(>10 or is not start by 09)
else if(txt_phone.Text.Length != 10 || phone.Substring(0, 2) != "09")
{
DialogResult dia;
dia = MessageBox.Show("Your phone number is not correct ! ", "Remind from kvjk_2125", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
//判斷電話欄位是否輸入的是數字
else if(phone.All(char.IsDigit) != true)
{
DialogResult dia;
dia = MessageBox.Show("You escribe phone number is not a number ! ", "Remind from kvjk_2125", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
text_form = "單號:" + lab_value.Text +
"\r\n訂購時間:" + lab_timer.Text +
"\r\n訂購人:" + txt_name.Text +
"\r\n連絡電話:" + txt_phone.Text +
"\r\n\r\n訂購內容:\r\n" + lab_order.Text;
DialogResult dia;
dia = MessageBox.Show("Here check your order form : \n" +
"單號:" + lab_value.Text +
"\n訂購時間:" + lab_timer.Text +
"\n訂購人:" + txt_name.Text +
"\n連絡電話:" + txt_phone.Text +
"\n\n訂購內容:\n" + lab_order.Text, "Remind from kvjk_2125", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
if (dia == DialogResult.OK)
{
//將資料儲存到訂單紀錄的Class
savedata.orderlist.Add(text_form);
FinalCheck review = new FinalCheck(text_form);
review.Show();
//禁止再更改TextBox欄位
txt_name.ReadOnly = true;
txt_phone.ReadOnly = true;
this.Close();
}
}
}
}
}
```
## 訂購紀錄頁面(FinalCheck.cs)
### UI設計

- 元件
```Button```:選擇繼續登入或是登出整個頁面
```label```:顯示訂單紀錄
- Object's Name
```lab_view```:將記錄存在另外的class裡面,並顯示在這裡
```btn_ToOrder```:返回點餐頁面
```button1```:我又忘記改名稱了ㅋㅋ,登出整個頁面並返回登入頁面
### 程式碼設計(使用註解解釋程式碼)
```c=
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace _1110832059_FinalExam
{
public partial class FinalCheck : Form
{
//設定一個店數,可以接收訂單內容並儲存到紀錄的Class
public static string view;
public FinalCheck()
{
InitializeComponent();
}
public FinalCheck(string text)
{
//接取訂單內容
InitializeComponent();
view = "\r\n" + text;
}
private void FinalCheck_Load(object sender, EventArgs e)
{
//顯示訂單內容,使用Count()計算List資料數目
for(int i = 0; i < savedata.orderlist.Count(); i ++)
//顯示在lab_view內
lab_view.Text += savedata.orderlist[i] + "\r\n======================================\r\n";
}
private void button1_Click(object sender, EventArgs e)
{
Login login = new Login();
login.Show();
this.Close();
}
private void btn_ToOrder_Click(object sender, EventArgs e)
{
OrderForm backTo = new OrderForm();
backTo.Show();
this.Close();
}
}
}
```
## 資料儲存(非資料庫)
### 程式碼設計
```c=
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _1110832059_FinalExam
{
internal class savedata
{
//對就是一行
//另建在一個class裡面,以免其他檔案關閉時,資料會一起掰掰
//如果需要資料庫就是另一回事了
public static List<string> orderlist = new List<string>();
}
}
```
## 更改過程
### 頁面變數.Show()
本來寫成```頁面變數.ShowDialog()```,但有時在Close()之後,無法關閉頁面。
### TextBox
在設計UI介面時,要將MultiLine關閉,以免使用者按下Enter件發生換行。