我有一个转发器,列出了搜索过程的结果。搜索用户之后将能够更新一些数据,但在更新之前我想检查所有表单元素(包括下拉列表和文本框),如果用户没有输入或选择任何数据。如果所有这些都是空的,我将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;
}
}
}
}
如何解决这个问题?任何帮助都会得到满足。
答案 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));