如何选择&#39;正确创建动态创建的列表<文本框>中的文本框?</textbox>

时间:2015-02-12 15:27:52

标签: c# list textbox controls

在学校项目中,我必须在MouseClick事件中创建“动态”(如果这是正确的术语)文本框。通过单击最近创建的文本框,将打开另一个表单(通过另一个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);
    }
编辑:史蒂夫成功地回答了我的问题!

1 个答案:

答案 0 :(得分:1)

您正在以第一种形式MouseClick事件创建TextBoxes列表 在该代码中,您使用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();
}