跳過到頁腳內容
Iron Academy Logo
C# 應用程式
C# 應用程式

其他分類

構建 C# WinForms 儀錶盤表單

Tim Corey
51m 42s

在<C# App From Start to Finish>系列的第21課中,Tim Corey專注於在一個WinForms應用程式中設置比賽儀表板表單。 此表單作為應用程式的啟動畫面,並作為使用者進入點,讓他們可以載入現有的比賽或創建新的比賽。 WinForms儀表板是一個利用Windows Forms事件驅動功能的程式,其中使用者操作會觸發由程式碼處理的特定事件。

Tim說明這節課不是關於複雜的UI工作,而是關於以清晰和一致的方式連接資料、模型、存儲過程和表單。 注意:WinForms特別適合用於公司內部軟體,如庫存管理、CRM系統和會計工具。 為了真正理解WinForms儀表板在現實應用中的運作方式,Tim一步一步地展示如何載入比賽、建立模型、處理資料庫連接和連接UI控制項。

在這篇文章中,我們將依照Tim的視頻說明逐步深入了解儀表板表單,並附上時間戳以便於查閱。 WinForms應用通常是輕量級的,提供出色的性能,使其成為較舊或性能較弱硬體的理想選擇。

儀表板表單介紹

一開始,Tim介紹了第21課並說明目標:設置比賽儀表板表單,這將是應用程式啟動時的第一個表單。

Tim指出這個表單故意設計得很簡單。 它只做幾件事情:

  • 載入現有比賽列表

  • 允許使用者選擇並載入比賽

  • 允許使用者創建新比賽

他向觀眾保證,這將不是一個冗長或過於複雜的課程,但它涉及系統的許多重要部分。

儀表板表單的責任

Tim解釋儀表板表單有兩個主要責任:

  1. 將現有比賽載入下拉選單

  2. 根據使用者操作打開其他表單

如果已經存在比賽,使用者可以選擇並點擊載入比賽(這將在稍後設置)。 若使用者想創建新比賽,他們點擊創建比賽,這將打開專案中已存在的表單。

此時,Tim澄清載入比賽按鈕尚未連接,將在後續課程中處理。

為下拉選單創建比賽列表

選擇C#專案模板後,Visual Studio打開一個表單供您設計用戶界面。

Tim切換到表單的程式碼後段解釋下拉選單需要一個支持列表。注意表單在設計器中的顯示方式,已準備好UI自訂。 由於下拉選單旨在顯示比賽,因此支持列表必須是List

他創建了一個私人的列表稱為tournaments並說明,資料應該來自GlobalConfig連接,這就地抽象了資料來源是SQL還是文本文檔。

Tim然後嘗試呼叫一個名為GetTournament_All的方法,注意到尚不存在,並解釋這個方法必須添加到資料存取層。

將GetTournament_All添加到資料層

Tim移動到SQL連接器並實現缺失的GetTournament_All方法。 他解釋這個方法將返回一個TournamentModel物件列表。

他複製了一個現有的模式,適用於專案中的其他地方並對其進行調整以適應比賽。 關鍵不同之處在於,這個方法調用了存儲過程名為:

spTournaments_GetAll

Tim解釋這個存儲過程僅檢索基本的比賽數據:

  • ID

  • 比賽名稱

  • 報名費

  • 活躍狀態

他註明,儘管TournamentModel包含更多屬性,這只是第一步。

了解部分模型填充

Tim暫停以解釋一個重要概念:部分填充。

儘管比賽模型包括隊伍、獎項和回合,這些屬性尚未填充。 在這個階段:

  • 隊伍是空的

  • 獎項是空的

  • 回合是空的

預期只有基礎的比賽屬性目前被填充,而像隊伍、獎項和回合等相關實體則保持空白,直至進一步載入。

Tim強調這是故意的,這些相關實體必須在基礎比賽記錄載入後才填充。

為每個比賽填充獎項

Tim介紹了一個foreach循環,迭代從資料庫返回的每場比賽。

對於獎項,他解釋過程很簡單:

  • 呼叫一個根據比賽ID檢索獎項的存儲過程

  • 將結果指派給T.Prizes

他引用存儲過程spPrizes_GetByTournament,解釋它返回與某特定比賽相關聯的所有獎項。

這個模式——加載基礎數據,然後通過ID加載子數據——是Tim在整個應用程式中強調的重複發生的情形。

加載隊伍和隊伍成員

接下來,Tim轉到參加隊伍。

他解釋加載隊伍是兩步過程:

  1. 加載與比賽相關的隊伍

  2. 為每個隊伍加載隊伍成員

他使用了一個名為spTeams_GetByTournament的存儲過程來檢索當前比賽相關的隊伍。

