views:

194

answers:

4

Hello all,

I have a DataTable with 20.000 row and 15 column. I need to create an ASP.Net Table, my code is similar to this:

//foreach Row in my DataTable do the following:


     TableRow t2Row = new TableRow();

                    TableCell t2Cell0 = new TableCell(); t2Cell0.Text = Count.ToString(); t2Row.Cells.Add(t2Cell0);
                    TableCell t2Cell1 = new TableCell(); t2Cell1.Text = dr["col1"].ToString(); t2Row.Cells.Add(t2Cell1);
                    TableCell t2Cell3 = new TableCell(); t2Cell3.Text = dr["col2"].ToString(); t2Row.Cells.Add(t2Cell3);
                    TableCell t2Cell2 = new TableCell(); t2Cell2.Text = dr["col3"].ToString(); t2Row.Cells.Add(t2Cell2);
                    TableCell t2Cell4 = new TableCell(); t2Cell4.Text = dr["col4"].ToString(); t2Row.Cells.Add(t2Cell4);
                    TableCell t2Cell5 = new TableCell(); t2Cell5.Text = ""; t2Row.Cells.Add(t2Cell5);
                    t2Cell5.ColumnSpan = 4;
                    TableCell t2Cell9 = new TableCell(); t2Cell9.Text = convertMinToTime(dr["col6"].ToString(), dr["col7"].ToString()); t2Row.Cells.Add(t2Cell9);
                    TableCell t2Cell10 = new TableCell(); t2Cell10.Text = dr["col8"].ToString(); t2Row.Cells.Add(t2Cell10);
                    TableCell t2Cell11 = new TableCell(); t2Cell11.Text = dr["col9"].ToString(); t2Row.Cells.Add(t2Cell11);
                    TableCell t2Cell12 = new TableCell(); t2Cell12.Text = dr["col10"].ToString(); t2Row.Cells.Add(t2Cell12);
                    TableCell t2Cell13 = new TableCell(); t2Cell13.Text = dr["col11"].ToString(); t2Row.Cells.Add(t2Cell13);

Table my_Table= new Table();
my_Table.Rows.Add(t2Row);

this code works really slow, is there a way to hasten this ?

A: 

You might get better performance declaring the entire table in a string of HTML with a single Literal or LiteralControl, and/or putting the declared HTML into it's own user control or reuse. Won't be as flexible but you won't be creating nearly as many objects.

AaronLS
+1  A: 

I'd suggest using a databinding approach, where you actually bind your DataTable using a databound-control, such as a GridView or Repeater.

With these controls, you should be making use of the DataSource property and DataBind methods. You don't need to manually add rows to a table etc. Databinding takes care of these fundamentals..

KP
+6  A: 

You could use a Repeater and put a <tr> with the necessary <td>'s in the ItemTemplate.

First check if it really is the building of the table that is taking up a lot of time. My guess is that it is the transferring and rendering of the HTML-code for a table with 20.000 rows and 15 columns that is slowing things down here.

Kristof Claes
Along these lines, make sure the table has the "table-layout:fixed;" css style. http://www.w3schools.com/Css/pr_tab_table-layout.asp That vastly improves table rendering speed.
Chris Lively
Thanks Chris. Didn't know that one yet!
Kristof Claes
@KristofC: Using that style causes the browser to only compute the first row rendering sizes. The remaining rows all use those values. This neatly sidesteps a lot of the processing power required to render a table and means that it can immediately show each row as it is received instead of waiting until the entire table is loaded to figure out how big it is.
Chris Lively
+1  A: 

Two thoughts come to mind:

  • Don't retrieve all 20K rows since you can't show all of them anyway. If you need filtering you can go back to the DB once you know what the user is filtering by.

  • Modify the datareaders SQL to have the fields + the other items needed such as the count and empty field and then load the datareader into the datatable (datatable.load)

klabranche