2014-02-26 24 views
1

我想學習如何將兩個數據表連接成一個使用Linq。我的linq查詢工作正常,我可以看到它的期望值。但是,當我循環linq結果並將值分配給新創建的數據行並將該行添加到新的數據表時,這些行將變爲空白。儘管分配值給他們的數據行空出來

這裏是我的代碼:

private void btnCombine_Click(object sender, EventArgs e) 
{ 

    var innerJoinQuery = 
     from strRow in StrDataTable.AsEnumerable() 
     join intRow in IntDataTable.AsEnumerable() 
      on strRow.Field<int>("IntID") equals intRow.Field<int>("ID") 
     select new { 
      IntOne = intRow.Field<int>("FirstNum"), 
      IntTwo = intRow.Field<int>("SecondNum"), 
      StrOne = strRow.Field<string>("FirstStr"), 
      StrTwo = strRow.Field<string>("SecondStr"), 
      StrThree = strRow.Field<string>("SecondStr") 
     }; 

    DataTable newTable = new DataTable(); 
    newTable.Columns.Add("IntOne"); 
    newTable.Columns.Add("IntTwo"); 
    newTable.Columns.Add("FirstStr"); 
    newTable.Columns.Add("SecondStr"); 
    newTable.Columns.Add("ThirdStr"); 

    newTable.Columns["IntOne"].DataType = System.Type.GetType("System.String"); 
    newTable.Columns["IntTwo"].DataType = System.Type.GetType("System.String"); 
    newTable.Columns["FirstStr"].DataType = System.Type.GetType("System.String"); 
    newTable.Columns["SecondStr"].DataType = System.Type.GetType("System.String"); 
    newTable.Columns["ThirdStr"].DataType = System.Type.GetType("System.String"); 

    foreach (var row in innerJoinQuery) 
    { 
     DataRow rowToAdd = newTable.NewRow(); 
     rowToAdd.ItemArray[0] = row.IntOne.ToString(); 
     rowToAdd.ItemArray[1] = row.IntTwo.ToString(); 
     rowToAdd.ItemArray[2] = row.StrOne.ToString(); 
     rowToAdd.ItemArray[3] = row.StrTwo.ToString(); 
     rowToAdd.ItemArray[4] = row.StrThree.ToString(); 

     newTable.Rows.Add(rowToAdd); 
    } 

    dataGridView3.DataSource = newTable; 
} 

回答

1

使用DataRow.ItemArray屬性的單獨的值沒有按」 t工作 - 相反,創建object[]數組,然後將整個事情設置爲.ItemArray屬性。有關其他示例,請參閱此MSDN page

foreach (var row in innerJoinQuery) 
{ 
    DataRow rowToAdd = newTable.NewRow(); 

    object[] items = new object[] { 
     row.IntOne.ToString(), 
     row.IntTwo.ToString(), 
     row.StrOne.ToString(), 
     row.StrTwo.ToString(), 
     row.StrThree.ToString() 
    }; 

    rowToAdd.ItemArray = items; 

    newTable.Rows.Add(rowToAdd); 
} 

或者,使用DataRow索引直接,這與各列的工作原理:

rowToAdd[0] = row.IntOne.ToString(); 
rowToAdd[1] = row.IntTwo.ToString(); 
rowToAdd[2] = row.StrOne.ToString(); 
rowToAdd[3] = row.StrTwo.ToString(); 
rowToAdd[4] = row.StrThree.ToString(); 

此外,在創建列時,有一個構造函數的類型,可以爲您節省一些代碼。您的前兩列類型不匹配。

newTable.Columns.Add("IntOne", typeof(int)); 
newTable.Columns.Add("FirstStr", typeof(string)); 
0

前兩個值顯示爲整數:

IntOne = intRow.Field<int>("FirstNum"), 
IntTwo = intRow.Field<int>("SecondNum"), 

DataType您指定的列是字符串:

newTable.Columns["IntOne"].DataType = System.Type.GetType("System.String"); 
newTable.Columns["IntTwo"].DataType = System.Type.GetType("System.String"); 

更新那些int,看看是否可以解決它:

newTable.Columns["IntOne"].DataType = System.Type.GetType("System.Int32"); 
newTable.Columns["IntTwo"].DataType = System.Type.GetType("System.Int32"); 

rowToAdd.ItemArray[0] = row.IntOne; 
rowToAdd.ItemArray[1] = row.IntTwo; 

您可能還需要爲列提供的DataPropertyName

newTable.Columns["IntOne"].DataPropertyName = "FirstNum"; 
newTable.Columns["IntTwo"].DataPropertyName = "SecondNum"; 
... 

,並確保AutoGenerateColumns值設置爲false

dataGridView3.AutoGenerateColumns = false; 
+0

將第一列的數據類型設置爲Int32不起作用。 我試着設置DataPropertyName但該屬性似乎不存在。 將AutoGenerateColumns設置爲false將導致在數據網格視圖中根本不顯示任何表。 –

相關問題