基于.NET的Windows窗体编程之WinForms列表控件

[复制链接]
发表于 2026-5-18 01:58:12 | 显示全部楼层 |阅读模式
在实际应用中,列表控件紧张用于表现列表格式的数据,然后供用户选择,常见的列表控件有ComboBox(下拉列表框),ListBox(列表框),CheckedListBox(带复选框的列表框),ListView(带图标的列表框),TreeView(树状布局的列表视图),本日我们以一些简朴的小例子,简述列表控件的常见应用方式,仅供学习分享利用,如有不敷之处,还请指正。

 
概述

 
列表控件,紧张是用于列出选项的 Windows 窗体控件,如果要向用户提供可供选择的选项列表,则可以向 Windows 窗体添加各种列表控件。 常见的列表控件紧张有以下几种:

  • ComboBox,下拉列表组合框,它表现两个部门:顶部部门是一个文本框,允许用户键入列表项。 第二部门是一个列表框,它表现可以从中选择一个项的列表。
  • ListBox,列表框,此控件表现一个列表,可以从中选择一个或多个项。
  • CheckedListBox,复选列表框,此控件不光可以如ListBox 控件一样表现项列表,还可在列表中的项旁边表现复选标志,它是 ListBox 控件的扩展,具备ListBox控件的全部功能。
  • ListView,表现带图标的项列表,可以利用此控件创建像Windows资源管理器一样的用户界面,该控件有四种视图模式:LargeIcon、SmallIcon、List 和 Details。
  • TreeView,树状布局表现控件,它展示节点的层级布局,树视图中的每个节点大概包罗其他节点,称为子节点。 TreeView控件可以将父节点,或包罗子节点的节点,表现为睁开状态或折叠状态。
上述列表控件既有功能相似之处,也有差异之处,在某些环境下是可以交换的。 但是在另一些场景下,一个大概比另一个更适当某个使命。通常,当有发起的选项时,ComboBox是符合的,当你想要将输入限定为列表上的内容时,ListBox是符合的。别的,ComboBox可节省窗体上的空间,在用户单击向下箭头之前不会表现完备列表,因此组合框可以轻松容纳在较小空间中。
 
数据构造

 
在本示例中,为了演示了各个列表控件的利用,先构造数据,本示例接纳学校(Shcool),院系(Department),专业(Major),年级(Grade),班级(Class)具备层级关系的模子,模子代码如下:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace Okcoder.WinForm.Demo
  7. {
  8.     /// <summary>
  9.     /// 学校
  10.     /// </summary>
  11.     public class School
  12.     {
  13.         public int Id { get; set; }
  14.         public string Name { get; set; }
  15.         public List<Department> Departments { get; set; }
  16.     }
  17.     /// <summary>
  18.     /// 系或学院
  19.     /// </summary>
  20.     public class Department
  21.     {
  22.         public int Id { get; set; }
  23.         public string Name { get; set; }
  24.         public List<Major> Majors { get; set; }
  25.     }
  26.     /// <summary>
  27.     /// 专业
  28.     /// </summary>
  29.     public class Major
  30.     {
  31.         public int Id { get; set; }
  32.         public string Name { get; set; }
  33.         public List<Grade> Grades { get; set; }
  34.     }
  35.     /// <summary>
  36.     /// 年级
  37.     /// </summary>
  38.     public class Grade
  39.     {
  40.         public int Id { get; set; }
  41.         public string Name { get; set; }
  42.         public List<Class> Classes { get; set; }
  43.     }
  44.     /// <summary>
  45.     /// 班级
  46.     /// </summary>
  47.     public class Class
  48.     {
  49.         public int Id { get; set; }
  50.         public string Name { get; set; }
  51.     }
  52. }
复制代码
创建SqlDalHelper,模拟数据库利用,构造示例数据,如下所示:
  1. namespace Okcoder.WinForm.Demo
  2. {
  3.     public class SqlDalHelper
  4.     {
  5.         private List<School> schools;
  6.         private List<Like> likes;
  7.         private List<Constellation> constellations;
  8.         public SqlDalHelper()
  9.         {
  10.             InitShcoolList();
  11.             InitLikes();
  12.             InitConstellations();
  13.         }
  14.         private void InitShcoolList()
  15.         {
  16.             string file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "schools.json");
  17.             string json = File.ReadAllText(file);
  18.             schools = Newtonsoft.Json.JsonConvert.DeserializeObject<List<School>>(json);
  19.         }
  20.         /// <summary>
  21.         /// 查询学校列表
  22.         /// </summary>
  23.         /// <param name="name"></param>
  24.         /// <returns></returns>
  25.         public List<School> QuerySchools(string name)
  26.         {
  27.             if (string.IsNullOrEmpty(name))
  28.             {
  29.                 return this.schools;
  30.             }
  31.             var list = this.schools.Where(item => item.Name.Contains(name)).ToList();
  32.             return list;
  33.         }
  34.         /// <summary>
  35.         /// 根据ID获取学校信息
  36.         /// </summary>
  37.         /// <param name="id"></param>
  38.         /// <returns></returns>
  39.         public School? GetSchool(int id)
  40.         {
  41.             return schools.FirstOrDefault(item => item.Id == id);
  42.         }
  43.     }
  44. }
