C# 如何与两个生成的控件进行交互?

C# How do I interact with two generated controls?

我有一个 Checkbox,标记后会创建一个 ListboxButton 和一个 Textbox。 生成的 Button 应该有 Click 事件来用 generated[=30] 的值填充 generated Listbox =] Textbox

但我在 public System.Windows.Forms.Button AddNewButton() 中得到 编译时错误 :

The name Txb does nost exist in the current context

The name lb does nost exist in the current context

代码如下:

 private void cbDd_CheckedChanged(object sender, EventArgs e)
    {
        AddNewListBox();
        AddNewTextBox();
        AddNewButton();
    }

    public System.Windows.Forms.ListBox AddNewListBox()
    {
        System.Windows.Forms.ListBox lb = new System.Windows.Forms.ListBox();
        this.Controls.Add(lb);
        lb.Top = 74;
        lb.Left = 500;
        cLeft = cLeft + 1;
        return lb;
    }

    public System.Windows.Forms.TextBox AddNewTextBox()
    {
        System.Windows.Forms.TextBox txb = new System.Windows.Forms.TextBox();
        this.Controls.Add(txb);
        txb.Top = 180;
        txb.Left = 500;
        txb.Text = "item name";
        cLeft = cLeft + 1;
        return txb;
    }

    public System.Windows.Forms.Button AddNewButton()
    {
        System.Windows.Forms.Button btn = new System.Windows.Forms.Button();
        this.Controls.Add(btn);
        btn.Top = 210;
        btn.Left = 500;
        btn.Text = "Add item";
        btn.Click += (s, e) => { if (string.IsNullOrEmpty(txb.Text)) return;
                };
        lb.Items.Add(cbTxb.Text);
        return btn;
    }

除了AddNew(ListBox|TextBox|Button)

public System.Windows.Forms.ListBox AddNewListBox()
{
    return new System.Windows.Forms.ListBox() {
      Location = new Point(500, 74),
      parent   = this, // instead of this.Controls.Add(...)
    };
}

public System.Windows.Forms.TextBox AddNewTextBox()
{
    return new System.Windows.Forms.TextBox() {
      Location = new Point(500, 180), 
      Text     = "item name",
      Parent   = this, 
    }; 
}

public System.Windows.Forms.Button AddNewButton() 
{
    return new System.Windows.Forms.Button() {
      Location = new Point(500, 210),
      Text     = "Add item",  
      Parent   = this,  
    };
}

我建议实现 AddNewControls(),其中创建的控件可以 交互

private void AddNewControls() {
  var lb  = AddNewListBox();
  var txb = AddNewTextBox();
  var btn = AddNewButton();

  btn.Click += (s, e) => {
    // now btn (button) can use txb (TextBox)
    if (string.IsNullOrEmpty(txb.Text)) 
      return;

    //TODO: put relevant code here
  }   

  cLeft += 3;

  //TODO: check lb and cbTxb.Text
  lb.Items.Add(cbTxb.Text);
}

然后你可以把

private void cbDd_CheckedChanged(object sender, EventArgs e) 
{
    AddNewControls();
}