• 締切済み

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

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

  • DataBindの更新タイミング(VB2005)

    VB2005で、あるクラスのプロパティをテキストボックスのTextプロパティにDataBindingしています。 テキストボックスの内容とクラスの内部変数の値が同じになるようにしたいのですが、上手くいきません。 Public Class Class1  Private _NameValue As String = Nothing  Public Property NameValue() As String   Get    Return _NameValue   End Get   Set (ByVal value As String)    _NameValue = Value   End Set  End Property End Class フォーム(Form1)にテキストボックス(TextBox1)とボタン(Button1)、ツールバーを設置しツールストリップボタン(ToolStripButton1)を設置します。 Public Class Form1  Private c As Class1  'フォーム表示時にClass1のインスタンス化、テキストボックスにバインディングする  Private Sub Form1_Show (ByVal ・・・) Handles MyBase.Shown   c = new Class1   TextBox1.DataBinding.Add("Text", c, "NameValue")  End Sub  'Button1をクリックした時  Private Sub Button1_Click(ByVal ・・・) Handles Button1.Click   MessageBox.Show(c.NameValue)  End Sub  'ToolStripButton1をクリックした時  Private Sub ToolStripMenu1_Click(ByVal ・・・) Handles ToolStripButton1.Click   MessageBox.Show(c.NameValue)  End Sub End Class デバッグを開始してテキストボックスに文字を打ち込み、Button1をクリックするとメッセージボックスに入力した文字が表示されます。 ですが、文字を打ち込みToolStripButton1をクリックすると文字を打ち込む前の状態の文字が表示されます。 なぜToolStripButtonの時は更新がされていないのでしょうか? テキストボックスからTabキーでButton1へフォーカスを移動させてからToolStripButtonをクリックすると更新された正しい内容が表示されます。 実際のプログラム上ではデータベースへの書き込みなどを行っているのですが、うまく更新できない時があり調べたらこの症状に気づきました。 ツールボタンをクリックした時に、先にDataBindの更新が走るようにする方法はありませんか? 

  • VB.NETで出来てC#で出来ない???

    VB.NETでは出来るのにC#で同じようにするやり方がわからなくて困っています。 VSのバージョンは2008です。 やりたいことは 『param.Item("AAA") = "111"』 このように書けるクラスを作りたいのですが、 VBで出来てC#では出来ないのでしょうか? イメージとしてはプロパティにメソッドをくっつけたようなクラス? C#ではこのように書くとエラーになります。 どのようにしたらいいでしょうか? public string Item(string Key) {  set { _param[Key] = value; } } VB Dim param As New Param() param.Item("AAA") = "111" ----Paramクラス---- Imports System.Text Public Class Param Private _Hash As New Hashtable Default Public Property Item(ByVal Key As String) As String Get Return _Hash(Key) End Get Set(ByVal value As String) _Hash(Key) = value End Set End Property End Class ---------

  • コントロールにイベントを発生させるには?

    VB.NET2005のWEBユーザーコントロールで下記のようにプロパティやメソッドをつくることはできたのですが、コンボボックスの選択がへんこうされたとか、テキストボックスの内容が変更されたとかのイベントをとることができません。いったいどうすればできるのでしょうか? Public Property TEST() As String Get Return "" End Get Set(ByVal value As String) _Test=value End Set End Property

  • DataGridViewTextBoxColumnを継承したカスタムコ

    DataGridViewTextBoxColumnを継承したカスタムコントロールにプロパティを追加したのですが、デザイナで編集保存して一旦閉じてから開き直すと初期値に戻ってしまいます。 保存したあと、form.Designer.vb ファイルをテキストエディタで開いてみると、やはり初期値(=False)が保存されているようです。 どのようにすればデザイナで設定した値を保存できるのでしょうか? ご教授いただけませんでしょうか。宜しくお願いします。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=34107&forum=7 この情報などを見てみたのですが、途中からイベント処理?の話に変わっているようで違うのかな?と思いました。 開発環境は Visual Basic 2010 Express です。 以下、作ったカスタムコントロールのソースです。 Public Class DataGridViewTextBoxColumnEx Inherits System.Windows.Forms.DataGridViewTextBoxColumn Private __CalcValue As Boolean Public Property CalcValue() As Boolean Get Return Me.__CalcValue End Get Set(ByVal value As Boolean) Me.__CalcValue = value End Set End Property End Class

  • リストボックス内の配列を保存・呼び出し

    お世話になります。 VB2005ユーザーです。 リストボックスに格納した配列をファイルへ保存・呼び出しをするにはどうすればいいのでしょうか? リストボックスにはTextbox1,2,3の内容を格納し、オーバーライドによりリストボックスにはTextbox1が表示されるようにすることはできたのですが、 SaveFileDialogを使って配列をファイルに保存する方法がわかりません。 http://dobon.net/vb/dotnet/file/xmlserializer.html こちらなどを参照させていただいたりしたのですが、よく理解できませんでした。 リストボックスに格納するコードは下記のようなものです。 Public Structure MyStruct Private _a As String Private _b As String Private _c As String Public Property a() As String Get Return _a End Get Set(ByVal Value As String) _a = Value End Set End Property Public Property b() As String Get Return _b End Get Set(ByVal Value As String) _b = Value End Set End Property Public Property c() As String Get Return _c End Get Set(ByVal Value As String) _c = Value End Set End Property ' ToStringメソッドをオーバーライドする Public Overrides Function ToString() As String Return Me._a End Function End Structure Private Sub リストに追加_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim myStruct As New MyStruct myStruct.a = Textbox1.Text myStruct.b = Textbox2.Text myStruct.c = Textbox3.Text ' アイテム追加 ListBox1.Items.Add(myStruct) ListBox1.SelectedIndex = 0 End Sub 望む結果としては、リストボックスに格納した複数の配列をファイルに保存、呼び出し時には保存した内容を基にリストボックスに復元、という動作をして欲しいのです。 ご教示のほう、宜しくお願いいたします!!

  • プロパティープロシージャーについて

    簡単な年齢計算プログラムです。 書籍のサンプルなのでうまく動いています。 クラスの変数がPrivate strnameだったりするので そこへアクセスするためにプロパティプロシージャーを使っているというところまでは 判ったような気がしますが、 getとsetの関係がわかりません。 まず、 1.何をGetしているのか 2.なぜGetが先に来るのか、 3.Setの前にGetのReturnで返してますが実態は何を返しているのでしょうか?普通に考えると逆のような気がします。 根本がわかっていないのだと思いますが、どなたかお教え願います。 呼ぶ方 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim person As New Class1() person.Name = TextBox1.Text person.Birthday = DateTimePicker1.Value.Date MessageBox.Show(person.Name & "さんの年齢は" & person.GetAge()) End Sub クラスの方。 Public Class Class1 Private strname As String Private datBirthday As Date Public Property Name() As String Get Return strname End Get Set(ByVal pro_name As String) strname = pro_name End Set End Property Public Property Birthday() As Date Get Return datBirthday End Get Set(ByVal pro_birthday As Date) datBirthday = pro_birthday End Set End Property Public Function GetAge() As Integer Return Int(DateTime.Today.Subtract(Birthday).Days / 365.25) End Function End Class

  • VB.NETで変数の宣言が上手くできません

    VB.NETで変数の宣言が上手くできません プロパティを使用し、変数の内容を一括保存しようと考えています その為に以下のようなコードを書いたのですが他のフォームから宣言されていないとなってしまいます 修正点を教えて頂けると嬉しいです Setting.vb Pubic class Settings Public dbdirectry As String Public flistpass As String Public Property flist () As String Get Return flistpass End Get Set (Byval Value As String) flistpass = Value End Set End Property もう一つflist () をdbdic ()に flistpassをdbdirectryにしたもの End Class この変数2つに他のフォームMainForm1.vbとDefaultSetting.vbなどからflistpass = Newflistpassなどと記述するとアクセス出来ず宣言していない扱いになります Publicでの宣言で大丈夫だと思ったのですが間違えているのでしょうか?

  • ユーザーコントロールに選択プロパティを出す?

    VB.NET2005のWEBユーザーコントロールでプロパティを作り、それをコントロールを配置したときのプロパティウィンドウから選択させたいのですが、書籍やネット等を調べてもわかりませんでした。。。現状のソースは Public Property TEST() As String Get Return "" End Get Set(ByVal value As String) if value = 1 then me.close end if End Set End Property です。 これでプロパティウィンドウにTESTという項目はでますが、値を入力しないといけません。よくあるBackColorのプロパティのようにリストから選択できるようにしたいのですがどうしたらいいでしょうか? それともカスタムコントロールでないとできないのでしょうか?

  • WithEventsの処理について

    複数あるテキストボックス(text1、text2…)にキーボードから入力したらメッセージを出すという独自のイベント処理を 共通の関数を使用しようとした時に以下の処理が挙げられるですがこの処理について <クラスモジュール(MsgEvent)> Public WithEvents MsgTextBox As TextBox   Private Sub MsgTextBox_KeyPress(KeyAscii As Integer) MsgBox MsgTextBox.name ……(1) End Sub <フォームモジュール> Dim Hairetu(1) As New MsgEvent Private Sub Form_Load() Set Hairetu(0).MsgTextBox = Text1 ……(2) Set Hairetu(1).MsgTextBox = Text2 End Sub 上記の(1)についてnameプロパティの意味がわかりません。 調べたら値の取得とあるのですがその値とは(2)で言えば「=text1」にあたるということですか? それと(2)のSetを定義しないといけない理由がよくわからないのでお教えください。 よろしくお願いします。

  • String型の値にスラッシュをつけて表示させたい。

    VB2005環境です。 渡ってきたString型の数字を、スラッシュをつけた上で、 テキストボックスに表示したいと思っています。 具体的には、 Dim YMD as string ="200709" Me.txtbox1.text=YMD これだと、200709と表示されてしまいますので、スラッシュを つけて、2007/09にしたいのです。 Formatを使うのだろうと思い、 Me.txtbox1.text=Format(YMD,"0000/00") としてみると、エラー。 スラッシュがつくからDateになるのかなと、 Me.txtbox1.text=CDate(Format(YMD,"0000/00")) でもダメでした。 Formatは、第二引数に指定した形式に直すものだと思っていたの ですが、String型のデータは直せないのでしょうか…? 問題点と、解決方法を教えていただけないでしょうか。 よろしくお願いします。

専門家に質問してみよう