复制代码
 此中schools.json文件为模拟测试数据,详细如下:
  1. [
  2.   {
  3.     "Id": 1,
  4.     "Name": "北京大学",
  5.     "Departments": [
  6.       {
  7.         "Id": 11,
  8.         "Name": "计算机系",
  9.         "Majors": [
  10.           {
  11.             "Id": 111,
  12.             "Name": "计算机科学与技术",
  13.             "Grades": [
  14.               {
  15.                 "Id": 1111,
  16.                 "Name": "大一",
  17.                 "Classes": [
  18.                   {
  19.                     "Id": 11111,
  20.                     "Name": "一班"
  21.                   },
  22.                   {
  23.                     "Id": 11112,
  24.                     "Name": "二班"
  25.                   },
  26.                   {
  27.                     "Id": 11113,
  28.                     "Name": "三班"
  29.                   }
  30.                 ]
  31.               },
  32.               {
  33.                 "Id": 1112,
  34.                 "Name": "大二",
  35.                 "Classes": [
  36.                   {
  37.                     "Id": 11121,
  38.                     "Name": "一班"
  39.                   },
  40.                   {
  41.                     "Id": 11122,
  42.                     "Name": "二班"
  43.                   },
  44.                   {
  45.                     "Id": 11123,
  46.                     "Name": "三班"
  47.                   },
  48.                   {
  49.                     "Id": 11124,
  50.                     "Name": "四班"
  51.                   }
  52.                 ]
  53.               },
  54.               {
  55.                 "Id": 1113,
  56.                 "Name": "大三",
  57.                 "Classes": [
  58.                   {
  59.                     "Id": 11131,
  60.                     "Name": "一班"
  61.                   },
  62.                   {
  63.                     "Id": 11132,
  64.                     "Name": "二班"
  65.                   }
  66.                 ]
  67.               },
  68.               {
  69.                 "Id": 1114,
  70.                 "Name": "大四",
  71.                 "Classes": [
  72.                   {
  73.                     "Id": 11141,
  74.                     "Name": "一班"
  75.                   },
  76.                   {
  77.                     "Id": 11142,
  78.                     "Name": "二班"
  79.                   }
  80.                 ]
  81.               }
  82.             ]
  83.           },
  84.           {
  85.             "Id": 112,
  86.             "Name": "通信电路",
  87.             "Grades": [
  88.               {
  89.                 "Id": 1121,
  90.                 "Name": "大一",
  91.                 "Classes": [
  92.                   {
  93.                     "Id": 11211,
  94.                     "Name": "一班"
  95.                   },
  96.                   {
  97.                     "Id": 11212,
  98.                     "Name": "二班"
  99.                   }
  100.                 ]
  101.               },
  102.               {
  103.                 "Id": 1122,
  104.                 "Name": "大二",
  105.                 "Classes": [
  106.                   {
  107.                     "Id": 11221,
  108.                     "Name": "一班"
  109.                   },
  110.                   {
  111.                     "Id": 11222,
  112.                     "Name": "二班"
  113.                   },
  114.                   {
  115.                     "Id": 11223,
  116.                     "Name": "三班"
  117.                   }
  118.                 ]
  119.               },
  120.               {
  121.                 "Id": 1123,
  122.                 "Name": "大三",
  123.                 "Classes": [
  124.                   {
  125.                     "Id": 11231,
  126.                     "Name": "一班"
  127.                   },
  128.                   {
  129.                     "Id": 11232,
  130.                     "Name": "二班"
  131.                   }
  132.                 ]
  133.               },
  134.               {
  135.                 "Id": 1124,
  136.                 "Name": "大四",
  137.                 "Classes": [
  138.                   {
  139.                     "Id": 11241,
  140.                     "Name": "一班"
  141.                   },
  142.                   {
  143.                     "Id": 11242,
  144.                     "Name": "二班"
  145.                   }
  146.                 ]
  147.               }
  148.             ]
  149.           }
  150.         ]
  151.       },
  152.       {
  153.         "Id": 12,
  154.         "Name": "法学系",
  155.         "Majors": [
  156.           {
  157.             "Id": 121,
  158.             "Name": "国内法学",
  159.             "Grades": [
  160.               {
  161.                 "Id": 1211,
  162.                 "Name": "大一",
  163.                 "Classes": [
  164.                   {
  165.                     "Id": 12111,
  166.                     "Name": "一班"
  167.                   },
  168.                   {
  169.                     "Id": 12112,
  170.                     "Name": "二班"
  171.                   },
  172.                   {
  173.                     "Id": 12113,
  174.                     "Name": "三班"
  175.                   }
  176.                 ]
  177.               },
  178.               {
  179.                 "Id": 1212,
  180.                 "Name": "大二",
  181.                 "Classes": [
  182.                   {
  183.                     "Id": 12121,
  184.                     "Name": "一班"
  185.                   },
  186.                   {
  187.                     "Id": 12122,
  188.                     "Name": "二班"
  189.                   },
  190.                   {
  191.                     "Id": 12123,
  192.                     "Name": "三班"
  193.                   },
  194.                   {
  195.                     "Id": 12124,
  196.                     "Name": "四班"
  197.                   }
  198.                 ]
  199.               },
  200.               {
  201.                 "Id": 1213,
  202.                 "Name": "大三",
  203.                 "Classes": [
  204.                   {
  205.                     "Id": 12131,
  206.                     "Name": "一班"
  207.                   },
  208.                   {
  209.                     "Id": 12132,
  210.                     "Name": "二班"
  211.                   }
  212.                 ]
  213.               },
  214.               {
  215.                 "Id": 1214,
  216.                 "Name": "大四",
  217.                 "Classes": [
  218.                   {
  219.                     "Id": 12141,
  220.                     "Name": "一班"
  221.                   },
  222.                   {
  223.                     "Id": 12142,
  224.                     "Name": "二班"
  225.                   }
  226.                 ]
  227.               }
  228.             ]
  229.           },
  230.           {
  231.             "Id": 122,
  232.             "Name": "国际法学",
  233.             "Grades": [
  234.               {
  235.                 "Id": 1221,
  236.                 "Name": "大一",
  237.                 "Classes": [
  238.                   {
  239.                     "Id": 12211,
  240.                     "Name": "一班"
  241.                   },
  242.                   {
  243.                     "Id": 12212,
  244.                     "Name": "二班"
  245.                   }
  246.                 ]
  247.               },
  248.               {
  249.                 "Id": 1222,
  250.                 "Name": "大二",
  251.                 "Classes": [
  252.                   {
  253.                     "Id": 12221,
  254.                     "Name": "一班"
  255.                   },
  256.                   {
  257.                     "Id": 12222,
  258.                     "Name": "二班"
  259.                   },
  260.                   {
  261.                     "Id": 12223,
  262.                     "Name": "三班"
  263.                   }
  264.                 ]
  265.               },
  266.               {
  267.                 "Id": 1223,
  268.                 "Name": "大三",
  269.                 "Classes": [
  270.                   {
  271.                     "Id": 12231,
  272.                     "Name": "一班"
  273.                   },
  274.                   {
  275.                     "Id": 12232,
  276.                     "Name": "二班"
  277.                   }
  278.                 ]
  279.               },
  280.               {
  281.                 "Id": 1224,
  282.                 "Name": "大四",
  283.                 "Classes": [
  284.                   {
  285.                     "Id": 12241,
  286.                     "Name": "一班"
  287.                   },
  288.                   {
  289.                     "Id": 12242,
  290.                     "Name": "二班"
  291.                   }
  292.                 ]
  293.               }
  294.             ]
  295.           }
  296.         ]
  297.       }
  298.     ]
  299.   },
  300.   {
  301.     "Id": 2,
  302.     "Name": "清华大学",
  303.     "Departments": [
  304.       {
  305.         "Id": 21,
  306.         "Name": "建筑系",
  307.         "Majors": [
  308.           {
  309.             "Id": 211,
  310.             "Name": "园林建筑",
  311.             "Grades": [
  312.               {
  313.                 "Id": 2111,
  314.                 "Name": "大一",
  315.                 "Classes": [
  316.                   {
  317.                     "Id": 21111,
  318.                     "Name": "一班"
  319.                   },
  320.                   {
  321.                     "Id": 21112,
  322.                     "Name": "二班"
  323.                   },
  324.                   {
  325.                     "Id": 21113,
  326.                     "Name": "三班"
  327.                   }
  328.                 ]
  329.               },
  330.               {
  331.                 "Id": 2112,
  332.                 "Name": "大二",
  333.                 "Classes": [
  334.                   {
  335.                     "Id": 21121,
  336.                     "Name": "一班"
  337.                   },
  338.                   {
  339.                     "Id": 21122,
  340.                     "Name": "二班"
  341.                   },
  342.                   {
  343.                     "Id": 21123,
  344.                     "Name": "三班"
  345.                   },
  346.                   {
  347.                     "Id": 21124,
  348.                     "Name": "四班"
  349.                   }
  350.                 ]
  351.               },
  352.               {
  353.                 "Id": 2113,
  354.                 "Name": "大三",
  355.                 "Classes": [
  356.                   {
  357.                     "Id": 21131,
  358.                     "Name": "一班"
  359.                   },
  360.                   {
  361.                     "Id": 21132,
  362.                     "Name": "二班"
  363.                   }
  364.                 ]
  365.               },
  366.               {
  367.                 "Id": 2114,
  368.                 "Name": "大四",
  369.                 "Classes": [
  370.                   {
  371.                     "Id": 21141,
  372.                     "Name": "一班"
  373.                   },
  374.                   {
  375.                     "Id": 21142,
  376.                     "Name": "二班"
  377.                   }
  378.                 ]
  379.               }
  380.             ]
  381.           },
  382.           {
  383.             "Id": 212,
  384.             "Name": "古建筑",
  385.             "Grades": [
  386.               {
  387.                 "Id": 2121,
  388.                 "Name": "大一",
  389.                 "Classes": [
  390.                   {
  391.                     "Id": 21211,
  392.                     "Name": "一班"
  393.                   },
  394.                   {
  395.                     "Id": 21212,
  396.                     "Name": "二班"
  397.                   }
  398.                 ]
  399.               },
  400.               {
  401.                 "Id": 2122,
  402.                 "Name": "大二",
  403.                 "Classes": [
  404.                   {
  405.                     "Id": 21221,
  406.                     "Name": "一班"
  407.                   },
  408.                   {
  409.                     "Id": 21222,
  410.                     "Name": "二班"
  411.                   },
  412.                   {
  413.                     "Id": 21223,
  414.                     "Name": "三班"
  415.                   }
  416.                 ]
  417.               },
  418.               {
  419.                 "Id": 2123,
  420.                 "Name": "大三",
  421.                 "Classes": [
  422.                   {
  423.                     "Id": 21231,
  424.                     "Name": "一班"
  425.                   },
  426.                   {
  427.                     "Id": 21232,
  428.                     "Name": "二班"
  429.                   }
  430.                 ]
  431.               },
  432.               {
  433.                 "Id": 2124,
  434.                 "Name": "大四",
  435.                 "Classes": [
  436.                   {
  437.                     "Id": 21241,
  438.                     "Name": "一班"
  439.                   },
  440.                   {
  441.                     "Id": 21242,
  442.                     "Name": "二班"
  443.                   }
  444.                 ]
  445.               }
  446.             ]
  447.           }
  448.         ]
  449.       },
  450.       {
  451.         "Id": 22,
  452.         "Name": "文学系",
  453.         "Majors": [
  454.           {
  455.             "Id": 221,
  456.             "Name": "近代文学",
  457.             "Grades": [
  458.               {
  459.                 "Id": 2211,
  460.                 "Name": "大一",
  461.                 "Classes": [
  462.                   {
  463.                     "Id": 22111,
  464.                     "Name": "一班"
  465.                   },
  466.                   {
  467.                     "Id": 22112,
  468.                     "Name": "二班"
  469.                   },
  470.                   {
  471.                     "Id": 22113,
  472.                     "Name": "三班"
  473.                   }
  474.                 ]
  475.               },
  476.               {
  477.                 "Id": 2212,
  478.                 "Name": "大二",
  479.                 "Classes": [
  480.                   {
  481.                     "Id": 22121,
  482.                     "Name": "一班"
  483.                   },
  484.                   {
  485.                     "Id": 22122,
  486.                     "Name": "二班"
  487.                   },
  488.                   {
  489.                     "Id": 22123,
  490.                     "Name": "三班"
  491.                   },
  492.                   {
  493.                     "Id": 22124,
  494.                     "Name": "四班"
  495.                   }
  496.                 ]
  497.               },
  498.               {
  499.                 "Id": 2213,
  500.                 "Name": "大三",
  501.                 "Classes": [
  502.                   {
  503.                     "Id": 22131,
  504.                     "Name": "一班"
  505.                   },
  506.                   {
  507.                     "Id": 22132,
  508.                     "Name": "二班"
  509.                   }
  510.                 ]
  511.               },
  512.               {
  513.                 "Id": 2214,
  514.                 "Name": "大四",
  515.                 "Classes": [
  516.                   {
  517.                     "Id": 22141,
  518.                     "Name": "一班"
  519.                   },
  520.                   {
  521.                     "Id": 22142,
  522.                     "Name": "二班"
  523.                   }
  524.                 ]
  525.               }
  526.             ]
  527.           },
  528.           {
  529.             "Id": 222,
  530.             "Name": "现代文学",
  531.             "Grades": [
  532.               {
  533.                 "Id": 2221,
  534.                 "Name": "大一",
  535.                 "Classes": [
  536.                   {
  537.                     "Id": 22211,
  538.                     "Name": "一班"
  539.                   },
  540.                   {
  541.                     "Id": 22212,
  542.                     "Name": "二班"
  543.                   }
  544.                 ]
  545.               },
  546.               {
  547.                 "Id": 2222,
  548.                 "Name": "大二",
  549.                 "Classes": [
  550.                   {
  551.                     "Id": 22221,
  552.                     "Name": "一班"
  553.                   },
  554.                   {
  555.                     "Id": 22222,
  556.                     "Name": "二班"
  557.                   },
  558.                   {
  559.                     "Id": 22223,
  560.                     "Name": "三班"
  561.                   }
  562.                 ]
  563.               },
  564.               {
  565.                 "Id": 2223,
  566.                 "Name": "大三",
  567.                 "Classes": [
  568.                   {
  569.                     "Id": 22231,
  570.                     "Name": "一班"
  571.                   },
  572.                   {
  573.                     "Id": 22232,
  574.                     "Name": "二班"
  575.                   }
  576.                 ]
  577.               },
  578.               {
  579.                 "Id": 2224,
  580.                 "Name": "大四",
  581.                 "Classes": [
  582.                   {
  583.                     "Id": 22241,
  584.                     "Name": "一班"
  585.                   },
  586.                   {
  587.                     "Id": 22242,
  588.                     "Name": "二班"
  589.                   }
  590.                 ]
  591.               }
  592.             ]
  593.           }
  594.         ]
  595.       }
  596.     ]
  597.   },
  598.   {
  599.     "Id": 3,
  600.     "Name": "南开大学",
  601.     "Departments": [
  602.       {
  603.         "Id": 31,
  604.         "Name": "体育系",
  605.         "Majors": [
  606.           {
  607.             "Id": 311,
  608.             "Name": "乒乓球",
  609.             "Grades": [
  610.               {
  611.                 "Id": 3111,
  612.                 "Name": "大一",
  613.                 "Classes": [
  614.                   {
  615.                     "Id": 31111,
  616.                     "Name": "一班"
  617.                   },
  618.                   {
  619.                     "Id": 31112,
  620.                     "Name": "二班"
  621.                   },
  622.                   {
  623.                     "Id": 31113,
  624.                     "Name": "三班"
  625.                   }
  626.                 ]
  627.               },
  628.               {
  629.                 "Id": 3112,
  630.                 "Name": "大二",
  631.                 "Classes": [
  632.                   {
  633.                     "Id": 31121,
  634.                     "Name": "一班"
  635.                   },
  636.                   {
  637.                     "Id": 31122,
  638.                     "Name": "二班"
  639.                   },
  640.                   {
  641.                     "Id": 31123,
  642.                     "Name": "三班"
  643.                   },
  644.                   {
  645.                     "Id": 31124,
  646.                     "Name": "四班"
  647.                   }
  648.                 ]
  649.               },
  650.               {
  651.                 "Id": 3113,
  652.                 "Name": "大三",
  653.                 "Classes": [
  654.                   {
  655.                     "Id": 31131,
  656.                     "Name": "一班"
  657.                   },
  658.                   {
  659.                     "Id": 31132,
  660.                     "Name": "二班"
  661.                   }
  662.                 ]
  663.               },
  664.               {
  665.                 "Id": 3114,
  666.                 "Name": "大四",
  667.                 "Classes": [
  668.                   {
  669.                     "Id": 31141,
  670.                     "Name": "一班"
  671.                   },
  672.                   {
  673.                     "Id": 31142,
  674.                     "Name": "二班"
  675.                   }
  676.                 ]
  677.               }
  678.             ]
  679.           },
  680.           {
  681.             "Id": 312,
  682.             "Name": "篮球",
  683.             "Grades": [
  684.               {
  685.                 "Id": 3121,
  686.                 "Name": "大一",
  687.                 "Classes": [
  688.                   {
  689.                     "Id": 31211,
  690.                     "Name": "一班"
  691.                   },
  692.                   {
  693.                     "Id": 31212,
  694.                     "Name": "二班"
  695.                   }
  696.                 ]
  697.               },
  698.               {
  699.                 "Id": 3122,
  700.                 "Name": "大二",
  701.                 "Classes": [
  702.                   {
  703.                     "Id": 31221,
  704.                     "Name": "一班"
  705.                   },
  706.                   {
  707.                     "Id": 31222,
  708.                     "Name": "二班"
  709.                   },
  710.                   {
  711.                     "Id": 31223,
  712.                     "Name": "三班"
  713.                   }
  714.                 ]
  715.               },
  716.               {
  717.                 "Id": 3123,
  718.                 "Name": "大三",
  719.                 "Classes": [
  720.                   {
  721.                     "Id": 31231,
  722.                     "Name": "一班"
  723.                   },
  724.                   {
  725.                     "Id": 31232,
  726.                     "Name": "二班"
  727.                   }
  728.                 ]
  729.               },
  730.               {
  731.                 "Id": 3124,
  732.                 "Name": "大四",
  733.                 "Classes": [
  734.                   {
  735.                     "Id": 31241,
  736.                     "Name": "一班"
  737.                   },
  738.                   {
  739.                     "Id": 31242,
  740.                     "Name": "二班"
  741.                   }
  742.                 ]
  743.               }
  744.             ]
  745.           }
  746.         ]
  747.       },
  748.       {
  749.         "Id": 32,
  750.         "Name": "电气学院",
  751.         "Majors": [
  752.           {
  753.             "Id": 321,
  754.             "Name": "弱电",
  755.             "Grades": [
  756.               {
  757.                 "Id": 2211,
  758.                 "Name": "大一",
  759.                 "Classes": [
  760.                   {
  761.                     "Id": 22111,
  762.                     "Name": "一班"
  763.                   },
  764.                   {
  765.                     "Id": 22112,
  766.                     "Name": "二班"
  767.                   },
  768.                   {
  769.                     "Id": 22113,
  770.                     "Name": "三班"
  771.                   }
  772.                 ]
  773.               },
  774.               {
  775.                 "Id": 2212,
  776.                 "Name": "大二",
  777.                 "Classes": [
  778.                   {
  779.                     "Id": 22121,
  780.                     "Name": "一班"
  781.                   },
  782.                   {
  783.                     "Id": 22122,
  784.                     "Name": "二班"
  785.                   },
  786.                   {
  787.                     "Id": 22123,
  788.                     "Name": "三班"
  789.                   },
  790.                   {
  791.                     "Id": 22124,
  792.                     "Name": "四班"
  793.                   }
  794.                 ]
  795.               },
  796.               {
  797.                 "Id": 2213,
  798.                 "Name": "大三",
  799.                 "Classes": [
  800.                   {
  801.                     "Id": 22131,
  802.                     "Name": "一班"
  803.                   },
  804.                   {
  805.                     "Id": 22132,
  806.                     "Name": "二班"
  807.                   }
  808.                 ]
  809.               },
  810.               {
  811.                 "Id": 2214,
  812.                 "Name": "大四",
  813.                 "Classes": [
  814.                   {
  815.                     "Id": 22141,
  816.                     "Name": "一班"
  817.                   },
  818.                   {
  819.                     "Id": 22142,
  820.                     "Name": "二班"
  821.                   }
  822.                 ]
  823.               }
  824.             ]
  825.           },
  826.           {
  827.             "Id": 322,
  828.             "Name": "强电",
  829.             "Grades": [
  830.               {
  831.                 "Id": 3221,
  832.                 "Name": "大一",
  833.                 "Classes": [
  834.                   {
  835.                     "Id": 32211,
  836.                     "Name": "一班"
  837.                   },
  838.                   {
  839.                     "Id": 32212,
  840.                     "Name": "二班"
  841.                   }
  842.                 ]
  843.               },
  844.               {
  845.                 "Id": 3222,
  846.                 "Name": "大二",
  847.                 "Classes": [
  848.                   {
  849.                     "Id": 32221,
  850.                     "Name": "一班"
  851.                   },
  852.                   {
  853.                     "Id": 32222,
  854.                     "Name": "二班"
  855.                   },
  856.                   {
  857.                     "Id": 32223,
  858.                     "Name": "三班"
  859.                   }
  860.                 ]
  861.               },
  862.               {
  863.                 "Id": 3223,
  864.                 "Name": "大三",
  865.                 "Classes": [
  866.                   {
  867.                     "Id": 32231,
  868.                     "Name": "一班"
  869.                   },
  870.                   {
  871.                     "Id": 32232,
  872.                     "Name": "二班"
  873.                   }
  874.                 ]
  875.               },
  876.               {
  877.                 "Id": 3224,
  878.                 "Name": "大四",
  879.                 "Classes": [
  880.                   {
  881.                     "Id": 32241,
  882.                     "Name": "一班"
  883.                   },
  884.                   {
  885.                     "Id": 32242,
  886.                     "Name": "二班"
  887.                   }
  888.                 ]
  889.               }
  890.             ]
  891.           }
  892.         ]
  893.       }
  894.     ]
  895.   }
  896. ]
