游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

从零开始系列,用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。Depthy。Depth)return1;
  if(x。Depthy。Depth)return1;
  returnx。ShowOrdery。ShowOrder;
  });
  这段代码C初学者看到了应该会有点懵,categories。Sort还好理解,就是调用List中的Sort函数执行排序嘛,后面的那一堆还带个的是什么鬼?
  这种在c中被称为Lamda表达式,如果你对javascript的匿名函数有了解的话,这个就很好理解了。这个其实就是C中的匿名函数:
  (x,y),x和y就是匿名函数的两个参数名
  {。。。}这个就是声明函数体,。。。中就是你要编写的函数体内的代码。
  其实上面的写法等价于:
  categories。Sort(compfunc);
  。。。
  staticintcompfunc(Categoryx,Categoryy)
  {
  if(x。Depthy。Depth)return1;
  if(x。Depthy。Depth)return1;
  returnx。ShowOrdery。ShowOrder;
  }
  Lamda表达式的好处是不需要额外声明一个函数名称,临时用下而已。不过说实话,我个人不大喜欢这种写法,语言的可读性较差,一切为了教学:)同学们可以自行选择。
  代码的执行逻辑教程上面有写,代码中我也写了备注,大家认真看下应该就能明白了。
  再分别说下其他的函数:
  countdepth函数,计算每个节点的深度,并保存在类变量中。
  getindexbyparentId函数,获取当前节点在指定节点列表中的序号。
  detachcategorycurrentdepth函数,提取指定深度的所有类别。
  insertintocategories函数,将提取出来的分类列表按顺序插入到目标列表
  上述代码看起来可能比较乱,没有任何排序算法做基础,如有雷同纯属巧合。我对算法这块实在不擅长,能达到目的我就满足了。
  排序完成后,显示效果是这样的:
  如果对自己要求不高,这样也可以凑合用,但是还没有层次关系,与我们的期望有差距。
  我们期望的是能够带一点层次关系,比如二级较一级要向右空几个空格,三级较二级再空几个,要想实现这样的效果,就需要对ComboBox进行重绘了。男人就是要对自己狠一点。
  操作方法如下:
  cbxParent控件:属性窗口DrawMode设置成OwnerDrawFixed
  事件窗口响应DrawItem事件
  运行后,你会发现,下拉框什么都不见了,因为已经开启了自绘控件模式,每一项都需要程序来绘制。
  那么如何进行自绘呢?
  先上代码:
  逐行解释:
  绘制背景:
  e。DrawBackground();
  绘制选中焦点矩形:
  e。DrawFocusRectangle();
  创建画刷,用来输出文字:
  BrushbrushnewSolidBrush(e。ForeColor);
  根据深度增加空格数量:stringtext;
  for(inti1;icategory。Depth;i)
  {
  text;
  }
  textcategory。Name;
  如果有子节点,则字体用粗体显示:Fontfontnull;
  if(category。HasChild)
  {
  fontnewFont(e。Font。FontFamily,e。Font。Size,FontStyle。Bold);
  }
  else
  {
  fontnewFont(e。Font。FontFamily,e。Font。Size);
  }
  指定位置、画刷、字体等输出文字:
  e。Graphics。DrawString(text,font,brush,e。Bounds。X,e。Bounds。Y3);
  销毁画刷和字体:brush。Dispose();
  font。Dispose();
  代码基本上一看就明白,最后销毁这里需要说明下。
  我们使用C编码,如果声明的是内存资源,那么。net会自动在适合的时候进行内存回收,我们不需要像C和C一样去主动管理内存回收,这也是C编码效率比CC高的重要原因之一,以前因为CC内存泄露问题,经常要调好几天的Bug才能把泄漏点找出来。
  但这不意味着我们用c了就随便声明不用再去考虑回收了,除了内存资源以外,还有很多系统资源都是有限的,比较常见的有Gdi资源、位图资源、网络资源、文件资源,这些系统资源都是有限的,使用完成后需要手动回收,如果不回收,就会造成系统资源耗尽而导致程序崩溃。
  这里说的Gdi,英文全称GraphicsDeviceInterface,直译就是图形设备接口,专门用于windows程序图形图像显示的,我们看到的这些标准windows控件,都是通过Windows系统底层的GDI函数绘制出来的。
  在C中,我们用到的画笔Pen、画刷Brush、字体Font等等这些都属于Gdi对象。我们通过系统自带的任务管理器就可以获知程序用到了多少个Gdi对象。
  这些都需要在使用完毕之后及时地回收。
  上面的代码其实还可以优化的。Gdi对象不需要每次都创建,在CategoryManagedForm类中声明Brush和Font的变量,如果为空就创建,不为空就继续使用,这样就只是在第一次使用时创建。窗体关闭时再回收,然后置空。很多效率优化都是基于此,频繁处理的代码越少越好,用空间换时间。只不过目前这点调用量还不需要如此,而且用户操作也不可能像程序执行一样频繁,优化就先不做了。
  最终运行的效果:
  分类管理界面的技术难点我们现在已经攻克了,再接下来就是实现右键分类菜单与分类管理界面的数据联动,我们下节继续。
  本教程尽量保证12天一更,项目源码已作为开源项目加入到Git,代码内容会随教程实时更新,大家有兴趣的话可以关注我,以获得最及时的更新。私信:私人日记可以来获取Git的链接。
  C基本语法大家在头条搜索菜鸟c,个人感觉这个网站还可以。
  大家阅读过程中有哪些看不懂或未尽兴的地方,可以在评论区留言,我会先记下来在后续的教程中找机会再说。
  教程有帮助的话请大家帮忙关注、转发、扩散,能不能开专栏还需要你们的支持!

