WinForm之CheckBox 控件

CheckBox(復選框)是 WinForm 中用于實現 “多項選擇” 的控件,允許用戶從一組選項中選擇任意數量的項(包括零項、一項或多項),適用于需要同時選擇多個選項的場景(如愛好、權限設置、功能開關等)。與 RadioButton(單選按鈕)的 “互斥選擇” 不同,CheckBox 各組選項之間相互獨立,選擇狀態互不影響。

CheckBox 控件的核心屬性

CheckBox 的核心特性是 “多選性” 和 “獨立狀態”,其屬性圍繞選擇狀態和外觀展開,常用屬性如下:

屬性名作用描述
Checked布爾值,獲取或設置復選框是否被選中(True 表示選中,基礎狀態屬性)。例如:checkBox1.Checked = true 可默認選中。
CheckState枚舉值,獲取或設置復選框的狀態(擴展狀態屬性),可選值: - Unchecked:未選中(默認) - Checked:選中 - Indeterminate:不確定(半選狀態,僅當 ThreeState = true 時有效)
ThreeState布爾值,控制是否啟用三態模式(默認 False)。設為 True 時,CheckState 可設為 Indeterminate(半選狀態,通常用于父選項表示 “部分子選項被選中”)。
Text復選框旁邊顯示的文本(如 “籃球”“足球”“同意條款”)。
Appearance控制外觀樣式: - Normal:默認樣式(方形復選框 + 文本) - Button:按鈕樣式(選中時呈按下狀態,類似開關)
AutoCheck布爾值,控制點擊時是否自動切換選中狀態(默認 True,設為 False 需手動處理狀態變化)。
Enabled/Visible控制控件是否啟用 / 可見(同其他控件)。
TextAlign文本相對于復選框的對齊方式(如 MiddleRight 文本在右側居中)。

CheckBox 控件的常用事件

CheckBox 的事件主要用于響應選擇狀態的變化,常用事件如下:

事件名觸發時機
CheckedChangedChecked 屬性值改變時觸發(基礎事件),無論從 True 變為 False 還是相反,都會觸發。
CheckStateChangedCheckState 屬性值改變時觸發(擴展事件,適用于三態模式,涵蓋 Indeterminate 狀態變化)。
Click點擊復選框時觸發(可能不反映狀態變化,不如狀態事件精準)。

CheckBox 控件的典型用法

CheckBox 適用于需要 “多選” 或 “獨立開關” 的場景,常見用法如下:

  1. 多項選擇 一組 CheckBox 允許用戶選擇多個選項(如愛好:籃球、足球、游泳、閱讀)。

  2. 功能開關 單個 CheckBox 作為功能開關(如 “記住密碼”“自動登錄”“啟用通知”)。

  3. 三態選擇(父子關聯) 啟用三態模式(ThreeState = true),父 CheckBox 用 Indeterminate 狀態表示 “部分子選項被選中”(如文件夾選擇:父文件夾部分子文件被選中)。

  4. 關聯控件啟用 / 禁用 根據 CheckBox 的選中狀態,動態啟用或禁用其他控件(如選中 “其他” 時,顯示自定義輸入框)。

基礎多選示例(愛好選擇)

按鈕樣式復選框(開關效果)

使用示例:多樣化的 CheckBox 效果

