| 型 | プロパティ | 内容 | 既定値 |
|---|---|---|---|
| string | Text | コントロールに表示されるテキスト | |
| decimal | Value | コントロールに割り当てる値 | |
| decimal | Maximum | 最大値 | 100 |
| decimal | Minimum | 最小値 | 0 |
| decimal | Increment | ボタンがクリックされたときに増減する量 | 1 |
| bool | ThousandsSeparator | trueならば、桁区切りを表示する | false |
| bool | Hexadecimal | trueならば、16進数形式で表示する | false |
| int | DecimalPlaces | 小数部の桁数 | 0 |
| bool | UserEdit | trueならば、ユーザーがTextプロパティを変更した | |
UpdateEditTexts()をオーバーライドすることで、書式など表示方法を変更できます。
protected override void UpdateEditText ();NumericUpDown.UpdateEditText Method (System.Windows.Forms) | Microsoft Learn
ユーザーにテキストを書き換えられた場合にも対応するには、ParseEditText()も実装します。このメソッドはオーバーライドできないためnewで隠蔽し、検証が必要なときにそれが呼ばれるようにValidateEditText()をオーバーライドします。また上下ボタンが操作されたときにもパースされるように、UpButton()とDownButton()もオーバーライドします。
class MyNumericUpDown : NumericUpDown
{
protected override void UpdateEditText()
{
// 現在の値がユーザーによって編集されていたら、処理前にパースする
if (UserEdit) ParseEditText();
// Textプロパティを指定の書式に変更する
Text = Value + "kb";
}
protected new void ParseEditText()
{
Debug.Assert(UserEdit == true);
try
{
// Textプロパティをパースし、Valueを更新する
Value = Decimal.Parse(Text.Replace("kb", ""));
}
finally
{
UserEdit = false;
}
}
protected override void ValidateEditText()
{
// オーバーライドした、このクラスのメソッドでパースする
ParseEditText();
UpdateEditText();
}
public override void UpButton()
{
if (UserEdit) ParseEditText();
base.UpButton();
}
public override void DownButton()
{
if (UserEdit) ParseEditText();
base.DownButton();
}
}
c# - Having text inside NumericUpDown control, after the number - Stack Overflow
winforms - How To Display "0000" instead "0" in NumericUpDown in C# - Stack Overflow
NumericUpDown.cs
書式を変更することで表示される文字数が変化すると、AutoSizeでサイズが自動的に変更されるときにサイズが不一致となります。そのときはGetPreferredSize()もオーバーライドして、サイズを調整します。
| 型 | イベント | 発生タイミング |
|---|---|---|
| EventHandler | ValueChanged | Valueプロパティが変更されたとき |
| EventHandler | TextChanged | Textプロパティが変更されたとき。ただしTextの検証に失敗したときは発生しない |
コードまたはユーザによってValueプロパティが変更されたときに発生します。上または下ボタンが押されたときは即座に、テキストが変更されたときはENTERが押されるかフォーカスが外れたときに発生します。一方でテキストが変更され上下のボタンが押されたときは、入力された値とボタンで増減した値で2度イベントが発生します。つまり"1"に変更されてから上ボタンが押されると、最初のイベント発生時点ではValueは1で、その直後にイベントが発生しIncrement分だけ加算され2となります。