您的位置:首页 > 编程语言 > PHP开发

FlowLayoutPanel内用户控件通过上下移动进行顺序调整

2015-02-10 16:46 369 查看
我觉得FlowLayoutPanel容器真心是一个很好用的容器,尤其对其里面的控件有位置要求的时候,任意删除其中一个控件,后面的控件会自动上移,这很好的满足了本文所要阐述的需求要点:控制控件的顺序。样图如下:



用户控件源代码:

using System;
using System.Windows.Forms;

namespace Demo
{
public partial class UCBase : UserControl
{
public UCBase()
{
InitializeComponent();
this.label1.Text = Guid.NewGuid().ToString(); //该UC标识
}
/// <summary>
/// 设置上下可见性
/// </summary>
/// <param name="up">是否上移</param>
/// <param name="v">是否可见</param>
public void SetVisible(bool up, bool v)
{
if (up)
{
picUp.Visible = v;
}
else
{
picDown.Visible = v;
}
}

//声明事件委托
public delegate void OperatorEventHandler(object sender, Operator op);
//定义事件
public event OperatorEventHandler OnOperatorClick;

public void PicBox_Click(object sender, EventArgs e)
{
string picName = (sender as PictureBox).Name;
switch (picName)
{
case "picUp":
OnOperatorClick(this, Operator.Up);
break;
case "picDown":
OnOperatorClick(this, Operator.Down);
break;
default:
if (MessageBox.Show(string.Format("确定要移除该项吗?"), "警告", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
OnOperatorClick(this, Operator.Remove);
}
break;
}
}
}
/// <summary>
/// 操作枚举
/// </summary>
public enum Operator
{
/// <summary>
/// 上移
/// </summary>
Up,
/// <summary>
/// 下移
/// </summary>
Down,
/// <summary>
/// 移除
/// </summary>
Remove
}
}


主界面关键代码:

private void btnAdd_Click(object sender, EventArgs e)
{
UCBase uc = new UCBase();
if (flowLayoutPanel1.Controls.Count == 0)//新添加项作为首项被添加
{
uc.SetVisible(true, false);//不可上移
}
else //非作为首相被添加
{
UCBase ucUp = flowLayoutPanel1.Controls[flowLayoutPanel1.Controls.Count - 1] as UCBase; //获取添加项的上一项
ucUp.SetVisible(false, true); //上一项可下移
}
uc.SetVisible(false, false); //新添加项不可下移(新添加项都加到底部,自然不可下移)
uc.OnOperatorClick += new UCBase.OperatorEventHandler(uc_OnOperatorClick);
uc.Width = 480; //设置宽度
flowLayoutPanel1.Controls.Add(uc);
}

private void uc_OnOperatorClick(object sender, Operator op)
{
UCBase uc = sender as UCBase;
int oldIndex = flowLayoutPanel1.Controls.IndexOf(uc);//获取操作项的索引值
switch (op)
{
case Operator.Up: //上移操作,同时要关注上一项的状态变化
if (oldIndex == 1)//若是当前第二项
{
uc.SetVisible(true, false);//上移后则变成第一项,自然不可再上移
}
uc.SetVisible(false, true);//上移后肯定可以再下移
UCBase ucUp = flowLayoutPanel1.Controls[oldIndex - 1] as UCBase;//获取操作项的上一项
ucUp.SetVisible(true, true);//上一项被下移,则肯定可以再上移
if (oldIndex == flowLayoutPanel1.Controls.Count - 1)//若是当前最后一项
{
ucUp.SetVisible(false, false); //上一项下移后则变成最后一项,自然不可再下移
}
//上移操作项,这是根本,其他只是对状态进行变化
flowLayoutPanel1.Controls.SetChildIndex(uc, oldIndex - 1);
break;
case Operator.Down: //下移操作,同时要关注下一项的状态变化
if (oldIndex == flowLayoutPanel1.Controls.Count - 2)//若是当前倒数第二项
{
uc.SetVisible(false, false);//下移后则变成最后一项,自然不可再下移
}
uc.SetVisible(true, true);//下移后肯定可以再上移
UCBase ucDown = flowLayoutPanel1.Controls[oldIndex + 1] as UCBase;//获取操作项的下一项
ucDown.SetVisible(false, true);//下一项被上移,则肯定可以再下移
if (oldIndex == 0)//若是当前第一项
{
ucDown.SetVisible(true, false);//下一项上移后则变成第一项,自然不可再上移
}
//下移操作项
flowLayoutPanel1.Controls.SetChildIndex(uc, oldIndex + 1);
break;
default: //移除操作
if (flowLayoutPanel1.Controls.Count > 1) //项数至少两项的情况同时要关注上下两项的状态变化
{
if (oldIndex == flowLayoutPanel1.Controls.Count - 1)//若是最后一项
{
ucUp = flowLayoutPanel1.Controls[oldIndex - 1] as UCBase;
ucUp.SetVisible(false, false);//上一项变成最后一项,自然不可下移
}
else if (oldIndex == 0) //若是第一项
{
ucDown = flowLayoutPanel1.Controls[oldIndex + 1] as UCBase;
ucDown.SetVisible(true, false);//下一项变成第一项,自然不可上移
}
}
//移除操作项
flowLayoutPanel1.Controls.Remove(uc);
break;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: