【问题标题】:Asp.net gridview Sorting by ageAsp.net gridview 按年龄排序
【发布时间】:2021-06-28 22:28:20
【问题描述】:

我有一个包含“年龄”列的表格,其中排序的年龄显示如下:

10 years,
105 years
18 years,
60 years.
8 months.

我怎样才能不按字母顺序排序,而是正确排序。 我不能去掉“年”这个词。

【问题讨论】:

  • 这就是你在数据库中保存它的方式?如果是,那么您必须重新设计表格,再添加一个字段,其中实际时间采用日期时间格式(或刻度)
  • 可以把gridview数据绑定的代码放上去吗?
  • 不,在数据库中存储生日,年龄计算,我可以看到。

标签: asp.net gridview


【解决方案1】:

好吧,如果这是来自数据库?

那么你可以这样做:

SELECT id, FirstName, LastName, Age, 
  cast(SUBSTRING(Age,1,Charindex(' ',Age)-1 ) as integer) as NumAge
  FROM tblCustomers
  ORDER BY NumAge

所以,现在您有一个文本显示列,但您也有一个真实的“数字”列,其中包含实际年数 - 您可以在该 NumAge 列上正确排序。而且这种排序也可以通过数据视图排序来完成 - 因此,无论您正在/正在对数据进行排序,如果您添加上述从该列中提取数字的列,则按 NumAge 排序将成为一种可能的选择。

如果我们没有月份和年份的混合,现在上述方法有效。但是,为了解决这个问题,我们将上面的内容改为:

SELECT id, FirstName, LastName, Age, 
    CASE
      WHEN CharIndex('month',Age) > 0 THEN
        (cast(SUBSTRING(Age,1,Charindex(' ',Age)-1 ) as integer))
      WHEN CharIndex('year',Age) > 0 THEN
        (cast(SUBSTRING(Age,1,Charindex(' ',Age)-1 ) * 12 as integer))
    END 
     AS AgeInMonths
  FROM tblCustomers
  ORDER BY AgeInMonths

所以,再一次,我们现在有了一个以月为单位的数字和值来表示年龄,并且可以对其进行排序。所以我们显示 Age + text 列,但是排序表达式可以使用 AgeInMonths 并且结果是正确顺序的数据。

如果你有日子呢?然后我会使用月 * 30 来代替月 * 12,而对于年,则只需使用 * 365。因此,支持年、月或日并不难。

结果再次是按给定年龄按数字顺序排序的数据。

【讨论】:

  • 如何显示 15 年,但存储排序为“15”?
  • 想了很多,我只是解释了如何。您只需继续显示您的文本列,但是当您排序时,您会在新列上进行排序。因此,您现在有两列 - 您现有的一列用于显示年龄 + 文本,但您现在只需根据这个现在可用的数字列进行排序。因此,您的按表达式排序或排序将对 NumAge 起作用。但是,月份示例列是一个问题 - 我将更新我的帖子以处理该问题。
  • 查看我对上述帖子的编辑 - 我添加了多年和数月的支持。
【解决方案2】:

问题也是“月”。 8 个月高于 2 年还是 8 个月等于 0 年? 如果是最后一个,您可以使用Linq。 可以说这是时代。

var age = new List<string>()
{
    "10 years,",
    "105 years",
    "18 years,",
    "60 years.",
    "8 months.",
    "1 year.",
    "18 months,",
 };

那么你就可以这样做了。它将列表分成几个月和几年。然后删除除数字以外的所有字符。如果是一个月,则除以 12 得到年份。然后对其进行排序,再次使其成为字符串并添加“年”。

var sortedAge = age.Where(x => x.ToLower().Contains("month"))
   .Select(x => Convert.ToInt32(string.Concat(x.Where(Char.IsDigit))) / 12)
   .Concat(age.Where(x => x.ToLower().Contains("year"))
   .Select(x => Convert.ToInt32(string.Concat(x.Where(Char.IsDigit)))))
   .OrderBy(y => y)
   .Select(z => z > 1 ? z.ToString() + " years" : z.ToString() + " year").ToList();

结果

0 year
1 year
1 year
10 years
18 years
60 years
105 years

但您最好将年龄作为 int 存储在 DOB 中,或者将出生日期存储为 datetime。

【讨论】:

  • 那么,如果我存储生日,如何显示年龄并按年龄排序?
  • 如果你存储 brthdate 你可以简单地计算年龄:stackoverflow.com/questions/9/…
  • 放大数字然后尝试将它们划分下来要容易得多。假设一切都在几个月内 - 整个问题变得很容易。将继续显示年龄 + 文本,但您只需对代表月份的列进行排序。 (见我上面的帖子)。但是,根本不清楚为什么 DOB 或某个数值从一开始就从未存储/保存。但是,请参阅我的帖子 - 我展示了一种相当简单的 T-SQL 方法,将给定的文本转换为月数值,然后可以对该 AgeInMonths 进行排序,但继续显示年龄 + 文本。
  • 如果您可以选择保存 DOB,那么它将自动始终按数值排序。为此,您使用日期或日期时间列。这允许您以任何方式显示 DOB 格式,包括您 2 岁 5 个月零 3 天之类的内容。因此,毫无疑问,请使用日期/日期时间列,因为您显示该列的方式不会影响按 DOB 排序 - 它始终会自动并始终按正确顺序排序。并且您可以使用 Month(DOB) 来获取当前月份,因此查询本月谁过生日也很简单。
猜你喜欢
  • 1970-01-01
  • 2019-02-23
  • 2015-01-17
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
相关资源
最近更新 更多