首先要有一父子架構的資料表
Private void SetTree()
{
// 取得有父子架構的資料
DataTable dt = GetData("Select ID, Name, FatherID From MyTable");
// 跑第一層迴圈建立根節點
foreach (DataRow row in dt.Rows)
{
TreeNode root = new TreeNode(rows["ID"].ToString(), rows["Name"].ToString());
AddChildNode(dt, root);
TreeView1.Nodes.Add(root);
}
}
// 跑遞迴建立子節點
Private void AddChildNode(DataTable dt, TreeNode node)
{
DataRow[] Rows = dt.Select(string.Format("FatherID = {0}", node.Value));
if (rows.Count() > 0)
{
foreach (DataRow row in Rows)
{
TreeNode newNode = new TreeNode(row["ID"].ToString(), rows["Name"].ToString());
node.ChildNodes.Add(newNode);
AddChildNode(dt, newNode);
}
}
}
2016年12月16日 星期五
2016年9月2日 星期五
DataTable.Select 改成 LINQ 的方式,速度快上至少 10 倍
當DataTable的資料列太多時,使用 DataTable.Select() 來篩選資料的速度很慢,
此時可以改用 LINQ,速度上至少快上 10 倍之多
DataTable dt = GetDataTable(); ← 取得資料
// 假設 dt 的欄位 (ID<int>, FirstName<string>, LastName<string>)
// 使用 Select 方法時
DataRow[] = dt.Select("FirstName = 'xxx'");
// 使用 LINQ 方法時
var q = from p in dt.AsEnumerable()
where p.Field<string>("FirstName").ToString() == "xxx"
select p;
q 可能會找不到資料,
出現下列錯誤
System.InvalidOperationException: 來源未包含 DataRow。
於 System.Data.DataTableExtensions.LoadTableFromEnumerable[T](IEnumerable`1 source, DataTable table, Nullable`1 options, FillErrorEventHandler errorHandler)
於 System.Data.DataTableExtensions.CopyToDataTable[T](IEnumerable`1 source)
所以如果要將 q 轉換為 DataTable,
需先判斷 q.Count() 是否為 0
if (q.Count() > 0)
q.CopyToDataTable()
此時可以改用 LINQ,速度上至少快上 10 倍之多
DataTable dt = GetDataTable(); ← 取得資料
// 假設 dt 的欄位 (ID<int>, FirstName<string>, LastName<string>)
// 使用 Select 方法時
DataRow[] = dt.Select("FirstName = 'xxx'");
// 使用 LINQ 方法時
var q = from p in dt.AsEnumerable()
where p.Field<string>("FirstName").ToString() == "xxx"
select p;
q 可能會找不到資料,
出現下列錯誤
System.InvalidOperationException: 來源未包含 DataRow。
於 System.Data.DataTableExtensions.LoadTableFromEnumerable[T](IEnumerable`1 source, DataTable table, Nullable`1 options, FillErrorEventHandler errorHandler)
於 System.Data.DataTableExtensions.CopyToDataTable[T](IEnumerable`1 source)
所以如果要將 q 轉換為 DataTable,
需先判斷 q.Count() 是否為 0
if (q.Count() > 0)
q.CopyToDataTable()
2016年7月1日 星期五
C# 在 DataTable 下 Distinct
在資料庫中,語法可以這麼下
Select Distinct [欄位名稱1], [欄位名稱2] From Table1
在C# 的 DataTable 中下 Distinct,可以這麼寫
DataTable dtDistinct =
dtOri.DefaultView.ToTable(true, new string[] { "欄位名稱1", "欄位名稱2" });
Select Distinct [欄位名稱1], [欄位名稱2] From Table1
在C# 的 DataTable 中下 Distinct,可以這麼寫
DataTable dtDistinct =
dtOri.DefaultView.ToTable(true, new string[] { "欄位名稱1", "欄位名稱2" });
標籤:
C#,
DataTable,
Distinct,
SQL Server
訂閱:
文章 (Atom)