3

我正在使用 aTableLayoutPanel并且我想在TableLayoutPanel. 我想遍历 的行和列,TableLayoutPanel但如果我只想要特定行和列的单个控件,这个问题同样适用。
不幸的是GetControlFromPosition(int column, int row),只检索可见的控件(即它们的 Visible 属性设置为 True)。这对我没有好处,因为有时我想访问不可见的特定位置的控件,然后使其可见。

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

有没有更简单或更干净的方法可以做到这一点?

4

4 回答 4

3

更好的 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;
}
于 2014-12-16T14:08:05.127 回答
2

我能想到的最好的方法是创建一个扩展方法。创建一个名为“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,并将其余参数随机排列。

于 2011-08-22T04:12:42.440 回答
1

对于 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;
            }
        }
    }
于 2011-08-26T17:19:16.453 回答
1

我找到了一种解决方法/hack,将 GetControlFromPosition 用于可见 = false,首先将控件添加到表格布局面板,然后将可见设置为 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;
于 2019-02-01T03:03:21.880 回答