【问题标题】:ASP.NET Gridview Sorting not sortingASP.NET Gridview 排序不排序
【发布时间】:2016-07-31 18:51:07
【问题描述】:

我的 Gridview 上的排序有问题。它似乎总是在一个排序顺序中,即升序?从不切换到 Desc?

我已经完成了调试过程,但不知道哪里出了问题?

这是我的代码,也正在使用分页,所以我不确定它是否会阻止它正常工作?

protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
  {        
    PopulateProductClass();
    PopulateProduct();
  }
  PopulateOrderList();
}

private string ConvertSortDirectionToSql(SortDirection sortDirection)
{
  string newSortDirection = String.Empty;

  switch (sortDirection)
  {
    case SortDirection.Ascending:
      newSortDirection = "ASC";
      break;

    case SortDirection.Descending:
      newSortDirection = "DESC";
      break;
  }
  return newSortDirection;
}

protected void gvOrderItems_Sorting(object sender, GridViewSortEventArgs e)
{   

  DataTable dt = new DataTable();
  dt.Columns.Add("OrderDate", typeof(string));
  dt.Columns.Add("OrderNumber", typeof(string));
  dt.Columns.Add("OrderItemSKUName", typeof(string));
  dt.Columns.Add("SKUNumber", typeof(string));
  dt.Columns.Add("OrderItemStatus", typeof(string));
  dt.Columns.Add("OrderItemUnitCount", typeof(string));
  dt.Columns.Add("mtrx_Code2", typeof(string));

  for (int i = 0; i < gvOrderItems.Rows.Count; i++)
  {
    DataRow drNew = dt.NewRow();
    drNew["OrderDate"] = gvOrderItems.Rows[i].Cells[0].Text;
    drNew["OrderNumber"] = gvOrderItems.Rows[i].Cells[1].Text.Replace("&nbsp;", "");
    drNew["OrderItemSKUName"] = gvOrderItems.Rows[i].Cells[3].Text;
    drNew["SKUNumber"] = gvOrderItems.Rows[i].Cells[2].Text;
    drNew["OrderItemStatus"] = gvOrderItems.Rows[i].Cells[6].Text;
    drNew["OrderItemUnitCount"] = gvOrderItems.Rows[i].Cells[5].Text;
    drNew["mtrx_Code2"] = gvOrderItems.Rows[i].Cells[4].Text;
    dt.Rows.Add(drNew);
  }

  if (dt != null)
  {
    DataView dataView = new DataView(dt);
    dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);

    gvOrderItems.DataSource = dataView;
    gvOrderItems.DataBind();
  }
}

dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);e.SortDirection 总是显示为升序?

<asp:GridView ID="gvOrderItems" runat="server" GridLines="None" CellSpacing="-1" AutoGenerateColumns="false" 
  AllowSorting="true" OnSorting="gvOrderItems_Sorting">
  <Columns>                             
    <asp:BoundField DataField="OrderDate" HeaderText="Date" SortExpression="OrderDate" />
    <asp:BoundField DataField="OrderNumber" HeaderText="Order Number" SortExpression="OrderNumber" />
    <asp:BoundField DataField="SKUNumber" HeaderText="Product Number" SortExpression="OrderNumber" />
    <asp:BoundField DataField="OrderItemSKUName" HeaderText="Product Description" />
    <asp:BoundField DataField="mtrx_Code2" HeaderText="Size" />
    <asp:BoundField DataField="OrderItemUnitCount" HeaderText="OTY" />
    <asp:BoundField DataField="OrderItemStatus" HeaderText="Status" />        
  </Columns>
</asp:GridView>

更新

好的,在 Kostrzak 的一些建议之后,我查找了 SO 问题 GridView sorting: SortDirection always Ascending 并将我的排序事件修改为这个......

