2011-05-16 13 views
6

Mam następujący problem:Jak programowo utworzyć dijit.Dialog z dojox.grid.DataGrid

Programowo tworząc dijit.Dialog i dojox.grid.DataGrid (połączony z zmienna globalna przechowywania danych (dojo.store.Memory)) zawartość okna dialogowego nie jest wyświetlana, gdy rozmiar okna dialogowego pozostaje na minimalnym poziomie.

Magazyn DataGrids jest wypełniony poprawnie, a Firebug pokazuje tabelę wewnątrz okna dialogowego.

data = new dojo.data.ObjectStore(
    { objectStore: new dojo.store.Memory({data:[]}) }); 

data.put({id:0,name:'Franklin'}); 

showDialog = function(){ 
    var dlg = dijit.byId('myDlg'); 
    if(dlg){ 
    dlg.show(); 
    } 
    else{ 
    var cp = new dijit.layout.ContentPane({style:"width:500;height:500;"}); 
    var grid = new dojox.grid.DataGrid({ 
     store : data, 
     structure : [ 
     {field:'id',name:'ID',width:'50px'}, 
     {field:'name',name:'Name',width:'400px'}] 
    },cp); 

    dlg = new dijit.Dialog({ 
     id:'myDlg', 
     title:'Names', 
     content:cp.domNode 
    }); 

    grid.startup(); 
    dlg.show(); 
    } 
); 

Może dodałem coś w niewłaściwej kolejności?

Również nie wiem, czy mój sposób łączenia/dołączania widgetów dojo przy użyciu właściwości domNode jest prawidłowym sposobem robienia rzeczy.

Nie wiem, czy ContentPane używam jest konieczne do umieszczenia siatki wewnątrz okna dialogowego. Oba warianty do tej pory nie działały.

Wreszcie nie jestem pewien, czy i gdzie Dialog wymaga pomiarów statycznych na właściwy rozmiar. Z mojego doświadczenia wynika, że ​​sam Dialog nie potrzebuje statycznej szerokości ani wysokości, ale nie mam do tej pory doświadczenia z dodawaniem dynamicznego komponentu , takiego jak Grid - który może zmienić swój rozmiar później przy starcie - do okna dialogowego.

Odpowiedz

2

Oto jedno z możliwych rozwiązań dla mojego powyższego problemu. Okno dialogowe musi być na miejscu i widoczne w tym przypadku. Dopiero potem zostanie utworzona siatka, umieszczona wewnątrz okna dialogowego i uruchomiona.

Zarówno okno dialogowe, jak i siatka, wymagają wymiarów explicid. Jeśli okno dialogowe ma inną treść, może nie potrzebować dodatkowych informacji o szerokości.

var myDialog = dijit.byId('myDialog'); 
if(!myDialog){ 
    myDialog = new dijit.Dialog({ 
     id:'myDialog', 
     title:'test dialog', 
     style:'width:600px;height:600px;' 
    }); 
} 
myDialog.show(); 

var myMemoryStore = new dojo.store.Memory(
    {data:[ 
     {'id':'0','lastname':'Frank'}, 
     {'id':'1','lastname':'Herbert'}]}); 
var myObjectStore = new dojo.data.ObjectStore({objectStore:myMemoryStore }); 

var myStructure = [ 
    {field:'id',  name:'ID', width:'20px'}, 
    {field:'lastname', name:'NAME', width:'200px'}]; 

var myGrid = dijit.byId('myGrid'); 
if(!myGrid){ 
    myGrid= new dojox.grid.DataGrid({ 
     id:'myGrid', 
     store:myObjectStore , 
     structure:myStructure, 
     style:'width:400px;height:400px;' 
    }); 
} 

dojo.place(myGrid.domNode,myDialog.containerNode,'first'); 
myGrid.startup(); 
+0

To rozwiązanie sprawdziło się, ale wracając do tego pytania, widzę możliwe lepsze rozwiązania - więc ponownie otwieram to pytanie, żeby je sprawdzić. – elfwyn

+0

Zrobiłem to samo. Problem polega na tym, że próbujesz dodać więcej niż siatkę do okna dialogowego. udało mi się obejść, ale jakoś dialog nie jest wyśrodkowany. – Nap

+0

@Nap Mam ten sam problem, nie jest on wyśrodkowany! Ciekawe, czy to załatwiłeś? – Saky

2

Nie trzeba najpierw wyświetlać okna dialogowego, które ma na celu uzyskanie okna dialogowego. Musisz utworzyć siatkę, dołączyć domNode do okna dialogowego, a następnie wyświetlić okno dialogowe. To działa dla mnie we wszystkich moich kodach. Best

Powiązane problemy