Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何迭代windows窗体控件_C#_Winforms_Loops - Fatal编程技术网

C# 如何迭代windows窗体控件

C# 如何迭代windows窗体控件,c#,winforms,loops,C#,Winforms,Loops,我有5个文本框和5个标签,命名如下: for (int i = 1; i <= 5; i++) { try { tcpCLient.ConnectAsync(text(i).Text, 80); label(i).Text = "Online"; } catch (Exception) { label(i).Text = "Offline"; } } text1,text2,text3等 l

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

for (int i = 1; i <= 5; i++)
{
    try
    {
        tcpCLient.ConnectAsync(text(i).Text, 80);
        label(i).Text = "Online";
    }
    catch (Exception)
    {
        label(i).Text = "Offline";
    }
}
  • text1
    text2
    text3
  • label1
    label2
    label3
我想做的是针对它们中的每一个并应用相同的代码,而不必单独编写一些东西。我在想这样一个循环:

for (int i = 1; i <= 5; i++)
{
    try
    {
        tcpCLient.ConnectAsync(text(i).Text, 80);
        label(i).Text = "Online";
    }
    catch (Exception)
    {
        label(i).Text = "Offline";
    }
}
for(int i=1;i嗯,代码
标签(i).文本的格式不正确。这似乎是您试图使用参数
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";
    }
}
Label[]labels={label1,label2,label3,label4,label5};
TextBox[]textboxs={text1,text2,text3,text4,text5};
对于(int i=0;i<5;i++)
{
尝试
{
tcpCLient.ConnectAsync(文本框[i].Text,80);
标签[i].Text=“在线”;
}
捕获(例外)
{
标签[i].Text=“脱机”;
}
}
“当前上下文中不存在名称“text”

text[i]。text只有在
text
type实现
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";
    }
}
var labels=新列表{label1,label2,label3};
var textBoxs=新列表{text1,text2,text3};

对于(int i=1;i您可以通过表单的
ControlCollection
迭代表单的
控件

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

不过,我强烈建议您选择另一条路线,我会制作一个
UserControl
,并结合使用MVC模式


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

在windows窗体中,您可以迭代
窗体。控件
以更自动化的方式获取所有标签和文本框

例如:

List textboxs=Controls.OfType()
.Where(txt=>txt.Name.StartsWith(“文本”))
.ToList();
列表标签=控件。OfType()
.Where(lbl=>lbl.Name.StartsWith(“标签”))
.ToList();
对于(int i=0;i

注意:这种方法只能获取
表单的直接子项。如果文本框和标签是不同父控件的子项(例如
面板
),您将需要迭代该父控件的
控件
属性。要迭代all表单的控件
请参见:

它是web应用程序或桌面、mvc、winforms什么?猜测它是winforms,表单有一个可以迭代的属性:但我实际上建议使用模型、控制器和Binding、 顺便说一句,这段代码无论如何都不起作用。你正在尝试将一个TcpClient实例连接到4个端点??如果你想深入研究绑定,你可以从这里开始:它是一个桌面WinForms,使用C#和框架4.8。我用Clint的方法解决了这个问题,但我将按照@Fildor的建议研究绑定!只要我关闭它,它似乎也是这样工作的非常感谢!这就成功了。我会记住枚举只对数组起作用的事实。“枚举只对数组起作用的事实”-这是不正确的说法。任何类都可以实现索引器。更不用说
列表
!=数组
标签(I)
按索引访问的语法不正确。它应该是
标签[i]
@ASh,good catch,edited