在平時的工作中,可能有很多情況下要對DataTable的裏面的數據進行處理,最簡單的例子如:對DataTable中的某個字段進行排序,根據條件篩選DataTable中的數據。。。,例子很多,下面我們看看如何處理的:
這是我最初寫的代碼:
{
DataTable dt = getDatatable();
try
{
var query = from q in dt.AsEnumerable()
where q.Field<string>("IPLocation") == "北京"
select new
{
IPid = q.Field<int>("IPid"),
IPFrom = q.Field<string>("IPFrom"),
IPTo = q.Field<string>("IPTo"),
IPCity = q.Field<string>("IPCity"),
IPToNumber = q.Field<string>("IPToNumber"),
IPFromNumber = q.Field<string>("IPFromNumber")
};
return query;
}
catch
{
return null;
}
}
然後我在最後做數據源綁定的時候,總是報System.InvalidCastException: 指定的轉換無效的錯誤,無論用Gridview的自動生成列,還是Reapter的手動添加列,都有問題,最後我查出生成的結果集就含有異常的存在,也就說再取結果集的時候,要慎重用如下寫法:
IPid = q.Field<int>("IPid"),
IPFrom = q.Field<string>("IPFrom"),
IPTo = q.Field<string>("IPTo"),
IPCity = q.Field<string>("IPCity"),
IPToNumber = q.Field<string>("IPToNumber"),
IPFromNumber = q.Field<string>("IPFromNumber")
我後來嘗試了另一種寫法:
IPid = q["IPid"].ToString(),
IPFrom = q["IPFrom"].ToString(),
IPTo = q["IPTo"].ToString(),
IPLocation = q["IPLocation"].ToString(),
IPCity = q["IPCity"].ToString(),
IPToNumber = q["IPToNumber"].ToString(),
IPFromNumber = q["IPFromNumber"].ToString()
一開始我調試也還是報System.InvalidCastException: 指定的轉換無效這個錯誤,我調試了一段時間,也還是有問題,我在想是不是數據綁定控件的問題,後來我將原來的Gridview自動生成列換成了手動輸入列:
<asp:Repeater ID="rpTest" runat="server">
<HeaderTemplate>
<tr>
<th style=" background-color:Gray; color:White;border: Gray 1px solid;text-align:center">ID</th>
<th style=" background-color:Black; color:White;border: Gray 1px solid;text-align:center">IPFrom</th>
<th style=" background-color:Black; color:White;border: Gray 1px solid;text-align:center">IPTo</th>
<th style=" background-color:Black; color:White;border: Gray 1px solid;text-align:center">IPLocation</th>
<th style=" background-color:Black; color:White;border: Gray 1px solid;text-align:center">City</th>
<th style=" background-color:Black; color:White;border: Gray 1px solid;text-align:center">IPToNumber</th>
<th style=" background-color:Black; color:White;border: Gray 1px solid;text-align:center">IPFromNumber</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td style="border: Gray 1px solid;text-align:center;"><%#Eval("IPid")%></td>
<td style="border: Gray 1px solid;text-align:center;"><%#Eval("IPFrom")%></td>
<td style="border: Gray 1px solid;text-align:center;"><%#Eval("IPTo")%></td>
<td style="border: Gray 1px solid;text-align:center;"><%#Eval("IPLocation")%></td>
<td style="border: Gray 1px solid;text-align:center;">
<%#Eval("IPCity") %>
</td>
<td style="border: Gray 1px solid;text-align:center;"><%#Eval("IPToNumber")%></td>
<td style="border: Gray 1px solid;text-align:center;"><%#Eval("IPFromNumber")%></td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
後來問題就解決了,我現在也不知道這個問題什麼原因,爲什麼不支持自動產生列呢(等待高手幫忙解決)?
知道問題的所在了,然後就可以隨心的處理DataTable裏面的數據了,如下面一個簡單的小例子:
{
DataTable dt = getDatatable();
try
{
var query = from q in dt.AsEnumerable()
orderby long.Parse(q["IPid"].ToString()) descending
where q["IPid"].ToString() == "345058"
select new
{
IPid = q["IPid"].ToString(),
IPFrom = q["IPFrom"].ToString(),
IPTo = q["IPTo"].ToString(),
IPLocation = q["IPLocation"].ToString(),
IPCity = q["IPCity"].ToString(),
IPToNumber = q["IPToNumber"].ToString(),
IPFromNumber = q["IPFromNumber"].ToString()
};
return query;
//List<IPInfo> list = new List<IPInfo>();
//foreach (var q in query)
//{
// IPInfo model = new IPInfo();
// model.IPCity = q.IPCity;
// model.IPFrom = q.IPFrom;
// model.IPFromNumber = q.IPFromNumber;
// model.IPid = long.Parse(q.IPid);
// model.IPLocation = q.IPLocation;
// model.IPTo = q.IPTo;
// model.IPToNumber = q.IPToNumber;
// list.Add(model);
//}
//return list;
}
catch
{
return null;
}
}
當然更復雜的對DataTable的操作這裏就不在敖述了,在這裏我只是說明一下困擾我的問題。