关闭

多级目录设计思想

1469人阅读 评论(3) 收藏 举报
一、基本设计思路
改进表结构:可以实现无限级分目录, 根据网站需求可限制最多分级目录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 "目录添加成功";
  }
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:97448次
    • 积分:1671
    • 等级:
    • 排名:千里之外
    • 原创:65篇
    • 转载:10篇
    • 译文:0篇
    • 评论:11条
    最新评论