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

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


  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值