VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 794|回复: 8

删除treeview父节点的同时,怎么在数据库中把所有子结点对应的目录删除掉?(急,谢)

[复制链接]

4

主题

12

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
发表于 2020-2-20 16:00:01 | 显示全部楼层 |阅读模式
我的表结构如下,“id”为主键(这是我的一个树形目录)

id        parentid         name
51        -1               r
52        -1               a
53        52               b
54        52               c
55        53               d
56        53               e
57        54               f
58        55               g

我的目的是使用这个表生成treeview后,在树形目录上删除父节点id为52的目录的同时,在数据库中把id为52的记录和父节点52下所有的子结点对应的数据库记录也删除。
请给段代码,俺数据库这个地方不会处理了。
有人告诉我你可以用一个递归来写出你给出一个ID后,得到这个ID的所有的ID子级。请问怎么得到这个ID的所有子级呢?
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-5-1 09:15:02 | 显示全部楼层
是递归塞,如果是实际的路径话,可以用数据库匹配字符串塞
回复

使用道具 举报

1

主题

11

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-5-3 23:15:01 | 显示全部楼层
你只要根据父节点的id查找数据库就可以了。你写一个递归传入一个id然后在里面where parentid=id去查找。可以返回一个datatable。然后用foreach(dr in datatable.rows)判断它是否有子节点,然后在这个foreach里面可以在声明一个datatable根据dr的id在调用这个递归方法。不就行了。
回复

使用道具 举报

1

主题

26

帖子

14.00

积分

新手上路

Rank: 1

积分
14.00
发表于 2020-5-4 17:30:01 | 显示全部楼层
如果你在DB里面写个trigger就OK了,只要ID被删除,那么ParentID=ID的数据就全部都自动删除!递规肯定是要的了!这是因为有多层目录的原因!

public OleDbConnection cn=new OleDbConnection();
public bool blnFirstLayer=true;
public ArrayList aryAllChildID=new ArrayList();
public string[] strAllChildID;

public void GetAllChildID(string paID)
{
    //将每个ID都放到这里来!
     aryAllChildID.Add(paID)
    //保存这个最顶层的ID
    string strRootID=paID;
    //存放sql语句
    string sql="SELECT ID FROM TABLE_NAME WHERE PARENTID='"+paID+"'";                       
    cn.ConnectionString="Provider=...................";
    cn.Open();
    OleDbCommand oCmd=new OleDbCommand(sql,cn);
    OleDbDataReader oDr=new OleDbDataReader();
    oDr=oCmd.ExecuteReader(CommandBehavior.CloseConnection);
    if(oDr.HasRows)
    {
         while(oDr.Read())
        {
             string strTmpID=Convert.ToString((oDr["ID"]==System.DBNull.Value)?String.Empty:oDr["ID"]);
             GetAllChildID(strTmpID);
        }
     }  
}   


没有测试或许有点错误!请自行调试!呵呵

回复

使用道具 举报

0

主题

16

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
发表于 2020-5-4 21:30:01 | 显示全部楼层
在显示树形目录的时候,可以把节点的Tag或者name属性设置为你的id的值,拿tag为例,在删除的时候,你再执行一下"delete * from where id="+(int)Node.Tag以及where parentid ="+(int)Node.Tag就行了
回复

使用道具 举报

1

主题

26

帖子

14.00

积分

新手上路

Rank: 1

积分
14.00
发表于 2020-5-5 20:15:01 | 显示全部楼层
刚才发的匆忙了,有些垃圾代码,现在把那些没用的代码去掉了!
你可以再看一下,加点注释!

//申明DB连接对象
public OleDbConnection cn=new OleDbConnection();

//执行完下面的函数后,这里的值就是你要的所有的ChildID!!!
public ArrayList aryAllChildID=new ArrayList();  


public void GetAllChildID(string paID)
{
    //将每个ID都放到这里来!
     aryAllChildID.Add(paID)
    //当然在这里你可以根据传入的ID,直接对DB进行删除操作了!记得把这个ID记下来,下面还要用它来查找它有否子ID了!
    ..........delete from table_name where id=paid
    ..........
    string strTmpRootID=paID;     //不再这里进行删除操作,就不要这句!
    //存放sql语句
    string sql="SELECT ID FROM TABLE_NAME WHERE PARENTID='"+paID+"'";                       
    cn.ConnectionString="Provider=...................";
    //打开连接
    cn.Open();
    //申明Command对象
    OleDbCommand oCmd=new OleDbCommand(sql,cn);
    //申明存放返回的数据集对象
    OleDbDataReader oDr=new OleDbDataReader();
    //获得返回数据
    oDr=oCmd.ExecuteReader(CommandBehavior.CloseConnection);
    if(oDr.HasRows)
    {         
         while(oDr.Read())
        {
             string strTmpID=Convert.ToString((oDr["ID"]==System.DBNull.Value)?String.Empty:oDr["ID"]);
              //如果不空,就遍历,这里如果你的DB,定义id+parentid为PK,就不需要下面条件来判断了!
              if(strTmpID!=String.Empty)
              {
                 GetAllChildID(strTmpID);
              }
        }
     }  
}
回复

使用道具 举报

0

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-5-7 22:30:02 | 显示全部楼层
來個最簡單的吧
使用觸發器,delete table where parentid in (select id from deleted)
回复

使用道具 举报

4

主题

12

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
 楼主| 发表于 2020-5-16 19:00:02 | 显示全部楼层
感谢大家,回去我调试一下。
回复

使用道具 举报

4

主题

12

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
 楼主| 发表于 2020-6-21 13:15:01 | 显示全部楼层
谢谢各位,触发器和复杂的存储过程我都不太会。我用下面的代码写了个递归,然后子结点的ID都存储到ArrayList中,再for循环删除记录就OK了。

//获得所有子结点ID
private void GetAllChildNodeId(int parentid)
    {
        idArrayList.Add(parentid);
        SqlConnection getConn = new SqlConnection("server=localhost;database=personmanager;uid=sa;pwd=sa");
        SqlCommand getCmd = getConn.CreateCommand();
        getCmd.CommandText = "select id from persongroup where parentid=" + parentid;
        SqlDataAdapter getDa = new SqlDataAdapter(getCmd);
        DataSet getDs = new DataSet();
        getConn.Open();
        getDa.Fill(getDs, "id");
        getConn.Close();
        foreach (DataRow getDr in getDs.Tables["id"].Rows)
            {
                int newParentid = (int)getDr["id"];
                idArrayList.Add(newParentid);
                GetAllChildNodeId(newParentid);
            }
    }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表