首页 > 编程语言 >C#多选下拉菜单自定义控件

C#多选下拉菜单自定义控件

时间:2024-05-08 15:00:40浏览次数:21  
标签:控件 自定义 ComboBox System multiComboBox1 Add Items CheckedListBox 下拉菜单

C#在winform项目中 多选下拉菜单自定义控件 。

由 ComboBox 和 CheckedListBox 组合形成。

效果:

 

自定义控件代码

MultiComboBox.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace HL_MultiComboBox
{
    public partial class MultiComboBox : UserControl
    {

        public ComboBox ComboBox = new ComboBox();
        public CheckedListBox CheckedListBox { get; set; }  //为选项赋值的接口
        public List<string> SelectedItems1 { get; set; }  //传递已选择项目的接口
 
        public MultiComboBox()
        {
            InitializeComponent();

            this.VerticalScroll.Enabled = true;
            this.AutoSize = true;
            CheckedListBox=new CheckedListBox();
            CheckedListBox.CheckOnClick = true;
            CheckedListBox.Visible = false;
            ComboBox = new ComboBox();
            ComboBox.Width = 150;
            ComboBox.DrawMode = DrawMode.OwnerDrawFixed;
            ComboBox.IntegralHeight = false;
            ComboBox.DroppedDown = false;
            ComboBox.DropDownHeight = 1;
            ComboBox.DropDownStyle = ComboBoxStyle.DropDown;
            ComboBox.AutoCompleteSource = AutoCompleteSource.ListItems;
            CheckedListBox.MouseUp += MouseUp1;
            CheckedListBox.MouseLeave += MouseLeave1;
            ComboBox.MouseDown += MouseDown1;
            ComboBox.DropDown += MouseLeave2;
            this.Controls.Add(ComboBox);   //添加控件
        }

        //
        #region 订阅方法模块
        //
        private void MouseLeave1(object sender, EventArgs e)  //鼠标离开CheckedListBox,隐藏CheckedListBox
        {
            CheckedListBox.Hide();
        }
        private void MouseLeave2(object sender, EventArgs e)  //ComboBox下拉时,显示下拉框
        {
            // 显示下拉框
            CheckedListBox.Width = ComboBox.Width;
            CheckedListBox.Size = new Size(ComboBox.DropDownWidth, CheckedListBox.Items.Count * 18);
            CheckedListBox.Location = new Point(ComboBox.Left, ComboBox.Height);
            Controls.Add(CheckedListBox);
            CheckedListBox.Visible = true;
        }
        private void MouseUp1(object sender, EventArgs e)  //在CheckedListBox中选择后,在ComboBox中显示相应项目
        {
            var list = new List<string>();
            foreach (var v in CheckedListBox.CheckedItems)  //将选择的项目加入list
            {
                list.Add(v.ToString());
            }
            ComboBox.Text = String.Join(",", list);
            SelectedItems1 = list;  //把选项赋给传递接口
        }
        private void MouseDown1(object sender, EventArgs e) //在ComboBox的下拉三角按下鼠标时,不显示ComboBox的下拉框,显示CheckedListBox当作其下拉框
        {
            ComboBox.DroppedDown = false;
        }
        #endregion 
 

    }
}

MultiComboBox.Designer.cs

       #region 组件设计器生成的代码

        /// <summary>
        /// 设计器支持所需的方法 - 不要
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // MultiComboBox
            // 
            this.Name = "MultiComboBox";
            this.Size = new System.Drawing.Size(278, 50);
            this.ResumeLayout(false);

        }

        #endregion

使用方法

拖 multComboBox 控件至窗体中 名为 multiComboBox1

       private void Form1_Load(object sender, EventArgs e)
        {
            this.multiComboBox1.ComboBox.Width = 300;
            //为下拉菜单添加选项
            this.multiComboBox1.CheckedListBox.Items.Add("1");
            this.multiComboBox1.CheckedListBox.Items.Add("2");
            this.multiComboBox1.CheckedListBox.Items.Add("3");
            this.multiComboBox1.CheckedListBox.Items.Add("4");
            this.multiComboBox1.CheckedListBox.Items.Add("5");
            this.multiComboBox1.CheckedListBox.Items.Add("6");
            this.multiComboBox1.CheckedListBox.Items.Add("7");
            this.multiComboBox1.CheckedListBox.Items.Add("8");
            this.multiComboBox1.CheckedListBox.Items.Add("9");
            this.multiComboBox1.CheckedListBox.Items.Add("10");

 
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var strSelected = multiComboBox1.SelectedItems1;
            string strResult = string.Join(",", strSelected);
            MessageBox.Show(strResult);

        }

 

