多级目录设计思想

原创 2006年05月24日 22:27:00
一、基本设计思路
改进表结构:可以实现无限级分目录, 根据网站需求可限制最多分级目录5级目录
ID 主键
ENName, ENNameCHNName1JapanNameKoreaName 分类名称
ParentID 父节点ID (ID成父子关系) ParentID 0 时表示根目录
ParentID 等于 ID 的值时,表示对应ID的子目录
Depth 当前结点分类级数(深度) 如一级,二级,三级
ParentStr 所有父节点ID
Child 共计多少一级子目录无子目录值为0
RootID 根节点分类ID 用于排序
SortType 类目录类型
SortOrder 排序
SortType 目录分类标识
如以下示意 (图1)
ID
Name
ParentID
ParentStr
Depth
RootID
Child
SortOrder
SortType
1
中国
0
0
0
1
2
1
Area
3
广东省
1
1
1
1
1
2
Area
4
深圳市
3
1,3
2
1
1
3
Area
5
江西省
1
1
1
1
0
5
Area
6
南山区
4
1,3,4
3
1
0
4
Area
7
日本
0
0
0
2
1
6
Area
8
大阪
7
7
1
2
0
7
Area
如值取6代表 中国->广东省->深圳市->南山区
 
关键函数
新增目录函数
string InertNewSort( int intSelectedSortID, string strSortType, string[] arrFieldName, string[] arrFieldValue)
参数说明:intSelectedSortID 当前选择要增加目录的ID如是根目录其值为0, strSortType 为识别对应目录的类别arrFieldName为对应目录名称,arrFieldValue为对应目录名称的取值。
主要设计思想:
示列如图1 如果增加新的根目录,ID值为数据库里Max(ID)加1如果Max(ID)不存在则为1,ParentID为0,ParentStr为0,Depth为0,RootID的取值方法与ID相同,Child为0,SortOrder 为取得的ID值。
如不为根目录,ID取值同上,ParentID为选中目录的ID值(对应的父目录ID),ParentStr为对应父目录的ParentStr加父目录的ID,如是根目录则为ParentStr加父目录的ID,Depth为对应父目录Depth值加1
RootID为对应父目录的RootID值
 
递归函数 void CheckAndFixSort(int intParentID, string strSortType)
在每一次更新数据后,用此函数来格式化Depth,Child,ParentStr,SortOrder 三个字段
无返回值
设置排序函数intSetSortOrder(int intID,string strGetType,string strSortType)
返回影响的行数
主要功能:设置前台显示的顺序(对同级目录排序) 每次设置排序只能移动一个单位
参数说明:intID 为当前要排序的ID , strGetType 为当前排序移动类别(GoUp 为向上移动,GoDown 为向下移动),strSortType 为识别对应目录的类别
 
主要设计思想:
示列如图1 如果要把江西省的排序排在广东省前(向上移动目录),先找出对应省份下有多少个子目录,并记录其Id值。
因为一个目录时基对应的所有子目录也要跟随其移动,如上图:江西省对应的所有子目录个数为 0 个,广东省其对应的子目录个数为为2个,各自加1后其值分别为1个与3个,然后对江西省的所有子目录包含基自身的SortOrder 值减去属于广东省目录的个数为3,再对广东省所有对应的子目录包含基自身的 SortOrder 值加上所有属于江西省目录的个数为1 即得到新的目录排序。如果要把广东省的排序排在江西省后(向下移动目录)方法相同。
主要函数:
  public void CheckAndFixSort(int intParentID, string strSortType, ref int intFixSortOrder)
  {
   DataSet ds = new DataSet();
   string strParentStr;
   // 初始化所有的根节点的 Depth, ParentStr 值
   if(intParentID == 0)
    _db.ExecuteAdapter("UPDATE TSortConfig SET Depth = 0,ParentStr = '0' WHERE SortType = '"+ strSortType +"' AND ParentID = 0");
   string strSelectSql = "SELECT ID,RootID,ParentStr,Depth FROM TSortConfig WHERE SortType = '"+ strSortType +"' AND ParentID ="+ intParentID +" ORDER BY RootID,SortOrder";
   ds =  _db.ExecuteAdapter( strSelectSql );
   foreach (DataRow myRow in ds.Tables[0].Rows)
   {
    if(myRow[2].ToString() != "0")
     strParentStr = myRow[2].ToString() +","+ myRow[0].ToString();
    else
     strParentStr = myRow[0].ToString();
    int intTemp = Int32.Parse(myRow[3].ToString()) + 1;
    string strUpdateSql = "UPDATE TSortConfig SET Depth = "+ intTemp +", ParentStr = '"+strParentStr+"', RootID = "+myRow[1]+" WHERE ParentID ="+myRow[0]+" AND SortType = '"+ strSortType +"'";
    
    // 更新所有下 ID = myRow[0] 子一级目录的 Depth, RootID 值
    int intChild = _db.ExecuteNonQuery( strUpdateSql );
    
    // 更新所有 ID = myRow[0] 的 Child, SortOrder 值 SortOrder 为参数传递入值
    _db.ExecuteAdapter( "UPDATE TSortConfig SET Child = "+intChild+", SortOrder = "+intFixSortOrder+" WHERE SortType = '"+ strSortType +"' AND ID="+ myRow[0]);
    intFixSortOrder++;
    
    // 递归调用 CheckAndFixSort 函数
    CheckAndFixSort(Int32.Parse(myRow[0].ToString()),strSortType, ref intFixSortOrder);
   }
  }
