【问题标题】:DataTable.DefaultView.Sort Doesn't SortDataTable.DefaultView.Sort 不排序
【发布时间】:2010-11-15 13:33:23
【问题描述】:

我对 DataTable.DefaultView.Sort 感到困惑。这是我要使用的代码段。

actionLogDT.DefaultView.Sort = "StartDate";

foreach (CustomerService.ActionLogStartEndRow logRow in actionLogDT)
{
  // code here
}

我看到的示例不使用 foreach 循环,因此让我对如何处理它感到困惑。它没有像我想象的那样排序。

我看到 .DefaultView 返回一个视图,而 .Table 给出了编译错误。

【问题讨论】:

  • 您的问题/困惑是什么?你得到什么编译错误?
  • 在对日期列进行排序时,该列必须在 DataTable 中定义为 DateTime。否则它可能会被视为一个字符串并以意外的顺序排序。

标签: c# datatable sorting


【解决方案1】:
actionLogDT.DefaultView.Sort = "StartDate";

actionLogDT = actionLogDT.DefaultView.ToTable();

【讨论】:

  • 谢谢!正是我需要的。获取一个表格,对其进行排序,并在以某种方式排序时使用它。
  • 对我来说情况/症状略有不同,但 .toTable() 为我解决了这个问题。谢谢。在我的例子中,我很好地应用了 DefaultView.Sort 表达式并看到排序对 DropDownList 生效,但它对 DataGrid 没有生效。 YMMV:我们应用的 DataGrid 是一个非常基本的只读表,不提供动态排序等功能。
  • 我已将代码从 vb.net(使用 DT.DefaultView.Sort)移植到 c# asp-net 核心。在 vb.net 中,排序工作没有覆盖 (.DefaultView.ToTable();)。你在这里发帖成功了——谢谢!
【解决方案2】:

对视图进行排序不会改变表中数据的排序顺序,只会改变视图中的顺序。如果您改为在视图上执行 foreach,它应该可以工作,将 DataRowView 中的行转换回您的强类型行。

foreach (DataRowView logRowView in actionLogDT.DefaultView)
{
    CustomerService.ActionLogStartEndRow logRow = logRowView.Row as CustomerService.ActionLogStartEndRow;
    // code here
}

【讨论】:

  • 这样做会给我一个“无法将'System.Data.DataRowView'类型的对象转换为'ActionLogStartEndRow'。”错误。
  • ActionLogStartEndRow 是否派生自 DataRow?
  • @Jeromy - 我相信确实如此。我正在使用 .XSD 数据层来完成所有这些工作。
  • 基本相同的转换错误。无法将“System.Data.DataRow”类型的对象转换为“ActionLogStartEndRow”类型。
  • 好的,我更新了答案以说明强类型行。希望这对你有用。
【解决方案3】:

我不得不采取稍微不同的方法。 This post 是我能找到的最接近我的代码工作的地方。这是工作结果:

actionLogDT.DefaultView.Sort = "StartDate";
DataView dv = actionLogDT.DefaultView;

foreach (DataRowView logRow in dv) { . . . }

从那里我只需要将值转换回正确的类型。

(string)logRow["Status"].ToString()

【讨论】:

  • 演员表是多余的....ToString() 应该足够了。
【解决方案4】:
foreach (var logRow in actionLogDT.DefaultView.ToDataTable()) { ... }

【讨论】:

    【解决方案5】:

    此外,由于您似乎想要循环遍历记录,因此您可以循环遍历 DefaultView 中的 dataRowView 对象。

    foreach (DataRowView drv in table.DefaultView)
    {
        string strValue = drv["ColumnName"].ToString();
        // its also worth mentioning that a DataRowView has a Row
        strValue = drv.Row["ColumnName"].ToString();
    }
    

    【讨论】:

      【解决方案6】:

      请试试这个:

      actionLogDT.DefaultView.Sort = "["+actionLogDT.Columns[0].ColumnName+"] asc";
      

      【讨论】:

      • 下次遇到这个问题我会试试的。
      【解决方案7】:

      只是好奇:您为什么使用 DataRowView

      foreach (DataRow row in actionLogDT.Rows)
      {
        Console.WriteLine(row["Status"]);
      }
      

      【讨论】:

      • 我不明白你的问题。
      • 因为问题是关于对数据表进行排序。要枚举排序数据,您需要枚举视图,而不是表本身。
      【解决方案8】:

      如果您需要一个数据表,那么您可以执行以下操作:

      var dv = actionLogDT.DefaultView;
      dv.Sort = "StartDate";
      
      actionLogDT = dv.ToTable();
      

      【讨论】:

        【解决方案9】:

        在 VB.NET 中,下面的代码是我调用解决方案的最佳方式。只需将您的origtable 复制到DataView,然后可以使用简单的.sort 命令对数据视图进行排序,然后设置一个与(原始表的)排序视图相等的新表。之后使用排序表dt 进行处理。

        Dim View1 As DataView = New DataView(origtable)
        View1.Sort = "LastName"
        Dim dt As DataTable = View1.ToTable
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-02
          • 2011-01-18
          • 2015-04-06
          • 2014-11-07
          • 2016-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多