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)
获得每个控件的位置,直到我找到我想要的位置。(我不确定GetPositionFromControl
和GetCellPosition
方法之间的差异,因为MS文档很少,但我会单独问这个问题)。
有更简单或更干净的方法让我做这件事吗?
我能想到的最好的方法是创建一个扩展方法。创建一个名为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;