2014-07-08 75 views
1

夥計們我在一個ASP webforms應用程序中有一個datatable,我試圖實現一種排序。基本上我有兩個字段名爲Agent_Name & Agent_Code在我的數據表中。如何搜索數據表中的特定值?

例如datatable是有這樣的價值觀:

+------------+------------+ 
| Agent_Code | Agent_Name | 
+------------+------------+ 
|   1 | A   | 
|   2 | B   | 
|   3 | C   | 
|   4 | D   | 
|   5 | E   | 
+------------+------------+ 

現在我的Agent_Code另一個數組中,我有2,3,5現在我想比較這陣與datatable,只保留那些記錄datatable其中其中有Agent_Code = 2,3,5,並放棄其餘。所以最後的datatable看起來像:

+------------+------------+ 
| Agent_Code | Agent_Name | 
+------------+------------+ 
|   2 | B   | 
|   3 | C   | 
|   5 | E   | 
+------------+------------+ 

我應該怎麼做?我會欣賞一些指針。

注意:請建議除linq之外的其他東西,我正在使用webforms。

回答

2

你可以使用嵌套的for循環:

for (int y = OriginalDataTable.Rows.Count - 1; y >= 0; y--) 
{ 
    int count = 0; 
    for (int i = 0; i <= AgentCodeArray.Length - 1; i++) 
    { 
     if (OriginalDataTable.Rows[y]["Agent_Code"].ToString() != AgentCodeArray[i].ToString()) 
     { 
      count++; 
      if (count == AgentCodeArray.Length) 
       OriginalDataTable.Rows[y].Delete(); 
     } 
    } 
} 

這樣做是經過在數據表和檢查每個記錄,如果「Agent_Code」新的數組中包含的任何地方。如果是這樣,讓它成爲。如果沒有,請刪除它。

這裏的關鍵是在刪除時通過數據表倒退。如果你不這樣做,索引將被重新排序,你會看到一個錯誤。

+0

收到這個錯誤: '已刪除行信息無法通過row.'上該環路訪問'如果(OriginalDataTable.Rows [Y] [ 「Agent_Code」]的ToString()= AgentCodeArray [I]的ToString()!) ' – NewbieProgrammer

+1

該錯誤通常意味着您正試圖訪問已被刪除的行。這意味着該行被提前刪除。我會首先檢查'count'和'AgentCodeArray.Length'的值是否應該是。 –

1

試試這個:

//creating some test datatable and agent list 
DataTable table = new DataTable(); 

table.Columns.Add(new DataColumn("Agent_Code")); 
table.Columns.Add(new DataColumn("Agent_Name")); 

DataRow row1 = table.NewRow(); 
DataRow row2 = table.NewRow(); 
DataRow row3 = table.NewRow(); 
DataRow row4 = table.NewRow(); 
DataRow row5 = table.NewRow(); 

row1["Agent_Code"] = 1; 
row2["Agent_Code"] = 2; 
row3["Agent_Code"] = 3; 
row4["Agent_Code"] = 4; 
row5["Agent_Code"] = 5; 

row1["Agent_Name"] = "A"; 
row2["Agent_Name"] = "B"; 
row3["Agent_Name"] = "C"; 
row4["Agent_Name"] = "D"; 
row5["Agent_Name"] = "E"; 

table.Rows.Add(row1); 
table.Rows.Add(row2); 
table.Rows.Add(row3); 
table.Rows.Add(row4); 
table.Rows.Add(row5); 

string[] Agent_Code = new string[] { "1", "3" }; 

//finished test data 

//actual logic here 
StringBuilder filterBuilder = new StringBuilder(); 

for (int i = 0; i < Agent_Code.Length; i++) 
{ 
    if (i != 0) filterBuilder.Append(" OR "); 

    filterBuilder.Append("Agent_Code = '"); 
    filterBuilder.Append(Agent_Code[i]); 
    filterBuilder.Append("'"); 
} 

DataView view = new DataView(table, filterBuilder.ToString(), "Agent_Code", DataViewRowState.CurrentRows); 

DataTable newTable = view.ToTable(); 
+0

我正在使用webforms,你可以建議一些除linq以外的東西嗎? – NewbieProgrammer

+0

更新我的回答雖然你可以在任何地方使用LINQ,除非你的目標框架是低於3.5版 – RoninCoder

0

下面的代碼將幫助您

string[] single = new string[2] { "2", "3" }; 
var arr = dt.Rows.Cast<DataRow>().Where(r => single.Contains(r.Field<string> 
            ("Agent_Code"))).CopyToDataTable(); 

在這個例子中dt爲您的數據源是從gridview.datasource獲得單是你的Agent_Code的陣列。

+0

我不允許使用LINQ。 – NewbieProgrammer

0

除了使用由Pragnesh提供的LINQ之外,您還可以考慮創建一個DataView。

使用您擁有的數組數據,使用RowFilter屬性循環遍歷DataView中包含DataTable中的原始集的DataView,以刪除與數組中的數據表條目不匹配的DataTable條目。

排序篩選出的結果是在DataView和你有你的過濾和排序集。

相關問題