■14570 / ) |
Re[3]: ユーザーコントロールのメンバへの参照 |
□投稿者/ 魔界の仮面弁士 (646回)-(2008/02/21(Thu) 20:18:44)
|
コードを貼る時は、投稿モードを[図表モード]にした方が良いですよ。
■No14566 (あき さん) に返信
……?? 話の流れがわからなくなりました。
これは、最初の質問と同じ内容ですか?
それとも、別の質問ですか?
(別の質問だとしたら、前の問題が解決したのかどうかを教えてください)
> wStr = Me.UserControl1.CaptionText(実際はラベルのTextプロパティ)
> wStr = Me.UserControl1.Text(テキストのTextプロパティ)
> wStr = Me.UserControl1.NameText(実際はラベルのTextプロパティ)
UserControl1 というユーザーコントロールを貼り付けた場合、既定では
UserControl11, UserControl12, UserControl13…という名前になるはずです。
これが、最初の質問と同じなのだとしたら、
「UserControl1」という「ユーザーコントロールの型名」ではなく、
フォームに貼りつけた時の「ユーザーコントロールの名前(Name)」
を使ってください。
もし、型名でアクセスしたいのであれば、それらを Shared にする必要があります。
> 上記@Bは値を参照できるのですが、Aがうまくいきません。
UserControl は、もともと「Text プロパティ」を持っています。
もし、元の Text を上書きして、別の Text プロパティを再実装したいなら、
シャドウイングするか、オーバーライドすることになります。
今回は、オーバーライドの道を選択されたのですね?
一応確認。Me.Text と MyClass.Text と MyBase.Text の違いは、把握できていますか?
http://blogs.wankuma.com/jeanne/archive/2006/11/09/44157.aspx
http://smdn.invisiblefulmoon.net/ikimasshoy/vbdotnet/memyclassmybase.html
> どうもフォーム上のユーザーコントロールに値を入力しても、参照時には空文字になっています。
そもそも UserControl の Text プロパティは、非表示扱いになっているはずです。
(プロパティ画面上からも隠されていますし、コードエディタ上でも、IntelliSense に現れないはず)
Bindable属性 … False
Browsable属性 … False
EditorBrowsable属性 … Never
DesignerSerializationVisibility属性 … Hidden
それでもあえて Text という名前を使おうとしているという事は、
「Overrides Property Text」に対して、これらの属性値を変更しているのでしょうか。
それとも、デザイン時には現れない、隠しプロパティとして実装したいのでしょうか。
もし、属性を変更しているのだとしたら、DesignerSerializationVisibility の内容を
確認してみてください。そして、Form1.Designer.vb ファイルにおいて、Text プロパティの
シリアライズが、期待通りに行われているかを確認してみてください。
デザイナによって空文字列がシリアライズされているなら、起動時の初期値も空になります。
> Get
> Return m_InputText
> End Get
ここで取得するのは、txtText.Text でも MyBase.Text でもなく「m_InputText」なのですね。
では、この m_InputText の初期値は何にしていますか?
> If (IsDBNull(New_Text)) And (New_Text.Length = 0) Then
New_Text の型は String 型ですよね。
String である以上、IsDBNull は常に False を返します。
ですから、このコードが True になる事はありません。
しかも、(AndAlso ではなく)And 演算子を使っているため、このコードだと、
プロパティに Nothing を代入された場合に、エラーになってしまいます。
> If New_Text <> m_InputText Then
> OnInputTextChanged(EventArgs.Empty)
> End If
> m_OldText = m_InputText ' 変更前の値を記録
> m_InputText = New_Text ' 更新後の値を設定
ここでは、「m_InputText」が変更される前に、Changed イベントを発生させていますが、
あまり好ましくありません。
Changed というイベント名は、「変更後」に発生させるべきとされていますので、
できれば、m_InputText の変更後に発生させるべきでしょう。
もし、変更前に発生させたいのであれば、Changing という名称にしましょう。
さらに言えば、Text プロパティの変更時に、TextChanged は発生させずに、
InputTextChanged だけを発生させるというのは、対象性が無いような気がします。
プロパティ名とイベント名を統一した方がよろしいかと。
|
|