C#无限栏目分级程序代码分享 好东西

 更新时间:2006年12月28日 00:00:00   作者:  

C#无限栏目分级程序代码分享[3] 核心代码放送之移动栏目

#region 移动栏目
  public int moveClass(string table,int classid,int target)
  {
   if (!checkExist(table,classid) )
    return 1;//要移动的栏目不存在
   if(target!=0)
   {
    if(!checkExist(table,target))
     return 2;//目标栏目不存在
   }

   //要移动的类别的所有的子栏目
   string moveclassids;  
   moveclassids=getChildren(table,classid);
   string[] arr=moveclassids.Split('','');  
   string temp="," + moveclassids;
   if (temp.IndexOf("," + target.ToString())!=-1)
    return 3;//不能指定该类别的下属类别作为所属类别

   string sql;

   #region //先处理要移动的栏目的信息
   string parentpath="";
   int orderid=0,rootid=0,previd=0,nextid=0,depth=0,parentid=0,child=0;
   int last_orderid=0;
   sql="select * from "+ table + " where classid=" + classid;
   IDataReader dr=base.getdr(sql);
   if (dr.Read() )
   {
    parentpath=dr["parentpath"].ToString();
    orderid=(int)dr["orderid"];
    rootid=(int)dr["rootid"];
    previd=(int)dr["previd"];
    nextid=(int)dr["nextid"];
    depth=(int)dr["depth"];
    parentid=(int)dr["parentid"];
    child=(int)dr["child"];
   }
   dr.Close();
   dr.Dispose();

   if(depth>0)
    //更新父系栏目的子栏目数目
    base.exesql("update "+ table +" set child=child-1 where ClassID=" + parentid);

   //修改上一类别的NextID和下一类别的PrevID
   if (previd>0)
    base.exesql("update "+ table +" set NextID=" + nextid + " where ClassID=" + previd);
   if (nextid>0)
    base.exesql("update "+ table +" set PrevID=" + previd + " where ClassID=" + nextid);

   //得到要移动的栏目的子栏目里最大的orderid
   if(child>0)
   {
    sql="select max(orderid) from " + table + " where classid in (" + moveclassids + ")";
    last_orderid=(int)base.getvalue(sql);
    //处理要移动的类别树后面的栏目的orderid,全部-(arr.Length+1)
    base.exesql("update " + table + " set orderid=orderid-" + (arr.Length+1) + " where orderid>" + last_orderid);
   }
   else
   {
    last_orderid=orderid;
    //处理要移动的类别树后面的栏目的orderid,全部-1
    base.exesql("update " + table + " set orderid=orderid-1 where orderid>" + last_orderid);
   }

   

   #endregion

   #region//处理目标类别的信息
   string target_parentpath="0";
   int target_orderid=0,target_rootid=0,target_previd=0,target_nextid=0,target_depth=0,target_parentid=0,target_child=0;
   int target_last_child_classid=0;
   int target_last_orderid=0;
   string target_children="";

   #region//是不是作为一级栏目
   if(target>0)
   {
    sql="select * from "+ table + " where classid=" + target;
    dr=base.getdr(sql);
    if (dr.Read() )
    {
     target_parentpath=dr["parentpath"].ToString()+"," + target;//新的父系路径
     target_orderid=(int)dr["orderid"];
     target_rootid=(int)dr["rootid"];
     target_previd=(int)dr["previd"];
     target_nextid=(int)dr["nextid"];
     target_depth=(int)dr["depth"];
     target_parentid=(int)dr["parentid"];
     target_child=(int)dr["child"];
    }
    dr.Close();
    dr.Dispose();
    //更新目标栏目的子栏目数目
    base.exesql("update "+ table +" set child=child+1 where ClassID=" + target);

    target_children=this.getChildren(table,target);
    if (target_child>0)
    {
     //如果有子栏目找到最后一个子栏目的orderid
     sql="select max(orderid) from " + table + " where classid in (" + target_children + ")";
     target_last_orderid=(int)base.getvalue(sql);
     //找到目标类别的一级子类别最后一个classid,并更新它的nextid=classid
     sql="select classid from " + table + " where parentid=" + target + " order by orderid desc";
     object temp_=base.getvalue(sql);
     target_last_child_classid=(int)temp_;
     base.exesql("update " + table + " set nextid=" + classid + " where classid=" + target_last_child_classid);
    }
    else
    {
     target_last_orderid=target_orderid;
     target_last_child_classid=0;
    }
    if (child>0)
     //处理目标类别树后面的栏目的orderid,全部加上(arr.Length+1)
     base.exesql("update " + table + " set orderid=orderid + " + (arr.Length+1) + " where orderid>" + target_last_orderid);
    else
     base.exesql("update " + table + " set orderid=orderid + 1 where orderid>" + target_last_orderid);
   }
   else//作为一级类别
   {
    //重新定义target_depth
    target_depth=-1;
    //重新定义target_last_orderid
    if (child >0)
     sql="select max(orderid) from " + table + " where classid not in (" + (classid + "," + moveclassids) + ")";
     //_______________________________________________________________这里解决当要移动的栏目有子栏目的时候,orderid出现的小问题.
    else
     sql="select max(orderid) from " + table + " where classid<>" + classid;//有可能要移动的类别在最后一个,这里把它排除
    object _temp;
    _temp=base.getvalue(sql);
    if(_temp!=null)
     target_last_orderid=(int)_temp;
    //重新定义target_rootid
    target_rootid=classid;

    //得到previd
    sql="select max(classid) from " + table + " where parentid=0 and classid<>" + classid;
    _temp=base.getvalue(sql);
    if(_temp!=null)
    {
     target_previd=(int)_temp;
     //修改上一个一级栏目的nextid
     base.exesql("update " + table + "set nextid="+ classid + " where classid=" + target_previd);
    }
   }
   #endregion

   #endregion

   #region 综合处理

   if (child>0)//要移动的类别有子栏目
   {
    int depth_d=0;//depth的减量
    if(target==0)
     depth_d=depth;
    else
     depth_d=depth-(target_depth+1);
    //更新字栏目的父系路径为 target_parentpath + "," + classid ,orderid
    for(int x=0;x<arr.Length;x++)
    {
     //注意这里要解决depth和parentpath的嵌套问题,即要移动的类别的子类别还有子类别
     string path;
     sql="select parentpath from " + table + " where classid=" + arr[x];
     path=base.getvalue(sql).ToString();
     path=path.Replace((parentpath + "," + classid),(target_parentpath + "," + classid));
     base.exesql("update " + table +" set depth=depth - "+ depth_d +", parentpath=''"+ path + "'',rootid="+ target_rootid +",orderid="+ (target_last_orderid + x + 2) +" where classid=" + arr[x]);
     //__________________________________________________________________________________________________________________________________________________________//其父系栏目已经加1,这里至少加2
    }
   }

   if (target>0)//更新要移动的类别的parentpath和previd,rootid,orderid,parentid,depth,nextid,target_previd
    base.exesql("update " + table +" set nextid=0,depth="+ (target_depth+1) +",parentid="+ target +", parentpath=''"+ target_parentpath +"'',previd="+ target_last_child_classid +" ,rootid="+ target_rootid +",orderid="+ (target_last_orderid+1) +" where classid =" + classid);
   else//区别在于previd
    base.exesql("update " + table +" set previd="+ target_previd +",nextid=0,depth="+ (target_depth+1) +",parentid="+ target +", parentpath=''"+ target_parentpath +"'' ,rootid="+ target_rootid +",orderid="+ (target_last_orderid+1) +" where classid =" + classid);

   #endregion

   return 0;
  }
  #endregion
