■No14570 (魔界の仮面弁士 さん) に返信
> コードを貼る時は、投稿モードを[図表モード]にした方が良いですよ。
すいません。こういった掲示板への投稿が始めてでご迷惑おかけします。
以後気をつけます。
> これが、最初の質問と同じなのだとしたら、
> 「UserControl1」という「ユーザーコントロールの型名」ではなく、
> フォームに貼りつけた時の「ユーザーコントロールの名前(Name)」
> を使ってください。
> もし、型名でアクセスしたいのであれば、それらを Shared にする必要があります。
私の記載表現が悪かったようですね。ユーザーコントロールの名前でアクセスしております。
>>上記@Bは値を参照できるのですが、Aがうまくいきません。
> UserControl は、もともと「Text プロパティ」を持っています。
>
もともと持っている「Text プロパティ」はどのようにユーザーコントロール側で
実装?すれば良いんでしょうか?
> もし、元の Text を上書きして、別の Text プロパティを再実装したいなら、
> シャドウイングするか、オーバーライドすることになります。
> 今回は、オーバーライドの道を選択されたのですね?
もともと、プロパティ名がTextだったのをInputTextで実装していて、
最初にご質問したエラーが表示される現象が発生しておりました。
それを、またTextに変更(アップグレードツールにて生成された状態)に戻した次第です。
>>どうもフォーム上のユーザーコントロールに値を入力しても、参照時には空文字になっています。
> そもそも UserControl の Text プロパティは、非表示扱いになっているはずです。
> (プロパティ画面上からも隠されていますし、コードエディタ上でも、IntelliSense に現れないはず)
>
> Bindable属性 … False
> Browsable属性 … False
> EditorBrowsable属性 … Never
> DesignerSerializationVisibility属性 … Hidden
>
> それでもあえて Text という名前を使おうとしているという事は、
> 「Overrides Property Text」に対して、これらの属性値を変更しているのでしょうか。
> それとも、デザイン時には現れない、隠しプロパティとして実装したいのでしょうか。
デザイナ上から消えてしまうのは、そういう事だったのですね。
私としては、テキストボックス部分のテキストプロパティを利用できれば良いので
元々のTextプロパティで十分なのですが、デザイナ上で設定できてコード上からも利用できる
形にしたいのです。
>>Get
>> Return m_InputText
>>End Get
> ここで取得するのは、txtText.Text でも MyBase.Text でもなく「m_InputText」なのですね。
> では、この m_InputText の初期値は何にしていますか?
>
以下に変更しました。
Get
Return txtText.Text
End Get
>>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 という名称にしましょう。
>
ご指導ありがとうございます。実装箇所を変更して確認します。
何か色々問題の箇所がありすぎるようなのでお返事頂いた内容を吟味して整理してみます。
|