2017-05-05 1 views
0

J'essaie d'afficher des données hiérarchiques dans une grille telerik/kendo. Les données proviennent d'une vue de base de données (importée en tant que modèle) qui contient une liste d'interruptions électriques. La clé primaire est identificateur d'interruption Il y a un champ dans la vue appelée ParentOutage qui, s'il est rempli avec l'InterruptionID d'une autre interruption, reliera les deux enregistrements. J'ai suivi l'exemple/démo de Telerik à la lettre mais je n'arrive pas à obtenir la grille pour afficher les dossiers enfants. L'événement qui remplit les enregistrements enfant ne se déclenche jamais. J'ai essayé de coder en dur les valeurs qui sont passées à la fonction getChildOutages pour voir s'il y avait un problème mais il n'a jamais été déclenché. Chaque ligne de la grille s'affiche avec la flèche pour développer l'enregistrement, mais lorsque vous l'agrandissez, un petit espace vide apparaît. En outre, seuls quelques enregistrements ont des enregistrements enfants, de sorte que la flèche ne doit pas apparaître à côté de chaque enregistrement. J'ai posté mon code ci-dessous:Telerik MVC Hiérarchie de la grille - No Child Records

<div class="form-group"> 
    @Code 


     Html.Kendo.Grid(Of vw_ElectInterruptions)() _ 
                           .Name("gridInterruptions") _ 
              .Columns(Sub(c) 
                  c.Bound(Function(p) p.InterruptionID).Width(75).Sortable(True).Title("ID") 
                  c.Bound(Function(p) p.ParentOutage).Width(85).Sortable(True).Title("Parent ID") 
                  c.Bound(Function(p) p.Description).Width(175).Sortable(True).Title("Description") 
                  c.Bound(Function(p) p.CircuitOrArea).Width(150).Sortable(True).Title("Area/Circuit") 
                  c.Bound(Function(p) p.TimeOff).Width(100).Sortable(True).Title("TimeOff").Format("{0:dd-MMM-yy hh:mm}") 
                  c.Bound(Function(p) p.TimeOn).Width(100).Sortable(True).Title("TimeOn").Format("{0:dd-MMM-yy hh:mm}") 

                End Sub) _ 
                .Events(Function(e) e.DataBound("dataBound")) _ 
                .ClientDetailTemplateId("template") _ 
                .AutoBind(True) _ 
                .Sortable(Sub(d) d.SortMode(GridSortMode.SingleColumn).AllowUnsort(False)) _ 
                .Filterable() _ 
                 .HtmlAttributes(New With {.Style = "height:500px;"}) _ 
                       .Pageable(Sub(d) d.PageSizes(True).ButtonCount(5).Refresh(True)) _ 
                             .DataSource(Sub(d) 
                                  d.Ajax() _ 
                                  .Sort(Sub(sort) 
                                      sort.Add("TimeOff").Descending() 
                                      sort.Add("InterruptionID").Ascending() 
                                    End Sub) _ 
                                  .PageSize(25) _ 
                                  .ServerOperation(False) _ 
                                  .Read(Function(read) read.Action("ElecInterruptionRefreshGrid", "Application")) _ 
                                  .Events(Sub(e) 
                                      e.Error("grid_error") 
                                    End Sub) 
                                End Sub).Render() 


    End Code 

</div> 

