C# 保存表單數據到文件:與 Tim Corey 的深入探討
C 保存表單資料至檔案:與 Tim Corey 深入探究(課程 23)
可靠地保存用戶輸入的資料是桌面應用程式最重要的責任之一。 您可以在 Windows 上的 Visual Studio 中創建一個 Windows Form 應用程式來實現檔案保存功能。 在"C# App Start to Finish"系列課程的第 23 課中,Tim Corey 演示了 WinForms 應用程式如何採集表單中輸入的資料、驗證資料、更新內存模型,並最終將其保存到資料庫或文字檔案中。
在這篇文章中,我們將深入探討如何將 C# 表單資料保存至檔案,嚴格按照 Tim 的影片逐步解釋。我們將討論如何在 Visual Studio 中開始一個新專案,設計 Windows Form 並使用像文字方塊的控制項,並使用 SaveFileDialog 等元件讓用戶透過篩選選擇路徑和檔案類型(例如,csv、jpeg)。 目標是了解 Tim 在本課中如何及為什麼將各個組件結合起來,讓讀者能夠清楚地跟隨。
回顧賽事檢視器和今日目標
在 0:01 時,Tim 歡迎觀眾來到第 23 課,並解釋今天的重點是完成賽事檢視器表單。 他提醒我們大多數的 UI 已經被設定好:
-
輪次下拉選單
-
比賽列表框
-
隊名標籤
- 分數輸入框
您可以為分數輸入框設定 Multiline 屬性,以便用戶在需要時填寫更多資料。
Tim 解釋說,今天他將設定兩個剩餘的部分:
-
"僅未比賽"核取方塊
- 成績按鈕,包括將結果保存到儲存區
添加成績按鈕後,您可以在 Visual Studio 中右鍵點擊表單並選擇"檢視程式碼"來設置事件處理程式。
他明確指出,一旦成績按鈕運作正常,應用程式將保存資料到資料庫或文字檔案中,這就是我們的主要話題開始的地方。
使用"僅未比賽"核取方塊來篩選比賽
在 1:02 時,Tim 打開核取方塊的屬性視窗並雙擊 CheckedChanged 事件。 他解釋說,每當核取方塊狀態改變時,比賽列表應重新載入。
Tim 指出,邏輯已經存在於一個名為 LoadMatchups 的方法中,所以不用重新創建任何東西,只需從核取方塊事件中再次調用該方法即可。
在 1:57 左右,Tim 修改了 LoadMatchups 以包括條件邏輯。 他逐步演示了如何添加一個 if 語句來檢查比賽的勝者是否為空。 如果是,則說明比賽尚未進行。
然後在 3:10,Tim 引入了使核取方塊工作的 OR 條件。 他用簡單的語言解釋邏輯:
-
如果比賽沒有勝者,則顯示
- 或者,如果核取方塊未選中,則顯示所有內容
Tim 仔細地口頭講解了真值表,解釋了為什麼:
-
選中 + 完成 = 隱藏
- 未選中 = 始終可見
他甚至建議在條件變得複雜時將這些邏輯寫在紙上。
設定成績按鈕並讀取表單值
在 5:45,Tim 雙擊了成績按鈕事件。 他解釋了單擊該按鈕應該做的事情:
-
從表單中讀取值(輸入通常以字串形式處理,這些字串將被處理並將輸出保存到檔案)
-
更新基礎比賽物件(這個邏輯封裝在一個類中)
- 決定勝者
在 6:26,Tim 從列表框中取出選定的比賽,並解釋這個物件決定了哪些隊伍屬於"隊伍一"和"隊伍二"。
然後他展示了如何循環遍歷比賽條目,並解釋說現在的目標不是設置文字字段,而是將文本值保存到分數屬性中。 以下程式碼演示了如何將資料寫入檔案。
在 7:45,Tim 將文字輸入轉換為 double 類型,並立即警告無效用戶輸入的危險。 他強調必須始終驗證用戶輸入的資料。
使用 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 解釋了他的錯誤排除原則。 他強烈建議將錯誤寫在紙上,以避免數字化分心並保持專注。
在 24:49,Tim 引入了一個稱為 DisplayMatchupInfo 的新方法。 他解釋說,只有當選擇比賽時,像標籤、文字方塊和分數按鈕這樣的 UI 元素才應該是可見的。
到 28:28,所有相關控制項根據是否有有效選擇自動切換可見性。
在打分後刷新列表
在 29:57,Tim 解釋說,單擊分數後,應立即刷新比賽列表。 他僅僅在分數按鈕的邏輯末尾再次調用 LoadMatchups()。
他演示了在進行比賽後,如果選中"僅未比賽",比賽就會從列表中消失。
將比賽資料保存到資料庫
在 31:16,Tim 轉向了保存資料。 他在資料訪問介面中引入了一個名為 UpdateMatchup 的新方法。
在 33:14,Tim 解釋為什麼此方法返回 void。 他強調物件是通過引用傳遞的,因此更新它們會更新原始資料。
接著他創建了儲存過程:
-
用於更新比賽勝者的一個
- 用於更新比賽條目和分數的一個
Tim 強烈警告在 38:08 時缺少 SQL 更新中的 WHERE 子句,解釋說一個錯誤就能覆蓋每一個記錄。
在 49:58,他從表單中呼叫 GlobalConfig.Connection.UpdateMatchup(m),正式將資料保存到永久存儲中。
更新和將比賽保存到文字檔案
在 52:32,Tim 切換到文字檔案連接器。 他解釋大部分代碼已存在並可以被適應使用。
保存到文字檔案後,重要的是需要注意在 C 中的所有檔案操作都需要包含
在 .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 表單資料。 文章提供了如何將表單資料保存至檔案的範例和示例工作流程。撰寫代碼後,您可以透過在 Visual Studio 中按下 F5 運行專案來測試功能。 採用他的方式,開發人員可以清楚地看到真正的應用程式如何安全地保存用戶輸入而不丟失數據或崩潰。
這一課提供了一個實用的範本,用於以正確的方式保存表單資料,就像 Tim 教導的一樣。
