我正在使用LINQ代码来查找DropDownList选择值
string txtnewrole = ddlRoleList.Items.FindByText("Admin").ToString();
ListItem item = (from i in ddlRoleList.Items.Cast<ListItem>()
where ((ListItem)i).Value.Contains(txtnewrole)select i).First()as ListItem;
string roleid = ddlRoleList.Items.FindByValue(item.Value).ToString();
Linq声明给我错误,序列中没有元素,plz帮我纠正这个 ,我尝试了第一个默认它返回我null,但在我的DropDownList我有管理文本值为2,我写这个linq得到admin的值,项值为null。怎么做到这一点?
答案 0 :(得分:4)
使用FirstOrDefault()
代替First()
然后检查该项是否为空。如果sequence不包含元素,则First()
抛出异常,但FirstOrDefault()
在这种情况下返回null。
另请注意此代码
string txtnewrole = ddlRoleList.Items.FindByText("Admin").ToString();
返回类似System.Web.UI.WebControls.ListItem
的内容我不确定它是否正是您想要的。除非您使用扩展方法覆盖ToString()
。
答案 1 :(得分:2)
我想在 @Daniel 回答中添加更多积分。
使用ddlRoleList.Items.FindByText("Admin").ToString()
时,可能会出现NULL
异常。如果ddlRoleList.Items.FindByText("Admin")
找不到,则返回“NULL”。
我没有看到ddlRoleList.Items.FindByValue(item.Value).ToString();
的正确用法。在这里,您尝试再次按值查找并转换为字符串。由于您已找到item
中的Linq
。
您需要做的是item.Text
如果您有更好的理解,我会以适当的方式为您编写以下代码:
String txtNewRole = String.Empty;
String roleId = String.Empty;
ListItem adminListItem = ddlRoleList.Items.FindByText("Admin");
if (adminListItem != null)
txtNewRole = adminListItem.Text;
//ListItem item = ddlRoleList.Items.Cast<ListItem>().Where(i => i.Value.Contains(txtNewRole)).Select(i => i).FirstOrDefault();
//OR
ListItem item = ddlRoleList.Items.Cast<ListItem>().FirstOrDefault(i => i.Value.Contains(txtNewRole));
if (item != null)
roleId = item.Text;