复制代码
 
ComboBox

 
ComboBox用于在下拉列表组合框中表现数据,默认环境下,ComboBox 控件表现两个部门:顶部部门是一个文本框,允许用户键入列表项。 第二部门是一个列表框,当点击右侧的下拉箭头时,表现用户可以从中选择一个项的列表。
ComboBox控件的关键属性:

  • SelectedIndex,表现控件当前选中项的索引,它是一个int范例的值,还可以通过在代码中更改 SelectedIndex 值,以编程方式变动ComboBox控件的选择项。 如果未选择任何项,则 SelectedIndex 值为 -1。 如果选择列表中的第一项,则 SelectedIndex 值为 0。
  • SelectedItem,表现控件当前选择的项,此属性类似于 SelectedIndex,但返回项本身(通常是字符串值)。
  • Count,表现控件中Items列表项的数目,Count 属性的值始终比最大大概的 SelectedIndex 值大 1,由于 SelectedIndex 是从零开始计数的。
  • Items,表现列表控件包罗的列表项聚集,可以通过Items属性Add,Remove,RemoveAt,Clear等方法修改Items中值的内容。
  • DataSource,表现ComboBox控件的数据源,它是一个可空的object范例,吸取实现IList接口或Array范例的数据。
  • DisplayMember,表现列表控件须要表现的内容,它通常是绑定的Item项的属性名称或列名。
  • ValueMember,表现列表控件的真实Value应的值,它通常是绑定的Item项的属性名称或列名。
