从零开始系列,用C#做软件产品:私人日记(六)完善分类菜单

上一节类库和分类数据类我们都做好了,这节我们从教大家如何使用它们开始。

一、在Diary.Win项目中添加依赖项

参考下面的动图:

从零开始系列,用C#做软件产品:私人日记(六)完善分类菜单

确认看到依赖性中有Diary.Model了,就说明已经添加好了,在Diary.Win项目中就可以使用它了。

二、在Diary.Win项目中使用类库

在第四节中,我们需要创建树节点,但因为没有数据所以无法继续。现在这个类库已经被我们添加到了项目中,要怎么使用呢?

首先到Diary.Win项目中,找到Form1.cs文件,然后鼠标右键,点查看代码,会切换到Form1.cs的代码视图。

从零开始系列,用C#做软件产品:私人日记(六)完善分类菜单

然后在tsmiCategoryCreate_Click函数中(就是“新建”菜单的点击事件)添加红框内的代码:

从零开始系列,用C#做软件产品:私人日记(六)完善分类菜单

做下代码的解读:

第一行绿色的是注释掉消息弹出框,这个上节有讲过,以后不再重复了;

Model.Category model = new Model.Category();

这句话翻译成人类语言,就是:创建出一个数据类型为Model.Category的实体,,然后把它复制给一个类型是Model.Category、名称是model的变量。

名称model可以指定符合c#的命名规范的任意名称。

Model.Category Model.等价于Diary.Model,代表命名空间;有同学会产生疑问,Form1.cs的代码前面也没声明using Diary,为什么这里使用类的时候不用加Diary呢?那是因为我踩过这里的坑,我知道如果他们都属于同一个命名空间的话,就可以省略:)如果你的项目名是XXX.Win,类库名是Diary.Model,那就需要在类库前面加完整的命名空间路径了。Category就是上一节中我们定义在Diary.Model类库的Category类。

不知不觉间,我们就已经成功地使用了类库。

再往下就是对model中的各个变量进行赋值,由于现在还没做管理界面,这里的数值我们暂时假设一下,仅仅是方便测试。这种方式在团队开发中非常常见:你要的功能别人还没做好,但你又不可能等着他都做完你再做。所以你完全可以先模拟数据,甚至模拟接口,暂时假设他已经做好了,只是数据比较单一,然后你做你的,等他做好的时候再对接就好了。

上面的代码其实还可以换一种写法,实现的功能都一样:

从零开始系列,用C#做软件产品:私人日记(六)完善分类菜单

这种是在声明是就把类变量都初始化好,好处是一旦要修改model的变量名,只需要第一行的model就好了,不像上面的写法,有多少行赋值语句就要改多少行,同学们可自行体会。

上面是我们通过手写代码创建出来的第一个实例,我们把:通过一个类创造出了一个对象的过程称之为实例化,这个对象就被称之为一个实例

现在我们已经通过调用类库创建出了一个分类数据的实例,那要怎么把它显示在树节点上呢?

三、创建树节点

我们继续堆代码,红色框内为我们新增代码:

从零开始系列,用C#做软件产品:私人日记(六)完善分类菜单

代码含义:创建一个名为tn、类型是TreeNode的实例,然后把这个实例添加到树控件中。以后像这种我认为比较简单的大家能看懂就直接说含义了,不再每行解释了。如果没看过之前的教程建议从头看起。如果还有不懂的可以在评论区留言,我会再进行重点讲解。

TreeNode类描述的就是树控件上的一个节点,Text是节点显示的文本,Tag这个变量需要重点说下。

在winform框架中,.net为很多控件都预留了Tag变量,这是一个object类型的变量。object字面翻译为对象,它是可以被转换成任何类型的一种类型。这就给了我们编程很大的灵活性,我可以把任何数据存放在这个Tag中。比如上段代码中,我把每次新建的分类值都分别赋值给了每个新建节点的Tag,等我后面在选中某个节点时,我就可以通过这个节点的Tag值立刻获取对应的分类数据,而不仅仅只是得到一个节点的名称。

上述代码执行效果如下:

从零开始系列,用C#做软件产品:私人日记(六)完善分类菜单

经过一番努力,我们可以实现通过新建菜单并创建节点了。但是我们注意到,当我选中一个节点的时候,我期望的是把新增的节点作为我选中节点的子节点,而不是出现在树控件的根目录。这就需要对程序执行逻辑做进一步的处理了。很简单:如果发现树控件有选中的节点,那就把新创建的节点加到选中的节点下;如果没有选中的节点,那就执行刚刚的代码。最终代码如下:

