C#中將表單資料保存到文件:Tim Corey的深入探討
[[academy-video-youtube({"vid": "AYuppLBoZeg", "start_time": "0", "title": "C# App Start To Finish Lesson 23 - Tournament Viewer Part 2", "creator": "Tim Corey", "length": "1h 19m 10s"})]]
C 儲存表單資料到檔案:與Tim Corey的深入探討(課程23)
可靠地保存使用者輸入的資料是桌面應用的一項重要職責。 您可以在Windows上的Visual Studio中建立Windows Form應用程式來實現文件保存功能。 在"C#應用程式從頭到尾"系列的第23課中,Tim Corey演示了一個WinForms應用程式如何處理表單中輸入的資料,驗證它,更新記憶體中的模型,並最終將其持久保存到資料庫或文字檔案中。
在本文中,我們將深入探討如何將C#表單資料保存到文件中,具體通過逐步解釋Tim的影片。我們將涵蓋如何在Visual Studio中開始建立新項目,設計具有如文字框的Windows表單,並使用如SaveFileDialog的元件功能來讓使用者瀏覽和選擇路徑及文件型別(例如csv、jpeg)使用過濾器。 目標是理解Tim在本課中是如何並為什麼連接各組件的,以便讀者能清晰地跟隨。
回顧賽事觀察及今日目標
在0:01時,Tim歡迎來到第23課並解釋今天的重點是完成賽事觀察表單。 他提醒我們,絕大部分的UI已經連接好:
回合下拉框
比賽匹配列表框
隊名標籤
- 得分文字框
您可以設置屬性,例如多行屬性(Multiline),讓得分文字框允許使用者填充更多資訊(如需要)。
Tim解釋今天將連接好剩下的兩個部分:
"僅顯示未完成的"複選框
- "記分"按鈕,包括將結果保存至儲存
新增"記分"按鈕後,您可以右鍵單擊此表單並選擇'View Code'來在Visual Studio中連接事件處理程式。
他明確指出,在"記分"按鈕成功運作後,應用程式將資料保存到資料庫或文字檔案,這才是我們的主要課題。
透過"僅顯示未完成的"複選框篩選比賽
在1:02時,Tim打開了此複選框的屬性窗口並雙擊CheckedChanged事件。 他解釋到,無論何時該複選框變更狀態,比賽列表都應重新載入。
Tim指出邏輯已經存在於一個叫 LoadMatchups 的方法中,因此他選擇不重複發明輪子,只是從複選框事件中再次調用該方法。
大約在1:57時,Tim修改了 LoadMatchups 方法以包含條件邏輯。 他詳細講解新增了一個 if 語句來檢查比賽的 Winner 是否為 null。 如果是,那麼比賽尚未進行。
然後在3:10時,Tim引入了一個"或"條件,使複選框運作。 他用簡單的術語解釋邏輯:
如果比賽沒有獲勝者,就顯示
- 或者,如果複選框未選中,就顯示所有
Tim仔細地通過口述真值表解釋原因:
已選擇 + 完成 = 隱藏
- 未選擇 = 始終可見
他甚至建議在條件變得複雜時將其邏輯畫在紙上。
連線"記分"按鈕和讀取表單值
在5:45時,Tim雙擊了"記分"按鈕事件。 他解釋點擊此按鈕應:
從表單讀取值(輸入通常被當作一個字串處理,將被處理並將輸出保存到文件)
更新基礎的比賽匹配物件(此邏輯被封裝在一個類中)
- 決定一個獲勝者
在6:26時,Tim從列表框中檢索已選擇的比賽匹配,並解釋此物件決定了哪些隊伍屬於"隊一"和"隊二"。
然後他展示如何迴圈遍歷比賽項目並解釋不同於設置文字字段,現在的目標是將文字數值保存到得分屬性中。 以下程式碼展示了如何將資料寫入文件。
在7:45時,Tim將文字輸入轉換為雙打並立即暫停,提醒使用者輸入無效的情況。 他強調說使用者輸入的資料必須始終被證實。
使用TryParse驗證輸入
在8:39時,Tim重構了分數解析成一個更安全的方法,使用double.TryParse。 他解釋這防止了應用崩潰如果使用者輸入了一些像文字而不是數字的無效值。
在10:20時,Tim將解析邏輯包入一個if語句:
如果解析成功,則繼續
- 如果失敗,則顯示消息框並返回
他解釋說使用return立即退出方法,防止錯誤的資料進一步擴散到系統中。
這種模式在隊一和隊二的分數中均重複。
確定獲勝者及處理極端情況
在14:25時,Tim比較了兩個分數以確定勝者。 如果隊一分數更高,那麼該隊被指派為比賽勝者。
在16:41時,Tim討論得分規則並解釋他的應用假設高分獲胜。 他注意到如果有人想支持低分獲胜(例如高爾夫),此邏輯可以逆轉或可配置。
在17:42時,Tim明確處理了平局。 他不是無聲地選擇一個勝者,而是顯示一個消息,說明不支持平局並有意不保存勝者。
修復錯誤和管理UI可见性
在20:14時,Tim碰到一個錯誤,當沒有未完成比賽匹配時。 他解釋為何在空列表上調用.First()會引發異常並通過先檢查列表計數進行修復。
從23:05起,Tim解釋了他的除錯理念。 他強烈建議將bug寫在紙上以避免數位干擾並保持專注。
在24:49時,Tim介紹了一個新方法,稱為DisplayMatchupInfo。 他解釋像標籤、文字框和"記分"按鈕之類的UI元素應僅在選擇比賽時顯示。
到28:28時,所有相關控制項在有無有效選擇的基礎上,自動切換可見性。
在記分後刷新列表
在29:57時,Tim解釋點擊"記分"後,比賽列表應立即刷新。 他簡單地在"記分"按鈕邏輯的末尾再次調用LoadMatchups()。
他演示了一旦比賽被記分並且選擇了"僅未完成的",它將從列表消失。
将比賽資料保存到資料庫中
在31:16時,Tim轉到儲存資料過程中。 他在資料存取接口中介紹了一個新方法,叫UpdateMatchup。
在33:14時,Tim解釋為何此方法回傳void。 他強調物件是以引用方式傳遞的,因此更新它們即是更新原始資料。
隨後他建立儲存過程:
用來更新比賽勝者的一個
- 用來更新比賽項目及得分的一個
在38:08時,Tim堅決警告SQL更新中丟失WHERE子句,並解釋一個小錯誤如何覆蓋每一個記錄。
在49:58時,他從表單上調用GlobalConfig.Connection.UpdateMatchup(m),正式將資料保存到持久儲存中。
更新和保存比賽到文字檔案
在52:32時,Tim轉至文字文件連接器。 他解釋大多數程式碼已經存在並可作調整。
將資料保存到文字文件後,需要注意所有C中的文件操作都需包含<stdio.h>庫並使用一個文件指標。 C語言中保存資料遵循三步過程:打開文件(帶正確的路徑和檔名)、寫入資料(text文件使用fprintf()或二進制文件使用fwrite())和使用fclose()關閉文件以確保所有輸出正確保存。 例如,您可以填寫一個文字框並使用以下程式碼將其內容保存到指定路徑的文字檔案中。 輸出將被寫入您指定的文件。
使用.NET中的SaveFileDialog元件時,使用者可以瀏覽文件系統並選擇要保存的文件。 對話框返回使用者選擇的路徑和文件名,並且您可以使用DialogResult屬性獲取文件的名稱。選擇文件後,您必須編寫實際將文件寫入磁盤的程式碼。 SaveFileDialog的OpenFile方法提供給您可寫入的Stream物件,讓您能夠保存輸出至所選文件。
在53:49時,Tim分享了一個關鍵理念:
"讓應用程式運行比編寫出色的程式碼更重要。"
他複製現有的保存邏輯並將其修改成UpdateMatchupToFile。與其新增新記錄,他選擇移除舊比賽並替換成更新后的比賽。
在59:27時,Tim不斷遵循這種模式以確保比賽項目中的分數和隊伍分配在文件中得到正確更新。
到1:02:44時,Tim演示重啟應用程式並確認資料保持不變,證明表單資料成功保存到文件中。
在.NET WinForms應用中處理CSV文件時,您可以使用SheetView類的LoadTextFile方法導入CSV文件,使用SaveTextFile方法導出CSV文件,並使用FpSpread類的SaveExcel方法將CSV文件轉換為Excel XLSX格式。 Spread.NET元件提供強大的CSV文件處理功能,讓您能輕鬆地在應用中管理CSV文件。 有關範例項目和逐步指南,請參見本部落格或下載範例應用程式以演示此功能。
Tim Corey的最後想法
在結尾幾分鐘內,Tim解釋保存資料只是過程的其中一部分。 一旦比賽完成,得勝的隊伍必須晉級到下一輪,這是他接下來要連接的部分。
他以強調對驗證的仔細關注、漸進式發展以及首先專注於可運行的軟體為本課結束,稍後進行重構。 我們希望這篇文章對您有幫助,並希望所提供的解決方案能幫助您在自己的項目中實現C儲存表單資料到文件功能。
摘要
在這堂課程中,Tim Corey逐步展示了C# WinForms表單資料如何從UI → 驗證 → 模型更新 → 文件儲存流動。 這篇文章提供了將表單資料保存到文件的範例和範例工作流。撰寫程式碼後,您可以在Visual Studio中按F5運行專案來測試功能。 通過遵循他的方式,開發者可以清楚地看到現實應用程式如何安全保存使用者輸入而不丟失資料或崩潰。
本課是一個實用藍圖,用於正確地保存表單資料,正如Tim所教授的那樣。

