2014-07-08 43 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和你有你的过滤和排序集。

相关问题