【问题标题】:Sorted gridview selects wrong row排序的gridview选择了错误的行
【发布时间】:2010-10-26 14:26:02
【问题描述】:

我有一个gridview(实际上是一个SPgridview)

我使列名可点击,以便用户可以使用数据对行进行排序。 而且效果很好。

当用户在对数据进行排序后尝试选择一行时,就会出现此问题。 我可以看到 gridview 有点“忘记”行是如何排序的,并在排序之前选择了单击索引处的行..

我该如何解决? 在用户选择一行后,我尝试再次对该行进行排序,但这似乎不起作用。 网格视图是否应该记住它刚刚排序的事实?

提前致谢:)

【问题讨论】:

    标签: asp.net sharepoint gridview sorting spgridview


    【解决方案1】:

    当您处理排序事件时,设置一个会话变量,将其设置为排序方向,并在您重新绑定数据源时使用它。

    protected void gridview_Sorting()
    {
        // BIND DATA Function
        BindData();
    
        DataTable dt = gridview.DataSource as DataTable;
    
        if (dt != null)
        {
            //Sort the data.
            dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);
    
            Session["sort"] = dt.DefaultView.Sort;
            gridview.DataSource = dt;
            gridview.DataBind();
        }
    }
    
    
    
    
    
    // bind data function//
    
    private void BindData()
    {
    
        DataTable dt = GetDataTable();
    
        if (Session["sort"] != null)
        {
            //Sort the data.
            dt.DefaultView.Sort = Session["sort"].ToString();
        }
    
        gridview.DataSource = dt;
        gridview.DataBind();
    }
    

    【讨论】:

      【解决方案2】:

      确保在回发后没有重新绑定网格。

      if(!IsPostBack)
      {
        gridView.DataSource = yourDataSource;
        gridView.DataBind();
      }
      

      【讨论】:

      • 对不起,也许值得一提的是,spgridview 被放置在一个共享点 webpart 中。所以我必须在每次回发后创建控件。 ://
      【解决方案3】:

      您是通过行索引还是通过要编辑的数据的唯一标识符来获取所选行?如果您按行索引获取,则可能会“忘记”,因为您正在 OnPostBack 上重新创建 Grid。尝试遍历数据并通过其唯一 ID 而不是其行索引来选择它。

      【讨论】:

      • 我正在获取 selectedDatakey,并且我使用该键连接到另一个 webpart,这很有效,但它就像 gridview 用它自己的或其他东西覆盖了我的选择。因为我通过行运行并将与数据键匹配的行设置为选中,但在回发后它会重置排序并改为通过索引选择行。
      【解决方案4】:

      查看 Johans 关于SPGridView and LinqDataSource 的博客

      【讨论】:

        【解决方案5】:

        当我偶然发现这个问题时,我已经制作了许多可排序的 GridView,但在今天之前没有与行命令交互。我的是一个“普通”的 GridView,而不是 SPgridview。我发现这行得通:

        1. 在 bindData() 中,如果我们还没有创建 DataTable 并将其放入 Session 对象中,请执行此操作。否则,我们将使用现有的已排序 DataTable:
        if (Session["dtbl"] == null) {
          Session["dtbl"] = method_to_fetch_datatable();
        }
        gv.DataSource = Session["dtbl"] as DataTable;
        gv.DataBind();
        
        1. 在 GridView 对 INSERT、UPDATE 或 DELETE 底层数据的行命令的处理中,刷新 Session 对象,保持排序,如果有的话:
        Session["dtbl"] = method_to_fetch_datatable();
        if (ViewState["SortExpression"] != null) {
          DataTable dt = Session["dtbl"] as DataTable;
          dt.DefaultView.Sort = ViewState["SortExpression"] as string;
        }
        bindData();
        

        【讨论】:

          【解决方案6】:

          我让它工作了。 (有点)

          在排序事件中,我保存了排序表达式(用于排序的列的名称) 以及排序方向升序或降序。

          然后我为gridview和databind创建数据源,在数据绑定之后,我使用gridview.sort命令按照我保存在viewstate中的值进行排序。

          效果很好,只有一个问题。 排序时,我在多次按下同一列后切换方向。 现在它认为我一直按列标题,所以它一直在反转排序。

          但我只是暂时只对一个方向进行排序。 现在我在排序事件中使用 sender 对象,我想如果我能得到一些关于什么导致事件的信息,我可以告诉它只根据发送者切换方向。

          谢谢:)

          【讨论】:

            猜你喜欢
            • 2021-04-25
            • 1970-01-01
            • 2019-07-04
            • 1970-01-01
            • 2019-04-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-01
            相关资源
            最近更新 更多