Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.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# Foreach循环通过文本框不';不归_C#_Winforms_Visual Studio 2008 - Fatal编程技术网

C# Foreach循环通过文本框不';不归

C# Foreach循环通过文本框不';不归,c#,winforms,visual-studio-2008,C#,Winforms,Visual Studio 2008,我以前在另一个程序中使用过这段代码,但现在我很难理解为什么它在我的第二行代码之后不会运行这段代码 foreach (Control c in Controls) if (c.GetType() == typeof(TextBox)) //doesn't run any further { if ((string)c.Tag == "Filled") { ... } ... } 我要么

我以前在另一个程序中使用过这段代码,但现在我很难理解为什么它在我的第二行代码之后不会运行这段代码

foreach (Control c in Controls)
    if (c.GetType() == typeof(TextBox)) //doesn't run any further
    {
        if ((string)c.Tag == "Filled")
        {
            ...
        }
        ...
    }
我要么遗漏了一些小细节,要么其他地方不正确。有什么想法吗

编辑:我的文本框位于面板内。

如果(c是文本框),最好使用
。 此外,如果您想知道代码中断的原因,请使用try/catch

更好地使用
if(c是TextBox)

此外,如果您想知道代码中断的原因,请使用try/catch,我建议您使用以下语法:

foreach (Control c in Controls)
    if (c is TextBox)

我建议使用以下语法:

foreach (Control c in Controls)
    if (c is TextBox)

这样做可能更简单:

foreach ( TextBox tb in this.Controls.OfType<TextBox>()) 
{
    if ((string)tb.Tag == "Filled")
    // .....
}
foreach(this.Controls.OfType()中的文本框tb)
{
如果((字符串)tb.Tag==“已填充”)
// .....
}

这样做可能更简单:

foreach ( TextBox tb in this.Controls.OfType<TextBox>()) 
{
    if ((string)tb.Tag == "Filled")
    // .....
}
foreach(this.Controls.OfType()中的文本框tb)
{
如果((字符串)tb.Tag==“已填充”)
// .....
}
您是否自行设置属性。这是一个
字符串
类型的属性。因此,您可以尝试以下操作:

if (c.Tag == "Filled")
{
    Console.WriteLine(c.Name);
}
如果要检查文本框是否为空,则只需尝试以下操作:

if (c.Text.Trim().Length == 0)
{
 Console.WriteLine(c.Name);
}
您正在从自己设置属性。这是一个
字符串
类型的属性。因此,您可以尝试以下操作:

if (c.Tag == "Filled")
{
    Console.WriteLine(c.Name);
}
如果要检查文本框是否为空,则只需尝试以下操作:

if (c.Text.Trim().Length == 0)
{
 Console.WriteLine(c.Name);
}

要获取所有控件(不仅仅是表单的直接子控件),可以使用此递归Linq

Func<Control, IEnumerable<Control>> allControls = null;
allControls = c => new Control[] { c }
                   .Concat(c.Controls.Cast<Control>()
                                     .SelectMany(x=>allControls(x)));
Func allControls=null;
allControls=c=>新控件[]{c}
.Concat(c.Controls.Cast)()
.SelectMany(x=>allControls(x));
现在你可以过滤文本框了

var tbs = allControls(this).OfType<TextBox>()
            .Where(t=>(string)t.Tag=="Filled")
            .ToList();
var tbs=allControls(this).OfType()
.其中(t=>(字符串)t.Tag==“已填充”)
.ToList();

要获取所有控件(不仅仅是表单的直接子控件),可以使用此递归Linq

Func<Control, IEnumerable<Control>> allControls = null;
allControls = c => new Control[] { c }
                   .Concat(c.Controls.Cast<Control>()
                                     .SelectMany(x=>allControls(x)));
Func allControls=null;
allControls=c=>新控件[]{c}
.Concat(c.Controls.Cast)()
.SelectMany(x=>allControls(x));
现在你可以过滤文本框了

var tbs = allControls(this).OfType<TextBox>()
            .Where(t=>(string)t.Tag=="Filled")
            .ToList();
