C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 30 を表示中)
■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 だけを発生させるというのは、対象性が無いような気がします。
プロパティ名とイベント名を統一した方がよろしいかと。

返信 編集キー/


管理者用

- Child Tree -