ComboBox控件的关键变乱:

  • SelectedIndexChanged,当ComboxBox控件的选择项发生改变时触发,可以用来相应ComboBox的选择项改变。
分析,ComboBox下拉列表组合框控件可以通过Items属性来添加或删除列表框中的值,也可以通过同一设置数据源(DataSource)方式举行的赋值。
接下来在Form表单的Load方法中,接纳DataSource的方式举行赋值,起首通过sqlDalHelper实例的QuerySchools方法获取学校列表,在将ComboBox控件的DataSource属性赋值为schools列表,由于列表中的项是School对象,以是须要通过DisplayMember指定须要表现的属性路径,ValueMember指定真实的Value的属性路径。详细如下所示:
  1. var schools = sqlDalHelper.QuerySchools(string.Empty);
  2. this.combSchools.DataSource = schools.ToList();
  3. this.combSchools.DisplayMember = "Name";
  4. this.combSchools.ValueMember = "Id";
复制代码
 运行步调,如下所示:

 
ListBox

 
ListBox控件表现一个列表,用户可以从中选择一个或多个项。 如果列表项总数凌驾可表现的数目,则会自动向 ListBox 控件添加滚动条。ListBox控件的关键属性:

  • MultiColumn,表现是否在列表框中表现多列,当属性 MultiColumn 设置为 true时,如果列表项总数凌驾可表现的数目时,列表框将表现为多列,并表现水平滚动条。 当MultiColumn 属性设置为false 时,如果列表项总数凌驾可表现的数目时,列表框表现为单列,并出现垂直滚动条。 
  • ScrollAlwaysVisible,表现滚动条是否不停表现,如果 ScrollAlwaysVisible 设置为 true,则无论项数怎样,滚动条都会表现,默以为false。
  • SelectionMode,表现一次可以选择多少个列表项,它是一个摆列范例:None表现不可以选择,One 表现一此只能选择一个,MultiSimple表现一次可以选择多个项,MultiExtended表现一次可以选择多个,且可以利用组合键盘,如Shift,Ctrl资助选择。
  • 与ComboBox控件一样,ListBox控件同样具备SelectedIndex,SelectedItem,Count,Items,DataSource,DisplayMember,ValueMember等属性。