以下代碼演示了 CheckBox 的核心用法,包括基礎多選、三態模式、功能開關及關聯控件等場景:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
?
namespace CheckBoxDemo
{public class CheckBoxExampleForm : Form{// 用于關聯顯示的文本框(選中"其他"時顯示)private TextBox otherTextBox;// 子復選框(用于演示三態父復選框)private List<CheckBox> childCheckboxes = new List<CheckBox>();
?public CheckBoxExampleForm(){// 窗體基礎設置Text = "CheckBox 控件示例";Size = new Size(500, 450);StartPosition = FormStartPosition.CenterScreen;otherTextBox = new TextBox();Controls.AddRange(CreateCheckboxes()); // 添加所有控件}
?// 創建不同功能的CheckBox控件private Control[] CreateCheckboxes(){List<Control> controls = new List<Control>();
?// 1. 基礎多選示例(愛好選擇)Label hobbyLabel = new Label{Text = "1. 請選擇愛好(可多選):",Location = new Point(30, 30),AutoSize = true};controls.Add(hobbyLabel);
?// 愛好選項CheckBox basketballCheck = new CheckBox{Text = "籃球",Location = new Point(50, 60),AutoSize = true};CheckBox footballCheck = new CheckBox{Text = "足球",Location = new Point(150, 60),AutoSize = true};CheckBox readingCheck = new CheckBox{Text = "閱讀",Location = new Point(250, 60),AutoSize = true};CheckBox musicCheck = new CheckBox{Text = "音樂",Location = new Point(350, 60),AutoSize = true};CheckBox otherCheck = new CheckBox{Text = "其他",Location = new Point(450, 60),AutoSize = true};controls.AddRange(new[] { basketballCheck, footballCheck, readingCheck, musicCheck, otherCheck });
?// 關聯的"其他"輸入框otherTextBox = new TextBox{Location = new Point(50, 90),Size = new Size(200, 20),PlaceholderText = "請輸入其他愛好",Visible = false // 初始隱藏};controls.Add(otherTextBox);
?// 綁定"其他"復選框的狀態變化otherCheck.CheckedChanged += (sender, e) =>{otherTextBox.Visible = otherCheck.Checked; // 選中則顯示};
?// 2. 功能開關示例(系統設置)Label settingLabel = new Label{Text = "2. 系統設置(功能開關):",Location = new Point(30, 130),AutoSize = true};controls.Add(settingLabel);
?CheckBox rememberCheck = new CheckBox{Text = "記住密碼",Location = new Point(50, 160),AutoSize = true};CheckBox autoLoginCheck = new CheckBox{Text = "自動登錄",Location = new Point(200, 160),AutoSize = true};CheckBox notifyCheck = new CheckBox{Text = "啟用消息通知",Location = new Point(350, 160),AutoSize = true,Checked = true // 默認啟用};controls.AddRange(new[] { rememberCheck, autoLoginCheck, notifyCheck });
?// 3. 三態復選框示例(父子關聯)Label threeStateLabel = new Label{Text = "3. 三態復選框(父子關聯):",Location = new Point(30, 200),AutoSize = true};controls.Add(threeStateLabel);
?// 父復選框(三態)CheckBox parentCheck = new CheckBox{Text = "全選/反選",Location = new Point(50, 230),AutoSize = true,ThreeState = true, // 啟用三態模式CheckState = CheckState.Unchecked};controls.Add(parentCheck);
?// 子復選框(3個)for (int i = 1; i <= 3; i++){CheckBox childCheck = new CheckBox{Text = $"子選項 {i}",Location = new Point(100, 260 + (i - 1) * 30),AutoSize = true};childCheckboxes.Add(childCheck);controls.Add(childCheck);
?// 子選項狀態變化時,更新父復選框狀態childCheck.CheckedChanged += (sender, e) => UpdateParentCheckState(parentCheck);}
?// 父復選框狀態變化時,同步子選項parentCheck.CheckStateChanged += (sender, e) =>{if (parentCheck.CheckState == CheckState.Checked){// 全選childCheckboxes.ForEach(c => c.Checked = true);}else if (parentCheck.CheckState == CheckState.Unchecked){// 全不選childCheckboxes.ForEach(c => c.Checked = false);}// Indeterminate狀態由子選項自動觸發,無需手動處理};
?// 4. 按鈕樣式復選框(開關效果)Label buttonStyleLabel = new Label{Text = "4. 按鈕樣式復選框:",Location = new Point(30, 350),AutoSize = true};controls.Add(buttonStyleLabel);
?CheckBox darkModeCheck = new CheckBox{Text = "深色模式",Location = new Point(50, 380),Size = new Size(100, 30),Appearance = Appearance.Button, // 按鈕樣式FlatStyle = FlatStyle.Flat};CheckBox fullscreenCheck = new CheckBox{Text = "全屏顯示",Location = new Point(200, 380),Size = new Size(100, 30),Appearance = Appearance.Button,FlatStyle = FlatStyle.Flat};controls.AddRange(new[] { darkModeCheck, fullscreenCheck });
?// 5. 顯示選中結果的按鈕和標簽Button showResultButton = new Button{Text = "顯示選中結果",Location = new Point(350, 380),Size = new Size(120, 30)};Label resultLabel = new Label{Text = "選中的愛好:無",Location = new Point(50, 420),AutoSize = true,ForeColor = Color.Blue};controls.AddRange(new[] { showResultButton, resultLabel });
?// 點擊按鈕時,獲取選中的愛好showResultButton.Click += (sender, e) =>{List<string> selectedHobbies = new List<string>();if (basketballCheck.Checked) selectedHobbies.Add("籃球");if (footballCheck.Checked) selectedHobbies.Add("足球");if (readingCheck.Checked) selectedHobbies.Add("閱讀");if (musicCheck.Checked) selectedHobbies.Add("音樂");if (otherCheck.Checked && !string.IsNullOrEmpty(otherTextBox.Text))selectedHobbies.Add(otherTextBox.Text);
?resultLabel.Text = $"選中的愛好:{ (selectedHobbies.Any() ? string.Join("、", selectedHobbies) : "無") }";};
?return controls.ToArray();}
?// 更新父復選框的三態狀態(根據子選項選中情況)private void UpdateParentCheckState(CheckBox parentCheck){int checkedCount = childCheckboxes.Count(c => c.Checked);if (checkedCount == 0){parentCheck.CheckState = CheckState.Unchecked; // 全不選}else if (checkedCount == childCheckboxes.Count){parentCheck.CheckState = CheckState.Checked; // 全選}else{parentCheck.CheckState = CheckState.Indeterminate; // 部分選中(半選)}}
?// 程序入口[STAThread]static void Main(){Application.EnableVisualStyles();Application.Run(new CheckBoxExampleForm());}}
}
?

代碼說明

這個示例展示了 CheckBox 的核心用法,重點包括:

  1. 基礎多選功能:通過一組 CheckBox 實現愛好選擇,用戶可同時選中多個選項;“其他” 選項選中時,通過 CheckedChanged 事件顯示關聯的輸入框,實現條件交互。

  2. 功能開關場景:模擬系統設置中的開關(記住密碼、自動登錄等),單個 CheckBox 獨立控制一項功能,默認選中 “啟用消息通知”。

  3. 三態模式與父子關聯:父 CheckBox 啟用三態模式(ThreeState = true),根據子選項的選中情況自動切換狀態:

    • 全選 → 父選項 Checked

    • 全不選 → 父選項 Unchecked

    • 部分選中 → 父選項 Indeterminate(半選狀態) 同時,點擊父選項可反向控制子選項(全選 / 全不選)。

  4. 按鈕樣式復選框:設置 Appearance = Appearance.Button 后,CheckBox 呈現按鈕樣式,選中時呈按下狀態,適合作為功能開關(如深色模式、全屏顯示)。

  5. 結果獲取:通過 “顯示選中結果” 按鈕遍歷 CheckBox 的 Checked 屬性,收集并展示選中的愛好,演示如何處理多選結果。

使用注意事項

  1. 與 RadioButton 的區別 CheckBox 支持多選(狀態獨立),RadioButton 支持單選(同組互斥),選擇控件時需根據業務場景(多選 / 單選)決定。

  2. 三態模式的啟用 Indeterminate 狀態僅在 ThreeState = true 時有效,通常用于 “部分選擇” 的抽象場景(如樹形結構、列表批量選擇),普通多選場景無需啟用。

  3. 事件選擇 基礎場景用 CheckedChanged 即可;三態模式需監聽 CheckStateChanged 以響應 Indeterminate 狀態變化。

  4. 狀態判斷順序 判斷 CheckState 時,建議先檢查 Indeterminate,再檢查 Checked/Unchecked(避免邏輯錯誤)。

  5. 批量處理選中項 遍歷一組 CheckBox 時,可通過 Checked 屬性篩選選中項(如示例中 “顯示選中結果” 的邏輯),無需逐個判斷。

CheckBox 是實現 “多項選擇” 的核心控件,通過靈活的狀態控制和事件處理,可滿足從簡單多選到復雜父子關聯的多種交互需求,是表單設計中處理 “非互斥選擇” 場景的首選。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91807.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91807.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91807.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鯨魚優化算法(Whale Optimization Algorithm, WOA)是一種受座頭鯨捕食行為啟發的群體智能優化算法,由Seyedali Mirjalili于2016年提出

鯨魚優化算法(Whale Optimization Algorithm, WOA)是一種受座頭鯨捕食行為啟發的群體智能優化算法,由Seyedali Mirjalili于2016年提出。 它通過模擬鯨魚的狩獵策略(特別是“氣泡網捕食”行為)來解決優化問題,廣泛應用于函數優化、工程設計、機器學習參數優化等領域。以下…

信息量,驚奇度,熵、KL散度(相對熵),交叉熵、最大似然估計MLE與最小化交叉熵的等價證明、

一&#xff1a; 一些基本概念 1.1 信息量:特定事件所攜帶的信息多少信息量衡量的是特定事件所攜帶的信息多少&#xff0c;其數學定義為&#xff1a;其中p(x)是事件x發生的概率。核心思想&#xff1a;越罕見的事件&#xff0c;其攜帶的信息量越大&#xff1b;越常見的事件&#…

VBA 64位API聲明語句第012講

跟我學VBA&#xff0c;我這里專注VBA, 授人以漁。我98年開始&#xff0c;從源碼接觸VBA已經20余年了&#xff0c;隨著年齡的增長&#xff0c;越來越覺得有必要把這項技能傳遞給需要這項技術的職場人員。希望職場和數據打交道的朋友&#xff0c;都來學習VBA,利用VBA,起碼可以提高…

深入理解Java中String.intern()方法:從原理到并發控制實踐

深入理解 Java 中 String.intern () 方法&#xff1a;從原理到并發控制實踐 在 Java 開發中&#xff0c;String.intern()方法是一個看似簡單卻蘊含深意的 API。它在字符串常量池管理、內存優化以及并發控制等場景中有著關鍵作用。本文將從底層原理出發&#xff0c;結合實際案例…

在Linux中創建LVGL應用

在Linux中創建LVGL應用 簡介 上一篇文章介紹了在imx6上開發UI的流程 . 這篇接上文&#xff0c; 介紹具體的開發步驟。 1. 創建項目主目錄 mkdir my_lvgl_project cd my_lvgl_project2. 初始化 Git 倉庫 (可選但推薦) git init echo "# My Project with Dependencies&…

大模型對比評測:Qwen2.5 VS Gemini 2.0誰更能打?

一、背景與選型關鍵 在 AI 應用落地的時代&#xff0c;“AI大模型選型對比”成為關鍵環節。選擇合適的模型要綜合考量性能、上下文長度、推理能力、中文/編程支持、成本等多維度指標。 本文重點比較 Gemini2.0Flash-Lite &#xff08;Preview&#xff09;、Gemini2.0Flash &a…

轉置卷積解釋與示例計算

文章目錄轉置卷積的三種等價實現方法&#xff1a;原理、公式與等價性分析數學定義與核心公式方法一&#xff1a;零填充翻轉核卷積&#xff08;數學定義方法&#xff09;原理與公式等價性說明方法二&#xff1a;直接位置映射&#xff08;pytorch框架高效實現&#xff09;原理與公…

關于車位引導及汽車乘梯解決方案的專業性、系統性、可落地性強的綜合設計方案與技術實現說明,旨在為現代智慧停車樓提供高效、安全、智能的停車體驗。

一、系統概述隨著城市土地資源日益緊張&#xff0c;立體停車、自動化停車成為發展趨勢。本方案圍繞“車位引導系統 汽車乘梯系統”構建智慧停車核心體系&#xff0c;結合地磁/視頻/超聲波檢測、AI識別、語音交互、電梯自動調度等先進技術&#xff0c;實現車輛入場、引導、停泊…

【相機】曝光時間長-->拖影

曝光時間長 → 運動目標在快門開啟期間持續移動 → 同一像素記錄多個位置的能量 → 圖像出現“拖影”&#xff08;運動模糊&#xff09;。&#x1f50d; 具體原因卷簾快門&#xff08;Rolling Shutter&#xff09;效應 RealSense 的 RGB 傳感器&#xff08;如 IMX 系列&#xf…

day36 力扣1049.最后一塊石頭的重量II 力扣494.目標和 力扣474.一和零

最后一塊石頭的重量II有一堆石頭&#xff0c;用整數數組 stones 表示。其中 stones[i] 表示第 i 塊石頭的重量。每一回合&#xff0c;從中選出任意兩塊石頭&#xff0c;然后將它們一起粉碎。假設石頭的重量分別為 x 和 y&#xff0c;且 x < y。那么粉碎的可能結果如下&#…

Java內存模型(Java Memory Model,JMM)

?? JMM?? 是Java虛擬機&#xff08;JVM&#xff09;規范中定義的一組規則和規范&#xff0c;用于描述多線程環境下&#xff0c;Java程序中變量的訪問和修改行為&#xff0c;尤其是在并發編程中如何保證內存可見性、原子性和有序性。JMM 是 Java 并發編程的基石&…

【swoole Windows 開發(swoole-cli 開發 hyperf)】

先前swoole在Windows平臺的開發體驗極差&#xff0c;如果在Windows開發swoole的東西可以用docker或者虛擬機&#xff0c;遠程開發&#xff0c;體驗比較好的是直接Mac或者Linux系統開發。但是作為window平臺的釘子戶表示我窮。swoole之前已經推出了cygwin64編譯成winwods版本的方…

興達餐飲 酒店 進銷存管理系統軟件

興達餐飲 酒店 進銷存管理系統軟件

Seal Report:一款免費開源的報表工具

Seal Report 是一款基于 C# 語言開發的開源報表工具&#xff0c;可以從各種數據庫或 NoSQL 數據源中生成日常報告&#xff0c;并且執行復雜的計劃任務。 功能特性 免費開源&#xff1a;源代碼托管在 GitHub 上&#xff0c;用戶可以自由使用、修改、甚至集成到自己的系統中&…

WebRTC 多媒體 SDP 示例與解析

webRTC中的SDP的Bundlle可能包含一個或者多個媒體塊&#xff08;媒體描述, 源碼對應類ContentInfo&#xff09;&#xff0c;從 m 開始到下一個 m 行&#xff08;或 SDP 結束&#xff09;之間的所有屬性&#xff08;包括 a&#xff09;都屬于同一個媒體塊&#xff08;media sect…

SpringBoot 啟動富文本文字更改

正常來說 SpringBoot啟動時候&#xff0c;展示的文字是這個 、 主播這邊想要換一個樣式&#xff0c;換一個自己自定義的文字 這邊換成了自己的博客名字 具體實現操作如下 在項目目錄 resources下創建一個名字為banner.txt的文本&#xff0c;這是SpringBoot啟動的時候尋找的…

基于結構熵權-云模型的鑄鐵浴缸生產工藝安全評價

一、評價模型核心思想 結構熵權法 解決傳統熵權法忽略指標間結構關系的問題,通過指標層次網絡計算權重。 步驟: 構建工藝安全評價指標體系(樹狀/網絡結構) 計算同級指標間的影響度矩陣 引入修正熵權:wj=1?Ej∑(1?Ek)結構影響因子w_j = \frac{1 - E_j}{\sum (1 - E_k)} \…

[Linux]從零開始的vs code交叉調試arm Linux程序教程

一、前言 最近的項目中需要集成rknn的視覺識別&#xff0c;在這之前我并且沒有將rknn集成到自己項目的經驗。這里我需要在rknn原本demo的基礎上我還需要集成自己的業務代碼。但是又有一個問題&#xff0c;原本rknn我們都是使用交叉編譯編譯到開發板上的&#xff0c;并且我們還要…

視頻號私信自動化回復插件

給自己的瀏覽器插件又增加了視頻號斯信的自動化回復搜索&#xff1a;程序員老狼主體邏輯就是&#xff0c;不停的點擊打招呼和斯信那個tab切換查看有無小紅點&#xff0c;有小紅點的會話&#xff0c;就點擊。查看有無打招呼&#xff0c;有打招呼就點擊&#xff0c;抓取昵稱和內容…

Web前端實現銀河粒子流動特效的3種技術方案對比與實踐

文章目錄 前端實現銀河粒子流動特效的技術原理與實踐 引言:銀河粒子特效的技術背景與現狀 技術發展歷史 當前技術現狀 技術原理與實現方案 思維導圖:銀河粒子特效技術架構 1. CSS3實現方案 基礎實現代碼 性能優化技巧 2. Canvas 2D實現方案 基礎實現代碼 Canvas高級優化技術 …