C# 交换TableLayoutPanel中的控制位置
编辑: 好的,为了清楚起见,我将进一步改进我的信息: 我有一个TableLayoutView(我将称之为tlv),它有5个固定列和x+2行。tlv的第一行包含每个单元格中的标签,用于标题目的。我动态地在tlv上添加更多的行,这样就可以解释为什么它有可变数量的行(加上从未删除的初始标题行) 作为另一个小麻烦,我还在tlv底部保留了一个空行条目,我必须保留它,因为我将它用于其他功能 为了形象化我刚才所说的,这是一个tlv示例,由4个条目(编号)、标题行(H)和占位符行(p)组成 我想从那开始,也就是说,如果我想交换条目2和条目3,那么输出将是:C# 交换TableLayoutPanel中的控制位置,c#,winforms,controls,C#,Winforms,Controls,编辑: 好的,为了清楚起见,我将进一步改进我的信息: 我有一个TableLayoutView(我将称之为tlv),它有5个固定列和x+2行。tlv的第一行包含每个单元格中的标签,用于标题目的。我动态地在tlv上添加更多的行,这样就可以解释为什么它有可变数量的行(加上从未删除的初始标题行) 作为另一个小麻烦,我还在tlv底部保留了一个空行条目,我必须保留它,因为我将它用于其他功能 为了形象化我刚才所说的,这是一个tlv示例,由4个条目(编号)、标题行(H)和占位符行(p)组成 我想从那开始,也就是
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();
}
}
我相信,tlv在移动内容的过程中(可能是为了填补空白?)会自动组织内容本身
rowIndex上面是目标行的索引,必须与下面的行交换。我不需要担心检查是否只有一行或者是否是最后一行,因为我已经做过了。忽略更改文本太多,我只需要一个指针,我可以如何实现预期的结果
非常感谢您提供的任何帮助:)以下代码可以完成此任务: 代码
谢谢您的帮助!我现在就试试看,以后我会记得仔细检查那篇文章!我已经尝试了你的代码,这不是我想要做的,但那只是我的错。我已经更新了我上面的问题,看看这是否会让你更清楚!:)看我的编辑,我真的不知道你这方面出了什么问题。这里有一个提示,当我的一些代码拒绝按预期工作时,我只是删除它并从头开始,通常我会发现错误。感谢所有的帮助,伙计!我终于能够用我自己的代码让它工作了,但你的字典方式教会了我更好的方法,所以非常感谢你的帮助!)
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
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);
}
}
}
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);
}
}
}