gpt4 book ai didi

c# - 在 flowLayoutPanel 中重新排列 CustomControl

转载 作者:行者123 更新时间:2023-11-30 16:12:06 28 4
gpt4 key购买 nike

我有多个自定义控件(它是一个下面有标签的按钮)添加到 FLP。我试图通过将一个自定义控件拖到另一个控件上来重新排列添加的自定义控件。在一些帮助下,它可以使用简单的按钮,但不能使用自定义控件。另一个问题是,如果我使用简单的按钮,仅当 FLP 在表单上时才有效,但如果我将 FLP 放在 tabPage 中的 tabControl 中,则不再有效。为什么不使用自定义控件以及 FLP 位于 tabControl 中?

这是我到目前为止一直在尝试的:

public partial class test_frm : Form
{

FlowLayoutPanel flowLayoutPanel1 = new FlowLayoutPanel();
private List<Control> _items = new List<Control>();

public test_frm()
{
InitializeComponent();
flowLayoutPanel1.AllowDrop = true;
tabControl1.AllowDrop = true;
flowLayoutPanel1.Dock = DockStyle.Fill;
this.Controls.Add(flowLayoutPanel1);
tabPage1.Controls.Add(flowLayoutPanel1);
flowLayoutPanel1.DragEnter += new DragEventHandler(flowLayoutPanel1_DragEnter);
flowLayoutPanel1.DragDrop += new DragEventHandler(flowLayoutPanel1_DragDrop);

//add custom controls
for (int i = 0; i < 10; i++)
{
Button button = new Button();
Label lbl = new Label();
CustomControl cst = new CustomControl(button, lbl);

button.Text = "Button " + i.ToString();
lbl.Text = "lbl " + i.ToString();
cst.Name = "Button " + i.ToString();
this._items.Add(cst);
flowLayoutPanel1.Controls.Add(cst);
cst.MouseDown += new MouseEventHandler(button_MouseDown);
}
}


void flowLayoutPanel1_DragDrop(object sender, DragEventArgs e)
{

List<Control> controls = new List<Control>(flowLayoutPanel1.Controls.Count); // get a copy of the controls on the FLP

foreach (Control ctr in flowLayoutPanel1.Controls)
{
controls.Add(ctr);
}

for (int i = 0; i < controls.Count; i++)
{
Point mouse = PointToClient(new Point(e.X, e.Y));
if (controls[i].Bounds.Contains(mouse.X - flowLayoutPanel1.Left, mouse.Y - flowLayoutPanel1.Top))
//If the control is dragged to another control inside the FlowLayoutPanel, move the dragged control to that place.
{
string name = (string)e.Data.GetData(typeof(string));
Control drag = flowLayoutPanel1.Controls.Find(name, true)[0];
Control temp = controls[i];
controls.RemoveAt(getIndex(drag.Name));
controls.Insert(i, drag);

flowLayoutPanel1.Controls.Clear(); //Clear the controls
for (int j = 0; j < controls.Count; j++)
{
flowLayoutPanel1.Controls.Add(controls[j]); //Readd all the Controls in new order
}
break;
}

}
}

private int getIndex(string name)
{
int result = -1;
for (int i = 0; i < flowLayoutPanel1.Controls.Count; i++)
{
if (flowLayoutPanel1.Controls[i].Name == name)
{
result = i;
break;
}
}
return result;
}

void flowLayoutPanel1_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
}


void button_MouseDown(object sender, MouseEventArgs e)
{
(sender as CustomControl).DoDragDrop((sender as CustomControl).Name, DragDropEffects.Copy);

}
}


public class CustomControl : Control
{
private Button _button;
private Label _label;


public CustomControl(Button button, Label label)
{
_button = button;
_label = label;
button.Width = 64;
button.Height = 65;
button.AutoSize = true;
label.Width = 65;
button.FlatStyle = FlatStyle.Flat;
button.AllowDrop = true;
//button.Margin = new Padding(15, 15, 15, 15);
button.BackgroundImageLayout = ImageLayout.Stretch;
Height = button.Height + label.Height;
Width = 68;

// Width = Math.Max(button.Width, label.Width);
Controls.Add(_button);
_button.Location = new Point(0, 0);
Controls.Add(_label);
_label.Location = new Point(0, button.Height);

}

最佳答案

工作解决方案:

private void flowLayoutPanel1_DragDrop(object sender, DragEventArgs e)
{
Control target = new Control();

target.Parent = sender as Control;

if (target != null)
{
int targetIndex = FindCSTIndex(target.Parent);
if (targetIndex != -1)
{
string cst_ctrl = typeof(CustomControl).FullName;
if (e.Data.GetDataPresent(cst_ctrl))

{
Button source = new Button();
source.Parent = e.Data.GetData(cst_ctrl) as CustomControl;

if (targetIndex != -1)
this.flowLayoutPanel1.Controls.SetChildIndex(source.Parent, targetIndex);
}
}
}
}

private int FindCSTIndex(Control cst_ctr)
{
for (int i = 0; i < this.flowLayoutPanel1.Controls.Count; i++)
{
CustomControl target = this.flowLayoutPanel1.Controls[i] as CustomControl;

if (cst_ctr.Parent == target)
return i;
}
return -1;
}

private void OnCstMouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Control cst = sender as Control;
cst.DoDragDrop(cst.Parent, DragDropEffects.Move);
}
}

关于c# - 在 flowLayoutPanel 中重新排列 CustomControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23488144/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com