关于TREEVIEW问题

来源:百度知道 编辑:UC知道 时间:2024/06/15 21:34:16
小弟现在在做一个关于TREEVIEW跟新保存功能,TREEVIEW数据库是G_EquipGroup,字段有FinterID(主键) FParentID(父ID),Fname(显示文本),用户操作时候可能更新,可能增加或删除节点,点击'保存',帮当前TREEVIEW数据保存到数据库里,我现在的做法是,在点击‘保存’时删除数据库里所有数据,然后遍历当前TREEVIEW每个节点,然后插入到数据库里,相关代码: private void tSBSave_Click(object sender, EventArgs e)//保存按钮
{
this.Focus();
index = 1;
List<string> sSqlList = new List<string>();
sSqlList.Add("Delete From G_EquipGroup");
sSqlList.AddRange(AllNodes(treeView1.Nodes));
string[] sSqlTrans = new string[sSqlList.Count];
sSqlList.CopyTo(sSqlTrans);
string sRet = string.Empty;

if (!ExeSqlCmdTrans(sSqlTrans, out sRet))
{
throw new Exception(sRet);
}
base.OnSHOWAPSSTATUSMESSAGE(1, "保存成功!");
}

private int index = 1;

别忘记了,你重新写入数据库的时候你的 FinterID可是你重新生成的.
看见你的 index++ 了没有? 比如你中间删除了某个节点,当你重新写入数据库时,那个被删除节点后面的所有节点的FinterID都会向前填充空缺.
如果你希望原来的FinterID 都不变,那只有在你加载节点的时候将他们的FinterID 与ParentID一同写入 Tag里面.
=============================================
如果你的程序是单一用户使用,全部删除,然后再重新写入应该是比较好的方法.但是如果是多用户可以同时操作的,恐怕就没那么乐观.我这里有点建议,供你参考:
1,建立3个集合,记录(新增,修改,删除)等用户的动作,在点击"保存"后再全部更新到数据库.
弊端:需要相当周全的考虑,比如刚新增的,尚未更新到数据库的变更,被用户删除.则直接从"新增"列表去除相应的记录,不更新数据.等等.总之挺麻烦.
2,建立一个对应的数据集.等同维护一张DataSet表,不管新增,删除,还是修改.都由其RowState记录.更新到数据库仅需使用Update语句.
3,顺着你原来的思路,稍作变更:
读取Trees的时候,将其FinterID,和ParentID一并存入当前TreeNode的Tag里面like this:
TreeNode item = new TreeNode(text);
item.Tag = new System.Collections.DictionaryEntry(finterID,parentID);