【问题标题】:TableLayoutPanel GetControlFromPosition does not get non-visible controls. How do you access a non-visible control at a specified position?TableLayoutPanel GetControlFromPosition 不获取不可见控件。如何访问指定位置的不可见控件?
【发布时间】:2011-08-22 00:33:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# .net vb.net winforms tablelayoutpanel


    【解决方案1】:

    更好的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;
    }
    

    【讨论】:

      【解决方案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,并将其余参数随机排列。

      【讨论】:

      • 我喜欢 Stack Overflow 的一点是,在您给我一个理由之前,我没有花时间学习扩展方法。 :-)
      • 谢谢,到目前为止,我一直在扩展类或使用辅助方法或部分类。扩展方法可能更有用或更易于实现。你有没有用msdn.microsoft.com/en-us/library/bb384936.aspx作为学习参考?
      【解决方案3】:

      对于 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;
                  }
              }
          }
      

      【讨论】:

        【解决方案4】:

        我找到了一种解决方法/hack,将 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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-10
          • 1970-01-01
          • 2013-07-02
          • 1970-01-01
          • 1970-01-01
          • 2019-04-30
          相关资源
          最近更新 更多