当前位置: 首页 > news >正文

WinForm之NumericUpDown控件

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.dtcms.com/a/312247.html

相关文章:

  • Noob靶机攻略
  • 力扣刷题日常(11-12)
  • linux编译基础知识-头文件标准路径
  • NX947NX955美光固态闪存NX962NX966
  • FreeRTOS源码分析二:task启动(RISCV架构)
  • 8.苹果ios逆向-安装frida
  • DBMS设计 之1 从DBMS 到数据中台
  • C语言-指针初级(指针定义、指针的作用、指针的计算、野指针、悬空指针、void类型指针)
  • Spring框架深度学习实战
  • ⭐CVPR2025 单目视频深度估计新框架 Seurat
  • 嵌入式系统的中断控制器(NVIC)
  • rosdep的作用以及rosdep install时的常用参数
  • 质数时间(二分查找)
  • ​​​​​​​第二十一天(CDN绕过)
  • EPICS aSub记录示例2
  • [学习笔记-AI基础篇]02_深度基础
  • Kotlin协程极简教程:5分钟学完关键知识点
  • 工业场景工服识别准确率↑32%:陌讯多模态融合算法实战解析
  • OpenVLA复现
  • 23th Day| 39.组合总和,40.组合总和II,131.分割回文串
  • Linux—进程状态
  • 深入 Go 底层原理(九):context 包的设计哲学与实现
  • 智能手表:电源检查
  • Java多线程详解(2)
  • 一、灵巧手捉取几何原理——空间五指平衡捉取
  • GraphRag安装过程中的报错:系统找不到指定的文件(Could not install packages due to an OSError)
  • AI赋能测试:技术变革与应用展望
  • C++const成员
  • [网安工具] Web 漏洞扫描工具 —— AWVS · 使用手册
  • 机器学习【五】decision_making tree