首页 > 解决方案 > 检查所有控件是否为空并对某些控件进行异常处理

问题描述

我想检查控件是否为空并对某些控件进行异常处理Controls,例如我想为这些文本框Notes_txtboxJob_txt . 这是我的功能,但它没有给我正确的结果。它给了Notes_txtboxJob_txt是空的:

public bool Check_Inputs_Empty_Exception(List<Control> Exception_Control_List, 
                                         TableLayoutPanel TableLayoutPanel)
{
    bool is_empy = false;

    foreach (Control Control in TableLayoutPanel.Controls)
    {
        for (int i = 0; i < Exception_Control_List.Count; i++)
        {
            if (Control.Name != Exception_Control_List[i].Name && 
                Control.GetType() == Exception_Control_List[i].GetType())
                {
                    if (String.IsNullOrWhiteSpace(Control.Text))
                    {
                        MessageBox.Show(Control.Name + "  is empty");
                        is_empy = true;
                    }
                }
            }
        }

        return is_empy;
    }
}

这是函数调用:

if (Check_Inputs_Empty_Exception(
      new List<Control> {Notes_txtbox,Job_txt}, TableLayoutPanel) == false)
{
    // My Add Function
}

标签: c#winforms

解决方案


这是一个简单而常见的逻辑缺陷。您的循环设置有错误的逻辑门。您只是在搜索任何不匹配的内容,您总是会找到(对于控件列表中的每个控件,异常列表中都有一个不是同一个控件的控件,除非异常列表只有一个元素)。

相反,搜索任何单个匹配项并在找到时设置一个标志。设置标志后,您将外循环移至下一次迭代。

public bool Check_Inputs_Empty_Exception(List<Control> Exception_Control_List, TableLayoutPanel TableLayoutPanel)
{
    bool is_empy = false;

    foreach (Control Control in TableLayoutPanel.Controls)
    {
        bool found = false;
        for (int i = 0; i < Exception_Control_List.Count; i++)
        {
            if (Control == Exception_Control_List[i]) 
            {
                found = true;
                break;
            }
        }
        if (found) continue;
        if (String.IsNullOrWhiteSpace(Control.Text))
        {
            MessageBox.Show(Control.Name + "  is empty");
            is_empy = true;
        }
    }

    return is_empy;
}

使用一点 LINQ,您也可以将其简化很多。此外,如果您只想要文本框,您可以使用OfType<>().

public bool Check_Inputs_Empty_Exception(List<Control> Exception_Control_List, TableLayoutPanel TableLayoutPanel)
{
    bool result = false;

    var emptyTextboxes = TableLayoutPanel.Controls
       .OfType<TextBox>()
       .Where( c => string.IsNullOrEmpty(c.Text) )
       .ToList();

    foreach (var control in emptyTextboxes)
    {
        if (!Exception_Control_List.Any( c => c == control )) 
        {
            MessageBox.Show(control.Name + "  is empty");
            result = true;
        }
    }

    return result;
}

推荐阅读