<script id="template" type="text/x-kendo-template"> 
 
    @Code 
 
     Html.Kendo.Grid(Of vw_ElectInterruptions)() _ 
 
                             .Name("childInterruptions_#=InterruptionID#") _ 
 
                .Columns(Sub(c) 
 
                    c.Bound(Function(p) p.InterruptionID).Width(75).Sortable(True).Title("ID") 
 
                    c.Bound(Function(p) p.Description).Width(175).Sortable(True).Title("Description") 
 
                    c.Bound(Function(p) p.CircuitOrArea).Width(150).Sortable(True).Title("Area/Circuit") 
 
                    c.Bound(Function(p) p.TimeOff).Width(100).Sortable(True).Title("TimeOff").Format("{0:dd-MMM-yy hh:mm}") 
 
                    c.Bound(Function(p) p.TimeOn).Width(100).Sortable(True).Title("TimeOn").Format("{0:dd-MMM-yy hh:mm}") 
 

 

 
                  End Sub) _ 
 
                    .DataSource(Sub(d) 
 
                         d.Ajax() _ 
 
                         .Read(Function(read) read.Action("GetChildOutages", "Application", New With {.id = "#=InterruptionID#"})) 
 
                         
 
                       
 
                       End Sub).ToClientTemplate() 
 
    End Code 
 
    
 
</script> 
 

 
    <script> 
 
     function dataBound() { 
 
      this.expandRow(this.tbody.find("tr.k-master-row").first()); 
 
     } 
 
    </script>

And the controller code: 

    Public Function ElecInterruptionRefreshGrid(request As DataSourceRequest) As ActionResult 

       Dim model = db.vw_ElectInterruptions.ToList 

       Dim jsonResult = Json(model.ToDataSourceResult(request), JsonRequestBehavior.AllowGet) 
       jsonResult.MaxJsonLength = Int32.MaxValue 
       Return jsonResult 

     End Function 

    Public Function GetChildOutages(id As Integer, request As DataSourceRequest) As ActionResult 


       Dim model = db.vw_ElectInterruptions.Where(Function(w) w.ParentOutage = id).ToList 

       Dim jsonResult = Json(model.ToDataSourceResult(request), JsonRequestBehavior.AllowGet) 
       jsonResult.MaxJsonLength = Int32.MaxValue 
       Return jsonResult 

     End Function 
+0

Tout d'abord, je suggère fortement d'améliorer l'indentation sur ce post. Deuxièmement, obtenez-vous des erreurs dans la fenêtre de la console lorsque vous tentez d'étendre une ligne? – Sandman

+0

Désolé pour l'indentation - Visual Studio ne semble pas être capable de gérer correctement le code rasoir/html et gâche toujours mes indentations - je les corrige et puis ils reviennent à la façon dont ils sont. J'ai été capable de résoudre le problème et posté la réponse. – PlasmaX

Répondre

0

Ok je passais des heures à ce sujet et puis a trouvé la réponse en quelques minutes après la publication de cette question. Apparemment, il n'a pas aimé le fait que je mets le gabarit de la grille enfant dans un code @Code ... End Code - block. J'ai changé le script de modèle pour ressembler à ceci et il a commencé à travailler:

@(Html.Kendo.Grid(Of vw_ElectInterruptions)() _ 
 
                             .Name("childInterruptions_#=InterruptionID#") _ 
 
                .Columns(Sub(c) 
 
                    c.Bound(Function(p) p.InterruptionID).Width(75).Sortable(True).Title("ID") 
 
                    c.Bound(Function(p) p.Description).Width(175).Sortable(True).Title("Description") 
 
                    c.Bound(Function(p) p.CircuitOrArea).Width(150).Sortable(True).Title("Area/Circuit") 
 
                    c.Bound(Function(p) p.TimeOff).Width(100).Sortable(True).Title("TimeOff").Format("{0:dd-MMM-yy hh:mm}") 
 
                    c.Bound(Function(p) p.TimeOn).Width(100).Sortable(True).Title("TimeOn").Format("{0:dd-MMM-yy hh:mm}") 
 

 

 
                  End Sub).AutoBind(True) _ 
 
                    .DataSource(Sub(d) 
 
                         d.Ajax() _ 
 
                         .Read(Function(read) read.Action("GetChildOutages", "Application", New With {.id = "#=InterruptionID#"})) 
 
                         
 
                       
 
                       End Sub).ToClientTemplate())

Je ne sais pas pourquoi cela ferait une différence.