动手做ASP.NET 2.0服务器端控件——AutoCheckTreeView(一)功能讨论

感谢谭振林先生所著《道不远人——深入解析ASP.NET 2.0控件开发》

 ASP.NET现在使用的朋友是越来越多了,而其中一些很“方便”的控件事实上在实际使用过程中却不是那么方便。还好,我们有办法改善它们,或者是继承现有控件后扩展,或者是继承Control或者CompositeControl重写一个新的控件。这些方法请参见《道不远人》,小凡用在此书中学到的知识重写了很多控件,今天为大家介绍——AutoCheckTreeView

顾名思义,AutoCheckTreeView是由TreeView继承而来。相信大家都用过TreeView,好处自然不用多说,那我们来回忆批斗一下这个控件的不足之处吧。

一,TreeView控件的节点勾选框不支持父子节点自动勾选,例如下面这个树形结构,并且节点存在CheckBox

--父1

   --子1

      --孙1

   --子2

      --孙2

      --孙3

如果勾选了“子1”节点,“父1”和“孙1”节点是不能自动勾选的。同样的,如果一个节点取消勾选,该节点的子节点也不能全部取消勾选。诚然,有些时候是不需要这样的功能的,可是,如果需要呢?怎么办?小凡的开发过程中,大概这种需求是55分成。

二,TreeView不支持DataSource的绑定功能

TreeView的DataSource是由父控件继承而来,但是,这个属性在TreeView中毫无用处,浪费了一大资源。而且显然,微软也考虑的并不足够。相信大家在项目开发过程中,很多时候都使用树形结构表来记录树形数据,最简单的情况[菜单主键,父菜单主键,菜单名称],这样就定义成功了一个菜单树形结构。好吧,当做维护界面时,当然就会选择TreeView来进行维护比较方便。然而,如何把数据库数据映射到界面上?现在的做法,唯有使用递归或者其它方法来一层一层架构。如果只有一个界面,那还不错,如果又有其它树形结构数据呢?继续做一次重复代码?不!我们做一个控件支持这样的功能,所有的问题都解决了!

在C#中,树形结构一般会出现下面的两种情况:

1)DataTable记录树形结构

  1. DataSet ds = new DataSet();
  2. DataTable dt = new DataTable("table");
  3. ds.Tables.Add(dt);
  4. dt.Columns.Add("name");
  5. dt.Columns.Add("value");
  6. dt.Columns.Add("id");
  7. dt.Columns.Add("pid");
  8. dt.Rows.Add("子1""sdf", 3, 1);
  9. dt.Rows.Add("父1""sdf", 1, 0);
  10. dt.Rows.Add("子2""sdf", 5, 2);
  11. dt.Rows.Add("孙1""sdf", 4, 3);
  12. dt.Rows.Add("父2""sdf", 2, 0);

2)使用扩展自IEnumerable的数据结构,并且对象的Property记录来对应

首先定义一个Class结构

  1. [Serializable]
  2. class A
  3. {
  4.     private string name;
  5.     public string Name
  6.     {
  7.         get { return name; }
  8.         set { name = value; }
  9.     }
  10.     private string value;
  11.     public string Value
  12.     {
  13.         get { return this.value; }
  14.         set { this.value = value; }
  15.     }
  16.     private int id;
  17.     public int Id
  18.     {
  19.         get { return id; }
  20.         set { id = value; }
  21.     }
  22.     private int pid;
  23.     public int Pid
  24.     {
  25.         get { return pid; }
  26.         set { pid = value; }
  27.     }
  28.     public A(string name, string value, int id, int pid)
  29.     {
  30.         this.name = name;
  31.         this.value = value;
  32.         this.id = id;
  33.         this.pid = pid;
  34.     }
  35. }

然后实例化对象,赋值并放入一个ArrayList中

  1. ArrayList set = new ArrayList();
  2. set.Add(new A("子1""sdf", 3, 1));
  3. set.Add(new A("父1""sdf", 1, 0));
  4. set.Add(new A("子2""sdf", 5, 2));
  5. set.Add(new A("孙1""sdf", 4, 3));
  6. set.Add(new A("父2""sdf", 2, 0));

在手上有这样的DataSet(DataTable)或者ArrayList情况下,我们希望能为TreeView设置DataSource后调用DataBind()方法即可完成数据绑定和显示功能。

所以,我们要做的TreeView需要两大功能:节点和其父子自动勾选和取消勾选,数据绑定

原文地址:https://www.cnblogs.com/vanpan/p/3583050.html