如何'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();
}
在一个学校项目中,我必须在 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();
}