ASP.NET如果所有文本值都为空,则检查所有表单元素

时间:2014-05-26 00:15:53

标签: c# asp.net repeater .net

我有一个转发器,列出了搜索过程的结果。搜索用户之后将能够更新一些数据,但在更新之前我想检查所有表单元素(包括下拉列表和文本框),如果用户没有输入或选择任何数据。如果所有这些都是空的,我将0分配给检查值。这是我的实现,但我收到此错误

System.InvalidCastException 

标记为

            int check = 0;
            foreach (RepeaterItem itemm in searchResultRepeater.Items)
            {
                for (int i = 0; i < itemm.Controls.Count; i++)
                {
                    Control ctrl = itemm.Controls[i];
                    if (ctrl is TextBox || ctrl is DropDownList)
                    {
                        TextBox tb = (TextBox)ctrl;
                        DropDownList ddl = (DropDownList)ctrl;
                        if ((tb.Text != null && tb.Text.Length > 0) || (ddl.Text != null && ddl.Text.Length > 0))
                        {
                            check = 1;
                            break;
                        }
                    }
                }
            }

如何解决这个问题?任何帮助都会得到满足。

1 个答案:

答案 0 :(得分:1)

您需要使用“as”而不是硬性演员。如果使用as那么你不需要is,因为如果它不能转换它将为null。

int check = 0;
foreach (RepeaterItem itemm in searchResultRepeater.Items)
{
    for (int i = 0; i < itemm.Controls.Count; i++)
    {
        Control ctrl = itemm.Controls[i];
        // use as to safely cast will be null if can't convert
        var tb = ctrl as TextBox;
        var ddl = ctrl as DropDownList;

        if ((tb != null && tb.Text != null && tb.Text.Length > 0) ||
            (ddl != null && ddl.Text != null && ddl.Text.Length > 0))
        {
            check = 1;
            break;
        }
    }
}

如果你只想要一个bool,你也可以使用Linq。 textbox和dropdownlist都实现了接口ITextControl。这将返回true或false而不是1或0。

var check = searchResultRepeater.Items.OfType<RepeaterItem>()
                                .SelectMany(c => c.Controls.OfType<ITextControl>())
                                .Any(c => (c is TextBox || c is DropDownList) && !string.IsNullOrEmpty(c.Text));