我对编程很陌生,所以希望这不是一个愚蠢的问题。我已经创建了一个WinForm应用程序,将创建基于在几个文本框中输入的信息的csv文件。我希望最后一组文本框及其相应的标签,仅当相应的数字已输入到特定的文本框中出现在GUI中。当在控制文本框中输入数字时,我有适当数量的文本框出现,但我不确定如何让标签也出现。当控制文本框中的数字被删除或更改时,我希望其他文本框和标签消失,然后重新出现正确的数字。
WinForm GUI
这是我的代码,让文本框出现。我不确定如何获得标签出现,或者如何重置盒子时,在SitesTextBox的数字变化。
//Number entered into Sites Textbox enables Site Repeater Textboxes
private void SitesTextBox_TextChanged(object sender, EventArgs e)
{
int repeaterSites;
string SitesInput = SitesTextBox.Text;
int.TryParse(SitesInput, out repeaterSites);
for (int i = 1; i <= repeaterSites; i++)
{
foreach (Control SiteTextBox in this.Controls)
{
if (SiteTextBox.Name == "SiteTextBox"i.ToString())
{
SiteTextBox.Visible = true;
}
}
}
}
您几乎已经完成了,需要对当前代码进行最少更改的方法可能是确保每个标签都有一个有意义的名称,就像您对文本框所做的那样,然后执行以下操作:
foreach (Control control in this.Controls)
{
if (control.Name.StartsWith("SiteTextBox"))
{
control.Visible = true;
}
if (control.Name.StartsWith("NameOfYourLabel"))
{
control.Visible = true;
}
}
或者两个控件的名称开头相同,那么您只需要一个If
语句。
也许更优雅一点的方法是首先检查控件的类型并强制转换它
foreach (Control control in this.Controls)
{
//If the control is a textbox, then we cast it and then place the reference in "tb"
if (control is TextBox tb)
{
if (tb.Name.StartsWith("SiteTextBox"))
{
tb.Visible = true;
}
}
//similar for a label
if (control is Label lbl)
{
if (lbl.Name.StartsWith("NameOfYourLabel"))
{
lbl.Visible = true;
}
}
}
供参考:如果你只想要一种类型的控件,那么你也可以像这样使用OfType选项:
foreach(var textbox in this.Controls.OfType<TextBox>())
{
}
然后甚至用Linq展开它来同时检查名称
foreach(var control in this.Controls.OfType<TextBox>().Where(c => c.Name.StartsWith("SiteTextBox")))
{
}