views:

2811

answers:

3

I have a dojo Grid widget inside a TitlePane with it's width set to 100%.

The TitlePane is in a liquid layout so it's width changes with the browser window size. The problem I am having is that when the parent window expands (or contracts) the grid itself does not change it's width. I can get it to resize itself by calling render() on the grid, but how can I detect that the parent window has resized so that I know to redraw the grid widget?

+3  A: 

I've had to do this on occasion; it's not too tough:

function resizeGrid() {
   // do whatever you need here, e.g.:
   myGrid.resize();
   myGrid.update();
}

dojo.addOnLoad(function() {
   dojo.connect(window, "onresize", resizeGrid);
});
Ryan Corradini
A: 

I have the same kind of problem. I tried a solution similar to Ryan Corradini's.

It is only OK for first display. If I change the window size, the resize function is correctly called, but the grid's size stays unchanged.

Please note my particular conditions: in the resize function, I have to set the height attribute of the grid (resize+update only seems not enough).

HTML looks like :

<div id="msgItems" dojoType="dijit.layout.ContentPane" region="center"
 style="padding:2px;">
<form id="msgDefForm" name="msgDefForm" dojoType="dijit.form.Form">
<div style="display:none;"><input type="text" name="msgName" id="msgName" dojoType="dijit.form.TextBox"></input>
</div>

<table dojoType="dojox.grid.DataGrid" jsId="msgGrid" id="msgGrid"
rowsPerPage="10" rowSelector="5px" singleClickEdit="false" loadingMessage="Loading message content"  
errorMessage="Error while loading the message content" selectable="true"  >
  <thead>
    <tr>
      <th field="zone" width="8em" cellType="dojox.grid.cells.Select" options="properties, values" editable="true">Zone</th>
      <th field="property" width="auto" editable="true">Property</th>
      <th field="value" width="auto" editable="true">Value</th>
    </tr>
  </thead>
</table>

</form>
</div>

JS looks like :

... in startOnLoad :
dojo.connect( window, "onresize", msgGridResized);
msgGridResized ();
...

function msgGridResized () {
    var cont = dojo.byId("msgItems")
    var h = cont.clientHeight - 4;
    if (h >= 0){
     var grd = dijit.byId("msgGrid");
     grd.attr("height", h+"px" );
     grd.resize();
     grd.update();
    }
}
OK! I found it: the "form" tag seems to interfer with the layout calculation. I simply took it out, and change my code accordingly in order to not need the hidden input field and it is now OK.
A: 

Haven't got time to try this out for you but can't you just dojo.connect to the TitlePane's resize event and in the handler resize the grid or set the size of the grid using percentages in the declaration/markup?

Rich