首页 > 其他分享 >winform--穿梭框

winform--穿梭框

时间:2024-07-22 15:30:34浏览次数:9  
标签:Right false -- pic item 穿梭 Tag winform Left

新建一个用户控件:

 直接上代码:

  /*
     * 作者:pengyan zhang
     * 邮箱:[email protected]
     * 博客:https://www.cnblogs.com/zpy1993-09
     * 时间:2024-04-10 16:36
     */
    public partial class ShuttleFrameControl : UserControl
    {


        private Color lb_BackColor { get; set; } = Color.Transparent;
        private Color lb_FonceColor { get; set; } = Color.Black;
        private Color pic_CheckBackColor { get; set; } = Color.FromArgb(95, 184, 120);
        private Color pic_UnCheckBackColor { get; set; } = Color.White;

        private Image pic_Img { get; set; } = Properties.Resources.Check;
        private List<ShuttleFrameData> InitData=new List<ShuttleFrameData>();
     
        public ShuttleFrameControl()
        {
            InitializeComponent();
           
            Init();



        }
        private void Init()
        {
            Input_Left.Text = "关键字搜索";
            Input_Left.ForeColor = Color.DarkGray;
            Input_Right.Text = "关键字搜索";
            Input_Right.ForeColor = Color.DarkGray;
            this.pic_Left.Tag = false;
            this.pic_Right.Tag = false;
            this.L_RunLfet.Tag=false;
            this.L_RunRight.Tag = false;

            this.Flow_Left_Bottom.AutoScroll = true;
            this.Flow_Right_Bottom.AutoScroll = true;
            this.P_Contain.Paint += this_Paint;
            this.Flow_Left_Bottom.Paint += this_Paint;
            this.L_RunLfet.Paint += this_Paint;
            this.L_RunLfet.Click += ShuttleFrame_Click;
            this.L_RunLfet.MouseEnter += ShuttleFrame_MouseEnter;
            this.L_RunRight.Paint += this_Paint;
            this.L_RunRight.Click += ShuttleFrame_Click;
            this.L_RunRight.MouseEnter += ShuttleFrame_MouseEnter;
            this.pic_Left.Paint += pic_Paint;
            this.pic_Left.MouseEnter += ShuttleFrame_MouseEnter;
            this.pic_Right.Paint += pic_Paint;
            this.pic_Right.MouseEnter += ShuttleFrame_MouseEnter;
            this.pic_Left.Click += ShuttleFrame_Click;
            this.pic_Right.Click += ShuttleFrame_Click;
            this.L_Left.Click += ShuttleFrame_Click;
            this.L_Right.Click += ShuttleFrame_Click;
            this.L_Left.MouseEnter += ShuttleFrame_MouseEnter;
            this.L_Right.MouseEnter+= ShuttleFrame_MouseEnter;
            this.panel_Left.Paint += this_Paint;
            this.panel_Right.Paint += this_Paint;
            this.Input_Left.Enter += Input_Enter;
            this.Input_Left.Leave += Input_Leave;
            this.panel_Flow.Paint += this_Paint;
            this.Input_Right.Enter += Input_Enter;
            this.Input_Right.Leave += Input_Leave;
            ReSet(this.Flow_Right_Bottom,1);
            ReSet(this.Flow_Left_Bottom,1);
        }
        private void Input_Leave(object? sender, EventArgs e)
        {
            var control = sender as System.Windows.Forms.TextBox;
            if (control.Text == "")
            {
                control.Text = "关键字搜索";
                control.ForeColor = Color.DarkGray;
            }
        }
        private void Input_Enter(object? sender, EventArgs e)
        {
            var control = sender as System.Windows.Forms.TextBox;
            if (control.Text == "关键字搜索")
            {
                control.Text = "";
                control.ForeColor = Color.Black;
            }
        }
        private void ShuttleFrame_MouseEnter(object? sender, EventArgs e)
        {
            var control = sender as Control;
            control.Cursor = Cursors.Hand; ;
            switch (control.Name)
            {
                case "Itempic":
                    var data = control.Parent.Tag as ShuttleFrameData;
                    if (data.IsShield) control.Cursor = Cursors.No;
                    else if(control is Label) control.BackColor = Color.FromArgb(224, 224, 224);
                    break;
                case "L_RunLfet":
                case "L_RunRight":
                   if( (bool)control.Tag == false)control.Cursor = Cursors.No;
                    break;
            }
        }
        private void ShuttleFrame_Click(object? sender, EventArgs e)
        {
            var control = sender as Control;
            bool ischeck;
            switch (control.Name)
            {
                case "L_Left":
                case "pic_Left":
                     ischeck = !(bool)this.pic_Left.Tag;
                    this.pic_Left.Tag = ischeck;
                    DealAllCheck(this.Flow_Left_Bottom, ischeck);
                    break;
                case "L_Right":
                case "pic_Right":
                     ischeck = !(bool)this.pic_Right.Tag;
                    this.pic_Right.Tag = ischeck;
                    DealAllCheck(this.Flow_Right_Bottom, ischeck);
                    break;
                case "Itempic":
                    DealLeftORRight(control.Parent as Panel);
                    break;
                case "L_RunLfet":
                    if ((bool)control.Tag == false) return;
                     ReMoveItem(Flow_Left_Bottom, Flow_Right_Bottom);
                    break;
                case "L_RunRight":
                    if ((bool)control.Tag == false) return;
                    ReMoveItem(Flow_Right_Bottom, Flow_Left_Bottom);
                    break;
            }
            ReSet(this.Flow_Right_Bottom);
            ReSet(this.Flow_Left_Bottom);
        }
        private void ReMoveItem(FlowLayoutPanel flow1,FlowLayoutPanel flow2)
        {
            List<Panel> list = new List<Panel>();
            int count = 0;
            foreach (Panel item in flow1.Controls)
            {
                var result = item.Tag as ShuttleFrameData;
                if (!result.IsCheck && result.IsShield == false && item.Visible == true) count++;
                if (result.IsCheck && result.IsShield == false && item.Visible == true) list.Add(item);
               
            }
            list.ForEach(item =>
            {
                flow1.Controls.Remove(item);
                var result = item.Tag as ShuttleFrameData;
                result.IsLeftORRight = !result.IsLeftORRight;
                result.IsCheck = false;
                if(Input_Right.Text != "关键字搜索" && Input_Right.Text != ""&&Input_Left.Text != "关键字搜索"&&Input_Left.Text!="")item.Visible = false;
                var pic = item.Controls[0] as PictureBox;
                pic.BackColor = pic_UnCheckBackColor;
                pic.Image = null;
                item.Tag = result;
                flow2.Controls.Add(item);

            });
           
        }
        public void SetShuttleFrame(List<ShuttleFrameData> shuttleFrameDatas)
        {
            InitData = shuttleFrameDatas;
            shuttleFrameDatas.ForEach(m => { DealData(m); });
        }
        private void DealData(ShuttleFrameData shuttleFrameData)
        {
            Panel panel = new Panel();
            panel.Height = 25;
            panel.Tag = shuttleFrameData;
            PictureBox pictureBox = new PictureBox();
            pictureBox.Parent = panel;
            pictureBox.BackColor = pic_UnCheckBackColor;
            pictureBox.Image = null;
            pictureBox.SizeMode = PictureBoxSizeMode.CenterImage;
            pictureBox.Size = new Size(25, 25);
            pictureBox.Location = new Point(0, 0);
            pictureBox.Paint += pic_Paint;
            pictureBox.Name = "Itempic";
            pictureBox.Click += ShuttleFrame_Click;
            pictureBox.MouseEnter += ShuttleFrame_MouseEnter;
            Label label = new Label();
            label.Parent = panel;
            label.Name = "Itempic";
            label.BackColor = Color.White;
            if (shuttleFrameData.IsShield) label.ForeColor = Color.DarkGray;
            else label.ForeColor = Color.Black;
            label.Text = shuttleFrameData.Title;
            label.Size= new Size(150, 25);
            label.Location = new Point(25, 0);
            label.Click += ShuttleFrame_Click;
            label.MouseEnter += ShuttleFrame_MouseEnter;
            label.MouseLeave += Label_MouseLeave;
             if (shuttleFrameData.IsLeftORRight)
            {
                panel.Width = Flow_Left_Bottom.Width-35;
                Flow_Left_Bottom.Controls.Add(panel);
            }
            else
            {
                panel.Width = Flow_Right_Bottom.Width-30;
                Flow_Right_Bottom.Controls.Add(panel);
            }
        }
        private void Label_MouseLeave(object? sender, EventArgs e)
        {
            var label = sender as Label;
            label.BackColor = Color.White; ;
        }
        /// <summary>
        /// 当所有操作都执行完,检查穿梭框中是否有选中的,或者是否全部选中
        /// </summary>
        private void ReSet(FlowLayoutPanel flow,int type=0)
        {
           // bool IsAllCheck = flow.Name == "Flow_Left_Bottom" ? (bool)pic_Left.Tag : (bool)pic_Right.Tag;
            bool IsAllCheck = true;

            bool IsItemCheck = false;
            int count = 0;
            int Sumcount = 0;
            foreach (Panel item in flow.Controls)
            {
                var result = item.Tag as ShuttleFrameData;
                if (result.IsShield == false && item.Visible == true) count++;
                if (result.IsCheck == false && result.IsShield == false && item.Visible == true) IsAllCheck = false;
                if(result.IsCheck==true&&result.IsShield==false&&item.Visible==true)IsItemCheck = true;
              
            }
          if(type==1)IsAllCheck = false;
            if (flow.Name== "Flow_Left_Bottom")
            {
                if (IsAllCheck&&count>0)
                {
                    pic_Left.BackColor = pic_CheckBackColor;
                    pic_Left.Image = pic_Img;
                    pic_Left.SizeMode = PictureBoxSizeMode.CenterImage;
                    pic_Left.Tag = true;
                }
                else
                {
                    pic_Left.BackColor = pic_UnCheckBackColor;
                    pic_Left.Image = null;
                    pic_Left.Tag = false;
                }
                if (IsItemCheck)
                {
                    L_RunLfet.Tag = true;
                    L_RunLfet.BackColor = pic_CheckBackColor;
                    L_RunLfet.Image = Properties.Resources.Check_Right_White;

                }
                else
                {
                    L_RunLfet.Tag = false;
                    L_RunLfet.BackColor = pic_UnCheckBackColor;
                    L_RunLfet.Image = Properties.Resources.Check_Right_Grag;
                }
            }
            else
            {
                if (IsAllCheck && count > 0)
                {
                    pic_Right.BackColor = pic_CheckBackColor;
                    pic_Right.Image = pic_Img;
                    pic_Right.SizeMode = PictureBoxSizeMode.CenterImage;
                    pic_Right.Tag = true;
                }
                else
                {
                    pic_Right.BackColor = pic_UnCheckBackColor;
                    pic_Right.Image = null;
                    pic_Right.Tag = false;
                }
                if (IsItemCheck)
                {
                    L_RunRight.Tag = true;
                    L_RunRight.BackColor = pic_CheckBackColor;
                    L_RunRight.Image = Properties.Resources.Check_Left_White;

                }
                else
                {
                    L_RunRight.Tag = false;
                    L_RunRight.BackColor = pic_UnCheckBackColor;
                    L_RunRight.Image = Properties.Resources.Check_Left_Grag;

                }
            }
        }
        private void pic_Paint(object? sender, PaintEventArgs e)
        {
            Control control = sender as Control;
            ControlPaint.DrawBorder(e.Graphics,//获取进行绘制的图形
             new Rectangle(0, 0, control.Width, control.Height),//绘制控件所在工作区域
             Color.LimeGreen, 1, ButtonBorderStyle.Solid,//边框类型,选择实线边框,也有虚线等种类;下面这四个重复的传参是设置工作区上下左右边框的功能
             Color.LimeGreen, 1, ButtonBorderStyle.Solid,
             Color.LimeGreen, 1, ButtonBorderStyle.Solid,
             Color.LimeGreen, 1, ButtonBorderStyle.Solid);
        }
        private void this_Paint(object? sender, PaintEventArgs e)
        {
            Control control = sender as Control;
            ControlPaint.DrawBorder(e.Graphics,//获取进行绘制的图形
           new Rectangle(0, 0, control.Width, control.Height),//绘制控件所在工作区域
            Color.FromArgb(224, 224, 224), 1, ButtonBorderStyle.Solid,//边框类型,选择实线边框,也有虚线等种类;下面这四个重复的传参是设置工作区上下左右边框的功能
            Color.FromArgb(224, 224, 224), 1, ButtonBorderStyle.Solid,
            Color.FromArgb(224, 224, 224), 1, ButtonBorderStyle.Solid,
            Color.FromArgb(224, 224, 224), 1, ButtonBorderStyle.Solid);
        }

        protected override void OnResize(EventArgs ea)
        {
            //穿梭框的长和宽定死
            this.Height = 400;
            this.Width = 500;
            base.OnResize(ea);
        }
        private void Input_Left_TextChanged(object sender, EventArgs e)
        {
            if (Input_Left.Text == "关键字搜索" || Input_Left.Text == "")
            {
                foreach (Panel item in Flow_Left_Bottom.Controls)if (item.Visible == false)item.Visible = true;
                return;
            }
            foreach (Panel item in Flow_Left_Bottom.Controls)
            if (!(item.Tag as ShuttleFrameData).Title.Contains(Input_Left.Text)) item.Visible = false;
            ReSet(this.Flow_Right_Bottom);
            ReSet(this.Flow_Left_Bottom);
        }
      

        private void Input_Right_TextChanged(object sender, EventArgs e)
        {
            
            if (Input_Right.Text == "关键字搜索" || Input_Right.Text == "")
            {
                foreach (Panel item in Flow_Right_Bottom.Controls) if (item.Visible == false) item.Visible = true;

                ReSet(this.Flow_Right_Bottom);
                ReSet(this.Flow_Left_Bottom);
                
            }
            foreach (Panel item in Flow_Right_Bottom.Controls)
            if (!(item.Tag as ShuttleFrameData).Title.Contains(Input_Right.Text)) item.Visible = false;

            ReSet(this.Flow_Right_Bottom);
            ReSet(this.Flow_Left_Bottom);
        }
        private void DealAllCheck(FlowLayoutPanel flow, bool ischeck)
        {
            foreach (Panel item in flow.Controls)
            {
                var result = item.Tag as ShuttleFrameData;
                if (result.IsShield == false && result.IsCheck == !ischeck&&item.Visible==true)
                {
                    result.IsCheck = ischeck;
                    if (ischeck)
                    {

                        item.Controls[0].BackColor = pic_CheckBackColor;
                        var pic = item.Controls[0] as PictureBox;
                        pic.Image = pic_Img;
                        pic.SizeMode = PictureBoxSizeMode.CenterImage;

                    }
                    else
                    {
                        item.Controls[0].BackColor = pic_UnCheckBackColor;
                        var pic = item.Controls[0] as PictureBox;
                        pic.Image = null;
                    }
                    item.Tag = result;
                }

            }
        }
        private void DealLeftORRight(Panel panel)
        {
            var data = panel.Tag as ShuttleFrameData;
            if (data.IsShield) return;
            data.IsCheck = !data.IsCheck;
            panel.Tag = data;
            if (data.IsCheck)
            {
                var pic = panel.Controls[0] as PictureBox;
                pic.BackColor = pic_CheckBackColor;
                pic.Image = pic_Img;
                pic.SizeMode = PictureBoxSizeMode.CenterImage;
            }
            else
            {
                var pic = panel.Controls[0] as PictureBox;
                pic.BackColor = pic_UnCheckBackColor;
                pic.Image = null;

            }
        }
    }

    public class ShuttleFrameData
    {
        /// <summary>
        /// Id  可以对应数据库主键,方存储
        /// </summary>
        public string Id { get; set; }
        /// <summary>
        /// 标题
        /// </summary>
        public string Title { get; set; }
        /// <summary>
        /// 是否选中,用于穿梭框的操作,默认False
        /// </summary>
        public bool IsCheck { get; set; }
        /// <summary>
        /// 是左侧值还是右侧值,这个用于初始化。
        /// </summary>
        
        public bool IsLeftORRight { get; set; }
        /// <summary>
        /// 是否屏蔽某些值
        /// </summary>
        public bool IsShield { get; set; }
    }
 private void Init()
        {
            List<ShuttleFrameData> list = new List<ShuttleFrameData>()
          {
              new ShuttleFrameData(){Id="1",Title="李白",IsShield=false,IsLeftORRight=true },
              new ShuttleFrameData(){Id="1",Title="杜甫",IsShield=false,IsLeftORRight=true },
              new ShuttleFrameData(){Id="1",Title="白居易",IsShield=true,IsLeftORRight=true },
               new ShuttleFrameData(){Id="1",Title="李清照",IsShield=false,IsLeftORRight=false },
              new ShuttleFrameData(){Id="1",Title="秦观",IsShield=false,IsLeftORRight=true },
              new ShuttleFrameData(){Id="1",Title="苏轼",IsShield=false,IsLeftORRight=false },
               new ShuttleFrameData(){Id="1",Title="李煜",IsShield=false,IsLeftORRight=true },
              new ShuttleFrameData(){Id="1",Title="王勃",IsShield=false,IsLeftORRight=true },
              new ShuttleFrameData(){Id="1",Title="柳永",IsShield=false,IsLeftORRight=true },
                 new ShuttleFrameData(){Id="1",Title="秦观",IsShield=false,IsLeftORRight=true },
              new ShuttleFrameData(){Id="1",Title="苏轼",IsShield=false,IsLeftORRight=false },
               new ShuttleFrameData(){Id="1",Title="李煜",IsShield=false,IsLeftORRight=true },
              new ShuttleFrameData(){Id="1",Title="王勃",IsShield=false,IsLeftORRight=true },
              new ShuttleFrameData(){Id="1",Title="柳永",IsShield=false,IsLeftORRight=true },


          };
            shuttleFrameControl1.SetShuttleFrame(list);

        }

 

 

 

