C#应用程序开发:深度剖析Tim Corey的“创建团队表单第2部分”(第13课)
在本文中,我们将通过跟随Tim Corey的"C#应用程序从头到尾"系列的第13课,来更深入地了解C#应用程序开发。 Tim带领我们完成构建一个功能性的Windows表单应用程序的过程,重点是如何连接UI控件,如组合框、列表框和按钮到数据。 本课演示了关键概念,如数据绑定、列表管理、使用Dapper的数据库连接,以及基本验证和调试——所有这些都是构建真实世界C#应用程序的必要技能。
继续创建团队表单
Tim首先提醒我们第13课是前一视频的延续,其中"添加新成员"部分已接上线。在这一课中,Tim解释说,主要目标是在下拉框(组合框)和列表框之间接上线,然后连接新创建的人物对象,以便它出现在列表中。Tim明确设定了计划:本课将重点关注UI接线、数据移动和列表同步——构建C#桌面应用程序的基本方面。
了解下拉和列表框数据
Tim解释说,在组合框和列表框的背后,将有一个Person对象的列表。 这是Windows表单中数据绑定的经典示例,其中UI元素绑定到数据模型的集合。
他在类级别创建了两个私有列表:
availableTeamMembers——那些可以被添加到团队中的人员
- selectedTeamMembers——已经被添加到团队中的人员
Tim澄清了预期的行为:当一个人在下拉框中被选择并添加时,他们应该从availableTeamMembers移到selectedTeamMembers。 这是桌面应用程序开发中的标准CRUD操作模式,其中UI反映基础数据。
为什么Tim不按比赛限制团队成员
Tim解决了一个常见的设计问题:"为什么不根据比赛限制团队成员?"他解释说,Create Team表单没有直接绑定到比赛,多场比赛可能同时进行。
Tim举了一个实际例子:如果篮球比赛和乒乓比赛都在进行,一个人可以参加这两项。 限制下拉框将需要复杂的逻辑,并可能引入错误。 相反,Tim选择了一个更简单的方法:
- 只有在被添加到团队后删除一个人出现在下拉框中。
这种方法展示了一个实际的软件设计决策:除非必要,否则避免过度复杂化。
创建WireUpLists方法
Tim创建了一个名为WireUpLists的方法,以将列表连接到UI控件。 此方法将availableTeamMembers列表绑定到组合框,将selectedTeamMembers列表绑定到列表框。
Tim指出了一个重要的改进:在现代Windows表单中,您可以直接将列表绑定到控件,而无需使用单独的BindingSource。 这是为开发Windows表单数据绑定的开发人员提供的一个有用的提示。
添加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将样本数据注释掉,准备加载真实数据。 他向IDataConnection接口添加了一个方法GetPerson_All。 Tim解释他的命名规则:
Create = 插入
- Get = 选择
这是C#应用程序中数据访问层的标准命名策略。
使用Dapper实现SQL数据检索
Tim使用Dapper和存储过程实现了GetPerson_All的SQL版本:
connection.Query<PersonModel>("spPeople_GetAll").ToList();Tim有意使用了输出变量而不是直接返回,以方便调试。 这展示了调试实践如何影响代码设计。
使用常量清理重复代码
Tim注意到重复的连接字符串名称,并将它们更改为常量。 他解释说,重复是坏习惯,以后可能会导致错误。
这是一个重要的软件工程原则:DRY(不要重复自己)。
将真实数据加载到下拉菜单
Tim创建了LoadListData(),并使用GetPerson_All()填充availableTeamMembers。 selectedTeamMembers列表保持为空,这是正确的,因为新的团队从空开始。
这展示了如何将UI连接到真实数据源,无论是数据库还是文本文件。
连接添加成员按钮
Tim创建了添加成员按钮的事件处理程序。 逻辑是:
从下拉菜单获取选定人员
从可用列表中移除他们
将他们添加到选定列表
- 刷新UI
Tim解释说,选定的项目必须转换为PersonModel,因为组合框将对象存储为object。 这突出了类型转换和C#中的对象处理的重要性。
调试刷新问题
Tim发现移动项目后UI没有刷新。 调试后,他找到了解决方案:
将DataSource设置为null
- 然后重新分配列表
这迫使组合框和列表框刷新。 Tim强调,调试技能是必需的,通常需要了解数据绑定的行为。
连接删除选定按钮
Tim将按钮重命名为Remove Selected,并创建了事件处理程序。 这反转了添加操作:
从selectedTeamMembers中删除
添加回到availableTeamMembers
- 刷新UI
Tim发现了一个错误:如果没有选择项目,则会添加一个空值。 他添加了验证:
if (p != null)
{
// 继续
}这展示了基本的验证和错误预防。
测试的重要性
Tim强调要像尝试破坏它的用户那样测试您的应用程序。 他建议找一些故意尝试破坏应用程序的测试者,因为真实用户会执行意外操作。
这是构建可靠软件的关键教训。
连接"Create Member"按钮
Tim修改"Create Member"按钮来保存新用户到数据存储,并立即将他们添加到选定列表。这展示了如何在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操作以及C#中的UI驱动编程的开发人员尤其有价值。
如果您想继续学习,Tim的下一课将完成创建团队功能,并将所有内容整合成一个工作应用程序。

