2012-10-20 57 views
12

在我的项目中有两个数据表dtFaildtFaileddtFailed除了列名称声明之外什么也没有)。 dtFail具有重复的“EmployeeName”列值。所以我花了数据视图dvFail,做的过程中,使他们不同,如​​图下面的代码:使行不同,并显示所有列

dtFail

enter image description here

我尝试下面的代码:

DataView dvFail = new DataView(dtFail); 
    dtFail = dvFail.ToTable(true, "EmployeeName"); //showing only one column in dtFail 

dtFailed只有一列

enter image description here

如果我喜欢下面

DataView dvFail = new DataView(dtFail); 
    dtFail = dvFail.ToTable(true, "EmployeeName","EmployeeRole","Status"); 

dtFailed示出,但与重复行

enter image description here

然后,数据表dtFailed正在存储复制“ EmployeeName“。

请提前帮助
感谢。

+0

需要更多信息 - 您可以粘贴一些示例数据,显示dvFail表中的数据是什么? –

+0

@SachinShanbhag检查我编辑的问题 –

回答

0

我不知道这将有助于与否。据我从你的问题得到你想要EmployeeName是不同的无关的其他列。但是,如果你ToTable并开启不同的标志,它会给所有不同行,无所谓多少列参与那里。所以如果你只提到EmployeeName,它显然会给你不同的EmployeeNames,而不是所有与它相关的列。

所以,这就是我做什么,最初只选择不同EmployeeName列,并把它变成一个临时的DataTable DTT。

DataTable dtt = dvFail.DefaultView.ToTable(true, "EmployeeName"); 

其次我已经创建,我们把隔离行从主数据表dtFail和手动设置列名称的另一个临时数据表。

DataTable TempDataTable = new DataTable(); 
DataTable dtFailed = new DataTable(); 

准备dtFailed DataTable中的列。

 if (dtFailed.Columns.Count == 0) 
    { 
      dtFailed.Columns.Add("EmployeeName"); 
      dtFailed.Columns.Add("EmployeeRole"); 
      dtFailed.Columns.Add("Status"); 
      dtFailed.Columns.Add("Date"); 
    } 

循环遍历不同EmployeeName DTT数据表并匹配EmployeeName并保持,在TempDataTable选定first行。最后将所有行转移到dtFailed中。

 for (int j = 0; j < dtt.Rows.Count; j++) 
    { 
      string EmployeeName = dtt.Rows[j]["EmployeeName"].ToString(); 
      TempDataTable = dvFail.Select("EmployeeName = " + EmployeeName).CopyToDataTable(); 
      dtFailed.Rows.Add(TempDataTable.Rows[0].ItemArray); 
    } 
1

解决方案1:

基于这个问题我的理解是,我们需要考虑基于EmployeeName重复,我们不必担心其他列。如果情况如此,解决方案效果会更好。

foreach(DataRow r in dtFail.AsEnumerable()) 
    { 
    if (!dt1.AsEnumerable().Any(r1 => r1["EmployeeName"] == r["EmployeeName"])) 
     { 
    // if you don't want to copy entire row create new DataRow 
    // with required fields and add that row. 
     dt1.Rows.Add(r.ItemArray); 
     } 
    } 

如果你想要你可以把dt1放回dtFail。

解决方案2:

如果我们需要考虑不同的行我更喜欢下面的解决方案。

var temp = dtFail.AsEnumerable().Distinct(); 
dtFail = temp.CopyToDataTable();