在下面的代码中, Hours 与UI中的选定值一起传递,如下所示
Hours = "10.1, 11.2";
如果UI中没有值,则这些值将包含如下。
Hours = "";
下面的代码是将它们放在一起。从数据库中获取值。如果值为“”,则会出错。
q.CopyToDataTable()
处的错误源不包含DataRows。
public void Populate_Gridview(string Hours)
{
string[] selectedHours = Hours.Split(',');
var q = from a in dt.AsEnumerable()
where selectedHours.Contains(a.Field<double?>("Hours").ToString())
select a;
GridView1.DataSource = q.CopyToDataTable();
GridView1.DataBind();
}
如果我有Double数组,如果输入没有任何值,即“”,我就不能将它们搞砸。我收到错误输入字符串的格式不正确。
Double[] selectedHours = Array.ConvertAll(All.Split(','), Double.Parse);
请指导我如何解决此问题。
答案 0 :(得分:0)
第一个问题是CopyToDataTable
仅在源中包含一些行时才有效。否则,它无法确定要包含在表中的列。一种可能的解决方案是使用正确的列创建一个空目标表,并将行复制到该表:
var destTable = dt.Copy();
destTable.Rows.Clear();
q.CopyToDataTable(destTable, LoadOption.OverwriteChanges);
GridView1.DataSource = destTable;
GridView1.DataBind();
另一个问题是,当调用空字符串时,默认情况下Split
会返回一个空字符串的数组,因此当您调用Double.Parse
时会出错。为避免这种情况,请使用StringSplitOptions.RemoveEmptyEntries
:
string[] splitted = All.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
Double[] selectedHours = Array.ConvertAll(splitted, Double.Parse);
答案 1 :(得分:0)
首先,我会改进你从字符串中获取双精度的方式,因为你的方式容易出错且效率低下。你可以尝试这种方法:
double[] selectedHours = hours.Split(new[]{','}, StringSplitOptions.RemoveEmptyEntries)
.Select(str => {
str = str.Trim();
double hour;
bool isDouble = double.TryParse(str, NumberStyles.Float, CultureInfo.InvariantCulture, out hour);
return new { str, isDouble, hour };
})
.Where(h => h.isDouble)
.Select(h => h.hour)
.ToArray();
var q = from row in dt.AsEnumerable()
join hour in selectedHours
on row.Field<double?>("Hours") equals hour
select row;
var dataSource = dt.Clone(); // empty
if (q.Any())
dataSource = q.CopyToDataTable();
答案 2 :(得分:0)
试试这个
var q = from a in dt.AsEnumerable()
where (selectedHours.Contains(a.Field<double?>("Hours").ToString())
|| selectedHours.Length==0)
select a;