动手做ASP.NET 2.0服务器端控件——AutoCheckTreeView(二)接口设计

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

 

讨论完了功能,我们来思考一下这个控件应该怎么设计。

1,给控件取个名字吧,因为一开始小凡只是考虑了自动勾选功能,所以就叫它AutoCheckTreeView。

2,显然继承自TreeView要比重新做一个更方便,那好,AutoCheckTreeView : TreeView就这么决定了。

3,它要开放一些什么新增接口吗?想一下,有的时候需要自动勾选功能,有的时候不需要自动勾选,那应该留下一个开关属性。

4,数据绑定,那比如要重载DataSource属性和DataBind()方法喽。

5,我们不能要求用户必须以规定的格式数据源来绑定我们的控件,所以,我们需要用户告诉我们,哪个字段或者属性代表主键,哪个字段或者属性代表父主键,并且就像DropDownList一样,要有一个TextMember来告诉我们到时候节点显示哪个字段里面的内容。

6,如果绑定的数据源是DataSet,那我们还需要知道是绑定其中是哪个表。

7,为了节省用户劳动,我们可以把节点选择后的动作TreeNodeSelectAction添加作为一个公开属性,当绑定数据后,我们就可以把节点生成为该类型。

因此,所有的接口属性和公开方法就是如下:

  1. #region 变量
  2.         private string dataPropertyName = String.Empty;
  3.         /// <summary>
  4.         /// 获取和设置单条数据中用于结构关系的列名或者属性名
  5.         /// </summary>
  6.         [Description("单条数据中用于结构关系的列名或者属性名"), DefaultValue("")]
  7.         public string DataPropertyName
  8.         {
  9.             get
  10.             {
  11.                 return ViewState["dataPropertyName"] == null ? dataPropertyName : ViewState["dataPropertyName"].ToString();
  12.             }
  13.             set
  14.             {
  15.                 dataPropertyName = value;
  16.                 ViewState["dataPropertyName"] = value;
  17.             }
  18.         }
  19.         private string dataParentPropertyName = String.Empty;
  20.         /// <summary>
  21.         /// 获取和设置单条数据中用于结构关系的父数据列名或者属性名
  22.         /// </summary>
  23.         [Description("单条数据中用于结构关系的父数据列名或者属性名"), DefaultValue("")]
  24.         public string DataParentPropertyName
  25.         {
  26.             get
  27.             {
  28.                 return ViewState["dataParentPropertyName"] == null ? dataParentPropertyName : ViewState["dataParentPropertyName"].ToString();
  29.             }
  30.             set
  31.             {
  32.                 dataParentPropertyName = value;
  33.                 ViewState["dataParentPropertyName"] = value;
  34.             }
  35.         }
  36.         private string tableName = String.Empty;
  37.         /// <summary>
  38.         /// 获取和设置表名称,用于当数据源为DataSet类型时
  39.         /// </summary>
  40.         [Description("表名称,用于当数据源为DataSet类型时"), DefaultValue("")]
  41.         public string TableName
  42.         {
  43.             get
  44.             {
  45.                 return ViewState["tableName"] == null ? tableName : ViewState["tableName"].ToString();
  46.             }
  47.             set
  48.             {
  49.                 tableName = value;
  50.                 ViewState["tableName"] = value;
  51.             }
  52.         }
  53.         private string textMember = String.Empty;
  54.         /// <summary>
  55.         /// 获取和设置数据绑定时用户设置TEXT值的字段或属性名
  56.         /// </summary>
  57.         [Description("数据绑定时用户设置TEXT值的字段或属性名"), DefaultValue("")]
  58.         public string TextMember
  59.         {
  60.             get
  61.             {
  62.                 return ViewState["textMember"] == null ? textMember : ViewState["textMember"].ToString();
  63.             }
  64.             set
  65.             {
  66.                 textMember = value;
  67.                 ViewState["textMember"] = value;
  68.             }
  69.         }
  70.         private Object dataSource = null;
  71.         /// <summary>
  72.         /// 设置和获取数据源,已重写
  73.         /// </summary>
  74.         [Description("数据源,已重写"), DefaultValue(null)]
  75.         public new Object DataSource
  76.         {
  77.             get
  78.             {
  79.                 return ViewState["dataSource"] == null ? dataSource : ViewState["dataSource"];
  80.             }
  81.             set
  82.             {
  83.                 dataSource = value;
  84.                 ViewState["dataSource"] = value;
  85.             }
  86.         }
  87.         TreeNodeSelectAction nodeSelectAction = TreeNodeSelectAction.Select;
  88.         /// <summary>
  89.         /// 设置和获取树节点选择后将引发事件
  90.         /// </summary>
  91.         [Description("树节点选择后将引发事件"), DefaultValue(TreeNodeSelectAction.Select)]
  92.         public TreeNodeSelectAction NodeSelectAction
  93.         {
  94.             get
  95.             {
  96.                 return ViewState["nodeSelectAction"] == null ? nodeSelectAction : (TreeNodeSelectAction)ViewState["nodeSelectAction"];
  97.             }
  98.             set
  99.             {
  100.                 nodeSelectAction = value;
  101.                 ViewState["nodeSelectAction"] = value;
  102.             }
  103.         }
  104.         private bool isAutoCheck = false;
  105.         /// <summary>
  106.         /// 设置和获取是否自动改变父子节点勾选状态
  107.         /// </summary>
  108.         [Description("是否自动改变父子节点勾选状态"), DefaultValue(false)]
  109.         public bool IsAutoCheck
  110.         {
  111.             get
  112.             {
  113.                 return ViewState["isAutoCheck"] == null ? isAutoCheck : (bool)ViewState["isAutoCheck"];
  114.             }
  115.             set
  116.             {
  117.                 isAutoCheck = value;
  118.                 ViewState["isAutoCheck"] = value;
  119.             }
  120.         }
  121.         #endregion
  1.         /// <summary>
  2.         /// 将数据源进行绑定并显示
  3.         /// </summary>
  4.         public void BindData()

幸好TreeView是支持ViewState的,我们要将这些属性值信息记录在ViewState中,这样页面回传之后就不需要用户重新赋值绑定了。

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