顯示具有 DataTable 標籤的文章。 顯示所有文章
顯示具有 DataTable 標籤的文章。 顯示所有文章

2016年12月16日 星期五

ASP.NET TreeView 的資料建立

首先要有一父子架構的資料表

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年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()

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" });