• 締切済み

デザイナ上にも値が表示され、独自の処理も組み込みたい

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が発生してしまいます。 どうするとデザイナ上にも値が表示され、先のようなカスタム処理を加えることが可能でしょうか? 宜しくお願い致します。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

カンマ表示用のプロパティを準備して以下のようにしてみてはいかがでしょう 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 といった具合で ・・・

naktak
質問者

補足

ご回答ありがとうございます。 ご提示頂いた方法で出来ました。 なぜにこれで出来るのかが不明ですが・・・。 併せてフォーカスがあたった時にカンマなし、フォーカスが離れたときに カンマあり、ということを行いたく、ご提示頂いたコードの所々を マネて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が走ったり、 上手い実装が全く出来ません・・・。

関連するQ&A