范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

从零开始系列,用C做软件产品私人日记(十)Combox树形显示

  上节我们实现了Combox的显示,为了更好地用户体验,我们需要让所属分类Combox实现类似树形显示,首先需要实现排序算法。 一、排序算法
  这块是场硬仗,说实话我个人也不大愿意做这种编码,可能是因为我数学基础和数据结构都很差,没什么理论基础,只能硬来,对做超出自己能力范围内的事情就比较费脑子了。
  这段排序算法算上注释我写了将近150行。之前是不大想详细讲了,直接放在前一节,但是篇幅还是太长了,索性就单独再开一节,详细讲下过程。
  先明确下大概需求:
  一组列表数据,通过Id和ParentId建立起了层次关系,现在需要将他们按层次关系排好序,同一节点需要按ShowOrder来排序。
  我先说下大体思路: 1)把根级节点提取出来,按ShowOrder排序;
  2)把一级节点提出来,按ShowOrder排序;遍历每个一级节点,找到它们的父节点,然后插入到下方;
  3)切换到二级节点,重复2)步骤,直到所有级别的节点全部执行完毕,就完成排序了;
  所以代码的执行步骤大体如下: 1)计算所有节点的深度,按深度排序,深度相同的按ShowOrder排序;
  2)得到最大深度,以深度建立循环体,依次执行,直到最大深度执行完毕;
  3)执行每个节点,把它们分别插入到相应的位置。
  这个步骤还有个细节需要注意。在插入时需要建立一个缓存机制,如果没有缓存机制,每个节点都插入同级节点,已经按ShowOrder排好的顺序可能就乱了。建立缓存机制后,相同ParentId的先统一加到缓存,当ParentId切换以后,再把缓存里的所有节点一次性插入到相应的位置,这样可以保证这些节点仍然可以按ShowOrder的顺序排好。
  这里面我们需要用到一个深度的值,它是跟随每个Category实例的,后续在做层次显示的时候也需要这个值,所以我在Model.Category中又新加了一个Depth的类变量,它不需要参与数据库存储。
  排序的代码:
  在Model.Category中我声明了Sort函数,定义成了static,意思是不需要实例化Model.Category就可以访问该函数。
  代码中调用的函数我在下面会单独解释,这段代码有个新的知识点需要再来介绍下:
  categories.Sort((x, y) => {
  if  (x.Depth > y.Depth)  return  1;
  if  (x.Depth < y.Depth)  return  -1;
  return  x.ShowOrder - y.ShowOrder;
  } );
  这段代码C#初学者看到了应该会有点懵, categories.Sort还好理解,就是调用List中的Sort函数执行排序嘛,后面的那一堆还带个=>的是什么鬼?
  这种在c#中被称为Lamda表达式,如果你对javascript的匿名函数有了解的话,这个就很好理解了。这个其实就是C#中的匿名函数:
  (x, y),x和y就是匿名函数的两个参数名
  =>{...} 这个就是声明函数体,...中就是你要编写的函数体内的代码。
  其实上面的写法等价于:
  categories.Sort(comp_func);
  ...
  static   int  comp_func(Category x, Category y)
  {
  if  (x.Depth > y.Depth)  return  1;
  if  (x.Depth < y.Depth)  return  -1;
  return  x.ShowOrder - y.ShowOrder;
  }
  Lamda表达式的好处是不需要额外声明一个函数名称,临时用下而已。不过说实话,我个人不大喜欢这种写法,语言的可读性较差,一切为了教学:)同学们可以自行选择。
  代码的执行逻辑教程上面有写,代码中我也写了备注,大家认真看下应该就能明白了。
  再分别说下其他的函数:
  count_depth函数,计算每个节点的深度,并保存在类变量中。
  get_index_by_parentId函数, 获取当前节点在指定节点列表中的序号。
  detach_category_current_depth函数, 提取指定深度的所有类别 。
  insert_into_categories函数, 将提取出来的分类列表按顺序插入到目标列表
  上述代码看起来可能比较乱,没有任何排序算法做基础,如有雷同纯属巧合。我对算法这块实在不擅长,能达到目的我就满足了。
  排序完成后,显示效果是这样的:
  如果对自己要求不高,这样也可以凑合用,但是还没有层次关系,与我们的期望有差距。
  我们期望的是能够带一点层次关系,比如二级较一级要向右空几个空格,三级较二级再空几个,要想实现这样的效果,就需要对ComboBox进行重绘了。男人就是要对自己狠一点。
  操作方法如下:
  cbxParent控件:属性窗口DrawMode设置成OwnerDrawFixed
  事件窗口响应DrawItem事件
  运行后,你会发现,下拉框什么都不见了,因为已经开启了自绘控件模式,每一项都需要程序来绘制。
  那么如何进行自绘呢?
  先上代码:
  逐行解释:
  绘制背景:
  e.DrawBackground();
  绘制选中焦点矩形:
  e.DrawFocusRectangle();
  创建画刷,用来输出文字:
  Brush brush = new SolidBrush(e.ForeColor);
  根据深度增加空格数量:string text = "";
  for (int i = 1; i <= category.Depth; i++)
  {
  text += " ";
  }
  text += category.Name;
  如果有子节点,则字体用粗体显示: Font font = null;
  if  (category.HasChild)
  {
  font =  new  Font(e.Font.FontFamily, e.Font.Size, FontStyle.Bold);
  }
  else
  {
  font =  new  Font(e.Font.FontFamily, e.Font.Size);
  }
  指定位置、画刷、字体等输出文字:
  e.Graphics.DrawString(text, font, brush, e.Bounds.X, e.Bounds.Y + 3);
  销毁画刷和字体: brush.Dispose();
  font.Dispose();
  代码基本上一看就明白,最后销毁这里需要说明下。
  我们使用C#编码,如果声明的是内存资源,那么.net会自动在适合的时候进行内存回收,我们不需要像C和C++一样去主动管理内存回收,这也是C#编码效率比C/C++高的重要原因之一,以前因为C/C++内存泄露问题,经常要调好几天的Bug才能把泄漏点找出来。
  但这不意味着我们用c#了就随便声明不用再去考虑回收了,除了内存资源以外,还有很多系统资源都是有限的,比较常见的有Gdi资源、位图资源、网络资源、文件资源,这些系统资源都是有限的,使用完成后需要手动回收,如果不回收,就会造成系统资源耗尽而导致程序崩溃。
  这里说的Gdi,英文全称 Graphics Device Interface,直译就是图形设备接口,专门用于 windows程序图形图像显示的,我们看到的这些标准windows控件,都是通过Windows系统底层的GDI函数绘制出来的。
  在C#中,我们用到的画笔Pen、画刷Brush、字体Font等等这些都属于Gdi对象。 我们通过系统自带的任务管理器就可以获知程序用到了多少个Gdi对象。
  这些都需要在使用完毕之后及时地回收。
  上面的代码其实还可以优化的。Gdi对象不需要每次都创建,在CategoryManagedForm类中声明Brush和Font的变量,如果为空就创建,不为空就继续使用,这样就只是在第一次使用时创建。窗体关闭时再回收,然后置空。很多效率优化都是基于此,频繁处理的代码越少越好,用空间换时间。只不过目前这点调用量还不需要如此,而且用户操作也不可能像程序执行一样频繁,优化就先不做了。
  最终运行的效果:
  分类管理界面的技术难点我们现在已经攻克了,再接下来就是实现右键分类菜单与分类管理界面的数据联动,我们下节继续。
  ----------------------------------------------------
  本教程尽量保证1-2天一更,项目源码已作为开源项目加入到Git,代码内容会随教程实时更新,大家有兴趣的话可以关注我,以获得最及时的更新。私信:私人日记 可以来获取Git的链接。
  C#基本语法大家在头条搜索"菜鸟c#",个人感觉这个网站还可以。
  大家阅读过程中有哪些看不懂或未尽兴的地方,可以在评论区留言,我会先记下来在后续的教程中找机会再说。
  教程有帮助的话请大家帮忙关注、转发、扩散,能不能开专栏还需要你们的支持!