var tbs=allControls(this).OfType()
.其中(t=>(字符串)t.Tag==“已填充”)
.ToList();

当您调用
Control.Controls
时,它将只返回最外层的控件。它不会递归地下降到包含其他控件的任何容器控件中

如果控件位于另一个容器中,则需要使用该容器的
.controls
属性

或者,您可以编写一个方法,递归返回父控件及其所有子控件的所有控件,从而对其进行泛化,如下所示:

public IEnumerable<Control> AllControls(Control container)
{
    foreach (Control control in container.Controls)
    {
        yield return control;

        foreach (var innerControl in AllControls(control))
            yield return innerControl;
    }
}
以下方法的结果与上述方法相同,仅供参考(更易于阅读):

专用无效测试(控制容器)
{
foreach(AllControls(container).OfType()中的var textbox)
如果((字符串)textbox.Tag==“已填充”)
Debug.WriteLine(textbox.Text);
}

对于您的代码,您的按钮单击处理程序可能如下所示:

void button1_Click(object sender, EventArgs e)
{
    foreach (var c in AllControls(this).OfType<TextBox>())
    {
        if ((string) c.Tag == "Filled")
        {
            // Here is where you put your code to do something with Textbox 'c'
        }
    }
}
void按钮1\u单击(对象发送者,事件参数e)
{
foreach(AllControls(this).OfType()中的var c)
{
如果((字符串)c.标记==“已填充”)
{
//这里是您将代码放在文本框“c”上的地方
}
}
}

请注意,您当然还需要
AllControls()
方法。

当您调用
Control.Controls
时,它将只返回最外层的控件。它不会递归地下降到包含其他控件的任何容器控件中

如果控件位于另一个容器中,则需要使用该容器的
.controls
属性

或者,您可以编写一个方法,递归返回父控件及其所有子控件的所有控件,从而对其进行泛化,如下所示:

public IEnumerable<Control> AllControls(Control container)
{
    foreach (Control control in container.Controls)
    {
        yield return control;

        foreach (var innerControl in AllControls(control))
            yield return innerControl;
    }
}
以下方法的结果与上述方法相同,仅供参考(更易于阅读):

专用无效测试(控制容器)
{
foreach(AllControls(container).OfType()中的var textbox)
如果((字符串)textbox.Tag==“已填充”)
Debug.WriteLine(textbox.Text);
}

对于您的代码,您的按钮单击处理程序可能如下所示:

void button1_Click(object sender, EventArgs e)
{
    foreach (var c in AllControls(this).OfType<TextBox>())
    {
        if ((string) c.Tag == "Filled")
        {
            // Here is where you put your code to do something with Textbox 'c'
        }
    }
}
void按钮1\u单击(对象发送者,事件参数e)
{
foreach(AllControls(this).OfType()中的var c)
{
如果((字符串)c.标记==“已填充”)
{
//这里是您将代码放在文本框“c”上的地方
}
}
}

请注意,您当然还需要
AllControls()
方法。

也许您的控件中没有文本框?。您遇到了什么错误?您是否使用了调试器来逐步检查代码?您可以检查变量的值。控件中是否有实际包含文本框的groupbox、panel或其他容器类型?(也就是说,您的文本框可能不直接在主控件下)没有错误,我正在使用调试器逐步完成代码。我尝试过(C是文本框)并得到了相同的结果。也许控件中没有文本框?。你得到了什么错误?你是否使用了调试器来逐步调试代码?您可以检查变量的值。控件中是否有实际包含文本框的groupbox、panel或其他容器类型?(也就是说,您的文本框可能不直接在主控件下)没有错误,我正在使用调试器逐步完成代码。我尝试过(C是Textbox)并得到了相同的结果Tag不是字符串,所以我认为您需要添加一个
.ToString()
,但我无法验证这一点。好的观点-但我认为现在OP有很多选项:-)Tag不是字符串,所以我认为您需要添加一个
.ToString()
,虽然我不能证实这一点,但我认为有很多选择