无限分级的递归算法, 另附顺序调整

8 篇文章 0 订阅
2 篇文章 0 订阅

 

首先是数据库Category, 表名:cats
catId: 类别的ID,标识自增长
catName: 类别名称
parentId: 对应其上级类别的catId
catNo: 序号 

然後是数据库操作类
参考:SQL数据库常用操作类

最后是Default3.aspx.cs (前台页面就是2个控件,省略了...)

using  System;
using  System.Data;
using  System.Configuration;
using  System.Collections;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;

public   partial   class  Default3 : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
        
if (!IsPostBack)
        
{
            bind();
        }

    }

    
protected void bind()
    
{
        
//原始DataTable:orgDt
        DataTable orgDt = db.dt("select * from cats");
        
//自定义一个空的DataTable:listDt, 用以将orgDt一行一行的按顺序插入之
        DataTable listDt = new DataTable("listDt");
        listDt.Columns.Add(
"catId"typeof(int));
        listDt.Columns.Add(
"catName"typeof(string));
        listDt.Columns.Add(
"parentId"typeof(int));
        listDt.Columns.Add(
"catNo"typeof(int));
        
//开始递归
        initList(listDt, 0, orgDt, "");

        
//绑定数据
        GridView1.DataSource = listDt;
        GridView1.DataBind();
        ListBox1.DataSource 
= listDt;
        ListBox1.DataTextField 
= "catName";
        ListBox1.DataBind();
    }


    
//递归函数
    protected void initList (DataTable listDt,int parentId, DataTable orgDt, string indent)
    
{
        
//将某一级的(parentId)的行取出转换成DataRow[] currRows, 待用
        DataRow[] currRows = orgDt.Select("parentId=" + parentId.ToString(), "parentId ASC");
        
//只要当前级下有子级, Length>0, 就会继续For从而继续递归
        int count = currRows.Length;
        
//将每一行转换成Array, 然後插入到listDt
        for (int i = 0; i < count; i++)
        
{
            
//转换
            object[] currRow = currRows[i].ItemArray;
            
//插入到listDt
            listDt.Rows.Add(currRow);
            
//开始递归
            initList(listDt, Convert.ToInt32(currRow[0].ToString()), orgDt, "");
        }

    }



    
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    
{
        
if (e.Row.RowType == DataControlRowType.DataRow)
        
{
            
int parentId = Convert.ToInt32(e.Row.Cells[3].Text);
            
if (parentId == 0)
            
{
                e.Row.ControlStyle.BackColor 
= System.Drawing.Color.Orange;
            }

            
else
            
{
                e.Row.Attributes.Add(
"style""background-color:silver");
            }
 
            e.Row.Attributes.Add(
"onmouseover""c = this.style.backgroundColor; this.style.backgroundColor='yellow';");
            e.Row.Attributes.Add(
"onmouseout""this.style.backgroundColor=c");
            Label lb1 
= (Label)e.Row.FindControl("Label1");
            lb1.Text 
= "ok";
        }

    }

    
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
    
{
        
if (e.Row.RowType == DataControlRowType.DataRow)
        
{

        }

    }

}

下面页是另外一种写法,和调整顺序的方法~

 

Default.aspx

<% @ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default"  %>

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >

< html  xmlns ="http://www.w3.org/1999/xhtml"   >
< head  runat ="server" >
    
< title > Category </ title >
</ head >
< body >
    
< form  id ="form1"  runat ="server" >
    
< div >
        
< asp:TextBox  ID ="TextBox1"  runat ="server" ></ asp:TextBox >
        
< asp:DropDownList  ID ="DropDownList1"  runat ="server" >
        
</ asp:DropDownList >< asp:Button  ID ="Button1"  runat ="server"  OnClick ="Button1_Click"
            Text
="ADD"   />
        
< asp:Button  ID ="Button2"  runat ="server"  OnClick ="Button2_Click"  Text ="DEL"   />
        
