首页 > 解决方案 > 为什么 Me.Controls.OfType 在 VB.NET 中不起作用?

问题描述

我正在使用 .NET Framework 4.7.2 作为参考。

Me.Controls.OfType在表单中的事件中使用自动句柄。

Sub AddTextBoxes_TextChanged()
    Dim textboxes = Me.Controls.OfType(Of TextBox)()

    Console.WriteLine(textboxes.Count)
    For Each txt In textboxes
        AddHandler txt.TextChanged, AddressOf AllTextBoxes_TextChanged
    Next
End Sub

Private Sub SampleForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    AddTextBoxes_TextChanged()
End Sub

Private Sub AllTextBoxes_TextChanged(sender As Object, e As EventArgs)
    ' ...
End Sub

但是, For 循环不起作用,所以我检查了 with 内是否有实际的文本框textboxes控件Console.WriteLine(textboxes.Count)。嗯,结果是0。我在表单设计中多次检查了文本框,它们存在。为什么不起作用Controls.OfType(Of TextBox)()

标签: vb.netlinq

解决方案


将您的处理程序放在表单的代码中。在设计视图中选择文本框之一。在“属性”窗口中选择闪电以显示所有可用的事件TextBox。选择 TextChanged 事件和下拉框箭头。AllTextBoxes_TextChanged由于签名匹配,您的方法将被列出。选择您的方法,Handles 代码将添加到方法中。对您希望使用此方法的每个文本框执行相同操作。

当然,您始终可以键入扩展的 Handles 子句。

但是,我看不出您的代码有什么问题。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim textboxes = Controls.OfType(Of TextBox)() '.ToList
    For Each txt In textboxes
        AddHandler txt.TextChanged, AddressOf AllTextBoxes_TextChanged
    Next
End Sub

Private Sub AllTextBoxes_TextChanged(sender As Object, e As EventArgs)
    Dim tb = DirectCast(sender, TextBox)
    MessageBox.Show($"The text changed event fired by {tb.Name}")
End Sub

为我工作。


推荐阅读