---
# System prepended metadata

title: CH2 Visual C#與.NET

---

# CH2 Visual C#與.NET
## 1.以.NET 8.0產生主控台程式
Step 1.
專案範本選「主控台應用程式」，採取先前使用範本的預設值，「主控台應用程式」，按「下一步」鈕進入「設定新的專案」交談窗
![image](https://hackmd.io/_uploads/HJpLjDlnT.png)
Step 2.
輸入部份字串「Cons」後，連按兩次【Tab】鍵來完成「Console.WriteLine()」敘述；最後完成一行敘述「Console.WriteLine(“Hello, .NET Framework!”)」
程式設計:
![image](https://hackmd.io/_uploads/SyLGgde2T.png)
執行畫面:
![image](https://hackmd.io/_uploads/S1LVgOxnT.png)
## 2.傳統的主控台程式
Step 1.
專案範本選「主控台應用程式」，採取先前範本的預設值，選「主控台應用程式(.NET Framework)」，按「下一步」鈕進入「設定新的專案」交談窗。
![image](https://hackmd.io/_uploads/BJvFf_x3a.png)
Step 2.
輸入部份字串「Cons」後，連按兩次【Tab】鍵來完成「Console.WriteLine()」敘述；最後完成一行敘述「Console.WriteLine(“Hello, .NET Framework!”)」
程式設計:
![image](https://hackmd.io/_uploads/BymNw_e26.png)

執行畫面:
![image](https://hackmd.io/_uploads/rkOBwdx3a.png)
## 3.資料做輸入和輸出的處理
.NET Framework類別庫的System.Console類別能處理標準資料流
讀取輸入資料，使用Read()或ReadLine()方法
Read()方法：從標準輸入資料流讀取下一個字元
ReakKey()方法：取得使用者按下的下一個字元或功能鍵；按鍵值會反應於主控台視窗中
ReadLine()方法：讀取使用者輸入的一連串字元；為了讀取這串字元，也可以透過變數儲存其字串
輸出資料，使用Write()或WriteLine()方法
Write()方法輸出字元後不做換行動作，也就是插入點依然停留在原行
WriteLine()方法輸出字元後會把插入點移向下一行的最前端
### E0204-WriteLine()方法配合字串插補(P.2-32)
程式規劃:
使用ReadLine()方法讀取資料，WriteLine()方法配合字串插補的前導字元「$」輸出變數name所儲存的值
![image](https://hackmd.io/_uploads/r15UX_en6.png)
程式設計:
![image](https://hackmd.io/_uploads/HyIuXFeh6.png)

執行畫面:
![image](https://hackmd.io/_uploads/H1WcmFgha.png)

## 4.格式化輸出
![image](https://hackmd.io/_uploads/B1TdQuenT.png)
![image](https://hackmd.io/_uploads/Hyetmde2T.png)
### E0205-WriteLine()方法練習(P.2-37)
程式規劃:
ReadLine()方法接收輸入的資料，配合WriteLine()方法輸出資料。
![image](https://hackmd.io/_uploads/HJR4Euxn6.png)
程式設計:
![image](https://hackmd.io/_uploads/Hk6WJKl3a.png)
執行畫面:
![image](https://hackmd.io/_uploads/BkvQJFl2p.png)
## 5.視窗應用程式(參考第一個 Windows Form 應用程式 PPT)
![image](https://hackmd.io/_uploads/rJHw4ug3p.png)
程式設計:
![image](https://hackmd.io/_uploads/HJTs5tghT.png)
![image](https://hackmd.io/_uploads/S1v35tlh6.png)

執行畫面:
![image](https://hackmd.io/_uploads/ryGa9Ylh6.png)


![image](https://hackmd.io/_uploads/H1pT9Kgnp.png)
0219心得感想(100字)

這次寫程式的體驗真是太有趣了,通過不斷地嘗試和摸索，我發現了解決問題的方法，這讓我覺得特別開心。每次成功都讓我更有信心，覺得自己能做更多事情。這次的經驗讓我覺得自己能夠面對未來的挑戰，並且相信自己可以做到更多！

# ch3資料型別與變數
## 資料型別轉換
由於Visual C# 語法嚴謹，不允許不同資料型別間的資料直接做運算，若碰到兩個不同資料型別的資料需做運算時，必須將資料做轉換成同一資料型別才能做運算。

### 1.自動轉型
當兩個資料要做運算時，若運算結果的目的資料型別有效範圍大於來源資料型別。運算前來源資料事先不必轉換資料型別，電腦系統會在運算前將之「自動轉型」再進行處理。
例如：int(來源資料型別)→long(目的資料型別)、float→double、int→float、long→float、long→double、…
![image](https://hackmd.io/_uploads/SJpzYsKhp.png)


### 2.明確轉型
Visual C# 提供一種型別轉換(Type Cast)方法，能強迫資料轉換成其他資料型別。型別轉換的語法如下：
![image](https://hackmd.io/_uploads/ByFmYoK36.png)

![image](https://hackmd.io/_uploads/By-NYjY2a.png)


### 3.Parse方法
資料的內容是文數字，如："1234"、"3.14"。文數字是字串資料，非數值資料，不能直接拿來做數值四則運算。但可使用Parse()方法將字串資料轉成數值，其語法如下：
![image](https://hackmd.io/_uploads/SJ1HKiKhp.png)


![image](https://hackmd.io/_uploads/rJ6HYoF2a.png)


### 4.轉換成字串資料
一、自動轉換

字串型別資料只能與其它型別的資料用「+」運算子做合併的運算，而且合併後的資料會成為字串型別。故其它型別的資料要與字串資料合併前，電腦會將之自動轉換型為字串型別資料後再進行合併。

![image](https://hackmd.io/_uploads/SJewFoKn6.png)


二、明確轉換
![image](https://hackmd.io/_uploads/HyvPtoKnT.png)


## 隨堂練習(0226)
### 1.數值格式化練習
![image](https://hackmd.io/_uploads/rkyOYoYh6.png)

![image](https://hackmd.io/_uploads/B1v_FjKhT.png)

![image](https://hackmd.io/_uploads/Hk6OtsFna.png)

範例畫面:
![image](https://hackmd.io/_uploads/ByztYjY2p.png)


程式碼:
int num = 1206218;
double bmi = 18.5;
int money = 10000;
String msg = String.Format("我的學號是{0:d7},\n我的bmi是{1:F3},\n我每周伙食費{2:d1}", num, bmi, money);


執行畫面:
![image](https://hackmd.io/_uploads/r1_532KnT.png)

### 2.貸款試算練習
![image](https://hackmd.io/_uploads/rk19Yot3p.png)


表單設計
1.將Form名稱設定為班級座號姓名，背景需更換
2.pictureboxs-Image匯入專案資源檔、SizeMode-Zoom
3.Label-BackColor改Web-Transparent

動作說明-圖片需隨著按鈕更換

範例如下圖:
1.初始畫面:
![image](https://hackmd.io/_uploads/rkUcYsKha.png)

2.計算畫面:
![image](https://hackmd.io/_uploads/r1pctiF2a.png)

3.錯誤畫面:
![image](https://hackmd.io/_uploads/r1coKsYhp.png)


4.清除畫面:
![image](https://hackmd.io/_uploads/rkl2FiK2T.png)


補充說明: try…catch 語法
try…catch 語法標記出一整塊需要測試的語句，並指定一個以上的回應方法，萬一有例外拋出時，try…catch 語句就會捕捉。

如果任何在 try 區塊內部裡的語句（或者在 try 區塊內部呼叫的函數裡）拋出例外，控制權將立即轉移給 catch 區塊。如果沒有例外從 try 區塊裡拋出，就會跳過 catch 區塊。

![image](https://hackmd.io/_uploads/ryK3FiKhp.png)


![image](https://hackmd.io/_uploads/BkvaKoYnp.png)


程式設計:

執行畫面(請附上以下初始/計算/錯誤/清除畫面):

1.初始畫面:

2.計算畫面:

3.錯誤畫面:

4.清除畫面:

### 0226心得(100字)
### 0226加分練習(課本P.10-42)
實作練習3:
利用下圖完成的表單，輸入二個數字做加、減、乘、除運算，使用Button製成運算選項鈕，計算結果以訊息方塊輸出，按下訊息方塊的確認鈕，會清除表單上文字塊的內容。
![image](https://hackmd.io/_uploads/BJX0YoF2p.png)
![image](https://hackmd.io/_uploads/HkPRFiF36.png)


程式碼:


執行畫面(將Form名稱設定為班級座號姓名):

實作練習4:
利用文字方塊和標籤配合陣列概念，算出總分、平均並找出最高分，表單操作介面如下所示。
![image](https://hackmd.io/_uploads/rJgk9oY3p.png)


程式碼:


執行畫面(將Form名稱設定為班級座號姓名):

# CH4 基本輸出入介面設計
## InputBox函式
![image](https://hackmd.io/_uploads/H1iYLeXpa.png)


## MessageBox.Show()方法
在C# 中可以透過MessageBox.Show()方法來製作出可顯示訊息的對話方塊，等待使用者按下按鈕，電腦會傳回一個整數值指示使用者按下哪個按鈕以作為程式流程的依據。

![image](https://hackmd.io/_uploads/ryYsUe7a6.png)


MessageBox.Show([Object,] Message, Caption, MessageBoxButtons, 
MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions);
Object：在指定物件前面顯示訊息方塊，可省略不寫。
Message：用來顯示警告或提示使用者的文字。
Caption：為訊息方塊標題欄上的名稱。
![image](https://hackmd.io/_uploads/HJZa8lm66.png)
![image](https://hackmd.io/_uploads/rkjTUemaT.png)


## 隨堂練習
### 1.login
![image](https://hackmd.io/_uploads/BkQ1Dl7aT.png)


表單設定
TextBox1-MaxLength=8、PasswordChar=*
TextBox2-MaxLength=8

範例程式

![image](https://hackmd.io/_uploads/ryaxvl76a.png)


新增一個結束的視窗(自我練習)
1.彈跳結束視窗
![image](https://hackmd.io/_uploads/S1nbvlmT6.png)

2.清除文字
![image](https://hackmd.io/_uploads/H1wGPe76T.png)

程式碼:


執行結果:


### 2.四則運算(課本P.10-42)
利用下圖完成的表單，輸入二個數字做加、減、乘、除運算，使用Button製成運算選項鈕，計算結果以訊息方塊輸出，按下訊息方塊的確認鈕，會清除表單上文字塊的內容。
![image](https://hackmd.io/_uploads/HkxZNPg76T.png)


程式碼:


執行畫面(將Form名稱設定為班級座號姓名):

### 3.成績計算(課本P.10-42)
利用文字方塊和標籤配合陣列概念，算出總分、平均並找出最高分，表單操作介面如下所示。
![image](https://hackmd.io/_uploads/ryYSveQ6p.png)


程式碼:


執行畫面(將Form名稱設定為班級座號姓名):

## 20240304心得(100字)
# CH5 身份證字號產生器/檢查器
https://coding-prep.com/2023/07/31/zerojudge-a020-身分證檢驗/
規則說明:
![image](https://hackmd.io/_uploads/HkZUz7npa.png)
表單設計:
![image](https://hackmd.io/_uploads/HJTLG72pT.png)
程式碼:
Random()

Random r = new Random();//產生亂數
Random()	
使用預設種子值初始化 Random 類別的新執行個體。

Random(Int32)	
使用指定的種子值，初始化 Random 類別的新執行個體。
idPos = r.Next(26);//取亂數(最大值26)
Next()	
傳回非負值的隨機整數。

Next(Int32)	
傳回小於指定之最大值的非負值隨機整數。

Next(Int32, Int32)	
傳回指定範圍內的隨機整數。
Substring

id = idChar.Substring(idPos, 1).ToUpper();//產生大寫英文字母
Substring(Int32, Int32)	
從這個執行個體擷取子字串。 
子字串起始於指定的字元位置，並且具有指定的長度。
ToUpper()

ToUpper()	
傳回此字串轉換為大寫的版本。
ToLower()

ToLower()	
傳回此字串轉換為小寫的版本。
Trim()

if (textBox1.Text.Trim().Length == 10)//長度達十個字才驗證
Trim()	
移除目前字串開頭和結尾的所有空白字元。
String.IndexOf 方法

idPos = idChar.IndexOf(id.Substring(0, 1).ToLower());
IndexOf(Char)	
報告這個字串中指定之 Unicode 字元第一次出現時的所在索引 (以零為起始)。
貼心補充-可直接複製程式

string idChar = "abcdefghjklmnpqrstuvxywzio";
string[] idCry ={"台北市","台中市","基隆市","台南市","高雄市","新北市","宜蘭縣","桃園縣",
                     "新竹縣","苗栗國","台中市","南投縣","彰化縣","雲林縣","嘉義縣","台南市","高雄市",
                     "屏東縣","花蓮國","台東縣","澎湖縣","陽明山","金門縣","連江縣","嘉義市","新竹市"};
![image](https://hackmd.io/_uploads/SkG9MQ3pp.png)

![image](https://hackmd.io/_uploads/HJ6qMX2pT.png)


![image](https://hackmd.io/_uploads/S1qTzQnTp.png)


![image](https://hackmd.io/_uploads/H15Cfm2a6.png)


程式碼:
namespace WindowsFormsApp3
{

    public partial class 資訊一乙18高碩志 : Form
    {
        string idChar = "abcdefghjklmnpqrstuvxywzio";
        string[] idCry ={"台北市","台中市","基隆市","台南市","高雄市","新北市","宜蘭縣","桃園縣",
"新竹縣","苗栗國","台中市","南投縣","彰化縣","雲林縣","嘉義縣","台南市","高雄市",
"屏東縣","花蓮國","台東縣","澎湖縣","陽明山","金門縣","連江縣","嘉義市","新竹市"};
        string msg = "";
        string id, sex;
        Random r = new Random();
        public 資訊一乙18高碩志()
        {
            InitializeComponent();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            int sum = 0, idPos = 0;
           
            idPos = r.Next(26);
            id = idChar.Substring(idPos, 1).ToUpper();
            sum = (idPos + 10) / 10 + ((idPos + 10) % 10) * 9;
            
            idPos = r.Next(2) + 1;
            id = id + idPos.ToString();
            sum += idPos * 8;
            
            for (int i = 2; i < 9; i++)
            {
                idPos = r.Next(10);
                id = id + idPos.ToString();
                sum += idPos * (9 - i);
            }
            
            if (sum % 10 == 0)
                idPos = 0;
            else
                idPos = 10 - (sum % 10);
            id = id + idPos.ToString();
            sum += idPos;
            textBox1.Text = id;
        }

        private void textBox1_TextChanged_1(object sender, EventArgs e)
        {

        }

        private void txtld_TextChanged(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (textBox1.Text.Trim().Length == 10)
            {
                int sum = 0, idPos = 0;
                id = textBox1.Text;
                idPos = idChar.IndexOf(id.Substring(0, 1).ToLower());
                sum = (idPos + 10) / 10 + (idPos % 10) * 9;
                sex = id.Substring(1, 1);
                for (int i = 1; i < 9; i++)
                    sum += Convert.ToInt32(id.Substring(i, 1)) * (9 - i);
                sum += Convert.ToInt32(id.Substring(9, 1));
                if (sum % 10 == 0)
                    msg = sum.ToString() + ",正確," + idCry[idPos];
                else
                    msg = sum.ToString() + ",錯誤,";
                if (sex == "1")
                    msg += ",male";
                else
                    msg += ",female";
            }
            else
                msg = "錯誤";
            txtld.Text = msg;
        }
    }
}


執行畫面(將Form名稱設定為班級座號姓名):
![image](https://hackmd.io/_uploads/HyXQ7E3Ta.png)
## 延伸練習- ID Generator
 留言
表單設計
RadioButton1-Checked=True
TextBox2-Cursor-IBeam、ScrollBars-Vertical
從工具箱新增 SaveFileDialog1





貼心補充-可直接複製程式:

  string idChar = "abcdefghjklmnpqrstuvxywzio";
  string[] idCry ={"台北市","台中市","基隆市","台南市","高雄市","新北市","宜蘭縣","桃園縣",
               "新竹縣","苗栗國","台中市","南投縣","彰化縣","雲林縣","嘉義縣","台南市","高雄市",
               "屏東縣","花蓮國","台東縣","澎湖縣","陽明山","金門縣","連江縣","嘉義市","新竹市"};
  string[] idSex = { "任意", "男", "女" };
  string msg, idBorn;
  int num, idPos, sex;
  Random r = new Random();
程式設計:
![image](https://hackmd.io/_uploads/S12yUJukA.png)
















程式碼:
```
using System.Xml.Linq;

namespace 資一乙你爸
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
        {

        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            rabFemale.BackColor = Color.Red;
        }

        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            String[] temps = new String[3];//儲存文字方塊的字串陣列

            String distin;

            rtxtData.Font = new Font("標楷體", 14);

            rtxtData.ForeColor = Color.Indigo;

            temps[0] = $"姓名:{txtName.Text}";

            temps[1] = $"生日:{dtpBirth.Text}";

            distin = (rabMale.Checked) ?

            rabMale.Text : rabFemale.Text;

            temps[2] = $" 性別:{distin}";

            rtxtData.Lines = temps;//取得陣列內容放入文字方塊

        }
      
        

        private void rabMale_CheckedChanged_1(object sender, EventArgs e)
        {
            rabMale.BackColor = Color.Yellow; //改變背景色
        }
    }
}
```

執行畫面:
![image](https://hackmd.io/_uploads/HJA2IJ_kA.png)


20240311心得(100字) 
在寫生成身分證字號程式的過程中，我學到了好多東西呢 首先，我發現要先仔細了解問題的要求和規則才能動手寫程式。身分證字號可不是隨便亂搞的，我得先知道它的結構和生成方式，這樣才能確保我的程式碼能正確地生成出來呢

然後，我學會了要善用程式語言提供的功能和工具。有時候，用現成的函數或庫可以讓我寫程式變得更簡單、更高效。比如，我可以利用一些內建函數來做一些數學運算，這樣就不用自己重頭寫了，省時省力
# CH5、陣列和字串
1.宣告一維陣列
陣列經過宣告不代表已取得記憶體空間，必須以new運算子完成實體化(Instance)程序，才能進一步取得記憶體空間的配置，語法如下：

陣列名稱 = new 資料型別[size];  //size：表示陣列長度或陣列元素
範例寫法：

int[] grade;                 //宣告陣列
grade = new int[4];          //以new運算子實體化長度為4的陣列
int[] grade = new int[4];    //將上述兩行合併成一行
2.讀取陣列元素
(1)foreach迴圈讀取其元素

foreach(資料型別 物件變數 in 集合)
{
    程式區段敘述;
}
(2)for迴圈處理陣列
for迴圈也能處理陣列，但必須取得陣列的長度才能讀取
來自System命名空間的Array類別所提供的屬性「Length」
能取得陣列長度，語法如下：

陣列名稱.Length;
3.Array類別
屬於System名稱空間，是所有陣列的基底類別，提供所有陣列的屬性和方法


數值排序:
將數值由小而大排序稱為遞增；若把數字由大而小排序則是遞減
Array類別的Sort()方法能以一維陣列為排序對象，也能指定排序範圍，相關語法如下：

Array.Sort(Array)
Array.Sort(Array, index, length)   //index：指定欲排序的開始索引值
                                   //length：指定要排序的元素個數
Sort()方法只能做遞增排序，要完成遞減排序，要有二道手續；
先使用Sort()方法完成遞增排序，再以Reverse()方法反轉陣列元素
Reverse()方法的語法簡介如下：

Array. (陣列1, [陣列2]);        //陣列元素由小而大排序
Array.Reverse(陣列);           //將陣列元素做Sort反轉

進一步來檢視Sort()方法排序有兩個陣列時，相關語法如下：

Array.Sort(Array1, Array2)     //Array1(key)：以第一個陣列為主做排序，其索引會成為排序的鍵值
                               //Array2(value)：能對應到第一個陣列的索引所存放的陣列項目(元素)
Array.Sort(Array, Array, index, length)
## 課後練習
### -練習1
參考P5-12

利用IndexOf()方法找出陣列中年齡是24歲的人員。若有第二筆記錄，則使用while迴圈重覆尋找陣列中下一個年齡24的人員。當陣列經過排序，就能以方法BinarySearch()搜尋指定的值

條件資料值：
string[] name = {"Molly", "Eric","Johseph", "Peter", "Iron", "Priyanka"};
int[] age = { 24, 26, 24, 26, 28, 25 };

String.IndexOf (Char, Int32, Int32)
報告指定字符在此範例中的第一個匹配項的索引。搜索從指定字符位置開始，並檢查指定數量的字符位置。
String.IndexOf(value, startIndex, count)
參數
value：要查找的 Unicode 字符。
startIndex：搜索起始位置。
count：要檢查的字符位置數。

BinarySearch(Array, Object)
使用二進位搜尋演算法，在一維且已排序的 Array 中搜尋值。

4.有維有度話陣列
(1)二維、多維陣列

二維陣列宣告，語法如下：
資料型別[,] 陣列名稱;                           //步驟1：宣告二維陣列
陣列名稱 = new 資料型別[列數, 欄數];              //步驟2：配置記憶體
資料型別[,] 陣列名稱 = new 資料型別[列數, 欄數]; 
//將步驟1、2合併來宣告二維陣列並以new運算子配置列、欄數
SetValue()，它也可以設定二維陣列的值，語法如下：
int[,] number = new int[4, 3];
number[0, 0] = 64;
number.SetValue(123, 0, 1);
如果陣列維度是2以上時，藉由指定維度取得陣列長度，可使用GetLength()方法，語法如下：
陣列名稱.GetLength(dimension);  //dimension：取得陣列維度
GetValue()就能依其指定的位置來取得某個元素的值，認識其語法：
GetValue(index);  //index：欲新增元素的位置
當陣列超過二維，習慣以多維陣列來稱呼。以三維陣列(Three-dimension Array)來說，代表它有三個註標，是一個「M * N * O」的多維陣列。宣告語法如下：
資料型別[, ,] 陣列名稱;
//M：代表二維陣列個數，N：二維陣列的列數；O為二維陣列的欄數
//資料型別後的中括號內要有兩個逗號來表示它是三維陣列
程式碼:
![image](https://hackmd.io/_uploads/HkTgwa3WR.png)

### -練習2
參考P5-20

score是二維陣列，要讀取陣列元素時，以GetLength()方法取得列和欄的長度，配合雙層for廻圈是較好的處理方式，然後將每個人的分數相加


### -練習3
參考P5-23

產生一個「2x2x3」三維陣列並以三層for廻圈讀取陣列的元素


(2)隱含型別陣列
隱含型別是對於陣列的資料型別不做明確表示。它的語法如下：

var 陣列名稱 = new[]{…};
宣告隱含型別陣列時，以var關鍵字取代原有的資料型別同樣地必須以new運算子來取得記憶體空間

var data = new[] {11, 21, 310, 567 }; //int[]
5.字元和字串
逸出序列

char結構判斷字元的方法

string 常用方法
## 自我練習
請完成以下填空:
### 練習一.IndexOf (Char, Int32, Int32)
![image](https://hackmd.io/_uploads/SytoRn2-C.png)
![image](https://hackmd.io/_uploads/H1AsRn2-0.png)
程式碼:



執行畫面:

### 練習二.評分紀錄
![image](https://hackmd.io/_uploads/ByMA0nhW0.png)
int n = 0;  // 目前第n位老師的給分
string[] tea = new string[] { "丁丁", "拉拉", "迪西", "小波", "努努" };
int[] score = new int[5];  // 宣告score[0]~[4]存放五位老師的給分
程式碼:

執行畫面:
### 練習三(歌曲排行榜)(NEW)
![image](https://hackmd.io/_uploads/rJBgkahWC.png)
![image](https://hackmd.io/_uploads/ryzbJa2ZA.png)
程式碼:
![image](https://hackmd.io/_uploads/BJkwyp2-0.png)
![image](https://hackmd.io/_uploads/HkRwkp3-0.png)
![image](https://hackmd.io/_uploads/BJxoJTnW0.png)

執行畫面:
![image](https://hackmd.io/_uploads/ByGbea3WR.png)
![image](https://hackmd.io/_uploads/S14Mla3Z0.png)
### 練習四(借書程式)(NEW)
![image](https://hackmd.io/_uploads/BJ54xahWR.png)
程式碼:

執行畫面:

## 隨堂練習(BMI計算程式)
![image](https://hackmd.io/_uploads/r1PvxphbA.png)
程式碼:

執行畫面:

## 20240408心得(100字)
## 20240429心得(100字)

# 六、常用控制項
## 1.TrackBar滑動軸控制項
滑動軸控制項可以使用鍵盤的方向鍵或滑鼠游標來移動滑動鈕設定輸入的數值，可防止使用者輸入超出範圍的數值。
TrackBar是類似控制項的 ScrollBar 可捲動控制項。 您可以藉由設定 Minimum 屬性來指定範圍的下端，以及 Maximum 指定範圍的上端屬性，以設定追蹤列捲動屬性的值 Value 。
![image](https://hackmd.io/_uploads/rJIuKm1QC.png)
## 2.ScrollBar捲軸控制項
ScrollBar捲軸控制項分為水平捲軸及垂直捲軸兩種,兩者功能相同只是方向不同。程式設計時為避免使用者輸入錯誤或超出範圍的整數數值資料時，可以使用捲軸控制項讓使用者調整捲動鈕來輸入資料
![image](https://hackmd.io/_uploads/rJqYFXkX0.png)
## 3.ToolTip提示控制項
表示小矩形快顯視窗 (Pop-Up Window)，它會在使用者將指標停留在控制項上時，顯示控制項用途的簡短說明。
### 練習一(圖片縮放練習)
![image](https://hackmd.io/_uploads/rJVstXJ7A.png)
程式碼:
private void Form1_Load(object sender, EventArgs e)
{
 PicShow.SizeMode = PictureBoxSizeMode.StretchImage;
 PicShow.Height = 90; PicShow.Width = 90;    // 設定圖片高度和寬度
 PicShow.Image = Image.FromFile("D:\\image\\pic1.png");    // 載入圖檔
 TkbPic.Maximum = 4; TkbPic.Minimum = 1;// 設定TkbPic的最大、最小值
 VsbHeight.Maximum = 180; VsbHeight.Minimum = 1; // 設定最大、最小值
 VsbHeight.LargeChange = 1;      // 設定VsbHeight的快動值 = 1
 VsbHeight.Value = PicShow.Height;   // VsbHeight的Value值=圖片高度
 HsbWidth.Maximum = 180; HsbWidth.Minimum = 1;  // 設定最大、最小值
 HsbWidth.LargeChange = 1;       // 設定HsbWidth的快動值 = 1
 HsbWidth.Value = PicShow.Width; // HsbWidth的Value值=圖片寬度
 Ttip.SetToolTip(VsbHeight, $"{VsbHeight.Value}");
 Ttip.SetToolTip(HsbWidth, $"{HsbWidth.Value}");
 Ttip.SetToolTip(TkbPic, "圖片1");
}
![image](https://hackmd.io/_uploads/BJD6Y7y7R.png)
程式碼:

執行畫面:

4.DateTimePicker日期時間挑選控制項
日期時間挑選控制項，可以快速建立一個供使用者挑選日期或時間的介面。日期時間可用月曆供使用者挑選日期或自行用鍵盤輸入日期。文字方塊中會顯示使用者挑選的日期，DateTimePicker控制項只能挑選一天
![image](https://hackmd.io/_uploads/SkT0t7kQA.png)
CustomFormat 屬性
可以自訂日期或時間顯示格式，但必須把Format屬性值設為Custom才有效。
dateTimePicker1.Format = DateTimePickerFormat.Custom;  
//將 Format 屬性設為 DateTimePickerFormat.Custom
dateTimePicker1.CustomFormat = "ddd dd MMM yyyy";  
// Display the date as "Mon 27 Feb 2012". 
DateTime.AddMinutes(Double) 方法
傳回新的 DateTime，將這個執行個體的值加上指定的分鐘數。
value Double
整數和小數的分鐘數。 value 參數可以是負數或正數。
### 練習二(定時提醒程式)(DateTimePicker)
![image](https://hackmd.io/_uploads/HycZi7kQC.png)
程式碼:
![image](https://hackmd.io/_uploads/B1HzimkQR.png)
程式碼:

執行畫面:

## 4.LinkLabel(超連結標籤)控制項
![image](https://hackmd.io/_uploads/Sye8sm1XR.png)
超連結標籤控制項常用的屬性如下：
(1)LinkColor屬性：用來記錄超連結標籤控制項中，超連結文字在未被點選前的顏色
 留言
 建議修訂

預設值為藍色
在程式碼視窗中，設定超連結標籤控制項的LinkColor屬性值之撰寫語法如下：
超連結標籤控制項名稱.LinkColor=Color.Color結構的屬性;
LinkLabel1.LinkColor=Color.Green;
Color結構常用的公開靜態唯讀屬性，包括Red(紅色)、Orange(橙色)、Yellow(黃色)、Green(綠色)、Blue(藍色)、Indigo(靛色)、Purple(紫色)等

(2)LinkVisited屬性：用來記錄超連結標籤控制項中的超連結文字顏色，是否可以從LinkColor的屬性值變更成VisitedLinkColor的屬性值

預設值為false，表示無法變更
在超連結標籤控制項的預設事件LinkClicked中，設定超連結標籤控制項的LinkVisited屬性值為true，才能感受超連結標籤控制項被按前與被按後文字顏色的變化。
(3)VisitedLinkColor屬性：用來記錄超連結標籤控制項中的超連結文字，被點選後的顏色

預設值為紫色
在程式碼視窗中，設定超連結標籤控制項的VisitedLinkColor屬性值之撰寫語法如下：
超連結標籤控制項名稱.VisitedLinkColor=Color.Color結構的屬性;
linkLabel1.LinkVisited = true;//點選時表示已被瀏覽
//已被瀏覽的顏色
linkLabel1.VisitedLinkColor = Color.Maroon;

(4)LinkBehavior屬性

以程式碼撰寫，讓控制項在滑鼠停留時加底線，簡述如下：
linkLabel1.LinkBehavior = LinkBehavior.HoverUnderLine;

將超連結標籤控制項的Enable(致能)屬性設為「false」時,利用屬性DisabledLinkColor(預設：灰色)來表示連結無作用時所顯現的顏色,程式碼可撰寫如下：
linkLabel1.DisableLinkColor = Color.White;

(5)引用System.Diagnostics命名空間

當使用者在超連結標籤控制項按下滑鼠時，會引發LinkClicked()事件處理常式。使用超連結標籤控制項可連結的對象包含執行檔、網址和電子郵件信箱
進行連結時必須引用「System.Diagnostics」命名空間做程序監控，透過此命名稱空間之Process類別Start()方法啟動欲執行的處理程式
語法如下：
System.Diagnostics.Process.Start(“String”);
### 練習三(超連結練習)
表單加入兩個標籤超連結控制項。按下第一個控制項[LinkLabel1]會進入「Visual Studio」網站；按下第2個控制項[視窗表單的應用程式]會開啟其他成功之表單(請自行指定)
![image](https://hackmd.io/_uploads/H1OFjmJ7R.png)
程式碼:

執行畫面:




