ASP.NET对Collection中的每个Gridview进行排序

时间:2014-10-15 23:04:38

标签: c# asp.net gridview aspxgridview

我有一个GridView控件加载到页面上,并充当其他GridView的嵌套。每个子GridView包含相同的列和数据类型,因此我希望用户能够单击LinkBut​​ton以按指定的排序表达式对每个GridView进行排序。 这是我到目前为止的代码,它不起作用。它只是去PostBack但以相同的顺序返回数据。

foreach (Control c in Page.Controls)
    {
        if (c.ID == "dgvResults")
        {
            GridView s = (GridView)c;
            DataTable dataTable = s.DataSource as DataTable;

            if (dataTable != null)
            {
                DataView dataView = new DataView(dataTable);
                dataView.Sort = "OEN ASC";

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


        }
    }

编辑1:我发现DataBource不再绑定在PostBack上,因此我必须将GridView DataSource作为DataTable存储在Session变量中。现在我无法正常工作。

编辑2:我试图将Gridview.DataSource存储在我的子GridViews的DataBinding和DataBound事件中,但它们永远不会存储在任何一种情况下。当我尝试在上面的代码中再次调用它们时,应该包含Datatable的会话变量不存在。

以下是我用来存储DataTable的代码:

// The variable 's' represents the GridView control that triggered the DataBinding event
Session["dtResults"] = s.DataSource as DataTable;

// The code below is how I call the Session variable that I set earlier in the DataBinding event
if (Session["dtResults"] != null) 
{
    DataTable dataTable = (DataTable)Session["dtResults"];
    ...
}

1 个答案:

答案 0 :(得分:0)

这可能不是解决此问题的正确方法,但我已经确定了这种方法并且适用于我。

真正的问题是我的GridViews被附加到一堆DropDownList控件上,这些控件在PostBack上将参数值提供给我的DataSources。如果我仅限于1 GridView,那么我可以将其DataTable存储在ViewState中,但因为我正在处理动态填充的GridViews {1}},这是不可能的(据我可以开始工作)。

因此,我不再迭代嵌套中的每个GridView,而是再设置一个DropDownList,这个包含与GridViews匹配的字段名称列表。然后,用户可以从列表中选择他们想要订购数据的字段。然后,此列表的值由PostBack传递给DataSource的存储过程,该存储过程又在内部处理该参数。

以这种方式执行此操作的好处是用户仍然可以选择单独对每个GridView进行排序。