< asp:Button  ID ="Button3"  runat ="server"  OnClick ="Button3_Click"  Text ="UP"   />
        
< asp:Button  ID ="Button4"  runat ="server"  Text ="Down"  OnClick ="Button4_Click"   /> &nbsp; < br  />
        
< asp:Button  ID ="Button5"  runat ="server"  OnClick ="Button5_Click"  Text ="先选择要Insert的项"   /> &nbsp;
        
< asp:Button  ID ="Button6"  runat ="server"  Enabled ="False"  OnClick ="Button6_Click"  Text ="然后选择Into的目标"   />
        
< br  />
        
</ div >
    
</ form >
</ body >
</ html >

 

Default.aspx.cs

using  System;
using  System.Data;
using  System.Configuration;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;
// using System.Data.SqlClient;

public   partial   class  _Default : System.Web.UI.Page 
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
        
if (!IsPostBack)
        
{
            bind();
        }

    }

    
public void bind()
    
{
        
//获取数据集
        DataSet ds = new DataSet();
        ds 
= db.ds("select * from cats order by catNo");
        BindingCWAList(DropDownList1, ds);
    }

    
private void BindingCWAList(DropDownList ddlID, DataSet ds) //ddlID是DropDownList控件的ID 
    {
        DropDownList1.Items.Clear();
        
//此处创建顶极分类,Value=0(如不需要,可以删除此行) 
        ddlID.Items.Add(new ListItem("一级分类""0"));
        
//开始递归
        InitList(ddlID, 0, ds, "");
    }



    
private void InitList(DropDownList ddlID, int parentID, DataSet catagoryDS, string indent)
    
{
        
//Select后边的是DataSet里面的列名
        
//第一轮中, 选择DS中catId=0的Row生成DataRow[] currRows; 第2轮中选择catId=1
        DataRow[] currRows = catagoryDS.Tables[0].Select("parentId=" + parentID.ToString(), "parentId ASC");
        
// count = 第一轮中 根Cat的数量, ADD到List中
        
//第2轮中, catId=1的子项的数量,如果为0之后for将不会执行, 终于!
        int count = currRows.Length;
        DataRow catagoryRow;
        
for (int i = 0; i < count; i++)
        
{
            
//历遍并addItem
            catagoryRow = currRows[i];
            ListItem item;
            
if (indent.Length > 0)//通过indent>0来判断是否是子项, 若是则加上">"
            {
                item 
= new ListItem(Server.HtmlDecode(indent + ">" + catagoryRow["CatName"].ToString() + " - No." + catagoryRow["CatNo"].ToString()), catagoryRow["catId"].ToString());
            }

            
else
            
{
                item 
= new ListItem(Server.HtmlDecode(indent + catagoryRow["CatName"].ToString()), catagoryRow["catId"].ToString());
            }

            ddlID.Items.Add(item);
            
//开始第2轮递归
            InitList(ddlID, Int32.Parse(catagoryRow["catId"].ToString()), catagoryDS, indent + "&nbsp;&nbsp;");
        }

    }



    
protected void Button1_Click(object sender, EventArgs e)
    
{
        
string catName = TextBox1.Text;
        
int parentId = Convert.ToInt32(DropDownList1.SelectedValue);
        
int maxNo = Convert.ToInt32(db.cell("select max(catNo) from cats"))+1;
        
string qs;
        qs 
= "insert into cats (catName,parentId,catNo) values ('" + catName + "'," + parentId + "," + maxNo + ")";
        
bool s = db.insert(qs);
        
if (s)
        
{
            Response.Write(
"ok");
            bind();
        }

        
else
            Response.Write(
"failed");
    }

    
protected void Button2_Click(object sender, EventArgs e)
    
