:: Forum >>

Select all rows - Performance problem

I have a grid with more than 7000 data entries and want to select all rows.
If I use the method
obj.setSelectedRows([0,1,....,6998,6999]);
it takes serveral minutes and the browser runs into a timeout.

Do you have any performance suggestions, how to fix the problem?

Claudia
Friday, September 8, 2006
Any help with my problem?

It is really important to select all rows in a large grid..
Don't you have kind of workaround?
Claudia
Thursday, September 14, 2006
bump
DT
Friday, September 15, 2006
Here is a possible workaround (seems to be much faster) -

obj.selectAllRows = function(){

    // save event handlers
    var onRowSelectedChanged = this.onRowSelectedChanged;
    var onRowStateChanged = this.onRowStateChanged;

    // cancel events
    this.onRowSelectedChanged = function(){return 1};
    this.onRowStateChanged = function(){return 1};

    this.setRowSelected(true);
    this.setRowState("selected");

    var i, rows = [], max = this.getRowCount();

    for (i=0; i<max; i++){
        rows.push(i);
    }

    this.setSelectedRows(rows);

    // restore event handlers
    this.onRowSelectedChanged = onRowSelectedChanged;
    this.onRowStateChanged = onRowStateChanged;

    // repaint the grid content
    this.refresh();

}


Should be something similar to un-select rows after that...
Alex (ActiveWidgets)
Friday, September 15, 2006
It works great and MUCH faster!!! Thanx

But now I have the same problem, if I wan't to un-select all rows:

obj.selectNoRows = function(){

// save event handlers
var onRowSelectedChanged = this.onRowSelectedChanged;
var onRowStateChanged = this.onRowStateChanged;

// cancel events
this.onRowSelectedChanged = function(){return 1};
this.onRowStateChanged = function(){return 1};

this.setRowSelected(false);
this.setRowState("");

var i, rows = [], max = this.getRowCount();

for (i=0; i<max; i++){
rows.push(i);
}

this.setSelectedRows(rows);

// restore event handlers
this.onRowSelectedChanged = onRowSelectedChanged;
this.onRowStateChanged = onRowStateChanged;

// repaint the grid content
this.refresh();

}


The function does the unselection, but after this, if you want to select any row, there's no reaction and you have to try another one. Then it works.

Maybe a bug?

Claudia
Monday, September 18, 2006
Claudia, Unselect all rows don't need the 'row' array creation, so you can replace all this code :
var i, rows = [], max = this.getRowCount();
for (i=0; i<max; i++){ rows.push(i); }
this.setSelectedRows(rows);

with just :
this.setSelectedRows([]);

Carlos
Monday, September 18, 2006
Yes, exactly as Carlos said -

obj.selectNoRows = function(){

    // save event handlers
    var onRowSelectedChanged = this.onRowSelectedChanged;
    var onRowStateChanged = this.onRowStateChanged;

    // cancel events
    this.onRowSelectedChanged = function(){return 1};
    this.onRowStateChanged = function(){return 1};

    this.setRowSelected(false);
    this.setRowState("");
    this.setSelectedRows([]);

    // restore event handlers
    this.onRowSelectedChanged = onRowSelectedChanged;
    this.onRowStateChanged = onRowStateChanged;

    // repaint the grid content
    this.refresh();

}
Alex (ActiveWidgets)
Monday, September 18, 2006
Hi,
I have also run into this performance problem when I want to select large numbers of rows, but not actually all of them.

For the sake of this example, I am trying to select 1999 of 2000 rows and the indices of these rows are in a javascript array called 'myRows'. Virtual mode is on, and there are only about 20 rows actually scrolled into view.

If I just call setSelectedRows(myRows), then the browser runs into a timeout, and I get a modal popup that asks me if I want to terminate the script (I'm using IE 7).

If I disable the onRowSelectedChanged handler as shown in the previous solutions in this thread then the timout does not occur, but unfortunately my selected rows never get highlighted - it looks like the selection is actually occurring, but there is no indication of it :(

If my grid contains less than about 1500 rows, then the timeout does not occur (CPU-load permitting). It looks very much as if the onRowSelectedChanged handler is being called for all the rows in the grid, not just the ones in the virtual window which actually need it to paint themselves.

Is there any way around this? Our application could potentially have very large datasets (~35K rows), of which any combination could be selected, so this is currently a bit of a showstopper for us.

Thanks in hope...
Sharon
Wednesday, May 16, 2007
Most likely you need adding refresh() call at the end to repaint the grid.
Alex (ActiveWidgets)
Wednesday, May 16, 2007
refresh() was being called already - it's definitely not that.

After much stepping though with the debugger, I worked out that the "selected" appearance was being set by the calculateRowState function which was in turn being called in the onRowSelectedChanged handler - which was, of course, supressed for the fast-select and hence no state change.

I have been able to work around this by explicitly calling setRowState for each of my selected rows, rather than needing the overhead of the full set of event handlers with all their extra calls to refresh(). So far it has not timed out in any of my tests on up to 10K rows, and if I run into the timeout at higher row counts then UI should be able to use window.setTimeout to yield the CPU in the middle of my loop if necessary.

For anyone else that runs into this in the future, the fast-select function is:

function FastSelectRows(grid, selectedRows)
{
// Cache then supress selection event handlers.
var onRowSelectedChanged = grid.onRowSelectedChanged;
var onRowStateChanged = grid.onRowStateChanged;
grid.onRowSelectedChanged = function() {return 1;};
grid.onRowStateChanged = function() {return 1;};

if (selectedRows.length == grid.getRowCount())
{
// All of of the grid is selected.
grid.setRowSelected(true);
grid.setRowState("selected");
}
else
{
// At least some of the grid is unselected.
grid.setRowSelected(false);
grid.setRowState("");
for (var i in selectedRows)
{
grid.setRowState("selected", selectedRows[i]);
}
}
grid.setSelectedRows(selectedRows);

// Restore the cached event handlers
grid.onRowSelectedChanged = onRowSelectedChanged;
grid.onRowStateChanged = onRowStateChanged;
}


Thanks anyway,
Sharon
Thursday, May 17, 2007

This topic is archived.


Back to support forum

Forum search