ListBox控件的关键变乱:

  • SelectedIndexChanged,与ComboBox控件一样,ListBox同样具备SelectedIndexChanged变乱,用来相应ListBox控件的选择项改变。
同样在Form表单的Load方法中,接纳DataSource的方式举行赋值,起首通过sqlDalHelper实例的QuerySchools方法获取学校列表,在将ComboBox控件的DataSource属性赋值为schools列表,由于列表中的项是School对象,以是须要通过DisplayMember指定须要表现的属性路径,ValueMember指定真实的Value的属性路径。详细如下所示:
  1. lbShcools.DataSource = schools.ToList();
  2. lbShcools.DisplayMember = "Name";
  3. lbShcools.ValueMember = "Id";
  4. lbShcools.MultiColumn = false;
复制代码
当用户选择ListBox中的项时,会触发SelectedIndexChanged,可以用来确定用户选择的项,如下所示:
  1. private void lbShcools_SelectedIndexChanged(object sender, EventArgs e)
  2. {
  3.         if (lbShcools.SelectedItems != null)
  4.         {
  5.                 List<string> schools = new List<string>();
  6.                 foreach (var item in this.lbShcools.SelectedItems)
  7.                 {
  8.                         var school = item as School;
  9.                         if (school != null)
  10.                         {
  11.                                 schools.Add(school.Name);
  12.                         }
  13.                 }
  14.                 this.lblSchools.Text = string.Join(",\n", schools);
  15.         }
  16. }