两世欢慕北湮结局是什么揭秘慕北湮感情线结局近日,电视剧《两世欢》正在持续更新当中,最后剧中男儿号的慕北湮,是大家关注的焦点之一,那么,在这部剧当中,慕北湮的结局是什么呢?揭秘慕北湮感情线是什么样的?一起来看一下。……两世欢风眠晚为什么害景辞揭露事情真相以及阿晚真实身世近日,电视剧《两世欢》正在热播当中,其中里面的剧情也是让人寻味。其中,风眠晚为什么害景辞呢?景辞的脚筋是被风眠晚设计陷害的吗?揭露事情真相以及阿晚真实身世,一起来看一下。……2022年将会流行的5种智能建筑技术通常情况下,智能建筑项目都是从为业主节省成本的单一角度来衡量的。然而,对于向租户出租空间的商业建筑或园区来说,创新技术已经显示出吸引了那些愿意为这些数字福利额外花钱的人。……金庸武侠倚天屠龙记十大高手第一高手竟是他(图)金庸武侠倚天屠龙记十大高手:金庸武侠小说的巨大成功,不仅归功于其曲折动人的故事情节,而且有赖于书中所刻画的众多个性鲜明突出的人物。个性,即不同于一般人的性格特征。下面小编盘点了……赘婿耿护院是好人还是坏人耿护院为什么叫大聪明呢在电视剧《赘婿》当中,耿护院这个角色十分的出彩,深受大家的喜欢,很多网友都非常好奇,耿护院究竟是好人还是坏人呢?耿护院为什么被叫做大聪明呢?一起来看一下具体的情况。1赘婿耿护院……如何购买一款新手机?一、看品牌和参数手机品牌和参数决定这款手机的售后服务和手机本身的价值。假如你买了一款山寨机品牌,你会不会担心这个山寨机突然破产,老板跑路?假如你买了一款骁龙6……我在北京挺好的结局怎么样,我在北京挺好的结局徐晓园现代剧《我在北京挺好的》给带来本是亲姐妹,不过产生阴差阳错产生天各一方,还产生谈小爱和徐晓园在三十多年的风雨人生历程中发生变化的情况,最后结局曹力章和徐晓园在一起了。1我……传奇大亨翟梦结局,传奇大亨翟梦演员传奇剧《传奇大亨》比较早进行铺设好翟梦产生的恋情,好把爱情给观众展现,所能延伸顾延枚的关注,逐渐发生纯真的恋爱,过后期结局有点十分展现不多明显,由此觉得宋轶把翟梦的角色演特别好……房似锦原型是谁原型中的她生活更是艰辛近日,电视剧《安家》正在热播当中,其中房似锦这个角色深入很多观众的内心,据了解,房似锦这个角色是由原型的,据说原型里面的房似锦现实生活当中是更加的艰辛的,一起来了解一下。……苹果专利提出用超声波检测定位ARVR环境中的镜子存在查看引用信息源请点击:映维网防护系统(映维网2021年10月19日)在使用VRAR时,重要的是允许用户感知周遭的环境。知晓对象在现实世界中的位置与明白虚拟对象并不存……电视剧我的仨妈俩爸大结局,我的仨妈俩爸白杨到底是谁的孩子都市剧《我的仨妈俩爸》给带来外柔内刚的女知青白鸽,她去含辛茹苦的养育着故去闺蜜的儿子,不过她在后期在艰难岁月里中不离不弃来生活,直到最后白鸽和白杨在一起,期间发现白杨就是崔放的……苍兰诀什么时候开机,苍兰诀讲了什么仙侠剧《苍兰诀》进行在2021年2月14日开机拍摄,期间公布说三界凡尘,仙魔纷扰,沧海一粟,唯爱而已,足以展现剧情主要内容,来把一段跨越三界的爱恨纠葛给观众逐渐精彩的展现。1苍……
渗透于秀凝结局,渗透于秀凝是谁演的历史剧《渗透》给展现于秀凝为国民党女督察,还是李维恭的学生和许忠义学姐,要看她做事存在雷厉风行的性格,实际她为心机颇重的女特工,不过到最后陈瑾出演的于秀凝在棒槌的保护下离开了。……推荐美女电影8部,讲真好看令人大饱眼福一些喜欢看电影的朋友一定要看推荐美女电影8部,因为这8部电影里面的美女颜值实在是太高了,会让人看了还想看,下面一起来了解下推荐美女电影8部讲真好看令人大饱眼福。1。杀死比……步步惊心大结局怎么样,步步惊心结局若曦嫁给谁了穿越剧《步步惊心》给带来现代白领张晓因车祸穿越到清朝康熙年间,顺利成为满族少女马尔泰若曦,还卷入九子夺嫡的纷争,直到最后马尔泰若曦死在十四阿哥怀里,并他们顺利走到一块了。……步步惊心若曦为什么死若曦为什么嫁给十四爷曾经一部《步步惊心》火遍全网,刘诗诗也是也是这部剧被大众关注的,在这部剧中大家也很好奇步步惊心若曦为什么死?若曦为什么嫁给十四爷?下面就和小编一起来看看吧。1步步惊心若曦……警察荣誉什么时候开机,警察荣誉是小说改编吗都市剧《警察荣誉》选择在2021年4月30日开机拍摄,来给观众展现基层派出所警员的群像,并结合现代生活给观众带来基层民警产生的荣誉,根本没有参考小说进行改编,完全都把真实鲜活的……元祖股份逆势下跌的现金牛,隐形的翅膀?证券简称:元祖食品评级:BBB2018年10月份2019年7月份,借助大盘的暴力拉升以及中秋节题材,元祖股份股价实现了翻倍式增长,然而7月份以后股价一路下挫,高点至今已近……宋慧乔被曝复婚!交往过李秉宪玄彬的她,感情抉择会如何?宋慧乔和宋仲基在曝出婚讯以后就得到了大众的祝福,他们因戏结缘,一部《太阳的后裔》让他们的感情从剧中延伸到现实。宋慧乔和宋仲基的婚姻是在大众的关注中推进的,两个人始终……八佰否认下发发行通知电影八佰演员表及上映时间曝光近日,电影《八佰》官方微博发布消息称,电影《八佰》并没有下发任何的发行通知,否认之前的发行通知消息,一时间该话题登上了热搜榜。不少网友都十分好奇,电影《八佰》演员表都有谁呢?电……犹如物理外挂般的神器北通E1键鼠转换器详细评测简单开箱在把玩这款产品之前,还是让我们来个简单的开箱,北通E1的外包装盒整体采用了黑色配色设计,科技感十足。包装盒正面就可以看到北通E1的宣传图,造型酷似飞碟一样,同时红……燕氏观点山西高校之晋中学院晋中学院(JinzhongUniversity)坐落于三晋腹地、晋商故里晋中市榆次区,是一所山西省省属的全日制多科性本科院校。基本信息中文名晋中学院所属地区山……年仅46岁华裔创业者去世,因家中失火,他的创业经历充满着传奇据国外媒体报道,一位名叫托尼谢家华(TonyHsieh)的美国优秀创业者突然于近日去世,年仅46岁。这位Zappos的CEO,曾经将这家鞋业公司推向大联盟,并将其成功所得用于一……电脑桌面上的那点事情升级爱格升支架后的线材整理在这之前使用显示器支架也有一段时间了,要说有什么好处嘛,真心是谁用谁知道吧,除了调整起来更为方便以外,对于我来说还是可以拓展桌面更大的使用空间实际一点,而对于支架这一类别的产品……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网