これは、他のコードではなく一部のコードで機能するため、最も奇妙なことです。次のコードは、TextBox をサブクラス化するクラスにあります (注: 重要かどうかはわかりませんが、Text プロパティをサブクラス化して、プライベート フィールド _realText から設定/取得します)。
以下のコードでは、最初の base.Text = this.RealText が正常に動作します!!! また、そのメソッド MaskData() 内にも設定しましたが、機能します!!!! では、なぜ if(!field.isSecure) セクションで機能しないのでしょうか? (私が何を意味するかについてはログを見てください)。base.Text=temp の後に Invalidate(), Update() を追加しようとしましたが、それは役に立ちませんでした。
コード:
private void SetupTextInBox()
{
if (isInManualMode)
{
this.ReadOnly = false;
base.Text = this.RealText;
}
else
{
this.ReadOnly = true;
if (!field.IsSecure)
{
string temp = this.RealText;
log.Info("This field is not secure so show it. field=" + field.Variable + " real='" + temp+"'");
base.Text = temp;
log.Info("text value='" + base.Text+"'");
return;
}
else
{
MaskData();
}
}
}
ログ
2012-06-30 07:15:51,468 [1] INFO AlpineAccess.Plugins.SecureTalkPlugin.SecureTextControl (null) - This field is not secure so show it. field=1.acc real='2222'
2012-06-30 07:15:51,468 [1] INFO AlpineAccess.Plugins.SecureTalkPlugin.SecureTextControl (null) - text value=''
編集: このメソッドは常に同じスレッドから呼び出されることに注意してください。これは、電話のトーンがどこか別の場所で押されたことを知らせるサーバー通知から来ており、そのスレッドは BeginInvoke を呼び出して、それを GUI/コントロール スレッドなどに配置します。
上記のメソッドのすぐ上流のコードは
public void AppendDTMFDigit(string digit)
{
log.Info("specified="+field.MaxSpecified+" someone appending dtmf digit on field=" + field.Variable+" fieldMax="+field.Max+" len="+RealText.Length);
if (field.MaxSpecified && this.RealText.Length >= field.Max)
return; //shortcut out since we can't exceed max digits
BeginInvoke(new MethodInvoker(delegate()
{
this.RealText = this.RealText + digit;
log.Info("new realtext=" + this.RealText);
SetupTextInBox();
}
));
}
詳細情報: すべてのクライアント コードを変更して、Text プロパティの使用と RealText プロパティの使用を停止し、Text プロパティのオーバーライドを停止すると、問題なく動作します。(明らかに、私はそれを望んでいませんが、RealText プロパティを参照する多くのクライアント コードを変更せずに、コントロールから TextBox に簡単に変更したり、元に戻したりすることはできません。 ...奇妙なバグのようです。
詳細情報: デバッガーがそれにステップインしましたが、これは非常に奇妙です。
2 非常に奇妙なこと。
- セッターではなく、ゲッターにステップします???
- TextBox の Text プロパティではなく、MY Text プロパティにステップインします。
grrrrr、なぜそれが...重大なバグのように聞こえますか? つまり、base.Text はスーパークラスのベースを参照する必要がありますね。– ディーン・ヒラー 編集中
Text メソッドのプロパティ コードの追加
public override string Text
{
get
{
return RealText;
}
set
{
if (value == null)
throw new ArgumentException("Not allowed to set RealText to null. Set to empty string instead");
RealText = value;
}
}