递归绑定TREEVIEW更改数据后如何再递归更新数据库?解决了加分!

fdc123 2009-04-27 06:08:17
我用递归绑定数据库的一张表
private void Form1_Load(object sender, EventArgs e)
{
fenlei(0, null);
}
private void fenlei(int parentid, TreeNode tn)
{
SqlCommand sqlcom = new SqlCommand();
sqlcom.Connection = sqlcon;
sqlcom.CommandText = "select ID,modulename,parentid,seqno from tree where parentid>=0 order by seqno";
SqlDataAdapter da = new SqlDataAdapter(sqlcom);
dt = new DataTable();
da.Fill(dt);
DataView dvtree = new DataView(dt);
dvtree.RowFilter = "[parentid]=" + parentid;
foreach (DataRowView row in dvtree)
{
if (tn == null)
{
TreeNode node = treeView1.Nodes.Add(row["modulename"].ToString());
node.Tag = row["id"];
fenlei(Int32.Parse(row["id"].ToString()), node);
}
else
{
TreeNode node = tn.Nodes.Add(row["modulename"].ToString());
node.Tag = row["id"];
fenlei(Int32.Parse(row["id"].ToString()), node);
}
}
treeView1.ExpandAll();
}

这是递归的代码 ,数据库中表有3列相关的。 ID列,parentid列(名称),parentid列(父节点的ID是子节点的parentid,parentid相同的放在同一个父节点下)
现在拖动节点后改变了parentid但是必须是拖动一次更新一下才行,
sqlcon.Open();
string strc = "update tree set parentid=" + id + " where id=" + Convert.ToDouble(this.textBox1.Text) + "";
SqlCommand sqlcom = new SqlCommand(strc, sqlcon);
int i = sqlcom.ExecuteNonQuery();
if (i > 0)
{
MessageBox.Show("更改成功");
}
这是拖动一次就要保存的代码。如何把所有要拖动的节点拖动完之后再用递归全部更新数据库?要用递归一次全部更新。。分不多,解决了再加分!!
...全文
148 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
fdc123 2009-04-27
  • 打赏
  • 举报
回复
你的意思是先把表全部删除然后再插入呀? 这样性能是不是有点问题呀。 我本来的想法是更新拖动过的节点。用递归来查询匹配。与数据库不一样的才更新
快40的码农 2009-04-27
  • 打赏
  • 举报
回复
我是用递归做的.以前没做个你说的这个,晚上是根据你的问题搭的环境.做的例子
fdc123 2009-04-27
  • 打赏
  • 举报
回复
呵呵 我刚刚自己搞定 你发出来了 - -#
快40的码农 2009-04-27
  • 打赏
  • 举报
