C#應用程式開發:Tim Corey的“建立團隊表單第2部分”(第13課)的深入探討
[[academy-video-youtube({"vid": "QTdfiZpoabk", "start_time": "0", "title": "C# App Start To Finish Lesson 13 - Create Team Form Part 2", "creator": "Tim Corey", "length": "46m 06s"})]]
在這篇文章中,我們將透過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資料繫結的開發者來說是一個有用的提示。
新增具有全名的DisplayMember
Tim解釋說,組合框必須顯示可讀的名字。 DisplayMember屬性需要從Person模型中獲得一個字串屬性。 Tim警告說僅僅使用FirstName或LastName會導致重複。
因此Tim建立了一個名為FullName的唯讀屬性:
public string FullName
{
get
{
return $"{FirstName} {LastName}";
}
}這展示了一個重要的UI實踐:務必確保您的UI顯示的是使用者友好的資訊,而不是原始的物件資料。
建立測試樣本資料
Tim建立了名為CreateSampleData的方法來測試清單和UI。 他向兩個清單中新增了示範的Person物件,並在構造函式中呼叫WireUpLists。
這是一種在連接到真實資料庫之前,快速建立和測試Windows Forms應用程式的有用技術。
以真實資料取代樣本資料
Tim將樣本資料註解並准備載入真實資料。 他新增了GetPerson_All方法到IDataConnection介面中。 Tim解釋了他的命名規範:
Create = 插入
- Get = 選擇
這是C#應用程式資料存取層的一個標準命名策略。
使用Dapper實現SQL資料檢索
Tim使用Dapper和一個儲存過程實作了GetPerson_All的SQL版本:
connection.Query<PersonModel>("spPeople_GetAll").ToList();Tim刻意使用輸出變數而不是直接返回,以便於除錯。 這展示了除錯實踐如何影響程式碼設計。
用常量整理重複的程式碼
Tim注意到重複的連接字串名稱,並將其更改為常量。 他解釋道,重複是不良實踐,可能會導致後續的錯誤。
這是一個重要的軟體工程原則:DRY(Don't Repeat Yourself,勿重複原則)。
將真正的資料載入下拉式選單中
Tim建立LoadListData()並使用GetPerson_All()填充availableTeamMembers。 selectedTeamMembers清單保持空,這是正確的,因為新團隊從空開始。
這展示了如何將UI連接到真實資料源,無論是資料庫還是文字檔案。
接線新增成員按鈕
Tim建立新增成員按鈕事件處理程式。 邏輯是:
從下拉選單中獲得選擇的人物
將他們從可用清單中移除
將他們新增到選擇清單
- 刷新UI
Tim解釋道,必須將選擇的項目轉型為PersonModel,因為組合框將物件以物件形式儲存。 這強調了在C#中型別轉型和物件處理的重要性。
除錯刷新問題
Tim發現移動項目後UI未刷新。 在除錯後,他找到了解決方案:
將DataSource設為null
- 然後重新賦值清單
這強迫組合框和清單框刷新。 Tim強調了除錯技能的重要性,理解資料繫結如何表現通常需要這些技能。
接線刪除選擇按鈕
Tim將按鈕重新命名為刪除選擇並建立事件處理程式。 這將反向操作新增:
從selectedTeamMembers移除
加回到availableTeamMembers
- 刷新UI
Tim發現了一個錯誤:如果未選擇任何項目,將會增加一個空值。 他新增了驗證:
if (p != null)
{
// proceed
}這展示了基本的驗證和錯誤預防。
測試的重要性
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操作和UI驅動編程的C#開發者特別有價值。
如果您想繼續學習,Tim的下一課將完成團隊建立功能,並將所有內容結合成一個可運行的應用程式。

