这两天做一些小东西,用到了TreeView和listVIiew,在用TreeView时,遇到了一个小问题,就是删除节点时,怎么清除所有的子节点,想了半天没想出办法,幸得同事指点一二,马上解决,在此简单说明,以恐将来再用。主要还是用递归算法。
/**/
/// <summary>
/// 递归删除子节点
/// </summary>
/// <param name="ID">删除的节点</param>
public void deleteID( string ID)
... {
DataView dv = Marker.Util.DataBaseUtil.GetDataView(Conn, "select * from Catalog where RefID='" + ID + "'");
if (dv.Table.Rows.Count == 0)
...{
Marker.Util.DataBaseUtil.ExeSQL(Conn, "delete from Catalog where id='" + ID + "'");
}
else
...{
foreach (DataRow dr in dv.Table.Rows)
...{
string id = dr["ID"].ToString();
deleteID(id);
}
}
Marker.Util.DataBaseUtil.ExeSQL(Conn, "delete from Catalog where id='" + ID + "'");
}
/// 递归删除子节点
/// </summary>
/// <param name="ID">删除的节点</param>
public void deleteID( string ID)
... {
DataView dv = Marker.Util.DataBaseUtil.GetDataView(Conn, "select * from Catalog where RefID='" + ID + "'");
if (dv.Table.Rows.Count == 0)
...{
Marker.Util.DataBaseUtil.ExeSQL(Conn, "delete from Catalog where id='" + ID + "'");
}
else
...{
foreach (DataRow dr in dv.Table.Rows)
...{
string id = dr["ID"].ToString();
deleteID(id);
}
}
Marker.Util.DataBaseUtil.ExeSQL(Conn, "delete from Catalog where id='" + ID + "'");
}
另外,如果大家在使用树时,如果不想每次添加一些内容时,就重新调用数据库生成数的话,可以通过添加节点,删除节点来实现和数据库同步,但这个方法不是太好,如果同时多个人操作数据库,那这个方法就会有问题。
关于listView控件的selectedIndexChange事件,我记得很久以前用时就遇到过这个问题,没想到前两天又遇到了,这个事件是当更改选项时触发,但是你要记得,当你更改选项时,首先它要取消原项的选中状态,(这时就没有选中项了,这样你的事件处理程序就会出错,提示你没有选中项。),然后再选中另外一项。所以我们要在事件处理中加上一句判断。if (listView1.SelectedItems.Count != 0),这样,就OK了
另外,有一个问题到现在也没有解决,就是怎样当我重新加载树时,还保持树展开状态.