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

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.xdnf.cn/news/16936.html

相关文章:

  • linux ssh公钥移除办法
  • Day 29: 复习
  • 保证金率(Margin Ratio)
  • Mybatis学习之获取参数值(四)
  • 力扣面试150题--回文数
  • golang——viper库学习记录
  • AWS上部署Spring Boot应用的完整指南
  • 音视频学习(四十八):PCM和WAV
  • Linux网络-------4.传输层协议UDP/TCP-----原理
  • 深入 Go 底层原理(五):内存分配机制
  • 【笔试真题】2024秋招京东后端开发岗位-第一批笔试
  • 云运维解决方案(word)
  • 8.苹果ios逆向-安装frida
  • STM32CubeIDE新建项目过程记录备忘(五)中断方式的USART串口通信
  • 什么是需量跟随
  • 深入 Go 底层原理(八):sync 包的实现剖析
  • 动态规划经典模型:双数组问题的通用解决框架与实战
  • VirtualBox 的 HOST 键(主机键)是 右Ctrl 键(即键盘右侧的 Ctrl 键)笔记250802
  • 音视频学习(四十五):声音的产生
  • 图(遍历/最小生成树/单/多源最短路径)
  • Spring事务失效场景
  • Python 全局解释器锁
  • Web前端实现银河粒子流动特效的3种技术方案对比与实践
  • 使用C++实现日志(1)
  • 淘宝小程序的坑
  • 华为核心交换机S7700的内存OID
  • 阿里云:Ubuntu系统部署宝塔
  • JavaScript将String转为base64 笔记250802
  • Jotai:React轻量级原子化状态管理,告别重渲染困扰
  • Unity_数据持久化_XML基础