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

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

FlowLayoutPanel内用户控件通过上下移动进行顺序调整_第1张图片

用户控件源代码:

using System;
using System.Windows.Forms;

namespace Demo
{
    public partial class UCBase : UserControl
    {
        public UCBase()
        {
            InitializeComponent();
            this.label1.Text = Guid.NewGuid().ToString(); //该UC标识
        }
        /// 
        /// 设置上下可见性
        /// 
        /// 是否上移
        /// 是否可见
        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;
            }
        }
    }
    /// 
    /// 操作枚举
    /// 
    public enum Operator
    {
        /// 
        /// 上移
        /// 
        Up,
        /// 
        /// 下移
        /// 
        Down,
        /// 
        /// 移除
        /// 
        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;
            }
        }


你可能感兴趣的:(C#)