悟天的小别墅

人心忧虑,屈而不升。 一句良言,使心欢喜。

导航

最近用了Dev的Treelist控件,其中用到了拖动方法。众所周知的是,Dev的Treelist封装了原先用递归才能实现的树状显示,所以写代码非常方便。以前我做树形表,还需要一些辅助字段如Level、HasChild等,维护起来也有点小麻烦,现在只要一个ParentId字段就够了,只要设置一下KeyFieldName和ParentFieldName就可以了。

如:

tlCategory.KeyFieldName = "Id";
tlCategory.ParentFieldName = "ParentId";
tlCategory.DataSource = new BindingList<CategoryObject>(rsp.Categories);

 

如此一来基本上就是颠覆了我以前写树的方法,不过同时也带来了一点小问题:在拖动时,Dev内置了拖动效果,当源节点拖动到目标节点上方时,上下移动鼠标会出现不同效果,出现黄色箭头时,说明源节点作为目标节点的子节点,出现蓝色向上或者向下箭头时,说明作为兄弟节点,这样一来,对界面的更新我是不需要写代码了,但是怎样把这个结果回写到数据库呢?

按照原来的做法,一般是在DragDrop中写更新的代码,但是我现在在DragDrop事件中无法获知拖动时,源节点到底是作为目标节点的子节点,还是兄弟节点?

查阅了很多资料,终于搞明白了。

简单的方法是在AfterDropNode中写代码,这个算是绕弯路了。

另外的方法是重写OnDragDrop事件,代码如下:

 protected override void OnDragDrop(System.Windows.Forms.DragEventArgs drgevent)
{
FieldInfo fi = typeof(TreeListHandler).GetField("fStateData", BindingFlags.Instance | BindingFlags.NonPublic);
StateData data = (StateData)fi.GetValue(Handler);
fi = typeof(DragScrollInfo).GetField("dragInsertDirection", BindingFlags.Instance | BindingFlags.NonPublic);
DragInsertDirection diDirection = (DragInsertDirection)fi.GetValue(data.DragInfo);

base.OnDragDrop(drgevent);
}