winform控件之checkedListBox

article/2025/10/28 1:35:11

checkedlistbox控件也是我们常用的控件,我们仿照上一篇checkbox的例程,这回用checkedlistbox来实现

本来以为是很容易实现的,结果发现想让功能做的完善以下,中间有许多坑需要填,下面我们一起来看一下吧

 

1.界面布局

界面布局如下

具体的布局代码就不贴了,总之就是在在上一篇的基础上使用checkedlistbox来实现全选,并新增了删除和添加的功能

 

2.用法示例

需要注意的有这么几点

1.事件顺序

当我们点击某一项的时候,checkedlistbox调用事件的顺序是这样的

ItemCheck -> SelectedValueChanged -> SelectedIndexChanged

 

2.点击空白

如上图所示,当我们已经选中一项的时候,再点击空白处,这一项的状态依然会改变,避免的方法可以参考这篇博文

CheckedListBox 当中项的状态改变

 

3.双击事件DoubleClick

如果我们某一项点击的比较快,会触发DoubleClick事件,这时候全选框状态和是否全选的状态会不一致,我们需要在这个事件里面重新进行检测

 

4.全选框状态

如上一篇CheckBox所述,全选按钮只能在Click事件里面进行处理,否则会出现事件嵌套

当我们点击全选按钮的时候,checkedlistbox会检测到我们点击的是空白,但是这时候我们检测全选框状态的时候,其状态并未改变,导致我们无法区分是点击了空白还是点击了全选框,所以只能单独设置个变量来判断是否点击了全选按钮

 

