我有一组填充dropdownlist
的代码。因此,当我从列表中选择一些值时,它可以正常工作,
但是当我进入默认选择--Select--
时,我得到错误
源不包含数据行
然后转到catch
部分
以下是我的代码。我知道我错过了什么。请建议如何处理这个
[WebMethod]
public static MaintDetails[] GetMaintZone(string ddlState)
{
DataTable dt = new DataTable();
List<MaintDetails> details = new List<MaintDetails>();
if (HttpContext.Current.Session["dtStateMZ"] != null)
{
dt = (DataTable)HttpContext.Current.Session["dtStateMZ"];
if (dt != null && dt.Rows.Count > 0)
{
try
{
dt = dt.AsEnumerable().Where(r => r.Field<string>("JIOSTATECODE") == ddlState).CopyToDataTable();
if (dt != null && dt.Rows.Count > 0)
{
foreach (DataRow dtrow in dt.Rows)
{
MaintDetails MZone = new MaintDetails();
MZone.MAINTID = dtrow["MAINTENANCEZONECODE"].ToString();
MZone.MAINTNAME = dtrow["MAINTENANCEZONENAME"].ToString();
details.Add(MZone);
}
}
}
catch (Exception)
{
throw;
}
}
}
return details.ToArray();
}
答案 0 :(得分:2)
问题出在这些方面:
dt = dt.AsEnumerable().Where(r => r.Field<string>("JIOSTATECODE") == ddlState).CopyToDataTable();
if (dt != null && dt.Rows.Count > 0)
{
CopyToDataTable
行抛出异常,因为它被(有效地)0行调用。因此,解决方案是确保不会发生这种情况:
var bob = dt.AsEnumerable().Where(r => r.Field<string>("JIOSTATECODE") == ddlState).ToList();
if (bob.Count > 0)
{
dt = bob.CopyToDataTable();
上述代码会将数据复制到临时List
,然后确保在List
之前有数据调用CopyToDataTable
。
答案 1 :(得分:0)
您也应该检查ddlState
。当您执行检查以查看是否有会话变量时,还要检查ddlState
是否不是默认值,例如
if (HttpContext.Current.Session["dtStateMZ"] != null && !string.IsNullOrWhitespace(ddlState) && ddlState != "0")
{
// your logic here
}
return details.ToArray();
这应该可以防止您的代码失败。问题在于:
dt = dt.AsEnumerable().Where(r => r.Field<string>("JIOSTATECODE") == ddlState).CopyToDataTable();
可能是CopyToDataTable
没有检查输入值,即它是null还是空,并且它试图对它进行处理。这将导致NullReferenceException
被抛出。
如果您想要安全起见,请添加try..catch
块并在catch块中返回一个空数组。
考虑到您收到0
的{{1}}并且不会返回任何结果,请检查您的字符串是否等于&#34; 0&#34;。如果它没有进入ddlState
部分,但跳过它。