繁体   English   中英

排序后GridView变为NULL?

[英]GridView becomes NULL after sorting?

我运行这个事件处理程序和方法来对我的 GridView 进行排序,但它说 GridView 为空:

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)

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

当您点击数据网格上的排序超链接时,您正在触发从客户端到服务器的回发。 然后 ASP.NET 使用持久化数据(如 ViewState 和其他数据)构造回复页面。

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(不推荐)

当您在DataTable周围放置DataView ,该方法只会在第一次工作(假设数据源从一开始就是DataTable )。 下次数据源是DataView ,您不能将其转换为DataTable

从一开始就使用DataTable的默认视图作为数据源,这样数据源总是一个DataView 然后您可以从源获取视图,并从中获取基础表:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM