Как перевернуть FlowLayoutPanel?

Я пытаюсь изменить порядок элементов управления в FlowLayoutPanel.

Я попытался преобразовать ControlCollection в массив, а затем перевернул его, очистил ControlCollection и затем снова прочитал Controls. Но это не похоже на запланированный эффект.

Вот код, который я использую:

private static void ReverseLayout(Control control, bool suspend = true) {
     if (suspend) control.SuspendLayout();
     Control[] newCC = new Control[control.Controls.Count];
     control.Controls.CopyTo(newCC, 0);
     Array.Reverse(newCC);
     control.Controls.Clear();
     //control.Controls.AddRange(newCC);
     for (int i = 0; i < newCC.Length; i++) {
        newCC[i].Location = new System.Drawing.Point(); // maybe? no :\
        newCC[i].TabIndex = i; // maybe? no :\
        control.Controls.Add(newCC[i]);
     }
     if (suspend) control.ResumeLayout(false);
  }

1 ответ

Решение

Ваш код кажется более сложным, чем нужно. Попробуйте поместить элементы управления в List<Control> и затем вызвать реверс, вернуть коллекцию обратно:

int firstTabIndex = flp.Controls[0].TabIndex;
List<Control> controls = flp.Controls.Cast<Control>().ToList();
flp.Controls.Clear();
controls.Reverse();
flp.Controls.AddRange(controls.ToArray());

Для свойства TabIndex вам придется повторно применить значение:

for (int i = 0; i < flp.Controls.Count; ++i) {
  flp.Controls[i].TabIndex = firstTabIndex + i;
}
Другие вопросы по тегам