zoukankan      html  css  js  c++  java
  • 动手做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中,这样页面回传之后就不需要用户重新赋值绑定了。

  • 相关阅读:
    待整理[图片验证码的破解]
    关于反爬的思索[集合]
    关于showdoc的服务器部署[转]
    jQuery插件实现多图片和单图片上传
    FTP 图片上传
    多线程(临界点处理)
    Python可迭代对象、迭代器和生成器
    一文搞懂Python函数(匿名函数、嵌套函数、闭包、装饰器)!
    Python比较操作符、变量赋值、对象拷贝
    Python并发编程——多线程与协程
  • 原文地址:https://www.cnblogs.com/vanpan/p/3583049.html
Copyright © 2011-2022 走看看