复制代码
 运行步调,如下所示:
 
 
CheckedListBox

 
CheckedListBox控件是 ListBox 控件的扩展,它不光可以表现项列表(如 ListBox 控件),还可在列表中的项旁边表现复选标志。CheckedListBox控件险些实行ListBox(列表框)实行的全部利用, 两个控件之间的其他差异是,CheckedListBox仅支持 DrawMode.Normal;而且Checked  ListBox只能选择一个项目或无项。CheckedListBox可以在筹划时利用 字符串聚集编辑器 添加项,也可以在运行时利用 Items 属性从聚会集动态添加项。
CheckedListBox控件的关键属性:

  • CheckedItems,表现选中的项聚集,通过遍历可以获取全部被选中的项。也可以通过控件的GetItemChecked 方法来获取项是否被选中,参数为项索引号,返回值true表现被选中,false表现未被选中。
  • CheckOnClick,表现当用户点击列表中的项时,列表项的复选框是否改变状态,默以为false:须要先选择项,再点击复选框举行选择。如果设置为true,则点击列表项会同时改变复选框的状态。
  • 与ListBox控件一样,CheckedListBox控件同样具备SelectedIndex,SelectedItem,Count,Items,DataSource,DisplayMember,ValueMember,MultiColumn,ColumnWidth等属性。
CheckedListBox控件的关键变乱:

  • ItemCheck,当CheckedListBox控件的项的复选框的状态发送变革时触发,变乱参数ItemCheckEventArgs,包摆列表项复选框的前(CurrentValue),后(NewValue)状态,以及项索引(Index)。
分析:Checked和Selected效果不一样,Checked是复选框被选中,Selected是确定已突出表现哪些项。以是CheckedItems和SelectedItems是表现差异的寄义。
本示例构造个人爱好列表框,用户可以勾选个人爱好,起首创建Like模子,如下所示:
  1. namespace Okcoder.WinForm.Demo
  2. {
  3.     public class Like
  4.     {
  5.         public int Id { get; set; }
  6.         public string Name { get; set; }
  7.     }
  8. }
复制代码
在SqlDalHelper类中初始化个人爱好列表,并增长QueryLikes接口获取爱好列表,如下所示:
  1. private void InitLikes()
  2. {
  3.         likes = new List<Like>();
  4.         likes.Add(new Like()
  5.         {
  6.                 Id = 1,
  7.                 Name = "足球",
  8.         });
  9.         likes.Add(new Like()
  10.         {
  11.                 Id = 2,
  12.                 Name = "篮球",
  13.         });
  14.         likes.Add(new Like()
  15.         {
  16.                 Id = 3,
  17.                 Name = "乒乓球",
  18.         });
  19.         likes.Add(new Like()
  20.         {
  21.                 Id = 4,
  22.                 Name = "跳舞",
  23.         });
  24.         likes.Add(new Like()
  25.         {
  26.                 Id = 5,
  27.                 Name = "唱歌",
  28.         });
  29. }
  30. public List<Like> QueryLikes()
  31. {
  32.         return this.likes;
  33. }
