什么是在vb 2005中完成表单上所有控件的最佳方式

时间:2009-05-26 22:43:03

标签: .net vb.net

什么是在vb2005中完成表单上所有控件的最佳方法? 我正在编写一个程序,可以根据表单上的信息编辑一串字节。 每个控件都使用它修改的十六进制地址和值来标记,即使嵌入在其他控件中的控件,在表单上执行所有控件的最佳方法是什么?

4 个答案:

答案 0 :(得分:6)

像这样的东西,传递形式开头:

Private Sub DoSomethingToAllControls(ByVal Container As Control)
    Dim ctl As Control
    For Each ctl In Container.Controls
        ' Do Something..

        ' Recursively call this function for any container controls.
        If ctl.HasChildren Then
            DoSomethingToAllControls(ctl)
        End If
    Next
End Sub

答案 1 :(得分:1)

从当前表单获取System.Windows.Forms.Control.ControlCollection(Me.Controls)的实例。从那里逐步通过集合中的控件。

答案 2 :(得分:1)

这是C#,但应该提出这个想法。该函数只是递归地枚举所有控件,你可以随心所欲地使用它们。

public static IEnumerable<Control> GetControlsRecursive(Control control)
{
    yield return control;

    foreach (Control directSubcontrol in control.Controls)
    {
        foreach (Control subcontrol in GetControlsRecursive(directSubcontrol))
        {
            yield return subcontrol;
        }
    }
}

用法就是这样。

foreach (Control control in GetControlsRecursive(myForm))
{
    DoStuff(control);
}

解决方案没有yield return语句在VB.NET中无法使用。

public static IEnumerable<Control> GetControlsRecursive(Control control)
{
    List<Control> controls = new List<Control>() { control };

    foreach (Control subcontrol in control.Controls)
    {
        controls.AddRange(GetControlsRecursive(subcontrol));
    }

    return controls;
}

答案 3 :(得分:0)

Private Sub enumerateControls(ByVal controlcontainer As Object)
        Dim basec As Control = controlcontainer
        If basec.HasChildren Then
            For Each itm As Control In basec.Controls
                enumerateControls(itm)
            Next
        End If
        If controlcontainer.tag IsNot Nothing Then
run function to determine control type and function

        End If
    End Sub