- 締切済み
デザイナ上にも値が表示され、独自の処理も組み込みたい
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が発生してしまいます。 どうするとデザイナ上にも値が表示され、先のようなカスタム処理を加えることが可能でしょうか? 宜しくお願い致します。
- めとろいと(@naktak)
- お礼率66% (482/721)
- Visual Basic
- 回答数1
- ありがとう数0
- みんなの回答 (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 といった具合で ・・・
関連する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の更新が走るようにする方法はありませんか?
- ベストアンサー
- Visual Basic
- 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
- ベストアンサー
- Visual Basic
- 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
- ベストアンサー
- Visual Basic
- リストボックス内の配列を保存・呼び出し
お世話になります。 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 望む結果としては、リストボックスに格納した複数の配列をファイルに保存、呼び出し時には保存した内容を基にリストボックスに復元、という動作をして欲しいのです。 ご教示のほう、宜しくお願いいたします!!
- ベストアンサー
- Visual Basic
- プロパティープロシージャーについて
簡単な年齢計算プログラムです。 書籍のサンプルなのでうまく動いています。 クラスの変数が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
- ベストアンサー
- Visual Basic
- 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での宣言で大丈夫だと思ったのですが間違えているのでしょうか?
- ベストアンサー
- Visual Basic
- ユーザーコントロールに選択プロパティを出す?
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のプロパティのようにリストから選択できるようにしたいのですがどうしたらいいでしょうか? それともカスタムコントロールでないとできないのでしょうか?
- ベストアンサー
- Visual Basic
- 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を定義しないといけない理由がよくわからないのでお教えください。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- 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型のデータは直せないのでしょうか…? 問題点と、解決方法を教えていただけないでしょうか。 よろしくお願いします。
- ベストアンサー
- Visual Basic
補足
ご回答ありがとうございます。 ご提示頂いた方法で出来ました。 なぜにこれで出来るのかが不明ですが・・・。 併せてフォーカスがあたった時にカンマなし、フォーカスが離れたときに カンマあり、ということを行いたく、ご提示頂いたコードの所々を マネて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が走ったり、 上手い実装が全く出来ません・・・。