w7旗舰版系统wmi服务如何禁用的方法可能有不少深度技术的用户对wim服务不是很了解的,下面我们先来介绍一下WMI是什么服务?它能做什么呢?(WMI),中文名字叫Windows管理规范。从Windows2000开始,Wwin10系统中edge浏览器禁止flash的方法有不少深度技术的用户都安装win10专业版,而且都使用了系统中自带的MicrosoftEdge浏览器,说到MicrosoftEdge是由Microsoft开发的网页浏览器。其正式版windows7旗舰版蓝牙耳机怎么连接电脑的方法我们有很多深度技术用户都是喜欢玩游戏的,一般大家常用的耳机都是有线的,而一位小伙伴为了摆脱线材的束缚,选用了蓝牙耳机。但是却不知道在windows7旗舰版蓝牙耳机怎么连接电脑的问题windows10iso电脑连不上网的解决方法有很多深度技术用户都可能在使用windows10iso系统的时候,遇到过电脑连不上网的的问题吧。这不一位小伙伴他的电脑就出现win10应用程序都连不上网的问题,一般网络故障可以大致win7旗舰版怎么打开电脑摄像头的操作方法使用深度技术的电脑用户有不少是做直播的,做直播肯定要使用到电脑摄像头,但是有一位小伙伴使用win764旗舰版用到摄像头的时候,却不知道摄像头在哪里打开的问题,下面深度系统小编就来为windows10正式版如何添加字体的操作方法相信很多深度技术的用户都知道在Win10系统中都自带有字体的,但对于设计人员特别是做广告设计的小伙伴来说还是十分有限的,有时候设计海报会用到个性字体,这时候怎么办?如果想让Win1windows10专业版电脑声音设置的操作方法一些深度技术用户在使用Windows10专业版系统的时候,发现电脑声音不够大,想要调节一下。但是不知道win10专业版中电脑声音设置的方法,其实大家只要进入声音调节设置一下即可,下win7系统恢复出厂设置的操作方法有不少深度技术电脑系统用户在使用w7旗舰版系统的时候免不了会遇到卡顿或者黑屏的情况,那么会导致系统无法正常使用,面对这样的情况除了重装系统之外,其实win7系统可以尝试恢复出厂设置win10正式版建立安装虚拟网卡的操作方法说到虚拟网卡可能有不少深度技术系统的用户不是很了解吧。其他,虚拟网卡是一款专注于网络共享的软件,让电脑同时拥有多个IP地址,以便更加方便地管理上网网络。那我们在win10正式版电脑win10纯净版系统进程优化的操作方法相信很多深度技术之家的用户,都会遇到电脑使用时间久了,会出现大大小小的故障问题,特别是在win10纯净版系统电脑中运行进程过多就会出现卡顿黑屏等问题,那么我们要如何对win10系统windows7旗舰版cf怎么调烟雾头的操作方法说到CF穿越火线是一款非常经典的射击游戏,相信很多深度技术之家的小伙伴也很喜欢玩的,这不有深度系统用户在使用windows7旗舰版的时候,就问了,cf怎么调烟雾头的问题?玩cf的小
华为MatePad11HarmonyOS2和120Hz高刷屏,学习办公新选择?距离理想中平板该有的样子,又更近一步。过去很长一段时间,平板电脑留给大家的普遍印象是买前生产力,买后爱奇艺,似乎除了追剧娱乐,其它场景很难派上用场。万万没想到,一场疫情,却为平板电LCD屏幕重出江湖,搭载骁龙870的iQOONeo5活力版有一战之力近日,搭载LCD屏幕的iQOONeo5活力版受到了消费者的喜爱。LCD屏幕与主流手机选择的OLED屏幕各有优劣,有不少人更加看中LCD屏幕的柔和光线以及护眼效果,所以iQOONeo6月iOS设备好评榜iPhoneSE再进一名2021年上半年已经正式过去,在今天我们也迎来了上半年iOS设备好评榜的最后一期榜单,不过虽然时间点上比较有意义,但榜单内的产品还是那几款,并没有什么新品出现,相信经常看我们榜单的隔音效果好适合上网课的有线耳机分享,学生朋友会喜欢的有线耳机对于学生们来说,买东西大都是追求性价比比较高的,数码产品也不例外。其中,耳机就是大部分学生中常见的电子产品。受疫情影响,大多数学生也总是经历网课,那当然就少不了耳机的使用了。在家上滴滴出行被网信办通告严重违法违规,网友早该整顿了7月4日晚,国家网信办发布关于下架滴滴出行APP的通报,根据举报,经检测核实,滴滴出行App存在严重违法违规收集使用个人信息问题。国家互联网信息办公室依据中华人民共和国网络安全法相小米四款新机遭曝光MIX系列数字系列redmiCC系列都来了如今的手机市场竞争真的非常激烈,以前都是旗舰市场中的机型非常多,现如今已经演变成高端旗舰市场,比如小米数字系列OPPO一加魅族华为iPhone三星等厂商,都在高端市场。在这么多厂商为何我们的互联网平台公司争着去美国上市?中国和美国的上市机制存在着明显差异,即中国目前的IPO发审采用审批制,而美国则是注册制。在流程时间和信息披露要求上,美国资本市场提出的要求要少于中国资本市场,但中国资本市场对于企业蔚来ET7极氪001极狐阿尔法S,谁是国产纯电轿车的国货之光?按照当下的形势来看,弯道超车这一看似有些逆流的词汇已经开始在纯电领域轮廓初现,BBA等舶来豪华品牌一直以来对高溢价比的统治力开始下滑,促成交易最终定论终于开始与产品实力硬绑定。而接比亚迪广汽埃安奇瑞新能源6月销量公布,都创了新高近日,蔚来汽车小鹏汽车哪吒汽车等多家造车新势力先后公布了6月能源汽车销售数据,比亚迪广汽埃安奇瑞新能源等也以紧随其后官宣6月销量,都取得了不错的成绩,具体信息如下一比亚迪6月新能源不支持5G的华为P50,你会支持吗?可以不买,但请不要嘲讽从目前得到的信息来看,华为P50或将采取双芯片战略,搭载高通骁龙888处理器和海思麒麟9000系列。本次华为P50搭载的高通骁龙888处理器是高通公司为华为定制的阉割了5G功能的4华为MatePad11体验拥有高刷屏幕的鸿蒙平板,你想要的都给你了平板电脑到底有没有生产力可言?有,但首先要明白自己的需求一直以来,平板电脑的生产力表现,都备受争议。有人说平板电脑性能不行应用体验不行,不足以有生产力可言,只能是个娱乐工具。而有人