Question

I'm intercepting the RowDatabound event and using:

DbDataRecord record = (System.Data.Common.DbDataRecord)e.Row.DataItem;

to get access to the unbound data source columns. It works fine on page load and when I apply a filter to the dataset. However, when I attempt to initate a sort on a GridView Column, I get :

Error: Unable to cast object of type 'System.Data.DataRowView' to type 'System.Data.Common.DbDataRecord'

I think I've traced the root issue back to the bind method used in the sort:

 SqlDataAdapter da = new SqlDataAdapter();        
    da.SelectCommand = cmd;
    DataSet ds = new DataSet();        
    da.Fill(ds);

    if (eventArgs != null)
    {
        DataSet SortedData = new DataSet();
        ds.Tables[0].DefaultView.Sort = eventArgs.SortExpression + " " + GetSortDirection(eventArgs.SortExpression);
        SortedData.Tables.Add(ds.Tables[0].DefaultView.ToTable());
        GridView1.DataSource = SortedData;
    }
    else
    {
        GridView1.DataSource =  ds;
    }
    GridView1.DataBind();
}

I remember this was a major pain to figure out because only Dataset had a Sort Property

Was it helpful?

Solution 2

Instead of trying to sort the Dataset, I appended the sort direction and column from the viewstate to the query before binding it to the grid using SqlDataReader. Looks like I went out of my way to make a simple thing hard to begin with...

OTHER TIPS

Since you assign a DataSet to GridView1.DataSource, then the type of e.Row.DataItem in the RowDatabound event will be a DataRowView instead of a System.Data.Common.DbDataRecord. You need to change this:

DbDataRecord record = (System.Data.Common.DbDataRecord)e.Row.DataItem;

to this:

DataRowView record = (DataRowView)e.Row.DataItem;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top