按文本查找控件并使用 Ctype 或项目分配自定义 属性 是字典中的控件

Find control by text and assign custom property with Ctype or item is control in dictionary

我有一个像这样的电子邮件文本框:

Imports System.ComponentModel

Public Class EmailTextBox
    Inherits TextBox
    Private _error As String = ""

    Public Sub New()
        ''
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        Dim brush As New SolidBrush(Me.ForeColor)
        e.Graphics.DrawString(Me.Text, Me.Font, brush, 0, 0)
    End Sub

    Protected Overrides Sub OnValidating(e As CancelEventArgs)
        MyBase.OnValidating(e)
        Dim isValidEmail As Boolean = ValidatedEmail(Me.Text)
        Dim _emailNotValid As String = Global.WindowsApp1.My.Resources.MessageResource.EmailNotValid
        Dim _errorBackColor As String = Global.WindowsApp1.My.Resources.MessageResource.ErrorBackColor

        e.Cancel = Not isValidEmail Or Me.ValidationError <> ""
        '
        If Me.ValidationError <> "" Then
            _emailNotValid = Me.ValidationError
        End If
        '
        If Not isValidEmail Then
            errProvider.SetError(Me, _emailNotValid)
            Me.BackColor = ColorTranslator.FromHtml(_errorBackColor)
        Else
            errProvider.SetError(Me, "")
            Me.BackColor = Color.White
        End If

    End Sub

    ' custom property for database validation
    Public Property ValidationError() As String
        Get
            Return _error
        End Get
        Set(ByVal Value As String)
            _error = Value
        End Set
    End Property

End Class

我把它拖到窗体中并设置名称为txtEmail。我如何在两种情况下设置 ValidationError 道具:
案例 1:

CType(Me.Controls("txtEmail"), TextBox).ValidationError = 456

案例二:

Private Items As New Dictionary(Of String, Control) From {
    {"txtEmail", txtEmail}
}
Items("txtEmail").ValidationError = 456

甚至更短:

Me.Controls("txtEmail").ValidationError = 456

感谢您的回答。

这些是实现您正在寻找的东西的一些选项。

Private Sub SetValidator()

    'if you know that there is only one
    Dim myCtrl As EmailTextBox = Me.Controls.OfType(Of EmailTextBox).First
    myCtrl.ValidationError = 457

    'if you want to find by name
    DirectCast(Me.Controls.Find("txtEmail", True)(0), EmailTextBox).ValidationError = 456

End Sub