2012-07-25 67 views
0

我有一個數據表,其中如果地址匹配將其中一行移動到數據表的頂部。我正在使用下面的代碼,但它不起作用。任何想法如何實現這一點。數據表中的數據是從Excel文件導入的。我已經在GridView中嘗試了相同的if語句來突出顯示重複內容,但是我也想將它們移動到頂端,因爲數據有超過1000行,並且難以一次又一次地上下移動以檢查突出顯示行。在數據表c中將行移動到頂部#

for (int row = 1; row < dtf1.Rows.Count; row++) 
{ 
    for (int rowinner = 1; rowinner < dtf1.Rows.Count; rowinner++) 
    { 
     if (rowinner != row) 
     { 
      if (dtf1.Rows[row][addresscolno] == dtf1.Rows[rowinner][addresscolno].ToString()) 
      { 
       DataRow newrow = dtf1.Rows[row]; 
       dtf1.Rows.RemoveAt(row); 
       dtf1.AcceptChanges(); 
       dtf1.Rows.InsertAt(newrow, 1); 
       dtf1.AcceptChanges(); 
       GridView1.DataSource = dtf1; 
       GridView1.DataBind(); 
      } 
     } 
    } 
} 
+1

所以基本上你想要命令DataRows ?! – 2012-07-25 22:31:12

回答

1

所以你想重新訂購DataTable。具有給定地址的行應該在頂部。您可以使用Linq-To-DataSet命令行和CopyToDataTable創建一個新的DataTable新秩序:

// assuming the address is a string in a variable address, to simplify matters 
DataTable tblOrdered = dtf1.AsEnumerable() 
    .OrderByDescending(r => r.Field<string>("addresscolno") == address) 
    .ThenBy(r => r.Field<string>("addresscolno")) 
    .CopyToDataTable(); 

然後你可以使用它作爲數據源爲你的GridView。

編輯:也試一試DataTable.Rows.InsertAt

dtf1.Rows.InsertAt(dtf1.Rows[rowinner], 0); 
+0

你能解釋一下代碼嗎?什麼是r變量? – 2012-07-25 22:43:20

+0

我想逐一比較所有的行,如果地址匹配,則將兩行都移動到頂部。 – 2012-07-25 22:44:34

+0

'dtf1.AsEnumerable()'產生DataTable的DataRows。因此'r'是DataRow。如果您只想確保地址匹配位於頂部並且其他行的順序無關緊要,則可以省略「ThenBy」。在這裏,地址匹配首先跟隨由地址命令的其他行。 – 2012-07-25 22:49:47