3.0.5

Alex, please clarify

There are many threads in this forum mentioning the behaviour when using JS array as data source: if you sort on any column and then change the data in the array, grid basically crashes.

I understand this is not regarded as bug, but those of us who use JS arrays and need to change the data still need the workaround.

Sudhaker Raj suggested one in this thread: javascript.forum.1788.24/bug-caused-by-sorting.html
function resetRowValues() {      
  //  re-initialize the data count 
  obj.setDataProperty("count", myData.length); 
  // @@@ I GET THIS ZERO FOR TABLE MODEL 
  var newCount = obj.getDataProperty("count"); 
  var rowValues = []; 
  for(var i=0; i < newCount; ++i) { rowValues.push(i); } 
  obj.setRowProperty("values", rowValues); 
  obj.setSortProperty("index", null); 
}


but admitted that it's not "working right all the time". It seem to work for me, but I haven't given it thorough testing.

I'd be much more confortable if "official" workaround from Alex was posted or if he approved Sudhaker's workaround. Please?

Thanks much everybody,
Sergei
May 31,
I guess I am a bit confused. I have multiple grids on a page, and constantly replace the data in them and have never had an issue with the grid 'crashing'. What methods do you use to replace the data and how do you produce this 'crash'?
Jim Hunter
May 31,
Jim,

This is the file dummy.htm from standard distribution with only a few lines modified. It illustrates the problem well. The most apparent way:
click on the link "Dataset 2" to load a smaller set. Then sort on any column. Then click "Dataset 1".

Many thanks.

<html>
<head>
    <title>ActiveWidgets Grid :: Examples</title>
    <style> body, html {margin:0px; padding: 0px; overflow: hidden;} </style>

    <!-- ActiveWidgets stylesheet and scripts -->
    <link href="../../runtime/styles/xp/grid.css" rel="stylesheet" type="text/css" ></link>
    <script src="../../runtime/lib/grid.js"></script>

    <!-- grid format -->
    <style>
        .active-controls-grid {height: 100%; font: menu;}

        .active-column-0 {width:  80px;}
        .active-column-1 {width: 200px;}
        .active-column-2 {text-align: right;}
        .active-column-3 {text-align: right;}
        .active-column-4 {text-align: right;}

        .active-grid-column {border-right: 1px solid threedlightshadow;}
        .active-grid-row {border-bottom: 1px solid threedlightshadow;}
    </style>

    <!-- grid data -->
    <script>
        var myData1 = [
            ["MSFT","Microsoft Corporation", "314,571.156", "32,187.000", "55000"],
            ["ORCL", "Oracle Corporation", "62,615.266", "9,519.000", "40650"],
            ["SAP", "SAP AG (ADR)", "40,986.328", "8,296.420", "28961"],
            ["CA", "Computer Associates Inter", "15,606.335", "3,164.000", "16000"],
            ["ERTS", "Electronic Arts Inc.", "14,490.895", "2,503.727", "4000"],
            ["SFTBF", "Softbank Corp. (ADR)", "14,485.840", ".000", "6865"],
            ["VRTS", "Veritas Software Corp.", "14,444.272", "1,578.658", "5647"],
            ["SYMC", "Symantec Corporation", "9,932.483", "1,482.029", "4300"],
            ["INFY", "Infosys Technologies Ltd.", "9,763.851", "830.748", "15400"],
            ["INTU", "Intuit Inc.", "9,702.477", "1,650.743", "6700"],
            ["ADBE", "Adobe Systems Incorporate", "9,533.050", "1,230.817", "3341"],
            ["PSFT", "PeopleSoft, Inc.", "8,246.467", "1,941.167", "8180"],
            ["SEBL", "Siebel Systems, Inc.", "5,434.649", "1,417.952", "5909"],
            ["BEAS", "BEA Systems, Inc.", "5,111.813", "965.694", "3063"],
            ["SNPS", "Synopsys, Inc.", "4,482.535", "1,169.786", "4254"],
            ["CHKP", "Check Point Software Tech", "4,396.853", "424.769", "1203"],
            ["MERQ", "Mercury Interactive Corp.", "4,325.488", "444.063", "1822"],
            ["DOX", "Amdocs Limited", "4,288.017", "1,427.088", "9400"],
            ["CTXS", "Citrix Systems, Inc.", "3,946.485", "554.222", "1670"],
            ["KNM", "Konami Corporation (ADR)", "3,710.784", ".000", "4313"]
        ];
        
        var myData2 = [
            ["DDDD", "Dummy Corporation", "314,571.156", "32,187.000", "55000"],
            ["AAAA", "Another Dummy stuff", "62,615.266", "9,519.000", "40650"],
            ["QQQQ", "QQQQQQQQQQQQQQQQQQQQ", "40,986.328", "8,296.420", "28961"]
        ];

        var myColumns = [
            "Ticker", "Company Name", "Market Cap.", "$ Sales", "Employees"
        ];
            
    function changeData() {
        obj.setRowProperty("count", myData.length);
        obj.setSelectionProperty("index", -1);
        obj.setSelectionProperty("values", []);
        obj.refresh();
    }
    
    </script>
</head>
<body>

<a href="javascript: { myData = myData1; changeData(); }">Dataset 1</a><br>
<a href="javascript: { myData = myData2; changeData(); }">Dataset 2</a>

    <script>

    //	create ActiveWidgets Grid javascript object
    var obj = new Active.Controls.Grid;
    var myData = myData1;

    //	set number of rows/columns
    obj.setRowProperty("count", myData.length);
    obj.setColumnProperty("count", 5);

    //	provide cells and headers text
    obj.setDataProperty("text", function(i, j){return myData[i][j]});
    obj.setColumnProperty("text", function(i){return myColumns[i]});

    //	set headers width/height
    obj.setRowHeaderWidth("28px");
    obj.setColumnHeaderHeight("20px");

    //	set click action handler
    obj.setAction("click", function(src){window.status = src.getItemProperty("text")});

    //	write grid html to the page
    document.write(obj);

    </script>
</body>
</html>
Sergei
May 31,
Apologies. This is basic.htm, not dummy.htm
Sergei
May 31,
Very strange, I have never encountered this problem. When I change the data in a grid, these are the steps I take and I do not get the problem you are seeing.

create new data arry
re-attach that array to the grid with setDataProperty("text", ...)
change the row count to match new data with setRowCount(xx)
set the selected index to 0 (we always have a selected row) with setProperty("selection/index", 0)
refresh the grid refresh()

This is what I do and I have not seen any glitches like your demo showed.

-----

I just tried to modify your demo to use my technique and it fails like yours does. Funny that my application is working fine but this demo is not.
Jim Hunter
May 31,
Alex,

What about this one?

Cheers,
Sergei
July 8,
Sergei,

the grid keeps array of row indices as 'row/values' property (which maybe subset of all data rows or just the different sort order). In case you add or delete records from the data array you have to pass this information to the grid - i.e. add or delete appropriate index from the 'row/values' array.

I am not sure if the current behavior is bug or a 'feature' but I agree there should be a better way of doing it.
Alex (ActiveWidgets)
July 11,

This topic is archived.

See also:


Back to support forum