C# 返回包含控制器类控件的groupbox并修改单个控件

C# 返回包含控制器类控件的groupbox并修改单个控件,c#,winforms,C#,Winforms,假设我在winform中嵌入了一个单独的groupBox 我们可以称之为grpLocal 因此,在这一点上,grpBox不包含任何单独的控件 现在让我们假设我需要这个grpLocal groupbox根据上下文包含不同的控件,在本例中是不同的产品 我的想法是创建一个抽象基类,其中包含如下方法: public abstract GroupBox showContextControls() public override Groupbox showContextControls() { pri

假设我在winform中嵌入了一个单独的groupBox

我们可以称之为grpLocal

因此,在这一点上,grpBox不包含任何单独的控件

现在让我们假设我需要这个grpLocal groupbox根据上下文包含不同的控件,在本例中是不同的产品

我的想法是创建一个抽象基类,其中包含如下方法:

public abstract GroupBox showContextControls()
public override Groupbox showContextControls()
{
  private label = new System.Windows.Forms.Label();
  private label2 = new System.Windows.Forms.Label();

  private grpExternal = new System.Windows.Forms.GroupBox();

  this.grpExternal.Controls.Add(this.label );
  this.grpExternal.Controls.Add(this.label2 );

  return grpExternal;
}
        Control[] matches = grpLocal.Controls.Find("label2", true);
        if (matches.Length > 0 && matches[0] is Label)
        {
            Label lbl = (Label)matches[0];
            lbl.Text = "Hello World!";
        }
后面是一些派生子类(每个产品一个),它们将使用此类执行以下操作:

public abstract GroupBox showContextControls()
public override Groupbox showContextControls()
{
  private label = new System.Windows.Forms.Label();
  private label2 = new System.Windows.Forms.Label();

  private grpExternal = new System.Windows.Forms.GroupBox();

  this.grpExternal.Controls.Add(this.label );
  this.grpExternal.Controls.Add(this.label2 );

  return grpExternal;
}
        Control[] matches = grpLocal.Controls.Find("label2", true);
        if (matches.Length > 0 && matches[0] is Label)
        {
            Label lbl = (Label)matches[0];
            lbl.Text = "Hello World!";
        }
请记住,此示例仅用于说明,因为需要返回大量控件。

grpLocal groupbox将执行以下操作

grpLocal = controller.showContextControls();
所以。。。关于这个问题

然后,我可以使用动态生成的“label2”或“label”并从原始winform中修改它们的属性吗

我可以想象你可以使用这个类(这是基于我自己的研究),但我似乎无法理解它在这种情况下是如何工作的

我希望能够执行以下操作来修改标签属性:

grpLocal.label2.text = "this is label 2";

非常感谢您的帮助,如果我没有说清楚,请在评论中提及

创建标签时,为标签指定一个名称

        Label label2 = new System.Windows.Forms.Label();
        label2.Name = "label2";
如果标签由GroupBox直接包含,则可以使用:

        grpLocal.Controls["label2"].Text = "Hi!";
如果标签可以嵌套在其他控件中,如GroupBox中的面板,则可以使用controls.Find()来搜索它,如下所示:

public abstract GroupBox showContextControls()
public override Groupbox showContextControls()
{
  private label = new System.Windows.Forms.Label();
  private label2 = new System.Windows.Forms.Label();

  private grpExternal = new System.Windows.Forms.GroupBox();

  this.grpExternal.Controls.Add(this.label );
  this.grpExternal.Controls.Add(this.label2 );

  return grpExternal;
}
        Control[] matches = grpLocal.Controls.Find("label2", true);
        if (matches.Length > 0 && matches[0] is Label)
        {
            Label lbl = (Label)matches[0];
            lbl.Text = "Hello World!";
        }

不知道我是否理解你的问题。但有一点可能会有所帮助:您可以使用搜索特定控件的递归方法遍历WinForms窗体上的所有控件。您可以使用每个控件的Tag属性来标识它,方法是在创建控件时将标记设置为某个依赖于使用情况的值或引用。当然可以。创建控件时,请为控件指定一个新的名称。然后您只能使用@RenniePet搜索GroupBox。我的问题是控件是从另一个控制器类动态生成的。控件作为groupbox容器从该类返回,一旦发生这种情况,我需要向它们添加属性。idle_mind的解决方案是目前为止最接近我需要做的。哇,这太棒了。是否可以对输入控件执行相同的操作?已找到解决方案!