NumericUpDown(数字上下控件)是 WinForm 中专门用于输入和调整数值的控件,它结合了文本框和上下按钮,用户可通过点击按钮或直接输入来设置数值,且能严格限制数值范围(最小值、最大值)和步长,适用于需要精确控制数值输入的场景(如年龄、数量、价格、权重等)。

NumericUpDown 控件的核心属性

NumericUpDown 的核心特性是 “数值约束” 和 “便捷调整”,其常用属性如下:

属性名作用描述
Value获取或设置当前数值(核心属性,类型为 decimal),如 numericUpDown1.Value = 10
Minimum设置允许的最小值(decimal 类型),默认 0,如 Minimum = 1 限制数值不能小于 1。
Maximum设置允许的最大值(decimal 类型),默认 100,如 Maximum = 120 限制数值不能大于 120。
Increment设置每次点击上下按钮时数值的增减步长(decimal 类型),默认 1,如 Increment = 0.5 每次增减 0.5。
DecimalPlaces设置显示的小数位数(默认 0,即整数),如 DecimalPlaces = 2 显示两位小数(如 10.50)。
Hexadecimal布尔值,控制是否以十六进制显示数值(默认 False),设为 True 时数值以十六进制显示(仅对整数有效)。
ReadOnly布尔值,控制是否只读(True 时不能直接输入,但可通过按钮调整)。
ThousandsSeparator布尔值,控制是否显示千位分隔符(如 1,000),默认 False
Text获取或设置控件显示的文本(与 Value 对应,通常无需手动修改)。
UpDownAlign控制上下按钮的对齐方式(Left 左对齐,Right 右对齐,默认 Right)。

NumericUpDown 控件的常用事件

NumericUpDown 的事件主要用于响应数值变化,常用事件如下:

事件名触发时机
ValueChangedValue 属性值发生变化时触发(核心事件),无论是通过按钮调整还是直接输入,都会触发,用于处理数值变更后的逻辑。
Click点击控件时触发(包括文本框和按钮区域)。
KeyPress在文本框中按下键盘按键时触发(可用于拦截无效输入,但控件默认会自动过滤非数值字符)。

NumericUpDown 控件的典型用法

NumericUpDown 适用于需要精确控制数值范围和格式的场景,常见用法如下:

  1. 整数输入(如年龄、数量) 设置 DecimalPlaces = 0(默认),MinimumMaximum 限制范围(如年龄:Minimum = 0Maximum = 120)。

  2. 小数输入(如价格、重量) 设置 DecimalPlaces = 2 保留两位小数,Increment = 0.01 精确调整(如价格:Minimum = 0Maximum = 9999.99)。

  3. 十六进制数值输入 设置 Hexadecimal = True,用于需要十六进制表示的场景(如颜色值、硬件地址)。

  4. 步长调整 根据需求设置 Increment(如音量调整步长为 5:Increment = 5,范围 0-100)。

  5. 数值变化联动 通过 ValueChanged 事件联动其他控件(如数值变化时实时计算总价、更新进度条等)。

整数控制示例(年龄选择)

最大值

最小值

初始值

保留几位小数

十六进制显示示例

使用示例:多样化的 NumericUpDown 效果

以下代码演示了 NumericUpDown 的核心用法,包括整数控制、小数控制、十六进制显示及数值联动等场景:

