2016-05-13 14 views
0

Ich habe innerhalb LayoutControlGroup mit einigen anderen LayoutControlGroup s bekam.Reorder LayoutControlGroups innerhalb eines anderen LayoutControlGroup auf Laufzeit

Was ich tun muss, ist es, sie in bestimmte Reihenfolge zur Laufzeit neu zu ordnen.

Wenn zum Beispiel Form auftaucht Ich habe diese Gruppen in einem solchen Reihenfolge bekommt:

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

Und dann bekomme ich einige Daten aus der DB und muß nach beispielsweise nur auf diese Daten, Gruppen neu zu ordnen umkehren die Reihenfolge:

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

Was ich schon versucht:

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);  
} 

jedoch jedes Mal die result ist false.

Gibt es eine andere Möglichkeit, es zu tun?

Antwort

0

Ich habe es herausgefunden. Die Gruppen haben Visibile (Visibility.Always), um sie zu bewegen. Keine Ahnung warum.

Die Lösung Pseudocode:

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(); 
}