2016-05-13 156 views
0

我有LayoutControlGroup以及其他几个LayoutControlGroups内部。在运行时对另一个LayoutControlGroup内的LayoutControlGroup进行重新排序

我需要做的是在运行时将它们重新排列成特定的顺序。

例如,当形式显示出来我有在这样为了这些群体:

[Group0] 
[Group1] 
[Group2] 
[Group3] 
[Group4] 

然后我从数据库获取一些数据,并需要根据这些数据来重新排列组,例如刚刚逆转顺序:

[Group4] 
[Group3] 
[Group2] 
[Group1] 
[Group0] 

我已经试过什么:

List<BaseLayoutItem> currentOrder = lcgParentGroup.Items.Cast<object>().Where(c => c is BaseLayoutItem).Cast<BaseLayoutItem>().Where(c => c.Name.StartsWith("lcgInnerGroup") && char.IsDigit(c.Name.Last())).ToList(); 
currentOrder.Sort((x, y) => System.Collections.Comparer.Default.Compare(x.Location.Y, y.Location.Y)); 

// Example order 
List<BaseLayoutItem> requiredOrder = new List<BaseLayoutItem>(currentOrder); 
requiredOrder.Reverse(); 

for (int i = 1; i < requiredOrder.Count; ++i) 
{ 
    // I just move every group after every relative group. 
    BaseLayoutItem relative = lcgParentGroup.Items.FindByName(requiredOrder[i - 1].Name); 

    DevExpress.XtraLayout.Customization.LayoutItemDragController dragController = new DevExpress.XtraLayout.Customization.LayoutItemDragController(requiredOrder[i], relative, MoveType.Outside, InsertLocation.After, LayoutType.Vertical); 
    bool result = requiredOrder[i].Move(dragController);  
} 

但是每次的resultfalse

有没有其他方法可以做到这一点?

回答

0

我已经想通了。这些组必须是Visibile(Visibility.Always)才能移动它们。不知道为什么。

溶液伪代码:

try 
{ 
    groups.BeginUpdate(); 

    List<object> dataFromDB = ...; 

    // Znamy aktualną kolejność grup 
    List<BaseLayoutItem> currentOrder = groups.Items.Cast<object>().Where(c => c is BaseLayoutItem).Cast<BaseLayoutItem>().ToList(); 

    // Sort as visibile in form 
    currentOrder.Sort((x, y) => System.Collections.Comparer.Default.Compare(x.Location.Y, y.Location.Y)); 

    // Save old visibilities 
    LayoutVisibility[] allVisibilities = currentOrder.Select(x => x.Visibility).ToArray(); 
    currentOrder.ForEach(x => x.Visibility = LayoutVisibility.Always); 

    List<BaseLayoutItem> requiredOrder = ...; // prepare required order 

    // Make requiredOrder[0] topmost group 

    // Move 
    for (int i = 1; i < requiredOrder.Count; ++i) 
    { 
     BaseLayoutItem relative = groups.Items.FindByName(requiredOrder[i - 1].Name); 
     BaseLayoutItem toMove = groups.Items.FindByName(requiredOrder[i].Name); 

     toMove.Move(relative, InsertType.Bottom); 
    } 

    // Restore visibilities 
    for (int i = 0; i < currentOrder.Count; ++i) 
    { 
     currentOrder[i].Visibility = allVisibilities[i]; 
    } 

} 
finally 
{ 
    groups.EndUpdate(); 
} 
相关问题