标签:控件,自定义,ComboBox,System,multiComboBox1,Add,Items,CheckedListBox,下拉菜单
From: https://www.cnblogs.com/hailexuexi/p/18179765

相关文章

  • C++基础-如何引入第三方静态库、动态库或自定义库 摘自 https://blog.csdn.net/u01310
    C++无论是内置库还是第三方库,都需要自己手动进行查找、配置、引入等工作。本文即是帮助完成C++项目对于库、框架如何完成依赖引入达成可调用的目的,重点讲述开发工具VisualStudio中的操作静态库(.lib)静态库引入适用用于大部分无开源的第三方库,开发者不需要关心库的具体实现如何,......
  • 如何通过前端表格控件在10分钟内完成一张分组报表?
    前言:当今时代,报表作为信息化系统的重要组成部分,在日常的使用中发挥着关键作用。借助报表工具使得数据录入、分析和传递的过程被数字化和智能化,大大提高了数据的准确性及利用的高效性。而在此过程中,信息化系统能够实现对数据的实时监控和更新,为管理者提供及时、准确的业务数据,帮助......
  • 自定义单链表(非循环)的基本接口函数
    文件描述及头文件包含/********************************************************************* 文件名称: 单链表(非循环)的基本接口程序* 文件作者:[email protected]* 创建日期:2024/05/07* 文件功能:对单链表的增删改查功能的定义* 注意事项:No......
  • 自定义单链表(非循环)反转的基本函数接口
    题干structListNode*ReverseList(structListNode*head){if(head==NULL||head->next==NULL){returnhead;}else{structListNode*Phead=head;structListNode*temp=head->next;Phead->next=NULL;......
  • shell 脚本中使用自定义的alias别名
    摘自:https://blog.csdn.net/cscrazybing/article/details/41285287alias,假名,别名,bash的一个内建命令,用来给常用的较长的命令定义个简短的名称。alias命令的基本格式为alias[word[='command']],[]内为可选项。定义word为command的别名。若=’command’部分省略,则输出word......
  • ECharts自定义提示框浮层内容
    因为提示框内容支持字符串模板和回调函数两种形式字符串模板模板变量有{a},{b},{c},{d},{e},分别表示系列名,数据名,数据值等等,但是trigger属性为axis的时候它数据条就很多了,就可以用{a0},{a1},{a2}这样子去拿数据跟数组下标一样(官网有详细示例)示例:在`option`中的`tooltip`里边写......
  • Docker网络:Docker0、容器互联技术--link、自定义网络、实战部署Redis集群
    一、Docker网络●--理解Docker0在干净的Linux环境上安装docker(将docker的所有镜像、容器先删除,干干净净!)实验:1、查看本地网络信息ipaddr可见有三个网卡信息:lo:本地(回环)地址;ens:虚拟机或云服务器(内网)地址;docker0:docker网络地址。问题:docker是如何处理容器网络访问......
  • 【Python-Json】自定义类输入json序列化、json的读取与写入
    AI问答Questionjson支持numpy数组么Answer不幸的是,标准的JSON格式不直接支持NumPy数组.JSON是一种用于存储和交换数据的文本格式,它有限的数据类型只包括对象(object)、数组(array)、数字(number)、字符串(string)、布尔值(true/false)、空值(null)等.因此,无法直接将......
  • blazor中的PageTitle输出keywords和description,自定义组件
    在blazor的PageTitle中不具备输出keywords和description的功能,而如果直接使用<mate>标签,输出中文时会变成乱码,所以我给大家推介下面的代码解君愁:1@*<PageTitle>@Title-@AppTitle</PageTitle>*@2<HeadContent>3@(newMarkupString($"<metaname=\"keywords\"......
  • 设置Winform窗体内控件跟随窗体大小变化而变化
    点击查看代码#region界面放大处理privatefloatx;//窗体大小全局变量privatefloaty;//窗体大小全局变量#region获取控件的width、height、left、top、字体大小值,存放在控件的Tag属性中privatevoidsetTag(Controlcons){//遍历窗体中的控......