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 的事件主要用于響應數值變化,常用事件如下:
事件名 | 觸發時機 |
---|---|
ValueChanged | 當 Value 屬性值發生變化時觸發(核心事件),無論是通過按鈕調整還是直接輸入,都會觸發,用于處理數值變更后的邏輯。 |
Click | 點擊控件時觸發(包括文本框和按鈕區域)。 |
KeyPress | 在文本框中按下鍵盤按鍵時觸發(可用于攔截無效輸入,但控件默認會自動過濾非數值字符)。 |
NumericUpDown 控件的典型用法
NumericUpDown 適用于需要精確控制數值范圍和格式的場景,常見用法如下:
整數輸入(如年齡、數量) 設置
DecimalPlaces = 0
(默認),Minimum
和Maximum
限制范圍(如年齡:Minimum = 0
,Maximum = 120
)。小數輸入(如價格、重量) 設置
DecimalPlaces = 2
保留兩位小數,Increment = 0.01
精確調整(如價格:Minimum = 0
,Maximum = 9999.99
)。十六進制數值輸入 設置
Hexadecimal = True
,用于需要十六進制表示的場景(如顏色值、硬件地址)。步長調整 根據需求設置
Increment
(如音量調整步長為 5:Increment = 5
,范圍0-100
)。數值變化聯動 通過
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 的核心用法,重點包括:
年齡控制:設置
Minimum = 0
、Maximum = 120
、DecimalPlaces = 0
,限制為 0-120 的整數,通過ValueChanged
事件實時顯示當前年齡。商品單價:
DecimalPlaces = 2
保留兩位小數,Increment = 0.01m
精確到分,ThousandsSeparator = true
顯示千位分隔符(如 “1,000.00”),符合價格顯示習慣。聯動計算:單價和數量的 NumericUpDown 控件通過
ValueChanged
事件聯動,實時計算總價(單價 × 數量),并以貨幣格式(C
)顯示。十六進制顯示:
Hexadecimal = true
啟用十六進制模式,數值顯示為十六進制(如 255 顯示為 “FF”),同時展示對應的十進制值,適合硬件或底層開發場景。音量控制:
Increment = 5
設置步長為 5,配合 ProgressBar 實時顯示音量進度,演示數值與其他控件的聯動效果。
使用注意事項
數據類型轉換
Value
屬性是decimal
類型,如需整數需強制轉換(如(int)numericUpDown1.Value
),注意小數轉整數會自動截斷(而非四舍五入)。輸入驗證 控件會自動過濾非數值輸入(如字母、符號),用戶輸入超出
Minimum
/Maximum
范圍時,會自動修正為最近的有效值(如輸入 130 時,若Maximum=120
則自動改為 120)。小數位數與步長配合 若
DecimalPlaces = 2
,建議Increment
設為0.01
的倍數(如0.05
、0.1
),避免出現過多小數位(如步長 0.33,可能顯示1.333
)。十六進制模式限制
Hexadecimal = true
時,DecimalPlaces
會自動失效(僅支持整數),且Value
仍為十進制存儲(顯示為十六進制)。只讀模式
ReadOnly = true
時,用戶不能直接輸入文本,但仍可通過上下按鈕調整數值,適合需要限制手動輸入但允許調整的場景。
NumericUpDown 控件通過嚴格的數值約束和便捷的調整方式,完美解決了數值輸入的準確性問題,是表單中處理年齡、價格、數量等數值型數據的首選控件。