从零开始系列,用C#做软件产品:私人日记(六)完善分类菜单

我想如果大家是按顺序学习到这里的,上面红框的代码应该能理解个大概了。类似这种比较简单的代码,我最后再大概说一下,以后就不讲了:

if...else跟其他语言一样,做条件判断;

tvCategory如果有选中的节点,那么它的SelectedNode就不为空,在C#中,null代表空,为空就是== null,不为空就是 != null 。这是语法,记住就行。

最下面的语句tvCategory.SelectedNode.Expand();是添加完以后直接展开这个节点的意思,如果不加这句就不展开,只会在选中节点下面多个小加号,感兴趣的同学可以自行注释尝试。执行效果如下:

从零开始系列,用C#做软件产品:私人日记(六)完善分类菜单

这样,通过菜单新建分类节点的功能就完成了。

现在我们再来回顾下第四节的任务,继续那些没有完成的任务:

210826-5、210826-6都完成了,210826-4和210826-7中未完成的功能我们通过高亮颜色来标识,继续进行。


四、显示分类图标

这个功能其实是很简单,简单到都不需要编码。之前没做是因为没有节点数据,做了也看不到效果。

工具箱中,找到ImageList添加都Form1中,命名为imgsCategory。

按下面过程添加图标及程序演示:

从零开始系列,用C#做软件产品:私人日记(六)完善分类菜单

ImageList的图片导入目录及图标文件需要提前准备好。

程序的实际显示的图标是需要根据类型来匹配的,待分类管理界面完成后再进行联调。

这样210826-4任务也完成了。


五、点击分类项查询内容

由于目前内容数据和界面尚未进行设计,所以此处只能预留接口。

响应树节点的点击事件,然后增加信息提示即可。但是那么多的事件,到底该选择哪个事件来做呢?我把我选择的过程给大家说明下:

我看了事件列表中有:AfterSelect、Click、MouseClick、NodeMouseClick,这几个都相近,都能响应鼠标点击事件。

AfterSelect 类似于选择节点改变事件,测试发现只有选择节点改变才会触发,这个没有达到我的预期,我希望的是无论是否改变,只要点击就触发,所以这个排除了;

Click是只要点击树控件就会触发,即便没点节点也会触发,并且不限定于鼠标点击;

MouseClick 与Click事件触发机制类似,不同就是只限鼠标点击。这两个函数在事件上满足我的要求,只要点节点就会触发,不管有没有改变。但它们的传入参数没有正在选择的节点值,我只能通过SelectedNode来获取,但这个时候SelectedNode指示的还是上一次的选中节点,所以也排除了。

最后发现了NodeMouseClick,在各方面都满足了要求。可能还有其他的方式,不过已经满足需要就不再研究了。

具体操作如下:

从零开始系列,用C#做软件产品:私人日记(六)完善分类菜单

tvCategory_NodeMouseClick 代码如下:

从零开始系列,用C#做软件产品:私人日记(六)完善分类菜单

代码逻辑:

当点击树控件的节点时,判断是否为鼠标左键,如果不是则什么都不做。如果是,则将当前节点Tag变量绑定的分类数据提取出来,如果分类数据不为空,那么将分类数据的编号弹框提示。

执行效果:

从零开始系列,用C#做软件产品:私人日记(六)完善分类菜单

至此,树控件右键相关的基本功能已完成。下一节开始我们进行分类管理界面的新建/修改窗体的设计与开发。

提前跟大家说明下,孩子开学+搬到新家,近期事情比较多,下次更新时间可能会稍长。

如教程有帮助请大家帮忙转发、评论、扩散,能不能开专栏还需要你们的支持!

----------------------------------------------------

本教程已作为开源项目加入到Git,代码内容会随教程实时更新,大家有兴趣的话可以关注我,以获得最及时的更新。私信:私人日记 可以来获取Git的链接,语法参考 可以获取一个C#语法的网站。

大家阅读过程中有哪些看不懂或未尽兴的地方,可以在评论区留言,我会先记下来在后续的教程中找机会再说。

展开阅读全文

页面更新:2024-04-15

标签:菜单   赋值   节点   软件产品   控件   变量   图标   实例   界面   私人   类型   事件   代码   功能   项目   教程   日记   系列   数据   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top