回复
我根据楼主的问题做的一个例子,操作的所有类都贴上来了,我在2005上测试通过.
创建数据库表
CREATE TABLE [dbo].[NodeTest](
[NodeId] [varchar](36) COLLATE Chinese_PRC_CI_AS NULL,
[NodeName] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[ParentId] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
类:
public partial class Form1 : Form
{
//数据库操作类.这个楼主改成自己的数据库操作类
DBFunction.CommonFunction com = new DBFunction.CommonFunction(DBFunction.DBName.SqlServerDB); public Form1()
{
InitializeComponent();
}
private void MiMoveUp_Click(object sender, EventArgs e) //向上移动
{
TreeNode Node = TVdepartment.SelectedNode;
TreeNode PrevNode = Node.PrevNode;
if (PrevNode != null)
{
TreeNode NewNode = (TreeNode)Node.Clone();
if (Node.Parent == null)
{
TVdepartment.Nodes.Insert(PrevNode.Index, NewNode);
}
else
{
Node.Parent.Nodes.Insert(PrevNode.Index, NewNode);
}
Node.Remove();
TVdepartment.SelectedNode = NewNode;
}
}
private void MiMoveDown_Click(object sender, EventArgs e)//向下移动
{

TreeNode Node = TVdepartment.SelectedNode;
TreeNode NextNode = Node.NextNode;
if (NextNode != null)
{
TreeNode NewNode = (TreeNode)Node.Clone();
if (Node.Parent == null)
{
TVdepartment.Nodes.Insert(NextNode.Index + 1, NewNode);
}
else
{
Node.Parent.Nodes.Insert(NextNode.Index + 1, NewNode);
}
Node.Remove();
TVdepartment.SelectedNode = NewNode;
}
}
//拖动代码
private void TVdepartment_ItemDrag(object sender, ItemDragEventArgs e)//左键拖动
{
if (e.Button == MouseButtons.Left)
{
DoDragDrop(e.Item, DragDropEffects.Move);
}
}

private void TVdepartment_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode"))
{
e.Effect = DragDropEffects.Move;
}
else
{
e.Effect = DragDropEffects.None;
}
}

private void TVdepartment_DragDrop(object sender, DragEventArgs e)//拖动
{
//获得拖放中的节点
TreeNode moveNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");

//根据鼠标坐标确定要移动到的目标节点
Point pt;
TreeNode targeNode;
pt = ((TreeView)(sender)).PointToClient(new Point(e.X, e.Y));
targeNode = this.TVdepartment.GetNodeAt(pt);

//如果目标节点无子节点则添加为同级节点,反之添加到下级节点的未端
TreeNode NewMoveNode = (TreeNode)moveNode.Clone();
if (targeNode.Nodes.Count == 0)
{
targeNode.Parent.Nodes.Insert(targeNode.Index, NewMoveNode);
}
else
{
targeNode.Nodes.Insert(targeNode.Nodes.Count, NewMoveNode);
}
//更新当前拖动的节点选择
TVdepartment.SelectedNode = NewMoveNode;
//展开目标节点,便于显示拖放效果
targeNode.Expand();

//移除拖放的节点
moveNode.Remove();
}

private void Form1_Load(object sender, EventArgs e)
{
TVdepartment.Nodes.Add("1", "根节点");
BuildTreeDirectory("1", TVdepartment.Nodes[0]);
}

//递归添加节点
private void BuildTreeDirectory(string lsbh, TreeNode parentNode)
{
DataSet ds = com.FillDataSet("select * from nodetest where ParentId='" + parentNode.Name + "'");

if (ds != null)
{
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
DataRow dr = ds.Tables[0].Rows[i];
TreeNode node = new TreeNode();
node.Text = dr["NodeName"].ToString();
node.Name = dr["NodeId"].ToString();
node.ToolTipText = dr["NodeId"].ToString();
parentNode.Nodes.Add(node);

this.BuildTreeDirectory(node.Name, node);
}
}
}
string sql = "insert into nodetest(NodeId, NodeName, ParentId) values ('{0}','{1}','{2}')";
private void button1_Click(object sender, EventArgs e)
{
string sql = "insert into nodetest(NodeId, NodeName, ParentId) values ('{0}','{1}','{2}')";
//删除所以节点信息
com.ExecuteNonQuery("delete from nodetest");
foreach (TreeNode nd in TVdepartment.Nodes)
{
if (nd.Parent != null)
{
if (com.ReadRecord("select parentid from nodetest where nodeid='" + nd.Name + "'") == "")
com.ExecuteNonQuery(string.Format(sql, nd.Name, nd.Text, nd.Parent.Name));

}
if (nd.Nodes.Count > 0)
this.AddNode(nd);
}
}
private void AddNode(TreeNode nd)
{
string sql = "insert into nodetest(NodeId, NodeName, ParentId) values ('{0}','{1}','{2}')";
if (nd.Parent != null)
com.ExecuteNonQuery(string.Format(sql, nd.Name, nd.Text, nd.Parent.Name));

if (nd.Nodes.Count > 0)
{
foreach (TreeNode node in nd.Nodes)
{
if (node.Parent != null)
{
if (com.ReadRecord("select parentid from nodetest where nodeid='" + node.Name + "'") == "")
com.ExecuteNonQuery(string.Format(sql, node.Name, node.Text, node.Parent.Name));
}
if (node.Nodes.Count > 0)
this.AddNode(node);
}
}
}
}
fdc123 2009-04-27
  • 打赏
  • 举报
