面板C#-Windows窗体应用程序中文本框的存在性检查问题

面板C#-Windows窗体应用程序中文本框的存在性检查问题,c#,winforms,C#,Winforms,对于我一直在开发的一款游戏,我正在尝试对面板中的所有文本框进行状态检查 在我们继续之前,这里是我的代码: private void btnCheck_Click(object sender, EventArgs e) { foreach (Panel pnl in Controls.OfType<Panel>()) { foreach (TextBox tb in pnl.Controls.OfType<Tex

对于我一直在开发的一款游戏,我正在尝试对面板中的所有文本框进行状态检查

在我们继续之前,这里是我的代码:

private void btnCheck_Click(object sender, EventArgs e) 
    {

        foreach (Panel pnl in Controls.OfType<Panel>())
        {
            foreach (TextBox tb in pnl.Controls.OfType<TextBox>())
            {
                if (string.IsNullOrEmpty(tb.Text.Trim()))
                {
                    MessageBox.Show("Please give an answer for all questions!");
                    okFlag = false;
                    return;
                }
                else
                {
                    okFlag = true;
                }
            }
        }
        if (okFlag == true)
        {
         //Check answers below
private void b检查\u单击(对象发送者,事件参数e)
{
foreach(Controls.OfType()中的面板pnl)
{
foreach(pnl.Controls.OfType()中的文本框tb)
{
if(string.IsNullOrEmpty(tb.Text.Trim()))
{
MessageBox.Show(“请回答所有问题!”);
okFlag=false;
返回;
}
其他的
{
okFlag=true;
}
}
}
if(okFlag==true)
{
//检查下面的答案
我遇到的问题是,即使我在所有文本框中都有值,消息框仍然会显示“请回答所有问题

okFlag是一个布尔值,我在代码顶部将其初始化为true

我还应该注意到,我有多个面板,其中包含文本框,但当一个面板显示时,所有其他面板都被隐藏


总之,我的问题是,我的文本框上的状态检查不起作用,因为它似乎认为文本框是空的或空的,即使我在其中有值。

当您有多个面板且只有一个可见时,您的检查将在第一个不可见的面板退出,因为文本框将没有文本(它是不可见的)

在代码中,应检查面板是否可见:

private void btnCheck_Click(object sender, EventArgs e) 
    {

        foreach (Panel pnl in Controls.OfType<Panel>())
        {
            if(!pnl.Visible) 
               continue;

            foreach (TextBox tb in pnl.Controls.OfType<TextBox>())
            {
                if (string.IsNullOrEmpty(tb.Text.Trim()))
                {
                    MessageBox.Show("Please give an answer for all questions!");
                    return;
                }
            }
...
private void b检查\u单击(对象发送者,事件参数e)
{
foreach(Controls.OfType()中的面板pnl)
{
如果(!pnl.可见)
继续;
foreach(pnl.Controls.OfType()中的文本框tb)
{
if(string.IsNullOrEmpty(tb.Text.Trim()))
{
MessageBox.Show(“请回答所有问题!”);
返回;
}
}
...

当您有多个面板且只有一个可见时,您的支票将在第一个不可见面板退出,因为文本框将没有文本(它是不可见的)

在代码中,应检查面板是否可见:

private void btnCheck_Click(object sender, EventArgs e) 
    {

        foreach (Panel pnl in Controls.OfType<Panel>())
        {
            if(!pnl.Visible) 
               continue;

            foreach (TextBox tb in pnl.Controls.OfType<TextBox>())
            {
                if (string.IsNullOrEmpty(tb.Text.Trim()))
                {
                    MessageBox.Show("Please give an answer for all questions!");
                    return;
                }
            }
...
private void b检查\u单击(对象发送者,事件参数e)
{
foreach(Controls.OfType()中的面板pnl)
{
如果(!pnl.可见)
继续;
foreach(pnl.Controls.OfType()中的文本框tb)
{
if(string.IsNullOrEmpty(tb.Text.Trim()))
{
MessageBox.Show(“请回答所有问题!”);
返回;
}
}
...
我有多个面板,其中有文本框,但当一个面板显示时,所有其他面板都被隐藏

由于代码不区分可见面板和隐藏面板,因此获取所看到消息的唯一解释是隐藏面板中的某些文本框为空

您可以通过检查
面板
在循环中的可见性来解决此问题:

foreach (Panel pnl in Controls.OfType<Panel>().Where(p => p.Visible))
{
    foreach (TextBox tb in pnl.Controls.OfType<TextBox>())
    {
        if (string.IsNullOrEmpty(tb.Text.Trim()))
        {
            MessageBox.Show("Please give an answer for all questions!");
            return;
        }
    }
}
foreach(Controls.OfType()中的面板pnl,其中(p=>p.Visible))
{
foreach(pnl.Controls.OfType()中的文本框tb)
{
if(string.IsNullOrEmpty(tb.Text.Trim()))
{
MessageBox.Show(“请回答所有问题!”);
返回;
}
}
}
请注意,不需要使用
okFlag
,因为当您将其设置为
false
时,循环在
return
语句中提前终止。换句话说,当
okFlag
false
时,无法到达外循环的末尾

我有多个面板,其中有文本框,但当一个面板显示时,所有其他面板都被隐藏

由于代码不区分可见面板和隐藏面板,因此获取所看到消息的唯一解释是隐藏面板中的某些文本框为空

您可以通过检查
面板
在循环中的可见性来解决此问题:

foreach (Panel pnl in Controls.OfType<Panel>().Where(p => p.Visible))
{
    foreach (TextBox tb in pnl.Controls.OfType<TextBox>())
    {
        if (string.IsNullOrEmpty(tb.Text.Trim()))
        {
            MessageBox.Show("Please give an answer for all questions!");
            return;
        }
    }
}
foreach(Controls.OfType()中的面板pnl,其中(p=>p.Visible))
{
foreach(pnl.Controls.OfType()中的文本框tb)
{
if(string.IsNullOrEmpty(tb.Text.Trim()))
{
MessageBox.Show(“请回答所有问题!”);
返回;
}
}
}
请注意,不需要使用
okFlag
,因为当您将其设置为
false
时,您的循环在
return
语句中提前终止。换句话说,当
okFlag
false
时,无法到达外部循环的末尾。您提到:

我有多个面板,其中包含文本框,但所有其他面板 在显示一个面板时隐藏

控件隐藏并不意味着它在控件集合中仍然不可用。也许在检查该面板的控件之前,您还应该检查可见性状态

    foreach (Panel pnl in Controls.OfType<Panel>())
    {
        if (pnl.Visible) {
            foreach (TextBox tb in pnl.Controls.OfType<TextBox>())
            {
                if (string.IsNullOrEmpty(tb.Text.Trim()))
                {
                    MessageBox.Show("Please give an answer for all questions!");
                    okFlag = false;
                    return;
                }
                else
                {
                    okFlag = true;
                }
            }
        }
    }
foreach(Controls.OfType()中的面板pnl)
{
如果(pnl.可见){
foreach(pnl.Controls.OfType()中的文本框tb)
{
if(string.IsNullOrEmpty(tb.Text.Trim()))
{
MessageBox.Show(“请回答所有问题!”);
okFlag=false;
返回;
}
其他的
{
okFlag=true;
}
}
}
}
您提到:

我有多个面板,其中包含文本框,但所有其他面板 在显示一个面板时隐藏

控件被隐藏并不意味着它在控件集合中仍然不可用