我有一个名为“Player”的类,其构造函数需要2个字符串和一个int。
这些在表单上的文本框中声明,每个团队(Home H / Away A)具有不同的名称,每个名称类型(Last L / First F)添加到文本框的名称。因此给出一个唯一的名称,如txtFHome1
。
在foreach
循环中,我想创建一个新的播放器,其中包含页面上文本框的详细信息。
这是我到目前为止所得到的。
List <Player> HomeTeam = new List<Player>
private void btnAccept_Click(object sender, EventArgs e)
{
foreach (Control c in this.Controls)
{
for (int i = 0; i < 10; i++)
{
HomeTeam.Add (new Player(c.Name.EndsWith("FHome"+i),c.Name.EndsWith("LHome"+i),c.Name.EndsWith("upDownH"+i)));
}
}
}
任何帮助?
答案 0 :(得分:1)
从你的帖子中我了解到11个玩家总共有3个控件,因此无需在表单中迭代所有Controls
。
private void btnAccept_Click(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
var player = new Player(((TextBox)this.Controls.FindControl("FHome" + i)).Text, ((TextBox)this.Controls.FindControl("LHome" + i)).Text, ((NumericUpDown)this.Controls.FindControl("upDownH" + i)).Value);
HomeTeam.Add(player);
}
}
答案 1 :(得分:0)
第一种方法是使用带有所有控件的字典。这是最快捷,最简单的方式。
Dictionary<int, TextBox> FHome;
Dictionary<int, TextBox> LHome;
Dictionary<int, TextBox> upDownH;
你应该像这样添加控件:
FHome.Add(0, textBoxLHome0);
FHome.Add(1, textBoxLHome1);
然后在您的代码中,您可以使用
for (int i = 0; i < 10; i++)
{
HomeTeam.Add (new Player(FHome[i].Text, LHome[i].Text, upDownH[i].Text));
}
答案 2 :(得分:0)
试试这个:
Controls.OfType<TextBox>().ToList().ForEach((textbox) =>
{
for (int i = 0; i < 10; i++)
{
textbox.Text = "your text";
}
});
请记得加入using System.Linq
答案 3 :(得分:0)
我建议您至少尝试将三个文本框封装到一个UserControl中,如下所示:
public partial class ControlPlayerParams : UserControl {
public string Param1 { get { return this.textBox1.Text; } }
public string Param2 { get { return this.textBox2.Text; } }
public string Param3 { get { return this.textBox3.Text; } }
public ControlPlayerParams() {
this.InitializeComponent();
}
}
这样,你至少可以更流畅,更安全地做你想做的事情(另外你只需修改一个UserControl,以防你需要改变一些东西(验证??)):
foreach (ControlPlayerParams cpp in this.Controls.OfType<ControlPlayerParams>())
HomeTeam.Add(new Player(cpp.Param1, cpp.Param2, cpp.Param3));
但是如果你问我,你应该重新考虑一下应用程序的架构。