然後,對於每支隊伍,Tim重用了一個現有的方法,通過隊伍ID加載隊伍成員。 他指出,這幾乎與系列較早撰寫的程式碼相同,只是針對比賽特定數據進行了調整。

介紹回合的複雜性

Tim解釋比賽模型中,回合是最複雜的部分。

回合存儲為:

List<List<MatchupModel>>

為了填充它們,Tim需要:

  • 加載比賽的所有對陣

  • 加載每個對陣的對陣條目

  • 解決像父對陣和贏家這樣的關係

他開始審查存儲過程:

  • spMatchups_GetByTournament

  • spMatchupEntries_GetByMatchup

處理Winner ID和嵌套模型

Tim指出處理資料庫時的一個常見問題: SQL返回的是ID,但應用程序期望的是對象。

Winner屬性是一個TeamModel,但資料庫只返回WinnerId。 Tim解釋無法直接從SQL填充嵌套對象。

為了解決這個問題,他在模型中添加了一個臨時WinnerId屬性,僅在數據加載過程中使用。 一旦所有隊伍加載完成,他使用ID將正確的TeamModel指派給Winner屬性。

填充對陣條目和父對陣

對於每個對陣,Tim:

  • 按對陣ID加載對陣條目

  • 檢查有效的隊伍ID

  • 使用已緩存的所有隊伍列表解決關係

他解釋為何ID預設為0當不存在值時,檢查>0的重要性。

Tim還解釋如何通過引用已加載的對陣來解決父對陣,這依賴於對陣按回合排序的事實。

構建回合結構

所有對陣完全填充后,Tim解釋回合是如何構建的。

他介紹:

  • 一個currentRound變量

  • 一個currentRow列表

當他循環遍歷對陣時:

  • 如果回合號變更,前一回合將添加到T.Rounds

  • 創建一個新回合列表

  • 對陣將相應地分組

Tim通過一個完整的示例來確保邏輯清晰,強調分離循環讓代碼更容易理解。

儀表板下拉選單接線

您可以通過從Visual Studio中的工具箱拖動通用控件例如標籤、文本框和下拉選單到表單中。

回到儀表板表單,Tim創建了一個WireUpLists()方法。

他指派:

  • DataSource到比賽列表

  • DisplayMember到TournamentName

標籤通常用於描述下拉選單的目的,而文本框可用於表單中的用戶輸入。 若要處理用戶交互,您可以雙擊設計器中的按鈕來自動生成Form1.cs文件中的Click事件處理函數。

他解釋這使得下拉選單顯示人類可讀的名稱而非對象引用。

測試SQL和文本文檔連接

Tim使用兩個資料源運行應用程式:

  • 文本文檔連接立刻起效

  • SQL連接引發錯誤

您可以選擇Start按鈕或在Visual Studio中按F5運行應用程式。

他逐步講解錯誤信息,識別出這個錯誤由缺少參數引起,並指出在整合多個數據源時此類錯誤普遍存在。 透過正確傳遞比賽ID到存儲過程中已經解決這個錯誤。

修復好獎勵和隊伍後,Tim確認兩個數據源現在已經正常運作。 識別及修復錯誤是開發過程中的一部分,特別是整合多個數據源時。

連接創建比賽按鈕

最後,Tim通過處理其事件特別是Click事件來連接創建比賽按鈕。

他解釋按鈕的事件處理代碼是在程式碼後端文件(Form1.cs)中編寫,而不是在Form1.Designer.cs文件中。Form1.Designer.cs文件會自動生成Windows Forms的UI代碼,不應手動編輯。

按鈕只會:

  • 創建一個新實例的創建比賽表單

  • 呼叫Show()

他討論設計決定,使用者在創建比賽後應去往哪裡,並解釋為何直接導航到比賽檢視器最為合理。

結論和下一步

Tim總結所做的工作:

  • 儀表板載入比賽

  • 下拉選單正確填充

  • 創建比賽表單有效打開

他指出創建比賽后刷新列表將在稍後處理。

在下一課中,Tim預告比賽檢視表單,將實現回合、對陣、得分和進程——使比賽系統活躍起來。未來版本的本課程還將涵蓋其他功能和改進,包括與WinForms和.NET新版本相關的更新。

課程展示了一個WinForms儀表板不僅僅是一個UI,而是連接模型、數據訪問和導航的協調點——Tim一絲不苟地逐步展示。

WinForms因其穩定性、快速開發速度以及與Windows操作系統的深度整合而仍然高度相關。

Hero Worlddot related to 構建 C# WinForms 儀錶盤表單
Hero Affiliate related to 構建 C# WinForms 儀錶盤表單

通過分享您所愛的東西賺得更多

您是否在為使用.NET、C#、Java、Python或Node.js的開發者創建內容?將您的專業知識轉化為額外收入!

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我