- 締切済み
デザイナ上にも値が表示され、独自の処理も組み込みたい
VB2005で独自の制限を持つコントロールを作ろうと思っています。 Imports System.ComponentModel Public Class Component1 Inherits TextBox Private _text As Double Public Overrides Property Text() As String Get Return _text End Get Set(ByVal value As String) If IsNumeric(value) Then _text = value End If End Set End Property End Class やりたい事は数値しか入力を許さず、一定のプロパティ指定によって カンマ区切りだとか小数部表示、桁数制限などが出来るようにしたい のです。 上記のようなコードで動作は出来るようなのですが、デザイナ上の プロパティウィンドウからTextを変更した時、デザイナ上に貼り付け られているテキストボックスの中に、指定されたTextが表示されません。 MyBase.Textを利用するとText()が何度も走行してしまうようですし、 取得するときに、Textプロパティに設定されている値を加工した結果を 返したい為、MyBase.Textの利用が宜しくないようです。 (例えば表示上は「1,234」となっているが、取得時には「1234」として 取得される、 設定時に「1234」と指定したが、実際に設定される値は「1,234」など) 先のような理由の為か、Getの方に Return String.Format("{0:#,##0}", Single.Parse(MyBase.Text)) のようなことをするとInvalidOperationExceptionが発生してしまいます。 どうするとデザイナ上にも値が表示され、先のようなカスタム処理を加えることが可能でしょうか? 宜しくお願い致します。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- redfox63
- ベストアンサー率71% (1325/1856)
カンマ表示用のプロパティを準備して以下のようにしてみてはいかがでしょう Private _bKanma as boolean Public Property TextKanma as boolean Get return _bKanma End Get Set ( byVal value as boolean ) if _bKanma <> value then myBase.Text = Text end if _bKanma = value End Set End Property Public Overrides Property Text() as String Get if _bKanma then dim tmp as Double if Double.TryParse( MyBase.Text, tmp ) then return tmp.ToStrign( "#,##0") end if end if return MyBase.Text End Get Set ( byVal value as String) if _bKanma then value = value.Replase(",","") end if dim tmp as Double if Double.TryPause( value, tmp ) then if _bKanma then MyBase.Text = tmp.ToString("#,##0") else MyBase.Text = tmp end if else ' MsgBox( "数値以外の文字は受け取れません" ) MyBase.Text = "" end if end Set End Property といった具合で ・・・
補足
ご回答ありがとうございます。 ご提示頂いた方法で出来ました。 なぜにこれで出来るのかが不明ですが・・・。 併せてフォーカスがあたった時にカンマなし、フォーカスが離れたときに カンマあり、ということを行いたく、ご提示頂いたコードの所々を マネてOnGotFocus()、OnLostFocus()を実装してみましたが、 どうも上手く動作してくれません。 処理的には走っているようなのですが、何も起こらないというような感じです。 OnGotFocus()について特記すると、OnGotFucos()へきた時点で既に なぜかカンマがなくなっています。 そしてカンマがなくなっているのに、表示上はカンマがついたままという 状態です。 実装は以下のようにしてみました。 Text()のSetだけ、上書きされないよう一応変えました。 Public Overrides Property Text() As String Get If _bKanma Then Dim tmp As Double If Double.TryParse(MyBase.Text, tmp) Then Return tmp.ToString("###0") End If End If Return MyBase.Text End Get Set(ByVal value As String) MyBase.Text = value End Set End Property Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs) MyBase.OnGotFocus(e) If _bKanma Then Dim tmp As Double If Double.TryParse(MyBase.Text, tmp) Then MyBase.Text = tmp.ToString("###0") End If End If End Sub MyBase.Textと言っているわりに上書きした自身のTextが走ったり、 取得処理なんて書いていないのにText()のGetが走ったり、 上手い実装が全く出来ません・・・。