Обмен управляющей позиции в TableLayoutPanel - PullRequest
0 голосов
/ 10 мая 2018

EDIT:

Ладно, для ясности я улучшу информацию немного:

У меня есть TableLayoutView (я назову это tlv), который имеет 5 фиксированных столбцов и x + 2 строк. Первая строка tlv содержит метки в каждой ячейке для целей заголовка . Я динамически добавляю больше строк в tlv, и поэтому он имеет переменное количество строк (плюс начальная строка заголовка, которая никогда не удаляется).

Как еще одно крошечное осложнение, я также оставляю пустую запись в нижней части tlv, которую я должен сохранить, потому что я использую ее для других функций.

Чтобы визуализировать то, что я только что сказал, это пример tlv, состоящий из 4 записей (пронумерованных), строки заголовка (H) и строки заполнителя (P).

HHHHH
11111
22222
33333
44444
PPPPP

Я хочу перейти от этого, скажем, если бы я хотел поменять местами записи 2 и 3, результат был бы:

HHHHH
11111
33333
22222
44444
PPPPP

Код, который у меня есть, выглядит следующим образом:

for (int j = 0; j < 5; j++)
{
    TableLayoutPanelCellPosition tablePosition1 = new 
    TableLayoutPanelCellPosition(j, rowIndex + 1);
    Control moveControl1 = queuedFiles.GetControlFromPosition(j, rowIndex);
    queuedFiles.SetCellPosition(moveControl1, tablePosition1);

    TableLayoutPanelCellPosition tablePosition2 = new 
    TableLayoutPanelCellPosition(j, rowIndex);
    Control moveControl2 = queuedFiles.GetControlFromPosition(j, rowIndex + 1);
    queuedFiles.SetCellPosition(moveControl2, tablePosition2);

    if (j.Equals(0))
    {
        moveControl1.Text = (rowIndex + 1).ToString();
        moveControl2.Text = (rowIndex).ToString();
    }
}

Однако этот код не работает и для приведенного выше примера выдает:

HHHHH
11111
33222
22333
44444
PPPPP

Я полагаю, что происходит то, что tlv автоматически организует свое содержимое в процессе их перемещения (возможно, для заполнения свободных мест?).

rowIndex выше - это индекс целевой строки, которая должна быть заменена на строку под ней. Мне не нужно беспокоиться о проверке, если есть только 1 строка или это последняя строка, потому что я уже сделал это. Не обращайте внимания и на изменение текста, мне просто нужен указатель на то, как я могу достичь желаемого результата!

Спасибо за абсолютно любую помощь, которую вы можете оказать:)

1 Ответ

0 голосов
/ 10 мая 2018

Следующий код выполняет работу:

код

using System;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // some content
            var panel = new TableLayoutPanel
            {
                Dock = DockStyle.Fill,
                ColumnCount = 5,
                RowCount = 2
            };

            for (var y = 0; y < 2; y++)
            for (var x = 0; x < 5; x++)
            {
                var control = new Button {Text = $@"X = {x}, Y = {y}"};
                panel.Controls.Add(control, x, y);
            }

            // swap button
            var button = new Button
            {
                Dock = DockStyle.Fill,
                Text = @"Clicky !"
            };

            button.Click += (o, args) =>
            {
                var dictionary = panel.Controls
                    .Cast<Control>()
                    .ToDictionary(k => k, v => panel.GetCellPosition(v));

                foreach (var pair in dictionary)
                {
                    var position = pair.Value;
                    position.Row ^= 1; // simple row swap
                    panel.SetCellPosition(pair.Key, position);
                }
            };

            // add to form
            var container = new SplitContainer
            {
                Dock = DockStyle.Fill,
                Orientation = Orientation.Horizontal,
                SplitterWidth = 5,
                BorderStyle = BorderStyle.Fixed3D
            };

            container.Panel1.Controls.Add(panel);
            container.Panel2.Controls.Add(button);

            Controls.Add(container);
        }
    }
}

До

enter image description here

После

enter image description here

Примечание

В следующий раз, когда вы зададите вопрос, опубликуйте Минимальный, Полный и Проверяемый пример , чтобы максимально увеличить ваши шансы получить ответ!

Что касается того, почему ваш код не работает, см. Предыдущее предложение, например, что было rowIndex и т. Д.

Редактировать

using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            const int cols = 5;
            const int rows = 6;

            // setup layout
            var tlp = new TableLayoutPanel
            {
                ColumnCount = cols,
                RowCount = rows,
                Dock = DockStyle.Fill,
                GrowStyle = TableLayoutPanelGrowStyle.FixedSize
            };

            for (var i = 0; i < cols; i++)
                tlp.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100.0f / cols));

            // add header
            var label = new Label
            {
                Text = @"My Header",
                BackColor = Color.Red,
                Dock = DockStyle.Fill,
                TextAlign = ContentAlignment.MiddleCenter
            };
            tlp.Controls.Add(label);
            tlp.SetColumn(label, 0);
            tlp.SetRow(label, 0);
            tlp.SetColumnSpan(label, cols);

            // add some cells
            var yMin = 1;
            var yMax = 5;
            var xMin = 0;
            var xMax = cols;
            for (var y = yMin; y < yMax; y++)
            for (var x = xMin; x < xMax; x++)
            {
                var color = Color.FromArgb(
                    255 / (xMax - xMin) * (x - xMin),
                    128,
                    255 / (yMax - yMin) * (y - yMin)
                );
                var label1 = new Label
                {
                    Text = $@"X = {x}, Y = {y}",
                    BackColor = color,
                    ForeColor = Color.White,
                    Dock = DockStyle.Fill,
                    TextAlign = ContentAlignment.MiddleCenter,
                    Margin = DefaultMargin
                };
                tlp.Controls.Add(label1, x, y);
            }

            // add swapper
            var button = new Button
            {
                Text = @"Clicky !",
                Dock = DockStyle.Fill
            };
            button.Click += (o, args) =>
            {
                var srcRow = 2;
                var tgtRow = 3;
                var controls = tlp.Controls.Cast<Control>().ToArray();
                var array1 = controls.Where(s => tlp.GetRow(s) == srcRow).ToArray();
                var array2 = controls.Where(s => tlp.GetRow(s) == tgtRow).ToArray();

                foreach (var control in array1)
                    tlp.SetCellPosition(control, new TableLayoutPanelCellPosition(tlp.GetColumn(control), tgtRow));

                foreach (var control in array2)
                    tlp.SetCellPosition(control, new TableLayoutPanelCellPosition(tlp.GetColumn(control), srcRow));
            };

            // pack things up
            var sc = new SplitContainer
            {
                Orientation = Orientation.Horizontal,
                BorderStyle = BorderStyle.Fixed3D,
                Dock = DockStyle.Fill
            };
            sc.Panel1.Controls.Add(tlp);
            sc.Panel2.Controls.Add(button);
            Controls.Add(sc);
        }
    }
}

enter image description here

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...