详细请看原文:http://ent.omeweb.com/book/content.aspx?id=1802
演示地址:http://ent.omeweb.com/catalog/index.html

相关文章

  • C#传值方式实现不同程序窗体间通信实例

    C#传值方式实现不同程序窗体间通信实例

    Form2构造函数中接收一个string类型参数,即Form1中选中行的文本,将Form2的TextBox控件的Text设置为该string,即完成了Form1向Form2的传值
    2013-12-12
  • C#验证身份证的函数

    C#验证身份证的函数

    因做项目需要,参考网上资料写了一个身份证验证的C#方法,本方法是在VS2005[C/S] 下写的。前面2个是网友们的实现方法,第三个才是项目中使用的哦,小伙伴们参考下吧。
    2015-05-05
  • 利用WinForm实现上左右布局的方法详解

    利用WinForm实现上左右布局的方法详解

    现在90%的管理系统都是在用上左右这种布局方式,真可谓是经典永流传。本文将利用WinForm实现上左右布局这一布局效果,感兴趣的可以学习一下
    2022-09-09
  • c#使用netmail方式发送邮件示例

    c#使用netmail方式发送邮件示例

    这篇文章主要介绍了c#使用netmail方式发送邮件的示例,大家参考使用吧
    2014-01-01
  • C#连接mysql的方法【基于vs2010】

    C#连接mysql的方法【基于vs2010】

    这篇文章主要介绍了C#连接mysql的方法,基于vs2010平台较为详细的讲述了C#操作mysql所需的组件下载、安装及连接mysql操作实现代码,需要的朋友可以参考下
    2017-03-03
  • C#泛型约束的深入理解

    C#泛型约束的深入理解

    本篇文章是对C#中的泛型约束进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#中Timer定时器类的简单使用

    C#中Timer定时器类的简单使用

    定时器就是经过固定时间,执行固定任务,本文主要介绍了C#中Timer定时器类的简单使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • c#继承与多态使用示例

    c#继承与多态使用示例

    继承是面向对象程序设计的主要特征之一,允许重用现有类去创建新类的过程。下面使用示例学习一下c#继承与多态
    2014-01-01
  • C#的winform控件命名规范

    C#的winform控件命名规范

    这篇文章主要介绍了C#的winform控件命名规范,对各种常用控件的命名规范做了较为详细的讲解,需要的朋友可以参考下
    2015-01-01
  • Unity排行榜优化滚动效果

    Unity排行榜优化滚动效果

    这篇文章主要为大家详细介绍了Unity排行榜优化滚动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07

最新评论