C#-在flowLayoutPanel中重新排列CustomControl
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#-在flowLayoutPanel中重新排列CustomControl,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4191字,纯文字阅读大概需要6分钟。
内容图文
![C#-在flowLayoutPanel中重新排列CustomControl](/upload/InfoBanner/zyjiaocheng/660/1ab512c39e8b4e79983cfa20763e5bb4.jpg)
我在FLP中添加了多个自定义控件(这是一个下面带有标签的按钮).我试图能够通过将一个自定义控件拖到另一个上来重新排列添加的自定义控件.在一些帮助下使其可以使用简单的按钮,但不适用于自定义控件.
另一个问题,如果我使用简单按钮,则仅当FLP在窗体上但将FLP放在tabControl的tabPage内时才起作用.
为什么当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全部内容,希望文章能够帮你解决C#-在flowLayoutPanel中重新排列CustomControl所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。