web service filling gridview awfully slow, as is paging/sorting
Posted
by nat
on Stack Overflow
See other posts from Stack Overflow
or by nat
Published on 2010-03-01T16:33:34Z
Indexed on
2010/04/14
4:03 UTC
Read the original article
Hit count: 272
Hi
I am making a page which calls a web service to fill a gridview this is returning alot of data, and is horribly slow.
i ran the svcutil.exe on the wsdl page and it generated me the class and config so i have a load of strongly typed objects coming back from each request to the many service functions.
i am then using LINQ to loop around the objects grabbing the necessary information as i go, but for each row in the grid i need to loop around an object, and grab another list of objects (from the same request) and loop around each of them.. 1 to many parent object > child one.. all of this then gets dropped into a custom datatable a row at a time.. hope that makes sense....
im not sure there is any way to speed up the initial load. but surely i should be able to page/sort alot faster than it is doing. as at the moment, it appears to be taking as long to page/sort as it is to load initially.
i thought if when i first loaded i put the datasource of the grid in the session, that i could whip it out of the session to deal with paging/sorting and the like.
basically it is doing the below
protected void Page_Load(object sender, EventArgs e)
{
//init the datatable
//grab the filter vars (if there are any)
WebServiceObj WS = WSClient.Method(args);
//fill the datatable (around and around we go)
foreach (ParentObject po in WS.ReturnedObj)
{
var COs = from ChildObject c in WS.AnotherReturnedObj
where c.whatever.equals(...) ...etc
foreach(ChildObject c in COs){
myDataTable.Rows.Add(tlo.this,
tlo.that,
c.thisthing,
c.thatthing,
etc......);
}
}
grdListing.DataSource = myDataTable;
Session["dt"] = myDataTable;
grdListing.DataBind();
}
protected void Listing_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
grdListing.PageIndex = e.NewPageIndex;
grdListing.DataSource = Session["dt"] as DataTable;
grdListing.DataBind();
}
protected void Listing_Sorting(object sender, GridViewSortEventArgs e)
{
DataTable dt = Session["dt"] as DataTable;
DataView dv = new DataView(dt);
string sortDirection = " ASC";
if (e.SortDirection == SortDirection.Descending)
sortDirection = " DESC";
dv.Sort = e.SortExpression + sortDirection;
grdListing.DataSource = dv.ToTable();
grdListing.DataBind();
}
am i doing this totally wrongly? or is the slowness just coming from the amount of data being bound in/return from the Web Service.. there are maybe 15 columns(ish) and a whole load of rows.. with more being added to the data the webservice is querying from all the time
any suggestions / tips happily received
thanks
© Stack Overflow or respective owner