【问题标题】:How to iterate over windows forms controls [duplicate]如何迭代Windows窗体控件[重复]
【发布时间】:2020-06-16 21:59:09
【问题描述】:

我有 5 个带有 5 个标签的文本框,命名如下:

  • text1text2text3
  • label1label2label3

我想要做的是针对它们中的每一个并应用相同的代码,而不必单独编写一些东西。我在考虑这样的循环:

for (int i = 1; i <= 5; i++)
{
    try
    {
        tcpCLient.ConnectAsync(text(i).Text, 80);
        label(i).Text = "Online";
    }
    catch (Exception)
    {
        label(i).Text = "Offline";
    }
}

问题是Visual Studio不允许我编译为“当前上下文中不存在名称'text'”

这是错误的方法吗?你会怎么做呢?

非常感谢!

【问题讨论】:

  • 是网页应用还是桌面,mvc,winforms什么的?
  • 猜测它是 winforms,表单有一个可以迭代的属性:docs.microsoft.com/en-us/dotnet/api/… 但我实际上建议使用模型、控制器和绑定。
  • 顺便说一句,该代码无论如何都不起作用。您正在尝试将一个 TcpClient 实例连接到 4 个端点??
  • 如果你想深入了解Binding,可以从这里开始:docs.microsoft.com/en-us/dotnet/framework/winforms/…
  • 它是一个带有框架 4.8 的 C# 桌面 WinForms。我使用克林特的方法解决了这个问题,但我会按照@Fildor 的建议研究绑定!只要我之后关闭 TCP,它似乎也可以这样工作。

标签: c# winforms loops


【解决方案1】:

“当前上下文中不存在名称'text'”。

text[i].Text只有在 text 类型实现 IEnumerable

时才能这样做

你可以这样做来枚举你的控件

var labels = new List<Label> { label1, label2, label3};
var textBoxs = new List<TextBox> { text1, text2, text3};


for (int i = 1; i <= 5; i++)
{
    try
    {
        tcpCLient.ConnectAsync(textBoxs[i].Text, 80);
        labels[i].Text = "Online";
    }
    catch (Exception)
    {
        labels[i].Text = "Offline";
    }
}

【讨论】:

  • 非常感谢!这成功了。我会记住枚举仅适用于数组这一事实。
  • “枚举仅适用于数组的事实” - 这是不正确的说法。任何类都可以实现索引器。更不用说List != array
  • labels(i) 按索引访问的语法不正确。应该是labels[i]
  • @ASh,不错,已编辑
【解决方案2】:

您可以通过其ControlCollection 迭代表单的Controls

Form.ControlCollection

但请注意,这包括所有控件。如果您想选择特定的,则必须按类型和/或名称进行过滤。

不过,我强烈建议您走另一条路。我会创建一个UserControl 并将MVC 模式与Binding 结合使用。

另外请注意,您的代码不会按预期工作,因为它似乎试图将 TcpClient 的同一实例连接到 4 个不同的端点。

【讨论】:

    【解决方案3】:

    在 Windows 窗体中,您可以遍历 Forms.Controls 以更自动化的方式获取所有标签和文本框。

    例子:

    List<TextBox> textBoxes = Controls.OfType<TextBox>()
        .Where(txt => txt.Name.StartsWith("text"))
        .ToList();
    
    List<Label> labels = Controls.OfType<Label>()
        .Where(lbl => lbl.Name.StartsWith("label"))
        .ToList();
    
    for (int i = 0; i < textBoxes.Count; i++)
    {
        try
        {
            tcpCLient.ConnectAsync(text(i).Text, 80);
            labels[i].Text = "Online";
        }
        catch (Exception)
        {
            textBoxes[i].Text = "Offline";
        }
    }
    

    注意:这种方式只能获取Form直系子代。如果文本框和标签是不同父控件的子控件(例如 Panel),则需要遍历该父控件的 Controls 属性。要遍历 所有 Form 的控件,请参阅:Loop through all controls on a form,even those in groupboxes

    【讨论】:

      【解决方案4】:

      好吧,代码label(i).Text 的格式不正确。看起来您正试图使用​​参数 i 调用函数 label 并访问此类结果的成员 Text

      你可以这样做

      Label[] labels = { label1, label2, label3, label4, label5 };
      TextBox[] textBoxes = { text1, text2, text3, text4, text5 };
      
      for (int i = 0; i < 5; i++)
      {
          try
          {
              tcpCLient.ConnectAsync(textBoxes[i].Text, 80);
              labels[i].Text = "Online";
          }
          catch (Exception)
          {
              labels[i].Text = "Offline";
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-19
        • 2018-03-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-20
        相关资源
        最近更新 更多