protected void gvOrderItems_Sorting(object sender, GridViewSortEventArgs e)
{   

  DataTable dt = new DataTable();
  dt.Columns.Add("OrderDate", typeof(string));
  dt.Columns.Add("OrderNumber", typeof(string));
  dt.Columns.Add("OrderItemSKUName", typeof(string));
  dt.Columns.Add("SKUNumber", typeof(string));
  dt.Columns.Add("OrderItemStatus", typeof(string));
  dt.Columns.Add("OrderItemUnitCount", typeof(string));
  dt.Columns.Add("mtrx_Code2", typeof(string));

  for (int i = 0; i < gvOrderItems.Rows.Count; i++)
  {
    DataRow drNew = dt.NewRow();
    drNew["OrderDate"] = gvOrderItems.Rows[i].Cells[0].Text;
    drNew["OrderNumber"] = gvOrderItems.Rows[i].Cells[1].Text.Replace("&nbsp;", "");
    drNew["OrderItemSKUName"] = gvOrderItems.Rows[i].Cells[3].Text;
    drNew["SKUNumber"] = gvOrderItems.Rows[i].Cells[2].Text;
    drNew["OrderItemStatus"] = gvOrderItems.Rows[i].Cells[6].Text;
    drNew["OrderItemUnitCount"] = gvOrderItems.Rows[i].Cells[5].Text;
    drNew["mtrx_Code2"] = gvOrderItems.Rows[i].Cells[4].Text;
    dt.Rows.Add(drNew);
  }

  if (dt != null)
  {
    if (e.SortExpression == (string)ViewState["SortColumn"])
    {
      // We are resorting the same column, so flip the sort direction
      e.SortDirection =
          ((SortDirection)ViewState["SortColumnDirection"] == SortDirection.Ascending) ?
          SortDirection.Descending : SortDirection.Ascending;
    }
    // Apply the sort
    dt.DefaultView.Sort = e.SortExpression +
        (string)((e.SortDirection == SortDirection.Ascending) ? " ASC" : " DESC");
    ViewState["SortColumn"] = e.SortExpression;
    ViewState["SortColumnDirection"] = e.SortDirection;

    gvOrderItems.DataSource = dt;
    gvOrderItems.DataBind();
  }
}

Page Load 上,日期顺序为降序。

2016-03-08
2016-02-10
2016-01-22
2016-01-22
2016-01-22
2016-01-22
2016-01-22
2016-01-22
2015-11-11
2015-11-11

单击gridview中的日期列后,它应该按升序排列,如下所示:

2015-11-11
2015-11-11
2016-01-22
2016-01-22
2016-01-22
2016-01-22
2016-01-22
2016-01-22
2016-02-10
2016-03-08

但是按照下面的顺序显示

2016-03-08
2016-02-10
2015 年 11 月 11 日
2015 年 11 月 11 日
22/01/2016
22/01/2016
22/01/2016
22/01/2016
22/01/2016
22/01/2016

我不确定它是如何得到这个订单的??

【问题讨论】:

  • SO 上已经有类似问题:stackoverflow.com/questions/250037/…
  • 谢谢,Kostrzak 我已经更新了问题。
  • 您是否需要在排序事件处理程序中从 GridView 重新填充 DataTable?打电话给PopulateOrderList不会做同样的事情吗?另一点:如果日期在日期字段而不是字符串中,排序将更可预测。也许调用PopulateOrderList 也可以解决这个问题。
  • 'PopulateOrderList' 获取数据表中的数据,然后将其添加到 pds (PagedDataSource) 方法中。但是从 gridview 访问当前数据应该不是问题吗?我不确定你的最后一点?
  • 从 GridView 重新加载数据而不是从源获取数据对我来说似乎很奇怪。至于我的最后一点,我认为如果您从源获取数据,OrderDate 将是日期字段,而不是字符串字段,这将有助于正确排序数据。

标签: c# asp.net gridview


【解决方案1】:

发现问题。正如 ConnorsFan 指出的那样,OrderDate 字段被设置为字符串而不是 DateTime 字段。因此,当我创建数据表时,我将字段数据类型从 typeof(string) 更改为 typeof(datetime),这解决了问题

之前

DataTable dt = new DataTable();
dt.Columns.Add("OrderDate", typeof(string));
dt.Columns.Add("OrderNumber", typeof(string));
dt.Columns.Add("OrderItemSKUName", typeof(string));
dt.Columns.Add("SKUNumber", typeof(string));
dt.Columns.Add("OrderItemStatus", typeof(string));
dt.Columns.Add("OrderItemUnitCount", typeof(string));
dt.Columns.Add("mtrx_Code2", typeof(string));

之后

DataTable dt = new DataTable();
dt.Columns.Add("OrderDate", typeof(DateTime));
dt.Columns.Add("OrderNumber", typeof(string));
dt.Columns.Add("OrderItemSKUName", typeof(string));
dt.Columns.Add("SKUNumber", typeof(string));
dt.Columns.Add("OrderItemStatus", typeof(string));
dt.Columns.Add("OrderItemUnitCount", typeof(string));
dt.Columns.Add("mtrx_Code2", typeof(string));

【讨论】:

    猜你喜欢
    • 2017-03-28
    • 2011-09-02
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2018-04-11
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多