プロが教える店舗&オフィスのセキュリティ対策術

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が発生してしまいます。

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

A 回答 (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
といった具合で ・・・

この回答への補足

ご回答ありがとうございます。
ご提示頂いた方法で出来ました。
なぜにこれで出来るのかが不明ですが・・・。

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

補足日時:2008/12/05 12:56
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!