实现的时候遇到的问题基本上就是上面几条,大家可以自己实现下,因该会遇到不少问题,下面来看看具体的实现代码

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WindowsFormsApplication1
{public partial class FormMain : Form{public FormMain(ArrayList arrip_list){InitializeComponent();}private void buttonShow_Click(object sender, EventArgs e){string sb = "您的兴趣爱好是 ";for (int i = 0; i < checkedListBox1.Items.Count; i++){if (checkedListBox1.GetItemChecked(i) == true){sb = sb + checkedListBox1.GetItemText(checkedListBox1.Items[i]) + ",";}}label2.Text = "" + sb;}private void checkedListBox1_SelectedValueChanged(object sender, EventArgs e){CheckedListBox clb = sender as CheckedListBox;点击空白处会触发该事件,如果之前没有选中任何项,则index为-1if (clb.SelectedIndex != -1){int SelectCount = 0;if (bIsSelectAll == false && clb.GetItemChecked(clb.SelectedIndex) == true){for (int i = 0; i < clb.Items.Count; i++){if (clb.GetItemChecked(i) == true){SelectCount++;}}if (SelectCount == clb.Items.Count){checkBoxSelectAll.CheckState = CheckState.Checked;//Console.WriteLine("Checked");}}else if (bIsSelectAll == false && clb.GetItemChecked(clb.SelectedIndex) == false){checkBoxSelectAll.CheckState = CheckState.Unchecked;//Console.WriteLine("UnChecked");}}//Console.WriteLine("Value Changed");//这里为了避免点击空白处依然会更改之前的选中项,每次都将index清空为-1//clb.SelectedIndex = -1;}//这里单独个变量用于记录全选按钮是否按下//如之前CheckBox所述,全选按钮只能在Click事件里面进行处理,否则会出现事件嵌套//但是在Click事件里面的问题就是,在其他地方获取全选按钮的状态时候,状态并未改变//导致在Checklistbox判断是点击空白还是点击全选的时候无法进行判断private bool bIsSelectAll = false;private void checkBoxSelectAll_Click(object sender, EventArgs e){CheckBox cb = sender as CheckBox;if (cb.CheckState == CheckState.Checked)//if (checkBoxSelectAll.CheckState == CheckState.Checked){bIsSelectAll = true;for (int i = 0; i < checkedListBox1.Items.Count; i++){//这里需要手动设置以下索引,否则在直接设置某项状态的时候//SelectedItem是nullcheckedListBox1.SelectedIndex = i;checkedListBox1.SetItemChecked(i, true);}}else if (cb.CheckState == CheckState.Unchecked){bIsSelectAll = true;for (int i = 0; i < checkedListBox1.Items.Count; i++){//这里需要手动设置以下索引,否则在直接设置某项状态的时候//SelectedItem是nullcheckedListBox1.SelectedIndex = i;checkedListBox1.SetItemChecked(i, false);}}bIsSelectAll = false;//这里清空下索引,否则每次点击后最后一项都会被选中//清空索引后,让所有项都取消反蓝checkedListBox1.SelectedIndex = -1;}private ArrayList listM_moteeui = new ArrayList();private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e){CheckedListBox clb = sender as CheckedListBox;//检测是否点击到空白的方法,可以参考下面这篇博文//https://blog.csdn.net/apgk1/article/details/50787435//判断如果点击的坐标是空白的地方则不更改值if (bIsSelectAll == false && clb.IndexFromPoint(clb.PointToClient(Cursor.Position).X,clb.PointToClient(Cursor.Position).Y) == -1){e.NewValue = e.CurrentValue;}else    //这边开始判断集合当中是不是已经有ID,如果没有就加入{string temp = clb.SelectedItem.ToString();if (!listM_moteeui.Contains(temp)){listM_moteeui.Add(temp);}else{listM_moteeui.Remove(temp);}}}private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e){CheckedListBox clb = sender as CheckedListBox;}private void checkedListBox1_DoubleClick(object sender, EventArgs e){CheckedListBox clb = sender as CheckedListBox;//这里需要在DoubleClick中重新判断以下,因为如果点击的太快//DoubleClick事件触发,全选按钮和checklistbox的状态会不一致if (clb.SelectedIndex != -1){int SelectCount = 0;if (clb.GetItemChecked(clb.SelectedIndex) == true){for (int i = 0; i < clb.Items.Count; i++){if (clb.GetItemChecked(i) == true){SelectCount++;}}if (SelectCount == clb.Items.Count){checkBoxSelectAll.CheckState = CheckState.Checked;}}else if (clb.GetItemChecked(clb.SelectedIndex) == false){checkBoxSelectAll.CheckState = CheckState.Unchecked;}}}private void buttonDelete_Click(object sender, EventArgs e){if (checkedListBox1.SelectedIndex != -1){//删除选中项checkedListBox1.Items.Remove(checkedListBox1.GetItemText(checkedListBox1.Items[checkedListBox1.SelectedIndex]));//重新检查是否需要选中全选按钮int SelectCount = 0;for (int i = 0; i < checkedListBox1.Items.Count; i++){if (checkedListBox1.GetItemChecked(i) == true){SelectCount++;}}if (SelectCount == checkedListBox1.Items.Count){checkBoxSelectAll.CheckState = CheckState.Checked;//Console.WriteLine("Checked");}else{checkBoxSelectAll.CheckState = CheckState.Unchecked;}}}private void buttonAdd_Click(object sender, EventArgs e){//如果内容不为空if (textBoxAdd.Text != ""){//添加新内容到checklistboxcheckedListBox1.Items.Add(textBoxAdd.Text);//清空内容textBoxAdd.Text = "";}}}
}

 

 

不足之处希望能多批评指正,谢谢


http://chatgpt.dhexx.cn/article/QfxWtlUl.shtml

相关文章

C#学习笔记:CheckedListBox控件的用法

一、常用属性、方法和事件 1.常用属性 &#xff08;1&#xff09;CheckOnClick属性 CheckOnClick属性是布尔类型的值&#xff0c;如果为True&#xff0c;那么单击条目就能将条目勾选&#xff1b;如果为false&#xff0c;则要双击条目才能将其勾选。 &#xff08;2&#xff…

分组控件:CheckedListBox控件的使用

在CheckBox、CheckedListBox、RadioButton和TrackBar这四个控件的功能都是设置和获取值的&#xff0c;我们称之为设置值的控件。 前面我们了解了CheckBox控件和RadioButton控件的使用&#xff0c;这里我们来看CheckedListBox控件的使用&#xff0c;CheckedListBox控件在工具箱…

C#窗体应用程序之CheckListBox复选列表与ListBox列表框控件

1.CheckListBox复选列表 复选框功能类似的复选列表框 (CheckedListBox)&#xff0c;方便用户设置和获取复选列表框中的选项&#xff0c;复选列表框显示的效果与复选框类似&#xff0c;但在选择多个选项时操作比一般的复选框更方便。 新建一个checklisbox 然后点击那个小三角&…

阿里巴巴笔试 算法 9.21

单选题 多选题 编程题1&#xff1a; 小红的01连续段 题目描述 小红定义一个01串的“连续段”为&#xff1a;连续相同字符的极大长度。例如&#xff1a;“110001111”有一个长度为2的连续段&#xff0c;有一个长度为3的连续段&#xff0c;有一个长度为4的连续段。 小红拿到了一…

阿里巴巴的一道笔试题

分布式系统中的RPC请求经常出现乱序的情况。 写一个算法来将一个乱序的序列报序输出&#xff0c;列如&#xff0c;假设起始序号是1&#xff0c;对于&#xff08;1&#xff0c;2&#xff0c;5&#xff0c;8&#xff0c;10&#xff0c;4&#xff0c;3&#xff0c;6&#xff0c;9…

【后端研发笔试】3.25号 阿里巴巴笔试题

直接模拟吧 。 知识点补充 判断是否为大小写字母&#xff1a;Character.isLetter(String s) 关于Scanner得输入输出&#xff0c;请访问&#xff1a; 代码实现&#xff1a; package acm;import java.util.*;/*** 3.25阿里笔试* Question1&#xff1a;easy**/ public class Ma…

阿里巴巴笔试题选解

阿里巴巴笔试题选解 --9月22日&#xff0c;阿里巴巴北邮站 小题&#xff1a; 1、有三个结点&#xff0c;可以构成多少种二叉树形结构&#xff1f; 2、一副牌52张(去掉大小王)&#xff0c;从中抽取两张牌&#xff0c;一红一黑的概率是多少&#xff1f; 编程题&#xff1a; 3、设…

阿里巴巴笔试题

注&#xff1a;试题来源于网络资源&#xff0c;仅供交流、讨论和学习。 ************************************************************** 阿里巴巴集团2014实习生招聘研发工程师笔试卷&#xff08;A&#xff09;&#xff08;浙大&#xff09; 1、假设一个主机IP地址为192.168…

2023年春招阿里巴巴全套1000道java面试笔试题及答案

作为一名优秀的程序员&#xff0c;技术面试都是不可避免的一个环节&#xff0c;一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识。 如果你参加过一些大厂面试&#xff0c;肯定会遇到一些这样的问题&#xff1a; 1、看你项目都用的框架&#xff0c;熟悉S…

2020年阿里巴巴实习笔试编程题

2020年阿里巴巴实习笔试编程题&#xff08;一&#xff09; 之前思路是动态规划&#xff0c;结果造成计算复杂和答案错误。这里只采用排列组合&#xff0c;可能出现算法复杂度大的问题&#xff0c;还可以继续优化。 题目描述&#xff1a;现有n个人&#xff0c;从中选择任意数量…

2020阿里巴巴笔试真题(含答案)

1.假设可以不考虑计算机运行资源&#xff08;如内存&#xff09;的限制&#xff0c;以下 python3 代码的预期运行结果是&#xff1a;&#xff08;&#xff09; import math def sieve(size):sieve [True] * sizesieve[0] Falsesieve[1] Falsefor i in range(2, int(math.sqr…

阿里技术类面试真题,你能做对几个?(含答案)

每年的9月和10月 是互联网大厂疯狂招人的时期 也是程序员们跳槽的黄金期 不知道你有没有幻想过这样一个场景&#xff1a; 阿里巴巴的面试官说 恭喜你通过面试&#xff0c;明天来办理入职吧&#xff01; 今天&#xff0c;播妞为大家整理了阿里面试真题 刷企业历年真题&am…

Ubuntu安装和配置ssh教程

一般Ubuntu都会默认安装openssh-client,但是没有安装openssh-server。 安装ssh服务器 sudo apt install openssh-server安装ssh客户端 sudo apt install openssh-client配置ssh客户端&#xff0c;去掉PasswordAuthentication yes前面的#号&#xff0c;保存退出 sudo vi /et…

Ubuntu系统下安装ssh的方法

1.用CtrlAltT打开Ubuntu终端&#xff0c;输入sudo apt-get update命令–>回车–>输入当前登录用户的管理员密码–>回车以实现更新Ubuntu系统&#xff1a; 2、安装ssh的命令,打开系统终端窗口&#xff0c;输入sudo apt-get install openssh-server命令–>回车–>…

Ubuntu安装ssh服务详细过程

SSH服务简介&#xff08;来自百度百科&#xff09; SSH 为 Secure Shell 的缩写&#xff0c;由 IETF 的网络小组&#xff08;Network Working Group&#xff09;所制定&#xff1b;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠&#xff0c;专为远程登录会话和其他网络服务…

Ubuntu18.04版本安装ssh及连接ssh的常见问题

下面我们来解决Ubuntu18.04版本安装ssh及连接ssh的常见问题&#xff0c;及解决方法。 【题外话】安装Ubuntu时会提示一句Please remove the installation medium then reboot&#xff1a; 提示这段话&#xff0c;可以直接重启。 1.Ubuntu安装完成后进入系统后没有网络连接的图…

ubuntu下SSH安装及使用

ubuntu下SSH安装及使用 SSH简介SSH验证方式SSH安装方式安装时可能遇到的问题 启动SSH服务 本文主要介绍ubuntu环境下的SSH安装和使用。 SSH简介 SSH 为 Secure Shell 的缩写&#xff0c;由 IETF 的网络小组&#xff08;Network Working Group&#xff09;所制定&#xff1b;SS…

Docker Ubuntu上安装ssh和连接ssh

下面所有操作都是在阿里云服务器上进行&#xff0c;ubuntu18.04环境。Docker 版本是18.09.6 首先从云上拉取一个ubuntu的一个镜像 rootLIZ:~# docker pull ubuntu # 如果是在自己的物理机上操作前面要加sudo,下同使用docker image ls 查看刚才拉取下来的镜像: 启动镜像 ro…

Ubuntu下安装SSH

查看SSH服务 sudo –e|grep ssh 安装SSH 执行命令&#xff1a; Sudo –apt-get install openssh-server&#xff0c;提示没有软件包openssh-server. 因此&#xff0c; 必须先安装openssh-server。但是Ubuntu系统有32位或64位操作系统&#xff0c;所以首先我们必须确定Ubuntu的…

Ubuntu实现远程登陆之ssh——安装ssh服务端

Secure Shell&#xff08;SSH&#xff09;是一种加密网络协议&#xff0c;用于在不安全的网络上安全地运行网络服务。利用SSH可以实现加密并安全地远程登录计算机系统。 Ubuntu安装后默认只有ssh客户端&#xff0c;即只能在Ubuntu内去连接其他ssh服务器&#xff0c;本文将详细…