winforms 如何在基于文本框输入的WinForm应用程序中更改多个对象的“可见”属性?

ar7v8xwq  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(136)

我是个编程新手所以希望这不是一个愚蠢的问题。我已经创建了一个WinForm应用程序,它将根据在几个文本框中输入的信息创建一个csv文件。我希望最后一组文本框及其相应的标签仅当相应的数字输入到特定的文本框时才出现在GUI中。当在控制文本框中输入数字时,我有适当数量的文本框出现,但我不确定如何让标签也出现。当控制文本框中的数字被删除或更改时,我想其他文本框和标签消失,然后正确的数字重新出现。
WinForm GUI
下面是我的代码,让文本框出现。我不知道如何让标 checkout 现,或者当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;
                }
                                    
            }
            

        }
    }
cbwuti44

cbwuti441#

你几乎就在那里了,对当前代码要求最少的更改可能是确保每个标签都有一个有意义的名称,就像你对文本框所做的那样,然后这样做:

foreach (Control control in this.Controls)
{
    if (control.Name.StartsWith("SiteTextBox"))
    {
        control.Visible = true;
     }
          
    if (control.Name.StartsWith("NameOfYourLabel"))
    {
        control.Visible = true;
     }                      
 }

或者两个控件的名称可以以相同的开头,那么你只需要1个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")))
    {

    }

相关问题