标签:Right,false,--,pic,item,穿梭,Tag,winform,Left
From: https://www.cnblogs.com/zpy1993-09/p/18316082

相关文章

  • mpc
    https://blog.csdn.net/apr15/article/details/133965768 在“数据安全概述”里面,我们提到了安全多方计算SMPC(Securemulti-partycomputation)的技术。在这个计算里面代表是密码分享SS(secretsharing)技术。   而开启整个算法世界的其实是华人科学家姚期智教授,他提出......
  • selenium需要学习哪些知识,给出导图
    编程语言基础(如Python)基本语法数据类型控制结构(如条件语句、循环)函数定义与使用面向对象编程概念(类、对象、继承等)Selenium基础汇总元素定位ID定位Name定位ClassName定位TagName定位LinkText定位PartialLinkText定位XPath定位(重点掌握)CSS选择器定位(重点掌......
  • AP9235B dc-dc升压恒流电源驱动IC 2.8-30V 输出电流2A SOT23-6 白光LED驱动方案
    概述 AP9235B系列是一款固定振荡频率、恒流输出的升压型DC/DC转换器,非常适合于移动电话、PDA、数码相机等电子产品的背光驱动。输出电压可达30V,3.2V输入电压可以驱动六个串联LED,2.5V输入电压可以驱动两路并联LED(每路串联三个LED)。通过改变CE脚上PWM信号的占空比可以控制LED的......
  • leader好沟通是上天赐予程序员的礼物
    不知道大家有没有遇到过那种眼睛长在天上的领导,每天就只会把上头的要求全部答应下来,然后把事情交给底下的程序员,也不知道沟通的时候帮我们挡一挡一些不合理的要求,搞得每天加班加完之后,把东西交过去测试完了,然后上面的人又觉得不符合他们的心意又打回去重做,然后又要卡ddl忙生忙......
  • ctr命令的基本使用与技巧
    k8s早1.24后放弃docker,并把containerd作为运行时组件,containerd调用链更短,组件更少,更稳定,占用节点资源更少ctr是containerd的一个客户端工具crictl是CRI兼容的容器运行时命令行接口,可以使用它来检查和调试Kubernetes节点上的容器运行时和应用程序crictl使用命名空间k8s......
  • UOS系统部署KingbaseES V8R6 java故障“InvocationTargetException”
    案例说明:在UOS系统下部署KingbaseESV8R6数据库时,出现Java错误,部署失败。系统版本:kingbase@srv01:~$cat/etc/os-releasePRETTY_NAME="UnionTechOSServer20"NAME="UnionTechOSServer20"VERSION_ID="20"VERSION="20"ID=UOSHOME_URL="h......
  • 如何在没有 USB 的情况下将文件从手机传输到笔记本电脑
    我们经常需要在不同设备间传输文件,而不再局限于使用传统的USB线连接。无线技术的进步为手机与笔记本电脑之间的文件传输提供了便捷、高效的解决方案。无论是跨越房间还是位于网络覆盖的不同位置,以下方法将指导您如何在没有USB线的情况下,轻松实现手机与笔记本电脑间的数据传输。......
  • 卷积神经网络CNN实战:MINST手写数字识别——数据集下载与网络训练
    数据集下载这一部分比较简单,就不过多赘述了,把代码粘贴到自己的项目文件里,运行一下就可以下载了。fromtorchvisionimportdatasets,transforms#定义数据转换,将数据转换为张量并进行标准化transform=transforms.Compose([transforms.ToTensor(),#转换为张量......
  • 二分查找算法基础
    一.二分查找二分查找,又叫“折中查找”,其通过问题的性质,每次将问题规模缩小一半,对应的时间复杂度为O(logN)。二分查找不仅能用作数组元素的查找,还可用于单调函数的求解。对于二分查找算法,它包含head(头指针),tail(尾指针), mid三个变量,这里的头尾指针其实并不是指针,一般为整型,表......
  • 冒泡排序
    冒泡排序两层循环,外层冒泡轮数,内层依次比较。时间复杂度O(n2),代码量小,效率较低,小数据好用。publicstaticvoidmain(String[]args){int[]ints={1,24,53,42,5};int[]sort=sort(ints);System.out.println(Arrays.toString(sort));}public......