TableLayoutPanel GetControlFromPosition不获取不可见控件.如何访问指定位置的不可见

本文关键字:访问 定位 位置 何访问 获取 GetControlFromPosition 控件 TableLayoutPanel | 更新日期: 2023-09-27 18:06:21

我使用的是TableLayoutPanel,我想在TableLayoutPanel的特定位置获得控制。我想遍历TableLayoutPanel的行和列,但如果我只想在特定的行和列上使用单个控件,那么这个问题同样适用。
不幸的是,GetControlFromPosition(int column, int row)只检索可见的控件(即它们的可见属性设置为True)。这对我来说不是很好,因为有时我想访问一个位于特定位置的控件,该控件不可见,然后使其可见。

我不得不求助于迭代TableLayoutPanel.Controls集合,然后使用GetPositionFromControl(Control control)GetCellPosition(Control control)获得每个控件的位置,直到我找到我想要的位置。(我不确定GetPositionFromControlGetCellPosition方法之间的差异,因为MS文档很少,但我会单独问这个问题)。

有更简单或更干净的方法让我做这件事吗?

TableLayoutPanel GetControlFromPosition不获取不可见控件.如何访问指定位置的不可见

我能想到的最好的方法是创建一个扩展方法。创建一个名为Extensions.vb的新模块,并添加:

Imports System.Runtime.CompilerServices
Public Module Extensions
    <Extension()>
    Public Function GetAnyControlAt(Panel As TableLayoutPanel, Column As Integer, Row As Integer) As Control
        For Each PanelControl As Control In Panel.Controls
            With Panel.GetCellPosition(PanelControl)
                If Column = .Column AndAlso Row = .Row Then Return PanelControl
            End With
        Next
        Return Nothing
    End Function
End Module

现在您可以使用以下命令访问该方法:

Dim MyControl As Control = TableLayoutPanel1.GetAnyControlAt(Column, Row)

扩展方法将方法添加到作为第一个参数列出的类中,在本例中为Panel As TableLayoutPanel,并将其余参数依次添加。

更好的c#方法:

public static Control GetAnyControlAt(this TableLayoutPanel panel, int column, int row)
{
    foreach (Control control in panel.Controls)
    {
        var cellPosition = panel.GetCellPosition(control);
        if (cellPosition.Column == column && cellPosition.Row == row)
            return control;
    }
    return null;
}

对于c#:

public static class ExtensionMethods
        {
            public static Control GetAnyControlAt(TableLayoutPanel pp, int col, int row)
            {
            bool fnd = false;
            Control sendCC = null;
            foreach (Control cc in pp.Controls)
            {
                if (pp.GetCellPosition(cc).Column == col)
                {
                    if (pp.GetCellPosition(cc).Row == row)
                    {
                        sendCC = cc;
                        fnd = true;
                        break;
                    }
                }
            }
            if (fnd == true)
            {
                return sendCC;
            }
            else
            {
                return null;
            }
        }
    }

我找到了一个变通方法/破解方法来使用GetControlFromPosition为visible=false,首先将控件添加到表布局面板,然后将visible设置为false

的例子:

CheckBox Chk_Tbl_exist = new CheckBox();
Chk_Tbl_exist.Text = "This is a checkbox"; 
TableLayoutPanel.Controls.Add(Chk_Tbl_exist, 0, 1);
Chk_Tbl_exist.Visible = false;