如何'select' 更正动态创建的列表<Textbox> 中的文本框?

How to 'select' correct Textbox out of List<Textbox> which are created dynamically?

在一个学校项目中,我必须在 MouseClick 事件中创建 'dynamic'(如果这是正确的术语)文本框。通过单击最近创建的文本框,将打开另一个表单(通过另一个 MouseClick 事件)。

在那个新表单中,我想将文本从最近创建的文本框更改为我在新表单中插入的文本。

我的问题是,当我创建多个文本框时,正确的文本框没有更新,它总是编辑我创建的最后一个文本框。

    private int tbcount = 1;
    //Dynamische textbox
    private TextBox tbNewUseCase;
    private List<TextBox> textboxlist = new List<TextBox>();

    public frm_use_case()
    {
        InitializeComponent();
    }

    //Textbox clicks
    private void tbNewUseCase_MouseClick(object sender, MouseEventArgs e)
    {
        ucform usecase = new ucform(this, tbNewUseCase);
        usecase.Show();
    }

    //Update textbox text
    public void UpdateTbTekst(TextBox tb, string tekst)
    {
        tb.Text = tekst;
    }

    //Mouseclick on the form
    private void frm_use_case_MouseClick(object sender, MouseEventArgs e)
    {
        if (rbTekst.Checked)
        {
                //Only in a certain area I want a textbox to be created
                if (e.X > 288 && e.X < 451 - 100 && e.Y > 66 && e.Y < 421)
                {
                    tbNewUseCase = new TextBox();
                    tbNewUseCase.Name = "tbUseCase" + tbcount;
                    tbNewUseCase.Location = new Point(e.X, e.Y);
                    tbNewUseCase.ReadOnly = true;
                    tbNewUseCase.MouseClick += tbNewUseCase_MouseClick;
                    this.Controls.Add(tbNewUseCase);

                    textboxlist.Add(tbNewUseCase);

                    tbcount++;
                }    
         }    
    }

这是单击其中一个文本框时创建的另一个表单的代码。

    private frm_use_case mnform;
    private TextBox currentusecase;

    public TextBox Currentusecase
    {
        get
        {
            return currentusecase;
        }
        set
        {
            currentusecase = value;
        }
    }

    public ucform(frm_use_case mainform, TextBox usecase)
    {
        InitializeComponent();
        mnform = mainform;
        Currentusecase = usecase;
    }

    //Calls the method that changes the text in the main form
    //tbNaam is a textbox.
    private void tbNaam_TextChanged(object sender, EventArgs e)
    {
        mnform.UpdateTbTekst(huidigeusecase, tbNaam.Text);
    }

编辑:史蒂夫成功回答了我的问题!

您正在第一个窗体鼠标单击事件中创建文本框列表。
在该代码中,您使用 TextBox 的新实例重复初始化名为 tbNewUseCase 的 TextBox 引用。在循环结束时,引用变量 tbNewUseCase 引用最后创建的文本框。

现在,当您将此引用传递给第二个表单时,更新会在此实例上发生,动态创建并添加到列表中的其他实例根本不受影响。因此您只能更改一个文本框。

现在,如果您希望更改发生在单击的文本框上,那么您应该更改将要更新的文本框传递给 ucform

的方式
//Textbox clicks
private void tbNewUseCase_MouseClick(object sender, MouseEventArgs e)
{
    // Here sender is a reference to the currently clicked textbox
    // and you could pass that reference to the ucform constructor
    ucform usecase = new ucform(this, sender as TextBox);
    usecase.Show();
}