首先是数据库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;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
public
partial
class
Default3 : System.Web.UI.Page
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
protected void Page_Load(object sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (!IsPostBack)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
bind();
}
}
protected void bind()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//原始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, "");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//绑定数据
GridView1.DataSource = listDt;
GridView1.DataBind();
ListBox1.DataSource = listDt;
ListBox1.DataTextField = "catName";
ListBox1.DataBind();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//递归函数
protected void initList (DataTable listDt,int parentId, DataTable orgDt, string indent)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//将某一级的(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++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//转换
object[] currRow = currRows[i].ItemArray;
//插入到listDt
listDt.Rows.Add(currRow);
//开始递归
initList(listDt, Convert.ToInt32(currRow[0].ToString()), orgDt, "");
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (e.Row.RowType == DataControlRowType.DataRow)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
int parentId = Convert.ToInt32(e.Row.Cells[3].Text);
if (parentId == 0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
e.Row.ControlStyle.BackColor = System.Drawing.Color.Orange;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
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)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (e.Row.RowType == DataControlRowType.DataRow)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
}
}
下面页是另外一种写法,和调整顺序的方法~
Default.aspx
<%
...
@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"
%>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<!
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<
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"
/>
<
br
/>
<
asp:Button
ID
="Button5"
runat
="server"
OnClick
="Button5_Click"
Text
="先选择要Insert的项"
/>
<
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
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
protected void Page_Load(object sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (!IsPostBack)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
bind();
}
}
public void bind()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//获取数据集
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
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
DropDownList1.Items.Clear();
//此处创建顶极分类,Value=0(如不需要,可以删除此行)
ddlID.Items.Add(new ListItem("一级分类", "0"));
//开始递归
InitList(ddlID, 0, ds, "");
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private void InitList(DropDownList ddlID, int parentID, DataSet catagoryDS, string indent)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//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++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//历遍并addItem
catagoryRow = currRows[i];
ListItem item;
if (indent.Length > 0)//通过indent>0来判断是否是子项, 若是则加上">"
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
item = new ListItem(Server.HtmlDecode(indent + ">" + catagoryRow["CatName"].ToString() + " - No." + catagoryRow["CatNo"].ToString()), catagoryRow["catId"].ToString());
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
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 + " ");
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
protected void Button1_Click(object sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
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)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Response.Write("ok");
bind();
}
else
Response.Write("failed");
}
protected void Button2_Click(object sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (DropDownList1.SelectedIndex > 0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
int id = Convert.ToInt32(DropDownList1.SelectedValue);
string qss = "select * from cats where parentId =" + id;
if (db.exits(qss))
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Response.Write("请先清空其子项");
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
string qs = "delete from cats where catId=" + id;
if (db.insert(qs))
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
bind();
}
}
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Response.Write("<script>alert('请选择要删除的项')</script>");
}
}
protected void Button3_Click(object sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (DropDownList1.SelectedIndex > 0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
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)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//第一位[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
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Response.Write("已经是第一位了好不好?");
}
}
}
protected void Button4_Click(object sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (DropDownList1.SelectedIndex > 0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
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)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
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
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Response.Write("已经是最后一位了好不好?");
}
}
}
protected void Button5_Click(object sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (DropDownList1.SelectedIndex > 0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Session["id"] = DropDownList1.SelectedValue;
Button6.Enabled = true;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Response.Write("8能移动 - -");
}
}
protected void Button6_Click(object sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
string qs = "update cats set parentId = " + Convert.ToInt32(DropDownList1.SelectedValue) + " where catId =" + Convert.ToInt32(Session["id"]);
if (db.insert(qs))
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
bind();
Button6.Enabled = false;
Session["id"] = null;
}
}
}
顺序调整的方式可能不太成熟,希望经验人士多多指教 ^ ^