复制代码
在Form表单的Load方法中,获取Like列表,并给CheckListBox赋值,如下所示:
  1. var likes = sqlDalHelper.QueryLikes();
  2. this.chklbLikes.DataSource = likes;
  3. this.chklbLikes.DisplayMember = "Name";
  4. this.chklbLikes.MultiColumn = true;
  5. this.chklbLikes.ColumnWidth = 80;
  6. this.chklbLikes.CheckOnClick = true;
复制代码
在上述示例中,设置了MultiColumn为true,如果一列无法表现时,为表现为多列。运行效果,如下所示:

注册CheckedListBox控件的ItemCheck变乱,可以获取用户选中的项,如下所示:
  1. private void chklbLikes_ItemCheck(object sender, ItemCheckEventArgs e)
  2. {
  3.        
  4.         List<string> likes = new List<string>();
  5.         foreach (var item in this.chklbLikes.CheckedItems)
  6.         {
  7.                 var like = item as Like;
  8.                 if (like != null)
  9.                 {
  10.                         likes.Add(like.Name);
  11.                 }
  12.         }
  13.         //因为ItemCheck方法具有滞后性,是等事件发生后,状态才会更新,所以判断NewValue的值,提前获取。
  14.         if (e.NewValue == CheckState.Checked)
  15.         {
  16.                 var like = this.chklbLikes.Items[e.Index] as Like;
  17.                 if (like != null)
  18.                 {
  19.                         likes.Add(like.Name);
  20.                 }
  21.         }
  22.         if(e.NewValue==CheckState.Unchecked)
  23.         {
  24.                 var like = this.chklbLikes.Items[e.Index] as Like;
  25.                 if (like != null)
  26.                 {
  27.                         if (likes.Contains(like.Name))
  28.                         {
  29.                                 likes.Remove(like.Name);
  30.                         }
  31.                 }
  32.         }
  33.         this.lblLikes.Text = string.Join(",", likes);
  34. }
复制代码
 
TreeView

 
TreeView控件展示节点的层级布局,就像在 Windows 利用体系中 Windows 资源管理器功能左侧窗格中表现文件和文件夹一样。树视图中的每个节点大概包罗其他节点,称为子节点。 可以将父节点,或包罗子节点的节点,表现为睁开状态或折叠状态。
TreeView控件的关键属性:

  • CheckBoxes,是否在树视图控件中的树节点旁边表现复选框,可以将TreeView中节点的Checked属性设置为true或false举举措态的选择或取消。
  • Nodes,获取TreeView的节点聚集或子节点聚集。
  • SelectedNode 属性获取或设置当前选定的节点,通过SelectedNode属性的Nodes属性的Add/Remove方法,可以动态的为当前选择节点添加/删除子节点。
  • ImageList,树状列表中节点图像聚集,可以通过指定Node节点的ImageIndex属性为树视图中的节点设置正常状态下的默认图像,SelectedImageIndex设置选择状态下的图像。
  • Clear方法可以为节点扫除全部子节点。如果是TreeView的Clear方法,则扫除全部节点;如果是当前选择的节点调用Clear方法,则扫除选定节点的子节点。
  • FirstNode,获取节点的第一个子节点,LastNode,获取节点的末了一个子节点。
  • NextNode,获取节点的下一个同级节点,PrevNode,获取节点的上一个同级节点。
  • Parent,获取节点的父级节点。
  • TopNode,TreeView控件的根节点。
TreeView控件的关键变乱:

  • AfterSelect,当TreeView的节点被Select时触发此变乱,可以用来确定用户点击了哪个节点。
  • AfterCheck,当TreeView控件中的节点表现CheckBox且被选中时触发。
在本示例中,当用户选择学校时,会在右侧表现选择学校的详细信息,以是须要在ComboBox的SelectedIndexChanged变乱中处置惩罚TreeView节点的初始化,如下所示:
  1. private void combSchools_SelectedIndexChanged(object sender, EventArgs e)
  2. {
  3.         //var id = combSchools.SelectedValue;//获取Id
  4.         this.tvSchool.Nodes.Clear();
  5.         var school = combSchools.SelectedItem as School;
  6.         if (school != null)
  7.         {
  8.                 this.lblSchool.Text = school.Name;
  9.                 TreeNode nodeSchool = new TreeNode();
  10.                 nodeSchool.Text = school.Name;
  11.                 for (int i = 0; i < school.Departments.Count; i++)
  12.                 {
  13.                         var department = school.Departments[i];
  14.                         TreeNode nodeDepartment = new TreeNode();
  15.                         nodeDepartment.Text = department.Name;
  16.                         for (int j = 0; j < department.Majors.Count; j++)
  17.                         {
  18.                                 var major = department.Majors[j];
  19.                                 TreeNode nodeMajor = new TreeNode();
  20.                                 nodeMajor.Text = major.Name;
  21.                                 for (int k = 0; k < major.Grades.Count; k++)
  22.                                 {
  23.                                         var grade = major.Grades[k];
  24.                                         TreeNode nodeGrade = new TreeNode();
  25.                                         nodeGrade.Text = grade.Name;
  26.                                         for (int l = 0; l < grade.Classes.Count; l++)
  27.                                         {
  28.                                                 var cla = grade.Classes[l];
  29.                                                 TreeNode nodeClass = new TreeNode();
  30.                                                 nodeClass.Text = cla.Name;
  31.                                                 nodeGrade.Nodes.Add(nodeClass);
  32.                                         }
  33.                                         nodeMajor.Nodes.Add(nodeGrade);
  34.                                 }
  35.                                 nodeDepartment.Nodes.Add(nodeMajor);
  36.                         }
  37.                         nodeSchool.Nodes.Add(nodeDepartment);
  38.                 }
  39.                 this.tvSchool.Nodes.Add(nodeSchool);
  40.         }
  41. }