using System;
using System.Drawing;
using System.Windows.Forms;
​
namespace NumericUpDownDemo
{public class NumericUpDownExampleForm : Form{// 用于联动计算的标签private Label totalPriceLabel;
​public NumericUpDownExampleForm(){// 窗体基础设置Text = "NumericUpDown 控件示例";Size = new Size(500, 400);StartPosition = FormStartPosition.CenterScreen;totalPriceLabel = new Label();Controls.AddRange(CreateNumericUpDowns()); // 添加所有控件}
​// 创建不同功能的NumericUpDown控件private Control[] CreateNumericUpDowns(){List<Control> controls = new List<Control>();
​// 1. 整数控制示例(年龄选择)Label ageLabel = new Label{Text = "1. 年龄(0-120岁):",Location = new Point(30, 30),AutoSize = true};controls.Add(ageLabel);
​NumericUpDown ageNumeric = new NumericUpDown{Location = new Point(200, 30),Size = new Size(100, 20),Minimum = 0,          // 最小年龄0Maximum = 120,        // 最大年龄120Increment = 1,        // 步长1DecimalPlaces = 0,    // 整数(无小数)Value = 18            // 默认值18};controls.Add(ageNumeric);
​// 年龄数值变化事件Label ageResultLabel = new Label{Text = "当前年龄:18",Location = new Point(320, 30),AutoSize = true,ForeColor = Color.Blue};controls.Add(ageResultLabel);ageNumeric.ValueChanged += (sender, e) =>{ageResultLabel.Text = $"当前年龄:{ageNumeric.Value}";};
​// 2. 小数控制示例(商品单价)Label priceLabel = new Label{Text = "2. 单价(0-999.99元):",Location = new Point(30, 80),AutoSize = true};controls.Add(priceLabel);
​NumericUpDown priceNumeric = new NumericUpDown{Location = new Point(200, 80),Size = new Size(100, 20),Minimum = 0,Maximum = 999.99m,    //  decimal类型需加m后缀Increment = 0.01m,    // 步长0.01(精确到分)DecimalPlaces = 2,    // 保留两位小数ThousandsSeparator = true, // 显示千位分隔符(如1,000.00)Value = 99.99m};controls.Add(priceNumeric);
​// 3. 数量选择(与单价联动计算总价)Label quantityLabel = new Label{Text = "3. 数量(1-100):",Location = new Point(30, 130),AutoSize = true};controls.Add(quantityLabel);
​NumericUpDown quantityNumeric = new NumericUpDown{Location = new Point(200, 130),Size = new Size(100, 20),Minimum = 1,Maximum = 100,Increment = 1,Value = 1};controls.Add(quantityNumeric);
​// 总价标签(联动计算)Label totalLabel = new Label{Text = "总价:",Location = new Point(320, 130),AutoSize = true};totalPriceLabel = new Label{Text = $"{priceNumeric.Value * quantityNumeric.Value:C}", // 格式化货币Location = new Point(370, 130),AutoSize = true,ForeColor = Color.Green};controls.AddRange(new[] { totalLabel, totalPriceLabel });
​// 单价或数量变化时,更新总价priceNumeric.ValueChanged += UpdateTotalPrice;quantityNumeric.ValueChanged += UpdateTotalPrice;
​// 4. 十六进制显示示例Label hexLabel = new Label{Text = "4. 十六进制数值(0-255):",Location = new Point(30, 180),AutoSize = true};controls.Add(hexLabel);
​NumericUpDown hexNumeric = new NumericUpDown{Location = new Point(200, 180),Size = new Size(100, 20),Minimum = 0,Maximum = 255,Increment = 1,Hexadecimal = true, // 启用十六进制显示Value = 255         // 十六进制为FF};controls.Add(hexNumeric);
​// 显示对应的十进制值Label hexDecimalLabel = new Label{Text = $"十进制:{hexNumeric.Value}",Location = new Point(320, 180),AutoSize = true,ForeColor = Color.Purple};controls.Add(hexDecimalLabel);hexNumeric.ValueChanged += (sender, e) =>{hexDecimalLabel.Text = $"十进制:{hexNumeric.Value}";};
​// 5. 步长调整示例(音量控制)Label volumeLabel = new Label{Text = "5. 音量(0-100,步长5):",Location = new Point(30, 230),AutoSize = true};controls.Add(volumeLabel);
​NumericUpDown volumeNumeric = new NumericUpDown{Location = new Point(200, 230),Size = new Size(100, 20),Minimum = 0,Maximum = 100,Increment = 5,      // 步长5Value = 50};controls.Add(volumeNumeric);
​// 音量进度条(联动显示)ProgressBar volumeProgress = new ProgressBar{Location = new Point(320, 230),Size = new Size(150, 20),Maximum = 100,Value = 50};controls.Add(volumeProgress);volumeNumeric.ValueChanged += (sender, e) =>{volumeProgress.Value = (int)volumeNumeric.Value;};
​return controls.ToArray();}
​// 更新总价(单价×数量)private void UpdateTotalPrice(object sender, EventArgs e){// 假设单价和数量控件的名称NumericUpDown priceNumeric = Controls.OfType<NumericUpDown>().ElementAt(1);NumericUpDown quantityNumeric = Controls.OfType<NumericUpDown>().ElementAt(2);decimal total = priceNumeric.Value * quantityNumeric.Value;totalPriceLabel.Text = total.ToString("C"); // 格式化货币(如¥99.99)}
​// 程序入口[STAThread]static void Main(){Application.EnableVisualStyles();Application.Run(new NumericUpDownExampleForm());}}
}
​

代码说明

这个示例展示了 NumericUpDown 的核心用法,重点包括:

  1. 年龄控制:设置 Minimum = 0Maximum = 120DecimalPlaces = 0,限制为 0-120 的整数,通过 ValueChanged 事件实时显示当前年龄。

  2. 商品单价DecimalPlaces = 2 保留两位小数,Increment = 0.01m 精确到分,ThousandsSeparator = true 显示千位分隔符(如 “1,000.00”),符合价格显示习惯。

  3. 联动计算:单价和数量的 NumericUpDown 控件通过 ValueChanged 事件联动,实时计算总价(单价 × 数量),并以货币格式(C)显示。

  4. 十六进制显示Hexadecimal = true 启用十六进制模式,数值显示为十六进制(如 255 显示为 “FF”),同时展示对应的十进制值,适合硬件或底层开发场景。

  5. 音量控制Increment = 5 设置步长为 5,配合 ProgressBar 实时显示音量进度,演示数值与其他控件的联动效果。

使用注意事项

  1. 数据类型转换 Value 属性是 decimal 类型,如需整数需强制转换(如 (int)numericUpDown1.Value),注意小数转整数会自动截断(而非四舍五入)。

  2. 输入验证 控件会自动过滤非数值输入(如字母、符号),用户输入超出 Minimum/Maximum 范围时,会自动修正为最近的有效值(如输入 130 时,若 Maximum=120 则自动改为 120)。

  3. 小数位数与步长配合DecimalPlaces = 2,建议 Increment 设为 0.01 的倍数(如 0.050.1),避免出现过多小数位(如步长 0.33,可能显示 1.333)。

  4. 十六进制模式限制 Hexadecimal = true 时,DecimalPlaces 会自动失效(仅支持整数),且 Value 仍为十进制存储(显示为十六进制)。

  5. 只读模式 ReadOnly = true 时,用户不能直接输入文本,但仍可通过上下按钮调整数值,适合需要限制手动输入但允许调整的场景。

NumericUpDown 控件通过严格的数值约束和便捷的调整方式,完美解决了数值输入的准确性问题,是表单中处理年龄、价格、数量等数值型数据的首选控件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91764.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91764.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/91764.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文读懂K8S kubectl 命令,运维小白必看!

一、Kubectl 是什么? Kubectl 是 Kubernetes(简称 K8S)集群的命令行工具,它就像是一把万能钥匙,让我们可以与 K8S 集群进行交互,轻松管理集群中的各种资源,像是 Pod、Service、Deployment 等等。通过向 K8S API 发送 REST 请求,kubectl 实现了对集群资源的增删改查等操…

髋臼方向的定义与测量-I

近期看到关于髋臼方向不同应用场景下的不同定义&#xff0c;觉得特别有意思&#xff0c;但是&#xff0c;原文是影印本&#xff0c;不太方便实用屏幕取词翻译&#xff0c;且一些专业术语也不太好理解。 因此&#xff0c;我将原文和翻译整理了一些&#xff0c;不对的地方&#x…

Python爬虫实战:研究mahotas库,构建图像获取及处理系统

一、引言 (一)研究背景 在信息爆炸的时代,图像作为一种直观、丰富的信息载体,其数量在互联网上呈现指数级增长。这些图像数据涵盖了自然景观、动植物、工业产品等多个领域,为模式识别、机器学习等研究提供了宝贵的数据源。特别是在植物学研究领域,叶片图像包含了丰富的…

【04】海康相机C#开发——VS 在编译时,提示“Files的值“+乱码情况解决办法’ ,C#项目打开编译时报错:Files 的值“IGEF‘,

文章目录C#项目打开&#xff0c;用VS 在编译时编译时报错&#xff1a;Files 的值“乱码&#xff1b; 有的编译器会显示&#xff1a;Files的值“IGEF 以上报错都为同一种错误&#xff0c;.net中的配置文件乱码导致的&#xff1a; 找到项目目录下的“..\obj\Debug\”的文件夹中…

MySQL隐式转换陷阱:从错误查询案例解析索引失效与数据类型匹配

开始之前&#xff0c;先问个问题问题&#xff1a;mysql 数据类型是date &#xff0c;怎么写查询条件索引有效&#xff1f; ——下面带着疑问看下去。 一、mysql-8.隐式转换导致索引失效或查出不符合where条件结果 今天在执行一条sql语句时候&#xff0c;where条件写错了&#x…

【sklearn(01)】数据集加载、划分,csv文件创建,特征工程,无量纲化

目录sklearn数据集玩具数据集现实世界数据集加载玩具数据集获取现实世界数据集本地csv数据创建csv文件pandas加载csv数据集划分特征工程步骤特征工程APIDictVectorizer 字典列表特征提取APICountVectorizer 文本特征提取API英文文本提取中文文本提取TfidfVectorizer TF-IDF文本…

docker desktop入门(docker桌面版)(提示wsl版本太低解决办法)

参考文章&#xff1a;Docker Desktop Engine Stopped原因分析&#xff08;docker桌面停止&#xff09;WSL没装或没更新 文章目录Docker Desktop入门指南1. Docker Desktop简介2. 安装Docker Desktop2.1 系统要求2.2 下载和安装3. 配置Docker Desktop修改默认存储路径4. 运行你的…

《n8n基础教学》第三节:模拟一个自动化场景

1、模拟场景Nathan &#x1f64b;是 ABCorp 的分析经理&#xff0c;他的工作是支持 ABCorp 团队的报告和分析。作为一个真正的多面手&#xff0c;他还负责处理一些杂项任务。Nathan 做的一些事情是重复且枯燥的。他希望自动化其中一些任务&#xff0c;以避免精疲力竭。作为一名…

CodeRush AI 助手进驻 Visual Studio:AiGen/AiFind 亮相(三)

CodeRush 是专为 Visual Studio 打造的高效开发插件&#xff0c;通过集成 AI 驱动功能&#xff08;如自然语言生成代码的 AiGen 和智能搜索逻辑的 AiFind&#xff09;、语音交互及深度重构工具&#xff0c;直接在 IDE 内无缝完成代码生成、修改与导航&#xff0c;消除窗口切换与…

如何从头开始搭建属于自己的家用nas实现内网穿透访问

最近我在家部署了群晖NAS923&#xff0c;从而实现内网穿透&#xff0c;下面写一个新手向教程&#xff1a; 一、硬件安装与初始化设置 1. 硬盘安装&#xff08;已完成可跳过&#xff09; 群晖 923 支持 4 块 3.5 英寸硬盘&#xff0c;开箱后取出硬盘架&#xff0c;将硬盘&am…

mysql 之多表

mysql之多表已知2张基本表&#xff1a;部门表&#xff1a;dept &#xff08;部门号&#xff0c;部门名称&#xff09;;员工表 emp&#xff08;员工号&#xff0c;员工姓名&#xff0c;年龄&#xff0c;入职时间&#xff0c;收入&#xff0c;部门号&#xff09;CREATE table dep…

【Django】-6- 登录用户身份鉴权

一、&#x1f6e1;️ Django 鉴权 & 登录控制 Django 自带的鉴权系统&#xff08;用户身份管理小管家&#xff09;鉴权系统能干啥&#xff1f;Django 自带的鉴权系统&#xff0c;就像一个 “用户身份管家” &#xff0c;帮你管好这些事儿&#xff1a;功能类比加密存储用户密…

winscp 连openwrt 返回127错误码

winscp 连openwrt 24.10返回127错误码。找了许多原因也没搞清为啥&#xff08;客户端加密方式、winscp版本过低等都试过&#xff09;&#xff0c;用SecureFx试了一下&#xff0c;发现是openwrt 24.10固件没有安装Sftp服器&#xff0c;用下列命令安装即可。opkg install openssh…

Python编程基础与实践:Python文件处理入门

Python文件处理实战 学习目标 通过本课程的学习&#xff0c;学员将掌握如何在Python中打开、读取、写入和关闭文件&#xff0c;了解文本文件和二进制文件的区别&#xff0c;以及在文件处理中的一些最佳实践。 相关知识点 Python文件处理 学习内容 1 Python文件处理 1.1 文件的基…

Corrosion2靶机

打开靶机信息收集&#xff1a;kali里使用arp-scan -l或者netdiscover发现主机使用nmap扫描端口nmap -sS -sV -T4 -n -p- 192.168.31.20开启了22、80、8080端口 8080发现开启了tomcat服务扫出了他的ip以及他开放的端口&#xff0c;我们接下来拿浏览器访问一下两个页面都没有什么…

编程与数学 03-002 计算机网络 18_物联网与网络

编程与数学 03-002 计算机网络 18_物联网与网络一、物联网的基本概念&#xff08;一&#xff09;物联网的架构与层次&#xff08;二&#xff09;物联网的关键技术二、物联网网络的构建&#xff08;一&#xff09;物联网网络的通信协议&#xff08;二&#xff09;物联网网络的拓…

【Kubernetes】ConfigMap配置管理:存储配置参数,创建到容器挂载

在Kubernetes中&#xff0c;配置管理是应用部署的重要环节。ConfigMap作为存储非敏感配置数据的资源对象&#xff0c;能帮助我们实现"配置与代码分离"&#xff0c;让应用部署更灵活。一、什么是ConfigMap&#xff1f; ConfigMap是Kubernetes中用于存储非加密配置数据…

Promise和回调地狱

顺序执行 vs. 异步操作&#xff1a; 当我们说“顺序执行”&#xff0c;通常是指 操作按顺序发生。而 异步操作 指的是操作在后台执行&#xff0c;不会阻塞其他操作&#xff0c;通常会使用回调、Promise 或 async/await 来处理结果。 在 Promise 链式调用 的情况下&#xff0c;虽…

LeetCode 65:有效数字

LeetCode 65&#xff1a;有效数字问题本质与挑战 需判断字符串是否为有效数字&#xff0c;规则涉及整数、小数、指数&#xff08;e/E&#xff09;的复杂组合&#xff0c;如&#xff1a; 整数&#xff1a;123、-45、678小数&#xff1a;1.2、.3、4.、5.6指数&#xff1a;1e10、2…

数据结构之顺序表应用与双指针法

元素删除通过元素移动的方式来模拟删除操作&#xff1a;将指定下标后的所有元素依次向前移动一位&#xff0c;覆盖要删除的元素&#xff0c;从而达到 "删除" 的效果。 通过自定义函数实现删除功能&#xff0c;需要传入数组、数组长度的指针&#xff08;因为要修改长度…