System.Windows.Forms.NumericUpDownにバグ?

NumericUpDownって、なんでTextがNull(またはEmpty)の時に不正な値とみなさないのか?
という点を調査している過程で、どうもNumericUpDownのバグくさいことが判明。
この記事はその対処法が書いてある。
http://blogs.newsgator.com/inbox/2007/03/net_numericupdo.html


で、仕様かバグかを判断する基準はいくつかあるのだが、Valueが2000でTextがEmptyって、UpdateTextの仕様としておかしいだろ、という事。
GUIコントロールでこの動作を仕様とするのは、さすがに無理があると思う。

対処法

先に記したリンク先の方法でもいいが、いちいちバギーなコントロールをカバーするためイベントハンドラを書くのは面倒なので、このコントロールを作って、

public class NotEmptyNumericUpDown : NumericUpDown {
	public NotEmptyNumericUpDown() 
		: base()
	{ }

	protected override void OnLostFocus(EventArgs e) {
		if (string.IsNullOrEmpty(this.Text)) {
			this.Text = this.Value.ToString();
			this.UserEdit = false;
		}
		base.OnLostFocus(e);
	}
}

NumericUpDownではなく、このコントロールを使えばいい。
NumericUpDownのTextプロパティはEditBrowsable属性によってエディタからすら隠されているが、Controlクラスを継承している以上存在しているので、上記コードは全く問題なく動作する。
あまり調べていないが、NumericUpDownのTextプロパティは、NumericUpDownが自身の子として持つTextBoxのTextプロパティを返しているだけではないだろうか。検証してないが多分正しい。


で、他の解決策としては、NumericUpDown自体を使わないこと。
NumericUpDownはMicrosoftの作品とは思えない程簡易なコントロールなので、自作してしまっても別に問題はないだろう。
自作の場合でかつ移植性を考えるなら、int型の使用やWndProcのoverrideなどは極力避ける点だけ気をつければいいだろう。