【问题标题】:Swapping control position in TableLayoutPanel在 TableLayoutPanel 中交换控件位置
【发布时间】:2018-05-09 23:41:03
【问题描述】:

编辑:

好的,为了清楚起见,我将进一步改进我的信息:

我有一个 TableLayoutView(我称之为 tlv),它有 5 个固定 列和 x + 2 行。 tlv 的第一行包含每个单元格中的标签,用于标题。我在 tlv 上动态添加更多行,这就是为什么它具有可变数量的行(加上从未删除的初始标题行)。

作为另一个小问题,我还在 tlv 底部保留了一个空行条目,我必须保留它,因为我将它用于其他功能。

为了形象化我刚才所说的,这是一个包含 4 个条目(编号)、标题行(H's)和占位符行(P's)的 tlv 示例。

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 行或者它是否是最后一行,因为我已经这样做了。也忽略更改文本,我只需要一个关于如何达到预期结果的指针!

非常感谢您提供的任何帮助:)

【问题讨论】:

    标签: c# winforms controls


    【解决方案1】:

    以下代码可以完成这项工作:

    代码

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

    之前

    之后

    注意

    下次您提出问题时,请发帖Minimal, Complete, and Verifiable example 以最大限度地提高您获得答案的机会!

    关于你的代码为什么不起作用,请参阅上一句,例如 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);
            }
        }
    }
    

    【讨论】:

    • 感谢您的帮助!我现在就试一试,以后我会记得仔细检查那个帖子!
    • 我已经尝试过你的代码,但这不是我打算做的,但这只是我的错。我已经更新了我上面的问题,看看这是否可以让你更清楚! :)
    • 看看我的编辑,我真的不知道你那边出了什么问题,因为它在这里有效。这里有一个提示,当我的一些代码拒绝按预期工作时,我只是删除它并从头开始,通常我会发现错误。
    • 感谢所有帮助伙伴!我终于能够使用我自己的代码让它工作,但是你的字典方式教会了我一个更好的方法,所以绝对感谢你的所有帮助! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2011-04-10
    相关资源
    最近更新 更多