1

入力を検証するカスタム テキスト ボックス コントロールがあります (不要な文字を取り除きます)。これは、コントロールの実装でさらに処理を行いたい場合を除いて、うまく機能します。

例 フォームに 3 つの「specialTextbox」があります。sText1、sText2、および sText3。sText1 と sText2 は意図したとおりに機能します。ただし、sText3 の値が変更されたときにフォーラムで変更を加える必要があるため、ctext changed イベントを処理するフォームにハンドラーがあります。

Private Sub sText3(sender As Object, e As EventArgs) Handles sText3.TextChanged
  'do some stuff here
End Sub

ただし、このルーチンは、カスタム テキスト ボックスの OnTextChanged メソッドをオーバーライドするように見えます。MyBase.OnTextChanged への呼び出しを含めようとしましたが、これはまだカスケードアップせず、何をしても、テキスト ボックスに検証の役割を果たさせることができないようです。

本当に単純なものに違いないのですが、私は困惑しています!

これはテキストボックスをオーバーライドするクラスです

Public Class restrictedTextBox
  Inherits Windows.Forms.TextBox

  Protected validChars As List(Of Char)

  Public Sub New(ByVal _validChars As List(Of Char))
    MyBase.New()

    validChars = _validChars
  End Sub

  Public Sub setValidChars(ByVal chrz As List(Of Char))
    validChars = chrz
  End Sub

  Protected Overrides Sub OnTextChanged(e As System.EventArgs)
    MyBase.OnTextChanged(e)

    Dim newValue As String = ""
    For Each c As Char In Me.Text.ToCharArray
      Dim valid As Boolean = False
      For Each c2 As Char In validChars
        If c = c2 Then valid = True
      Next

      If valid Then newValue &= c.ToString
    Next

    Me.Text = newValue
  End Sub
End Class

これはカスタムテキストボックスを持つフォームです

Public Class frmNewForm
  Private Sub btnOK_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnOK.Click
      MessageBox.Show("the text from the restricted text is: " & txtRestricted.Text)
  End Sub
End Class

これは、TextChanged イベントを実装するカスタム テキスト ボックスを含むフォームです。

Public Class frmNewForm2
  Private Sub btnOK_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnOK.Click
    MessageBox.Show("the text from the restricted text is: " & txtRestricted.Text)
  End If

 Private Sub txtRestricted_TextChanged(sender As Object, e As EventArgs) Handles txtRestricted.TextChanged
    'now that I have implemented this method, the restrictedTextBox.OnTextChanged() doesn't fire - even if I call MyBase.OnTextChanged(e)

    'just to be completely clear. the line of code below DOES get executed. But the code in restrictedTextBox.vb does NOT 
    lblAwesomeLabel.Text=txtRestricted.Text
  End Sub
End Class
4

1 に答える 1

0

それは発火しますが、おそらくあなたがそれを実装している方法ではありません。

サンプル コードには、テキスト ボックス用の空のコンストラクターがありません。つまり、フォームにテキスト ボックスを追加するときにデザイナーを使用していない可能性が高いです。

しかし、あなたのフォームは、それがデザイナーによって作成されたことを示しています:

Private Sub txtRestricted_TextChanged(sender As Object, e As EventArgs) _
  Handles txtRestricted.TextChanged
End Sub

投稿されたコードでは不可能です。プログラムで「新しい」コントロールを作成する場合は、イベントもプログラムで接続する必要があります。

ハンドラーをドロップして、スタブを残します。

Private Sub txtRestricted_TextChanged(sender As Object, e As EventArgs)
  'yada-yada-yada
End Sub

次に、新しいテキストボックスを作成するときに、それを接続します:

txtRestricted = new restrictedTextBox(myCharsList)
AddHandler txtRestricted.TextChanged, AddressOf txtRestricted_TextChanged
Me.Controls.Add(txtRestricted)
于 2012-12-09T15:14:24.553 に答える