2011-03-31 78 views
0

编辑:解决这个自己 - 显然不会作为排序dataTable不排序底层数据 - 从表创建dataView,工作正常。排序和更新数据表不产生预期的结果

我有一个数据表,我排序,然后迭代通过删除一列中的重复值,但输出不符合预期。

数据表结构:

infoRow["Title"] 
infoRow["QuickLink"] 
infoRow["Description"] 
infoRow["Date"] 
infoRow["MonthName"] 

我选这样的,它工作得很好,并产生每月递增顺序排序表:

dataTable = dataTable.DefaultView.ToTable(true); 
dataTable.DefaultView.Sort = "Date asc"; 

排序后,我使用下面的代码将每一行与前一个进行比较,如果MonthName值相同,则用空字符串替换它:

string prevMonthName = ""; 
foreach (DataRow row in dtEvents.Rows) 
{ 
    string strMonthName = row["MonthName"].ToString(); 
    if (strMonthName == prevMonthName) 
    { 
     row["MonthName"] = ""; 
     row.AcceptChanges(); 
    } 
    prevMonthName = strMonthName; 
}   

所以,我遇到的问题是,即使在排序后运行MonthName循环,它似乎是针对未排序的数据运行。这就像DefaultView.Sort只影响呈现的输出,而没有物理重新排序表,因此代码的第二部分不会产生我需要的结果。如果我也许是使用数据视图或我只是方式偏离了轨道......

+0

dtEvents和datatable是否引用同一个对象? – 2011-03-31 02:26:41

回答

2

我实际上有一个类似的,但稍有不同的问题,你的问题给了我一个主意。事实证明,你的代码非常接近你(和我)需要的东西。所有你需要做的是翻盖的排序代码这两行,像这样:

dataTable.DefaultView.Sort = "Date ASC"; 
dataTable = dataTable.DefaultView.ToTable(true); 

现在,第一行代码排序默认视图。这对于DataGridView或ComboBox或您用于显示的任何内容都是足够的,因为它们使用了DefaultView。但是,DataTable本身仍未排序。因此,第二行将DataTable设置为与已排序的DefaultView完全相同。

我刚刚注意到你在上面的编辑,说你已经解决了它。这个'解决方案'似乎更像是一种解决方法。看到你如何正确代码,但在错误订单,我想你会对这个答案感兴趣。

0

假设dtEvents被引用同一个对象的数据表,你可以试试这个:

string prevMonthName = ""; 
foreach (DataRowView row in dtEvents.DefaultView) 
{ 
    string strMonthName = row["MonthName"].ToString(); 
    if (strMonthName == prevMonthName) 
    { 
     row["MonthName"] = ""; 
     row.AcceptChanges(); 
    } 
    prevMonthName = strMonthName; 
} 
0

只是为了好玩我想出如何使用Linq to SQL来做到这一点(假设我有一个与上述模式的SQL表)。因为我花时间搞清楚了,所以我认为我可以分享它。

// Order the table and add an index column 
var ordered = MonthTests.OrderBy(mt => mt.Date) 
         .AsEnumerable() 
         .Select((mt, index) => new 
         { 
          OrderId = index, 
          Record = mt 
         }); 

// Select out what we want 
var query = from item in ordered 
      let prev = ordered.FirstOrDefault (q => q.OrderId == (item.OrderId-1)) 
      select new 
      { 
       Title = item.Record.Title, 
       QuickLink = item.Record.QuickLink, 
       Date = item.Record.Date, 
       MonthName = (prev != null && prev.Record.MonthName == item.Record.MonthName) ? "" : item.Record.MonthName 
      }; 

玩得开心。

相关问题