C#保存表单数据到文件:深度剖析Tim Corey
C 保存表单数据到文件:跟蒂姆·科里深入探讨(第 23 课)
可靠地保存用户输入的数据是桌面应用程序最重要的职责之一。 您可以在 Windows 上的 Visual Studio 中创建 Windows 窗体应用程序以实现文件保存功能。 在 "C# App Start to Finish" 系列的第 23 课中,蒂姆·科里详细演示了 WinForms 应用如何将表单上输入的数据,验证它,更新内存模型,最后保存到数据库或文本文件。
在本文中,我们将严格地通过蒂姆的视频逐步解释,更深入地研究如何将 C# 表单数据保存到文件。我们将讲述如何在 Visual Studio 中启动新项目,设计包含文本框等控件的 Windows 窗体,并使用 SaveFileDialog 等组件使用户能够使用过滤器浏览并选择路径和文件类型(如 csv、jpeg)。 目标是理解蒂姆在本课程中如何以及为何将事情连接在一起,以便读者可以清楚地跟随。
审查锦标赛查看器和今日目标
在 0:01,蒂姆欢迎观众来到第 23 课,并解释今天的重点是完成锦标赛查看器表单。 他提醒我们,大多数 UI 已经连接好:
回合下拉菜单
比赛列表框
队名标签
- 比分文本框
您可以设置属性,如比分文本框的多行属性,以允许用户在需要时填写更多数据。
蒂姆解释今天他将连接两个剩下的部分:
"仅未玩"复选框
- 计分按钮,包括将结果保存到存储中
添加计分按钮后,您可以右键单击表单,并在 Visual Studio 中选择"查看代码"以连接事件处理程序。
他明确表示,一旦计分按钮正常工作,应用程序将数据保存到数据库或文本文件,这就是我们主要的主题所在。
通过"仅未玩"复选框过滤比赛
在 1:02,蒂姆打开复选框的属性窗口,并双击 CheckedChanged 事件。 他解释道,每当复选框状态改变时,比赛列表就应该重新加载。
Tim指出逻辑已经存在于一个名为LoadMatchups的方法中,所以他不需要重新设计,只需在复选框事件中再次调用该方法即可。
在大约1:57,Tim修改了LoadMatchups以包含条件逻辑。 他详细讲述了如何添加一个if语句来检查比赛的赢家是否为空。 如果是,则说明比赛尚未进行。
然后在3:10,Tim引入了OR条件以使复选框工作。 他用简单的术语解释了逻辑:
如果比赛没有赢家,则显示
- 或者,如果未选中复选框,显示所有内容
Tim小心翼翼地逐字解释了真值表,说明原因:
选中+完成=隐藏
- 未选中=始终可见
他甚至建议在条件变得复杂时,将这些逻辑画在纸上。
连接得分按钮和读取表单值
在5:45,Tim双击了Score按钮事件。 他解释点击这个按钮应该:
从表单中读取值(输入通常被视为字符串,经过处理后,输出将保存到文件中)
更新底层的比赛对象(该逻辑封装在一个类中)
- 决定赢家
在6:26,Tim从列表框中检索所选比赛,并解释该对象决定了哪些团队属于"Team One"和"Team Two"。
然后他展示了如何循环遍历比赛条目,并解释说现在的目标是获取文本值并将其保存到分数属性中,而不是设置文本字段。 以下代码演示了如何将数据写入文件。
在7:45,Tim将文本输入转换为double,并立即暂停以警告无效的用户输入。 他强调用户输入的数据必须始终进行验证。
使用TryParse验证输入
在8:39,Tim通过使用double.TryParse将得分解析重构为更安全的方法。 他解释了这可以防止应用程序崩溃,例如用户输入了文本而不是数字。
在10:20,Tim将解析逻辑包在if语句中:
如果解析成功,继续
- 如果失败,显示消息框并返回
他解释使用return会立即退出方法,防止不良数据继续传播到系统中。
这种模式对Team One和Team Two的分数都重复使用。
确定赢家并处理边缘情况
在14:25,Tim比较了两个分数以确定赢家。 如果Team One的分数更高,则将该队指定为比赛赢家。
在16:41,Tim讨论了得分规则,并解释他的应用程序假设得分高者获胜。 他指出,如果有人希望支持低分获胜(如高尔夫),则可以反转或配置这种逻辑。
在17:42,Tim明确地处理了平局情况。 他没有默默地选择赢家,而是显示消息称不支持平局,并有意避免保存赢家。
修复错误和管理UI可见性
在20:14,Tim遇到了一个错误,当没有未比赛的比赛时。 他解释了为什么在空列表上调用.First()会导致异常,并通过首先检查列表数量来修复它。
从23:05开始,Tim解释了他的调试理念。 他强烈建议把错误记录在纸上,以避免数字干扰并保持专注。
在24:49,Tim介绍了一个新方法叫DisplayMatchupInfo。 他解释了像标签、文本框和Score按钮这样的UI元素应该只在选择了比赛时才可见。
到28:28,所有相关控件都会根据是否有有效选择自动切换可见性。
计分后的列表刷新
在29:57,Tim解释计分后比赛列表应立即刷新。 他只需在Score按钮逻辑的末尾再次调用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表单数据如何从UI流转到验证、模型更新再到文件存储。 这篇文章提供了保存表单数据到文件的示例和样本工作流。在编写完代码后,您可以按下Visual Studio中的F5来测试功能。 通过遵循他的思路,开发者可以清楚看到真实应用如何安全地保存用户输入而不丢失数据或崩溃。
这一课程是按Tim教授的方式,通过正确的方法保存表单数据的实践蓝图。

