第八节的内容早已写好发布,结果一直在审核中,不知道触动了哪条神经。
评论中看到有一些网友都在问为什么不用WPF来开发,在这里我统一说明下:
1)WPF界面设计相对复杂。由于它是矢量的,需要额外有很多容器做对齐方面的调整,并且很多调整是要直接写xaml才能获得良好的效果。Winform是所见即所得,简单拖放就能看到效果、满足功能。我第一阶段的教学目的主要是想让同学们系统地了解一个软件产品开发的整个过程,从基础做起,为后续开发打基础,不想花太多的精力放在界面设计上。等到同学们有了编程的基础,再在已有的数据和业务的基础上做界面的改良,也会容易很多。
2)WPF应用场景较Winform并无明显优势。即便是用WPF来设计,目前也只能Windows系统下运行,无法实现跨平台。这与普通的Winform差别就仅限于界面表现,没有本质上的差别。Winform通过锚定也可以一定程度地实现缩放。单就开发私人日记这个项目来说,总体差别不大,但是Winform的开发效率却很高。当然如果你的项目需要大量的图表展现,那么应该优先考虑用WPF开发,如果只是一般的工具软件,Winform足够了,WPF个人感觉没必要。
总结来说,第一阶段综合考虑教学和开发效率,采用Winform来开发性价比最高。另外,我想给大家透露下,对软件产品而言:功能是雪中送炭,界面只是锦上添花。大家不要小看Winform应用,我现在软件产品的大部分收入都是来自Winform开发的程序。现在PC端还是Windows的天下,用户看中的是你的软件能不能解决他的问题,出现问题你能不能快速解决,界面再花哨功能和维护跟不上也是白搭。
当然如果大家的呼声很高,可以在后续再增加一个WPF的项目来教学。好了,接下来我们开始今天的内容。
在开始任务前,又发现了一个小Bug:分类管理中,右键菜单新建功能,一旦关闭对话框,树控件会自动将第一个节点设置为选中状态,导致无法创建根目录的情况再次发生。查看了一下树控件的属性,并没有禁止自动选中节点的属性可以设置。那我们还是改下代码吧:
之前的代码是在弹出分类管理对话框之后再判断是否有选中节点,现在在弹出对话框之前把状态暂存,这样就不会因为关闭后自动选中节点而无法创建根目录了。再次运行查看,问题得到解决。
上一节我们实现了分类管理界面的操作联动,这节开始实现数据联动。
上一节弹出的分类管理界面是这样的:
几个输入框需要用户手动输入数据是没问题的,所属分类与类型,这个是下拉框,既然是下拉框肯定要事先有数据可供用户选择的,那么如何来向下拉框中录入数据呢?本节开始介绍:
一、初始化窗体要想在界面显示前向下拉框控件中添加数据,需要先找到初始化窗体的事件,对应Form中的Load事件。
双击自动创建事件代码,CategoryManagerForm_Load就是CategoryManagerForm的界面初始化函数,我们对控件的初始化操作都在这个函数中完成。
二、初始化分类类型我们需要实现两个ComboBox的初始化,一个是所属分类cbxParent,一个是分类类型cbxType。
分类类型cbxType相对简单,我们先来实现它,代码如下:
看到上述代码,我估计又会有同学懵了。这是一堆什么玩意,以前从来没见过啊。对初学者来说这种代码实在不能算友好,不过只要明白代码含义了,理解起来也不那么困难。
先看第一段
List<Tuple<string, string>> listType = new List<Tuple<string, string>>()
这里面我使用了两种模板类,一个是List,一个是Tuple。
先来说List,英文直译是列表,注意跟数据结构学的链表并不是一个概念。它是一个封装好的类,专门用来存取顺序数据。要比链表功能强大得多。并且它是一个模板类。
什么是模板类呢?我们之前有讲到过类,类是用来抽象现实数据的,而模板类则是用来创造类的,灵活运用可以大大减少代码量。比如我现在需要两个列表:一个专门存储int型数据列表,一个专门存储string型数据列表。如果没有模板类,我需要创建两个类,然后对他们进行分别声明和实现变量、方法等,可能90%的代码都是重复的。现在有了List模板类,我只需要在代码中声明List<int>就创造了int型列表的类;声明List<string>就创造了string型列表的类,非常简单。把模板类类化就是在<>中指定要类化的数据类型。
所以上面的代码就是声明了一个Tuple<string, string>类型的列表,取名为listType。
明白了模板类,再来看下看下这个Tuple<string, string>是什么东西?
Tuple英文直译是元组的意思,较难理解,不过它后面也带<>的,所以这也是一个模板类。可以理解为:可以定义成各种数据类型组合的一个模板类。比如以分类数据Model.Category为例,我们完全可以把它用Tuple来定义:Tuple<int, string, int, bool, string, int, string, string>,有同学就表示疑问了:既然有这个Tuple了,那还要自己定义干嘛,都用Tuple来定义不就好了吗?
这个要看应用场景:
1)Tuple只能定义数据,没办法像类一个样定义方法;
2)Tuple里面的数据名称都是Item1、Item2这种类型的,不易阅读;
3)Tuple能存放的数据类型最多是8个;
所以,简单临时用下的类,我们可以使用Tuple来快速声明,其他位置还需要复用的或是需要有方法的类,还是需要用显式的来声明。
上面代码中Tuple<string, string>就是声明一个具有两个string类型的类,一个值用来保存分类类型的编码,一个值用来保存分类类型的名称。
下面代码就是对listType 进行初始化,目前为了让程序能跑起来看到效果。
{
new Tuple<string, string>("正常", "Normal"),
new Tuple<string, string>("代码", "Code"),
};
以上对Tuple的使用,主要目的是为了教学和演示方便,后续如果功能上有需要,可能还会变更代码。
程序执行到这一步结束,分类类型的数据就有了,再继续看代码:
cbxType.DataSource = listType;
cbxType.DisplayMember = "Item1";
cbxType.ValueMember = "Item2";
cbxType.SelectedValue = "Normal";
这4句就是用来绑定数据的:
cbxType.就是指分类类型控件,这种以后就不解释了。
DataSource是数据源的意思,用来指定comboBox的数据来源,那肯定就是上面的listType了;
DisplayMember是下拉框每项显示文字用数据源中的数据类型的哪个属性,listType的数据类型是Tuple<string, string>,那就是Item1了;
ValueMember 是下拉框每项的值用数据源中的数据类型的哪个属性来表示,那就是Item2了;
SelectedValue 是用哪条数据来作为默认的值;
代码理解之后,我们来跑下程序。
下拉框出现了我们预期的文字,但是我们发现还可以输入值,这个不是我们想要的,需要在界面设计中对ComboBox的风格设置一下:
DropDownStyle改成DropDownList就可以了,看到界面上已经变灰就可以了。顺道把所属分类也一并改掉,结果就不演示了。
三、初始化所属分类接下来我们来实现所属分类的ComboBox。为什么我说所属分类的处理要比分类类型的复杂呢?分类类型的就只有一个两条顺序的数据,而分类数据则是一个具有树状结构的数据,这种层次关系如何在一个下拉框中表现出来呢?
做法有也有很多种,自绘控件、使用第三方类库等,考虑到初学者的教学,我就用最原始的方法:既然是树型结构,每项数据相对于根节点就有深度,每一层深度加多几个空格来表示,然后按父子关系排好顺序,这个层次结构也就清晰了。
由于目前数据库还没有实现,真实数据暂时没有,所以我们需要预先模拟一下数据,并按照分类类型绑定数据的方法编码。至于排序,我把排序方法定义在了Model.Category中,只要我执行一下这个函数即可。代码如下:
红框中就是初始化所属分类下拉框的代码:
listCategory是模拟的数据;
Model.Category.Sort(listCategory)是将listCategory排序;
似乎没有什么问题,然而执行时却遇到一个错误:
到网上查资料,知道问题所在了,ValueMember和DisplayMember必须指定为一个属性值,而我声明的Id只是一个类变量,不是属性。我也没搞清楚微软为什么要做这样的限定,没什么大影响就懒得去查资料了。解决很简单,把Id变成属性就好了:
把
写成
这样再运行下来,我们就看到了:
现在,只要把排序:
cbxParent.DataSource = Model.Category.Sort(listCategory);
Model.Category.Sort函数做好,所属分类下拉框的技术难点我们就攻克了。
如何来实现排序,下节我们继续。
----------------------------------------------------
本教程尽量保证1-2天一更,项目源码已作为开源项目加入到Git,代码内容会随教程实时更新,大家有兴趣的话可以关注我,以获得最及时的更新。私信:私人日记 可以来获取Git的链接。
C#基本语法大家在头条搜索“菜鸟c#”,个人感觉这个网站还可以。
大家阅读过程中有哪些看不懂或未尽兴的地方,可以在评论区留言,我会先记下来在后续的教程中找机会再说。
教程有帮助的话请大家帮忙关注、转发、扩散,能不能开专栏还需要你们的支持!
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved