从按钮内部获取面板并更改 TableLayoutPanel 单元格颜色

问题描述

我在每个单元格中有一个 TableLayoutPanel 面板,每个面板中有 2 个 RadioButton。当我检查 RadioButton 时,单元格颜色会改变。我知道我可以通过为每个 RadioButton 分配 CheckedChanged 事件并硬编码单元格行和列来更改颜色来做到这一点。我有 15 个面板,所以会有 30 个不同的 CheckedChanged 事件。

有什么办法可以使用 sender(RadioButton)获取它的面板吗?这样我就可以使用 GetCellPosition(panel) 获取单元格并使用面板来获取选中的 RadioButton 。然后我可以将此事件分配给所有 RadioButtons。

解决方法

这可以通过使用 Control.Parent 属性来实现。

您的代码应如下所示:

Private Sub RBs_CheckedChanged(sender As Object,e As EventArgs) Handles RadioButton1.CheckedChanged,RadioButton2.CheckedChanged,' ...etc.
    Dim rb = DirectCast(sender,RadioButton)
    Dim pnl = DirectCast(rb.Parent,Panel)
    
    ' TODO: Do something with pnl and/or rb.
    Console.WriteLine(pnl.Name)
End Sub

但是请注意,选择某个 RadioButton 将触发 两个 RB 的 CheckedChanged 事件;一个被检查了,一个没有被检查。因此,您可能希望将代码包含在 If rb.Checked Then ... End If 或任何合适的内容中。