【问题标题】:sorting and updating datatable not producing expected results排序和更新数据表未产生预期结果
【发布时间】:2011-07-26 13:36:08
【问题描述】:

编辑:我自己解决了这个问题 - 显然不会工作,因为对 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 循环,它似乎也在针对未排序的数据运行。就像 Def​​aultView.Sort 只会影响渲染的输出,而不会对表格进行物理重新排序,因此代码的第二部分不会产生我需要的结果。我应该使用 DataView 还是我只是偏离轨道...

【问题讨论】:

  • dtEvents 和 datatable 引用的是同一个对象吗?

标签: c# .net sorting datatable


【解决方案1】:

我实际上遇到了类似但略有不同的问题,您的问题给了我一个想法。事实证明,您的代码非常接近您(和我)的需要。您需要做的就是翻转这两行排序代码,如下所示:

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

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

我刚刚注意到您在顶部的编辑,上面说您已经解决了。该“解决方案”似乎更像是一种解决方法。看到您如何拥有正确的代码,但使用了错误的顺序,我想您会对这个答案感兴趣。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      只是为了好玩,我想出了如何使用 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
                  };
      

      玩得开心。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-17
        • 1970-01-01
        • 1970-01-01
        • 2020-08-10
        相关资源
        最近更新 更多