回复
自己终于搞定了。。。 哎! 估计我的方法很烂 我是用集合来保存的 发出来分享下吧!
double id;
double douid;
ArrayList alid = new ArrayList();
ArrayList aldouid = new ArrayList();
private void treeView1_DragDrop(object sender, DragEventArgs e)// 这是拖动后的代码
{

Point targetPoint = treeView1.PointToClient(new Point(e.X, e.Y));
TreeNode targetNode = treeView1.GetNodeAt(targetPoint);
TreeNode draggedNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
id = (double)targetNode.Tag;
douid = (double)draggedNode.Tag;

alid.Add(id); //这里把ID跟 parentid 添加到两个集合中。
aldouid.Add(douid);

if (!draggedNode.Equals(targetNode) && !ContainsNode(draggedNode, targetNode))
{
if (e.Effect == DragDropEffects.Move)
{
draggedNode.Remove();
targetNode.Nodes.Add(draggedNode);
}
else if (e.Effect == DragDropEffects.Copy)
{
targetNode.Nodes.Add((TreeNode)draggedNode.Clone());
}
targetNode.Expand();
}
}
private void update()
{
for (int i = 0; i < alid.Count & i < aldouid.Count; i++) //这里随便i小于一个就行了 然后循环更新。
{
sqlcon.Open();
string str = "update tree set parentid='" + alid[i] + "' where id='" + aldouid[i] + "'";
SqlCommand sqlcom = new SqlCommand(str, sqlcon);
sqlcom.ExecuteNonQuery();
sqlcon.Close();
}
}
吼吼!! 为什么不能自己给自己分呢!
快40的码农 2009-04-27
  • 打赏
  • 举报
回复
//拖完节点后,点击button1事件,一次全部更新到数据库的方法
private void button1_Click(object sender, EventArgs e)
{
string sql = "insert into nodetest(NodeId, NodeName, ParentId) values ('{0}','{1}','{2}')";
//插入节点前,删除所有节点信息
com.ExecuteNonQuery("delete from nodetest");//执行删除方法,这个改成你自己的删除方法.
foreach (TreeNode nd in TVdepartment.Nodes)
{
if (nd.Parent != null)
{
//插入前判断是否存在同样id的记录
if(com.ReadRecord("select parentid from nodetest where nodeid='" + nd.Name + "'" == "")
com.ExecuteNonQuery(string.Format(sql, nd.Name, nd.Text, nd.Parent.Name));
}
if (nd.Nodes.Count > 0)
this.AddNode(nd);//如果存在子节点,插入子节点到数据库
}
}
//插入子节点到数据库的方法
private void AddNode(TreeNode nd)
{
string sql = "insert into nodetest(NodeId, NodeName, ParentId) values ('{0}','{1}','{2}')";
if (nd.Parent != null)
{
if(com.ReadRecord("select parentid from nodetest where nodeid='" + nd.Name + "'" == "")//插入前判断
com.ExecuteNonQuery(string.Format(sql, nd.Name, nd.Text, nd.Parent.Name));//执行插入
}
if (nd.Nodes.Count > 0)
{
foreach (TreeNode node in nd.Nodes)
{
if (node.Parent != null)
{
if (com.ReadRecord("select parentid from nodetest where nodeid='" + node.Name + "'") == "")
com.ExecuteNonQuery(string.Format(sql, node.Name, node.Text, node.Parent.Name));
}
if (node.Nodes.Count > 0)
this.AddNode(node);//递归插入子节点的子结点
}
}
}
fdc123 2009-04-27
  • 打赏
  • 举报
回复
哎 没办法呀 问题一个接一个呀。。。 现在功能都实现了 就是这个不知道怎么一次更新。
快40的码农 2009-04-27
  • 打赏
  • 举报
回复
天天都看楼主在发帖求助,我给你调下看看.
NetCloud0 2009-04-27
  • 打赏
  • 举报
回复
帮顶!
fdc123 2009-04-27
  • 打赏
  • 举报
回复
吃完饭了 自己顶一下。。 都没人知道了吗?
chinese_zmm 2009-04-27
  • 打赏
  • 举报
回复
帮你顶

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