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

来源:互联网 发布:手机pdf制作软件 编辑:程序博客网 时间:2024/05/22 11:05

我觉得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;            }        }


2 0
原创粉丝点击