C# 應用程式開發:透過 Tim Corey 的「創建團隊表單第 2 部分」深入探索(第 13 課)
在本文中,我們將跟隨Tim Corey的"C# App Start to Finish" 系列的第13課來深入探討C#應用程式開發。 Tim引導我們完成構建<Windows Forms 應用程式的過程,重點講解如何將UI控件如下拉框、列表框和按鈕連接到資料。 本課演示了關鍵概念,如資料繫結、列表管理、使用Dapper的數據庫連接,以及基本驗證和除錯,這些都是構建現實世界C#應用程式的基本技能。
持續建立團隊表格
Tim首先提醒我們,第13課是上個影片的延續,其中"新增成員"部分已接線。在這節課中,Tim解釋主要目標是接線下拉框(結合框)和列表框,然後連接新創建的人物物件以便顯示在列表中。Tim清楚地制定了計畫:這節課將專注於UI接線、資料移動和列表同步化——構建C#桌面應用程式的基本面。
理解下拉框和列表框資料
Tim解釋在結合框和列表框後面會有一個人物物件清單。 這是Windows Forms中資料繫結的經典例子,其中UI元素綁定到資料模型的集合。
他在類級別建立了兩個私人列表:
-
availableTeamMembers – 可以加入團隊的人
- selectedTeamMembers – 已經加入團隊的人
Tim澄清預期行為:當某人在下拉菜单中被選中並添加時,他們應該從availableTeamMembers移至selectedTeamMembers。 這是一個桌面應用開發中常見的CRUD操作模式,其中UI反映底層資料。
為何Tim不按比賽限制團隊成員
Tim回答了一個常見的設計問題:"为何不基於比賽限制團隊成員?"他解釋建立團隊表單與比賽不直接相關,多個比賽可以同時進行。
Tim舉了個實用的例子:如果同時有籃球和乒乓球比賽進行,一個人可以同時參加兩者。 限制下拉框會需要複雜的邏輯,並可能帶來錯誤。 因此,Tim選擇了一個更簡化的方式:
- 僅在個人被添加到團隊後從下拉菜單中移除。
這種方法展示了一個實用的軟件設計決策:除非必要,避免過度複雜化。
創建WireUpLists方法
Tim創建了一個名為WireUpLists的方法以將列表連接到UI控件。 此方法將availableTeamMembers列表綁定到結合框,並將selectedTeamMembers列表綁定到列表框。
Tim指出一個關鍵改進:在現代Windows Forms中,您可以將列表直接綁定到控件,而無需使用單獨的BindingSource。 這是一個對於Windows Forms資料繫結的開發者來說有用的小技巧。
加入顯示成員全名
Tim解釋結合框必須顯示可讀名字。 DisplayMember屬性期望來自Person模型的一個字符串屬性。 Tim警告說,僅使用FirstName或LastName可能會導致重複。
因此,Tim創建了一個名為FullName的只讀屬性:
public string FullName
{
get
{
return "{FirstName} {LastName}";
}
}
這展示了重要的UI實踐:永遠確保UI顯示的是使用者友好的信息,而不是原始的物件資料。
創建測試範例資料
Tim創建了一個名為CreateSampleData的方法來測試列表和UI。 他在兩個列表中添加了範例人物物件,並在構造函數中調用了WireUpLists。
這是一種在連接上真實資料庫之前快速構建和測試Windows Forms應用程式的有用技術。
用實際數據替換範例數據
Tim將範例數據註解掉並準備加載真實數據。 他在IDataConnection接口中添加了一個方法GetPerson_All。 Tim解釋了他的命名習慣:
-
Create = 插入
- Get = 查詢
這是C#應用程式中資料訪問層的標準命名策略。
用Dapper實現SQL數據檢索
Tim使用Dapper和存儲過程實現了GetPerson_All 的SQL版本:
connection.Query<PersonModel>("spPeople_GetAll").ToList();
Tim故意使用輸出變量而不是直接返回以使除錯更容易。 這展示了除錯習慣如何影響代碼設計。
清理重複代碼以常量表示
Tim注意到重複的連接字符串名稱並將其更改為常量。 他解釋說重複是壞習慣,可能會引起後期錯誤。
這是一個重要的軟件工程原則:DRY (不要重複自己)。
將真實數據加載到下拉列表中
Tim創建了LoadListData()並使用GetPerson_All()填充availableTeamMembers。 selectedTeamMembers列表保持空白,這是正確的,因為新的團隊從空白開始。
這展示了如何將UI連接到真實的數據源,無論是數據庫還是文本文件。
接線添加成員按鈕
Tim創建了添加成員按鈕的事件處理器。 邏輯如下:
-
從下拉列表中獲取選中的人
-
從可用列表中移除
-
添加到已選列表
- 刷新UI
Tim解釋說,選定的項必須轉換為PersonModel,因為結合框將對象作為對象存儲。 這強調了在C#中類型轉換和對象處理的重要性。
除錯刷新問題
Tim發現將項目移動後UI不會刷新。 經過除錯,他找到了解決方案:
-
將DataSource設置為null
- 然後重新分配列表
這迫使結合框和列表框刷新。 Tim強調除錯技能是必要的,經常需要了解資料繫結的行為。
接線刪除選定按鈕
Tim將按鈕重新命名為刪除選定並創建了事件處理器。 這逆轉了添加操作:
-
從selectedTeamMembers中移除
-
添加回到availableTeamMembers
- 刷新UI
Tim發現了一個錯誤:如果選中的項目沒有被選中,將添加null值。 他添加了驗證:
if (p != null)
{
// 繼續
}
這展示了基本的驗證和錯誤預防。
測試的重要性
Tim強調測試您的應用程式,像用戶一樣嘗試破壞它。 他建議有測試人員故意嘗試破壞應用,因為真正的用戶會做出意想不到的行動。
這是構建可靠軟件的一個關鍵課題。
接線"創建成員"按鈕
Tim修改了"創建成員"按鈕以保存新人到資料存儲並立即添加到已選列表中。這展示了如何在Windows Forms應用程式中實現CRUD操作。
為文本文件實現GetPerson_All
Tim意識到缺少文本文件版本的GetPerson_All。 他用一行簡單語句實現它:
return PeopleFile.FullFilePath.LoadFile().ConvertToPersonModels();
這顯示了如何用簡單邏輯輕鬆實現基於文件的存儲。
確定一切正常
Tim運行應用程式並確定下拉列表現在從文本文件和數據庫中加載人員。 他添加新人並看到他們立即出現,顯示整個系統運行正常。
接下來呢?
Tim總結說,下一個視頻將專注於構建團隊本身。 這涉及將多個資料片保存到數據庫或文本文件中,完成此功能。
最終想法
Tim Corey的第13課是C# Windows Forms應用程式開發的現實範例。 從接線UI控件和資料繫結到除錯和驗證,Tim教授實用的程式技能以構建現實桌面應用程式。 這課特別適合那些想學習資料繫結、Dapper、SQL CRUD操作以及C#中基於UI的編程的開發人員。
如果您想繼續學習,Tim的下一課將完成團隊建立功能,並將一切整合成為一個運作中的應用程式。