// 添加新目录
  public string InertNewSort( int intSelectedSortID, string strSortType, string[] arrFieldName, string[] arrFieldValue)
  {
   int intRootID = 0,intID = 0,intParentID = 0,intDepth = 0,intSortOrder = 0,intMaxRootID = 0;
   string strParentStr = "0";
   string[] arrParamName = new string[12];
   string[] arrParamValue = new string[12];
  
   #region 取相关数值
   if(intSelectedSortID != 0 )
   {
    string[] arrNewSortItems = GetNewSortItems(intSelectedSortID,strSortType);
    intRootID = Int32.Parse(arrNewSortItems[0].ToString());
    intParentID = Int32.Parse(arrNewSortItems[1].ToString());
    intDepth = Int32.Parse(arrNewSortItems[2].ToString());
    intSortOrder = Int32.Parse(arrNewSortItems[3].ToString());
    if(intDepth+1 > intMaxDepth )
    {
     return "最大深度为"+(intMaxDepth+1).ToString()+"级";
    }
    strParentStr = arrNewSortItems[4].ToString();
   }
   else
    intMaxRootID = GetMaxIdValue("RootID",strSortType);
   #endregion
   // 准备入库的数值
   intID = GetMaxIdValue( "ID",strSortType);
   if(intSelectedSortID != 0)
   {
    intDepth++;
    intSortOrder = intID;
    if (strParentStr.Equals("0"))
     strParentStr = intSelectedSortID.ToString();
    else
     strParentStr = strParentStr + "," + intSelectedSortID.ToString();
   }
   else
   {
    intDepth = 0;
    intRootID = GetMaxIdValue( "RootID",strSortType);
    intSortOrder = 0;
    intParentID = 0;
    strParentStr = "0";
   }
   #region 把数据存入数组
   
   arrParamName[0] = arrFieldName[0];
   arrParamName[1] = arrFieldName[1];
   arrParamName[2] = arrFieldName[2];
   arrParamName[3] = arrFieldName[3];
   arrParamName[4] = "SortType";
   arrParamName[5] = "Id";
   arrParamName[6] = "ParentID";
   arrParamName[7] = "ParentStr";
   arrParamName[8] = "Depth";
   arrParamName[9] = "RootID";
   arrParamName[10] = "Child";
   arrParamName[11] = "SortOrder";
   arrParamValue[0] = arrFieldValue[0];
   arrParamValue[1] = arrFieldValue[1];
   arrParamValue[2] = arrFieldValue[2];
   arrParamValue[3] = arrFieldValue[3];
   arrParamValue[4] = strSortType;
   arrParamValue[5] = intID.ToString();
   arrParamValue[6] = intParentID.ToString();
   arrParamValue[7] = strParentStr;
   arrParamValue[8] = intDepth.ToString();
   arrParamValue[9] = intRootID.ToString();
   arrParamValue[10] = "0";
   arrParamValue[11] = intSortOrder.ToString();
   #endregion
   int intReturnValue = InsertSort( arrParamName, arrParamValue );
   int intFixSortOrder = 1;
   CheckAndFixSort(0,strSortType,ref intFixSortOrder);
   return "目录添加成功";
  }

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

【JavaWeb-9】MVC设计模式、处理业务逻辑代码的分层思想、目录结构参照、实践案例

1、B/S也成为瘦客户端,C/S叫胖客户端。JavaWeb设计模式,第一种叫model1(JSP+useBean),基本已经废弃,教学的时候可以用用。第二种叫model2(JSP+servlet+ja...

python 多级目录压缩解压文件

咱向来就是拿来主意,也发个东西供同行“拿来”使用吧 咱信奉的就是少量的代码完成大量的工作,虽然代码不多,但还是要用大脑的。发出来供大家参考 功能: 支持中文路径,支持多级目录支持跨平台,在l...
  • sondx
  • sondx
  • 2011年09月30日 18:05
  • 3230

多级目录makefile例子

先看一下make前后的目录结构对比         makefile会自动生成需要的文件夹,各个模块下src/obj负责存放生成的 .o 文件,target用于存储生成的可执行文件,lib用于存储生...

ExpandableListView多级目录

  • 2014年08月01日 15:38
  • 1.32MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多级目录设计思想
举报原因:
原因补充:

(最多只允许输入30个字)