2017-07-26 49 views
0

我有兩個DataTable中的DataSet,MasterTable具有PK關係鏈接到DetailTable。我知道表達可以幫助總結孩子像使用DataColumn的Expression屬性從ChildRows獲取拼接文本

dtMaster.Columns.Add(new DataColumn("TotalQty", 0, "Sum(child.Qty)")); 

的價值,但我需要concate字符串,如

dtMaster.Columns.Add(new DataColumn("HasErrors", 0, "Concat(child.ErrorText + ';')")); 

我知道列表達式不支持CONCAT,所以現在,我需要檢測Table.ColumnChanging事件來手動設置主控的HasError字段值。

有人可以幫我一個更自動的方式嗎?

這裏是我的示例代碼

internal static void Test() 
    { 
     var ds = new DataSet(); 

     var dtMaster = ds.Tables.Add("Master"); 

     var colIDMaster = dtMaster.Columns.Add("ID"); 

     var dtDetail = ds.Tables.Add("Detail"); 

     var colIDDetail = dtDetail.Columns.Add("ID"); 
     dtDetail.Columns.Add("CID"); 
     dtDetail.Columns.Add("Qty", typeof(int)); 
     dtDetail.Columns.Add("ErrorText", typeof(string), "IIF(Qty is null, 'Qty err', '')"); 

     ds.Relations.Add("m2d", colIDMaster, colIDDetail, false); 

     //I know I can do this 
     dtMaster.Columns.Add("TotalQty", typeof(int), "Sum(child.Qty)"); 
     //here is I am asking solution 
     //dtMaster.Columns.Add("ContainErrors", typeof(string), "Concat(child.ErrorText + ';')"); 

     var newMasterRow = dtMaster.NewRow(); 
     newMasterRow["ID"] = "A"; 
     dtMaster.Rows.Add(newMasterRow); 

     var newDetailRow = dtDetail.NewRow(); 
     newDetailRow["ID"] = "A"; 
     newDetailRow["CID"] = "D1"; 
     newDetailRow["Qty"] = DBNull.Value; 
     dtDetail.Rows.Add(newDetailRow); 

     newDetailRow = dtDetail.NewRow(); 
     newDetailRow["ID"] = "A"; 
     newDetailRow["CID"] = "D2"; 
     newDetailRow["Qty"] = 10; 
     dtDetail.Rows.Add(newDetailRow); 

     //now I can loop and print the master row with ID and it's ErrorTexts 
    } 

感謝您的幫助

+0

請詳細說明,更多的這個問題 –

+0

添加示例代碼,我希望我可以看到主人的行[0] [「ContainErrors」]有文字「數量走錯了路。 ...'< - 如果多於一個孩子的ErrorText –

回答

0

您需要在詳細信息add列的值更改事件。

dtDetail.ColumnChanged += dtDetail_ColumnChanged; 

    static void dtDetail_ColumnChanged(object sender, DataColumnChangeEventArgs e) 
    { 
     if (e.Column.ColumnName == "Qty") 
     { 
      int sum = 0; 
      // dtMaster.Columns.Add("TotalQty" 
      foreach(DataRow row in ds.Tables["Detail"].Rows) 
      { 
       if (row["Qty"] != DBNull.Value && Convert.ToString(row["CID"]) != Convert.ToString(e.Row["CID"])) 
       { 
        sum += Convert.ToInt32(row["Qty"]); 
       } 
      } 

      sum += Convert.ToInt32(e.Row["Qty"]); 

      ds.Tables["Master"].Rows[0]["TotalQty"] = sum; 

     } 
    } 
+0

對不起我的英語,我已經通過處理DetailTable的ColumnChanging事件完成了我想要的操作。和importent是我需要解決的字符串cancating,而不是總和。它可以很容易地在主表達式中使用Sum(child.Qty)。感謝您的進一步建議。 –

相關問題