練習 1:填空題——控制項關鍵屬性
| 題目 | 答案 |
| 控制項是否回應使用者互動 | Enabled |
| 控制項是否顯示 | Visible |
| TextBox 輸入密碼字元 | PasswordChar |
| CheckBox CheckState 為 Indeterminate 時,Checked 值 | Unchecked |
| 將 RadioButton 分組 | Panel 或 GroupBox |
| ComboBox 禁止編輯文字 | DropDownStyle = DropDownList |
| MenuStrip 選單項目快捷鍵 | ShortcutKeys |
| ListView 顯示模式 | View |
練習 2:判斷題
- 控制項是屬性、方法、事件的封裝集合 —— 正確
- TextBox 僅能單行輸入 —— 錯誤(可設 Multiline=True 多行)
- RichTextBox 僅能操作 RTF 檔 —— 錯誤(亦可純文字)
- CheckBox Checked 與 CheckState 值恆相同 —— 錯誤(三態時不同)
- ToolTip 顯示控制項自訂提示 —— 正確
練習 3:TextBox、MaskedTextBox、RichTextBox 適用場合
- TextBox:一般單段文字編輯,單行/多行、密碼輸入。
- MaskedTextBox:特定格式輸入(日期、電話等),格式錯誤觸發
MaskInputRejected 事件。
- RichTextBox:進階多段文字編輯,支援字型/段落格式、尋找取代、RTF 檔案互通。
練習 4:CheckBox 與 RadioButton 差異
- CheckBox:獨立選項,可多選(複選),支援三態(Indeterminate)。
- RadioButton:同群組內單選,選取一項自動取消其他。
練習 5:按鈕點擊計數顯示於 TextBox
介面設計
textBox1:Multiline=True, ScrollBars=Vertical
button1:開始計數
button2:停止計數
核心程式碼
int count = 1;
bool isAdding = true;
private void button1_Click(object sender, EventArgs e)
{
if (isAdding)
textBox1.Text += $"第 {count} 次點擊按鈕\r\n";
count++;
}
private void button2_Click(object sender, EventArgs e)
{
isAdding = false;
}
練習 6:ListBox 自動加入 10 個數字
int baseNum = 1;
private void button1_Click(object sender, EventArgs e)
{
for (int i = baseNum; i < baseNum + 10; i++)
listBox1.Items.Add(i);
baseNum += 10;
}
練習 7:簡易計算機(0~4 整數加減)
關鍵設計
- 數字按鈕共用
InputNumber 事件處理函式,透過 sender 區分。
- 使用
enum calculateType { none, add, sub } 記錄運算狀態。
isY 標記是否為新運算數輸入階段。
核心邏輯
private void InputNumber(object sender, EventArgs e)
{
Button btn = (Button)sender;
if (isY) { textBox.Clear(); isY = false; }
textBox.Text += btn.Text;
}
private void addButton_Click(object sender, EventArgs e)
{
calcType = calculateType.add;
x = Convert.ToInt32(textBox.Text);
isY = true;
}
// 減法、等號、清除邏輯類似
練習 8:TreeView + ListView 實作簡易資源管理器
架構
SplitContainer:左側 TreeView 顯示目錄樹,右側 ListView 顯示檔案清單。
ImageList:提供資料夾/檔案圖示。
- 遞迴
GetDirectories 建立樹節點,Tag 屬性儲存 DirectoryInfo 物件。
NodeMouseClick 事件:依選取節點填充 ListView(子目錄與檔案)。
關鍵程式碼片段
private void PopulateTreeView()
{
DirectoryInfo info = new DirectoryInfo(@"C:\Documents and Settings");
if (info.Exists)
{
TreeNode root = new TreeNode(info.Name) { Tag = info };
GetDirectories(info.GetDirectories(), root);
treeView1.Nodes.Add(root);
}
}
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
listView1.Items.Clear();
DirectoryInfo dir = (DirectoryInfo)e.Node.Tag;
// 加入子目錄
foreach (var d in dir.GetDirectories())
AddListViewItem(d.Name, "Directory", d.LastAccessTime);
// 加入檔案
foreach (var f in dir.GetFiles())
AddListViewItem(f.Name, "File", f.LastAccessTime);
listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
}