排序后GridView变为NULL?

时间:2011-05-09 07:19:33

标签: c# asp.net sorting gridview

我运行这个事件处理程序和方法来对我的GridView进行排序,但它确实是null:

protected void OtherGridView_Sorting(object sender, GridViewSortEventArgs e)
    {
        DataTable dtSortTable = gvMeldingen.DataSource as DataTable;

            DataView dvSortedView = new DataView(dtSortTable);
            dvSortedView.Sort = e.SortExpression + " " + getSortDirectionString(e.SortDirection);
            gvMeldingen.DataSource = dvSortedView;
            gvMeldingen.DataBind();

    }
    private string getSortDirectionString(SortDirection sortDirection)
    {
        string newSortDirection = String.Empty;
        if (sortDirection == SortDirection.Ascending)
        {
            newSortDirection = "ASC";
        }
        else
        {
            newSortDirection = "DESC";
        }
        return newSortDirection;
    }

请帮帮我。提前谢谢!

这是我得到的错误:必须在使用DataView之前设置DataTable。

这突出显示:dvSortedView.Sort = e.SortExpression + " " + getSortDirectionString(e.SortDirection)

2 个答案:

答案 0 :(得分:2)

在往返过程中,DataSource属性会丢失。这就是DataTable dtSortTable = gvMeldingen.DataSource as DataTable;为空,DataView dvSortedView = new DataView(dtSortTable);无效的原因。

当您点击数据网格上的排序超链接时,您将触发从客户端到服务器的回发。然后,ASP.NET使用像ViewState等其他持久数据构建回复页面。

DataSource 属性不是往返之间持久状态的一部分,这就是它的值丢失的原因。

解决方案是重新查询您的DataSource,如下所示:

protected void OtherGridView_Sorting(object sender, GridViewSortEventArgs e)
    {
        var SortExpression = e.SortExpression + " " + getSortDirectionString(e.SortDirection);

        gvMeldingen.DataSource = ... // Requery the Data using the new sort expression above
        gvMeldingen.DataBind();
    }

另一种解决方案是每次在Page_Load事件中设置DataSource(不推荐)

答案 1 :(得分:0)

当您在DataView周围放置DataTable时,该方法仅在第一次工作时(假设数据源从开始就是DataTable)。下次数据来源为DataView时,您无法将其投放到DataTable

从开始使用DataTable的默认视图作为数据源,以便数据源始终为DataView。然后,您可以从源中获取视图,并从中获取基础表:

DataView view = gvMeldingen.DataSource as DataView;
DataTable dtSortTable = view.Table;