复制代码
运行步调,示例效果如下:

 
ListView

 
ListView控件表现带图标的项列表,可以利用ListView创建用户界面,比方 Windows 资源管理器的右窗格。 通过View 属性可以设置ListView的视图模式,共有四种视图模式:

  • LargeIcon 模式表现项文本旁边的大图标,如果控件富足大,则这些项会表现在多个列中。  
  • SmallIcon 模式类似,只不外它表现小图标。
  • List模式表现小图标,但始终位于单个列中。
  • Details模式表现多个列中的项。
ListView控件的关键属性:

  • Items,包罗控件表现的项。
  • SelectedItems 属性包罗控件中当前选定的项的聚集。
  • MultiSelect,标识用户可以选择多个项。
  • CheckBoxes,是否在ListView控件中的项旁边表现复选框,可以将ListView中项的Checked属性设置为true或false举举措态的选择或取消。
ListView控件的关键变乱:

  • SelectedIndexChanged,与ComboBox,ListBox控件一样,ListView同样具备SelectedIndexChanged变乱,用来相应ListView控件的选择项改变。
 本示例接纳星座列表图片,起首构造星座模子,如下所示:
  1. namespace Okcoder.WinForm.Demo
  2. {
  3.     /// <summary>
  4.     /// 星座
  5.     /// </summary>
  6.     public class Constellation
  7.     {
  8.         public int Id { get; set; }
  9.         public string Name { get; set; }
  10.         public string Nick { get; set; }
  11.         public string Desc { get; set; }
  12.         public int ImgIndex { get; set; }
  13.     }
  14. }
复制代码
接下来在SqlDalHelper中构造星座数据,如下所示:
  1. private void InitConstellations()
  2. {
  3.         constellations = new List<Constellation>();
  4.         constellations.Add(new Constellation() { Id = 1, Name = "Aries", Nick = "白羊座", Desc = "03-21至04-19", ImgIndex=0 });
  5.         constellations.Add(new Constellation() { Id = 2, Name = "Taurus", Nick = "金牛座‌", Desc = "04-20至05-20", ImgIndex = 1 });
  6.         constellations.Add(new Constellation() { Id = 3, Name = "Gemini", Nick = "‌双子座‌", Desc = "05-21至06-21", ImgIndex = 2 });
  7.         constellations.Add(new Constellation() { Id = 4, Name = "Cancer", Nick = "巨蟹座", Desc = "06-22至07-22", ImgIndex = 3 });
  8.         constellations.Add(new Constellation() { Id = 5, Name = "Leo", Nick = "狮子座", Desc = "07-23至08-22", ImgIndex = 4 });
  9.         constellations.Add(new Constellation() { Id = 6, Name = "Virgo", Nick = "处女座‌", Desc = "08-23至09-22", ImgIndex = 5 });
  10.         constellations.Add(new Constellation() { Id = 7, Name = "Libra", Nick = "天秤座‌", Desc = "09-23至10-23", ImgIndex = 6 });
  11.         constellations.Add(new Constellation() { Id = 8, Name = "Scorpio", Nick = "天蝎座", Desc = "10-24至11-22", ImgIndex = 7 });
  12.         constellations.Add(new Constellation() { Id = 9, Name = "Sagittarius", Nick = "射手座", Desc = "11-23至12-21", ImgIndex = 8 });
  13.         constellations.Add(new Constellation() { Id = 10, Name = "Capricorn", Nick = "摩羯座", Desc = "12-22至01-19", ImgIndex = 9 });
  14.         constellations.Add(new Constellation() { Id = 11, Name = "Aquarius", Nick = "水瓶座", Desc = "01-20至01-18", ImgIndex = 10 });
  15.         constellations.Add(new Constellation() { Id = 12, Name = "Pisces", Nick = "双鱼座", Desc = "02-19至03-20", ImgIndex = 11 });
  16. }
  17. public List<Constellation> QueryConstellations()
  18. {
  19.         return this.constellations;
  20. }
复制代码
在Form表单的Load变乱中,获取列表并赋值给ListView控件,如下所示:
  1. private void FrmList2_Load(object sender, EventArgs e)
  2. {
  3.         //1.先获取图像,初始化ImageList列表
  4.         var images = Directory.GetFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Constellation"));
  5.         images = images.OrderBy(item => item).ToArray();//排序
  6.         foreach (var image in images)
  7.         {
  8.                 this.imgList.Images.Add(Image.FromFile(image));
  9.         }
  10.         this.imgList.ImageSize = new Size(100, 100);
  11.         //2.绑定ListView
  12.         this.lvConstellations.LargeImageList = this.imgList;
  13.         this.lvConstellations.MultiSelect = false;
  14.         this.lvConstellations.View = View.LargeIcon;
  15.         //3.初始化ListView中的Items项
  16.         var constellations = sqlDalHelper.QueryConstellations();
  17.         if (constellations.Count > 0)
  18.         {
  19.                 foreach (var constellation in constellations)
  20.                 {
  21.                         this.lvConstellations.Items.Add(new ListViewItem(constellation.Nick, constellation.ImgIndex));
  22.                 }
  23.         }
  24.         //如果3,1,2的顺序可能会导致ListView中的图像不显示。
  25. }
复制代码
当ListView控件选择时,表现星座的大图和详细信息,如下所示:
  1. private void lvConstellations_SelectedIndexChanged(object sender, EventArgs e)
  2. {
  3.         if (this.lvConstellations.SelectedIndices.Count < 1)
  4.         {
  5.                 return;
  6.         }
  7.         int index = this.lvConstellations.SelectedIndices[0];
  8.         var constellation = this.sqlDalHelper.QueryConstellations()[index];
  9.         if (constellation != null)
  10.         {
  11.                 this.lblName.Text = constellation.Name;
  12.                 this.lblNick.Text = constellation.Nick;
  13.                 this.lblDesc.Text = constellation.Desc;
  14.                 this.pictureBox1.Image = this.imgList.Images[constellation.ImgIndex];
  15.                 this.pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
  16.         }
  17. }
复制代码
 此中星座图片从网上下载完成后,放在步调根目次下,如下所示:

运行步调,如下所示:

 以上就是《基于.NET的Windows窗体编程之WinForms列表控件》的全部内容,旨在抛砖引玉,一起学习,共同进步。
 

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表