我有一个GridView控件加载到页面上,并充当其他GridView的嵌套。每个子GridView包含相同的列和数据类型,因此我希望用户能够单击LinkButton以按指定的排序表达式对每个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"];
...
}
答案 0 :(得分:0)
这可能不是解决此问题的正确方法,但我已经确定了这种方法并且适用于我。
真正的问题是我的GridViews
被附加到一堆DropDownList
控件上,这些控件在PostBack上将参数值提供给我的DataSources
。如果我仅限于1 GridView
,那么我可以将其DataTable
存储在ViewState
中,但因为我正在处理动态填充的GridViews
{1}},这是不可能的(据我可以开始工作)。
因此,我不再迭代嵌套中的每个GridView
,而是再设置一个DropDownList
,这个包含与GridViews匹配的字段名称列表。然后,用户可以从列表中选择他们想要订购数据的字段。然后,此列表的值由PostBack
传递给DataSource
的存储过程,该存储过程又在内部处理该参数。
以这种方式执行此操作的好处是用户仍然可以选择单独对每个GridView
进行排序。