drag-n-drop在Treelist中工作,但是我不知道如何保存它们,因此当我关闭/打开项目时,它会恢复为Treelist中的旧值。例如,我向上或向下移动行,但是当我打开项目再次恢复旧位置
时 private void checkBox1_CheckedChanged(object sender, System.EventArgs e)
{
treeList1.OptionsDragAndDrop.DragNodesMode = checkBox1.Checked ? DragNodesMode.Single : DragNodesMode.None;
}
//</checkBox1>
private DevExpress.XtraTreeList.Nodes.TreeListNode GetDragNode(IDataObject data)
{
return data.GetData(typeof(DevExpress.XtraTreeList.Nodes.TreeListNode)) as DevExpress.XtraTreeList.Nodes.TreeListNode;
}
//<listBox1>
private string GetStringByNode(DevExpress.XtraTreeList.Nodes.TreeListNode node)
{
string ret = "";
for (int i = 0; i < treeList1.Columns.Count; i++)
ret += node.GetDisplayText(i) + (i < treeList1.Columns.Count - 1 ? "; " : ".");
return ret;
}
private void listBox1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
if (GetDragNode(e.Data) != null)
e.Effect = DragDropEffects.Copy;
}
private void listBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
DevExpress.XtraEditors.ListBoxControl lb = sender as DevExpress.XtraEditors.ListBoxControl;
DevExpress.XtraTreeList.Nodes.TreeListNode node = GetDragNode(e.Data);
if (node != null)
{
string dragString = GetStringByNode(node);
int ind = lb.IndexFromPoint(lb.PointToClient(new Point(e.X, e.Y)));
if (ind == -1)
lb.Items.Add(dragString);
else
lb.Items.Insert(ind, dragString);
}
}
treelist保存由将节点移动到另一个父节点引起的更改,因为该节点的 parentID 字段相应地更新。但是,如果您将节点移动在同一子节点集合中,则这些更改将会丢失。这就是为什么要完成此任务的原因,您需要创建一个额外的数据源列,该列将存储每个节点的当前索引。在如何更改Treelist节点位置以及相应的记录在数据库示例中的位置中说明了此方法。看看它。