{
        
if (DropDownList1.SelectedIndex > 0)
        
{
            
int id = Convert.ToInt32(DropDownList1.SelectedValue);
            
string qss = "select * from cats where parentId =" + id;
            
if (db.exits(qss))
            
{
                Response.Write(
"请先清空其子项");
            }

            
else
            
{
                
string qs = "delete from cats where catId=" + id;
                
if (db.insert(qs))
                
{
                    bind();
                }

            }

        }

        
else
        
{
            Response.Write(
"<script>alert('请选择要删除的项')</script>");
        }

    }

    
protected void Button3_Click(object sender, EventArgs e)
    
{
        
if (DropDownList1.SelectedIndex > 0)
        
{
            
int id = Convert.ToInt32(DropDownList1.SelectedValue);
            
//获得此parentId和catNo
            int parentId = Convert.ToInt32(db.cell("select parentId from cats where catId=" + id));
            
int catNo = Convert.ToInt32(db.cell("select catNo from cats where catId=" + id));
            
//获得同类同级(parentId=" + parentId+") 当前项及之前项(catNo<="+catNo+") 倒序 by catNo desc 的前2位top 2
            string qs = "select top 2 * from cats where (parentId=" + parentId + ")AND(catNo<=" + catNo + ") order by catNo desc";
            DataRow[] drs 
= db.ds(qs).Tables[0].Select();
            
if (drs.Length == 2)
            
{
                
//第一位[0]是当前项
                string cCatNo = drs[0]["catNo"].ToString();
                
string pCatNo = drs[1]["catNo"].ToString();
                Response.Write(
"当前是" + cCatNo + " | 下一个是" + pCatNo);
                
string pqs = "update cats set catNo ='" + cCatNo + "' where catNo='" + pCatNo + "'";
                
string cqs = "update cats set catNo='" + pCatNo + "' where catId =" + id;
                
if (db.insert(pqs + ";" + cqs))
                    bind();
                DropDownList1.SelectedValue 
= id.ToString();
            }

            
else
            
{
                Response.Write(
"已经是第一位了好不好?");
            }

        }

    }

    
protected void Button4_Click(object sender, EventArgs e)
    
{
        
if (DropDownList1.SelectedIndex > 0)
        
{
            
int id = Convert.ToInt32(DropDownList1.SelectedValue);
            
int parentId = Convert.ToInt32(db.cell("select parentId from cats where catId=" + id));
            
int catNo = Convert.ToInt32(db.cell("select catNo from cats where catId=" + id));
            
string qs = "select top 2 * from cats where (parentId=" + parentId + ")AND(catNo>=" + catNo + ") order by catNo asc";
            DataRow[] drs 
= db.ds(qs).Tables[0].Select();
            
if (drs.Length == 2)
            
{
                
string cCatNo = drs[0]["catNo"].ToString();
                
string pCatNo = drs[1]["catNo"].ToString();
                Response.Write(
"当前是" + cCatNo + " | 下一个是" + pCatNo);
                
string pqs = "update cats set catNo ='" + cCatNo + "' where catNo='"+pCatNo+"'";
                
string cqs = "update cats set catNo='"+pCatNo+"' where catId ="+id;
                
if (db.insert(pqs + ";" + cqs))
                    bind();
                DropDownList1.SelectedValue 
= id.ToString();
            }

            
else
            
{
                Response.Write(
"已经是最后一位了好不好?");
            }

        }

    }

    
protected void Button5_Click(object sender, EventArgs e)
    
{
        
if (DropDownList1.SelectedIndex > 0)
        
{
            Session[
"id"= DropDownList1.SelectedValue;
            Button6.Enabled 
= true;
        }

        
else
        
{
            Response.Write(
"8能移动  -  -");
        }

    }

    
protected void Button6_Click(object sender, EventArgs e)
    
{
        
string qs = "update cats set parentId = " + Convert.ToInt32(DropDownList1.SelectedValue) + " where catId =" + Convert.ToInt32(Session["id"]);
        
if (db.insert(qs))
        
{
            bind();
            Button6.Enabled 
= false;
            Session[
"id"= null;
        }

    }

}

顺序调整的方式可能不太成熟,希望经验人士多多指教 ^ ^

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值