2012-11-15 13 views
5

Aktualizacja Udało mi się uzyskać renderowanie formularza (zobacz obraz) z wartościami i szablonami edytora.Edytowalny szablon szczegółów Kendo UI Siatka

Sorry for blacked out labels. NDA stuff. Przepraszamy za zaciemnienie etykiet. Wymagania NDA ...

to teraz działa w wielu rzędach, ponieważ używam uid wiersza dać szczegół szablonu unikalną nazwę ten sposób:

@(Html.Kendo().TabStrip() 
    .Name("Details_#=uid#") 

Mam aktualizowane źródło poniżej najnowszą wersję i zawiera listę problemów, które z przyjemnością pomogę.

Kwestie nieuregulowane:

  • szeregowania szczegół szablonu wraz z siatki, kiedy zapisać zmiany
  • Przypisywanie etykiety i zasady weryfikacji wykorzystując dane adnotacje na widoku modelu (nie wydają się działać odkąd nie wydaje się uzyskać pomocników Html pracy. Czy byłoby świetnie!

tekstu Orignal post (kod źródłowy został zaktualizowany)

Próbuję utworzyć siatkę wsadową, w której każdy element zawiera szablon szczegółów.

Każdy szablon szczegółów zawiera tabulator, w którym chcę przechowywać dodatkowe dane formularzy.

W tej chwili mam standardową siatkę wsadową działającą, ale nie mogę uzyskać informacji na ekranie dla każdego elementu ORAZ mieć możliwość edycji. Ponadto szablon szczegółów jest przerywany, gdy występuje więcej niż jeden wiersz. Szablon wciąż jest renderowany, ale przyciski nie działają, ponieważ oba szablony mają ten sam identyfikator, co w oczywisty sposób przełamuje zdolność użytkownika do interakcji, ale nie jestem pewien, w jaki sposób zapewnić unikalne identyfikatory dla każdego szablonu wiersza (może w jakiś sposób użyć rodzica?)

Nie jestem również pewien, jak serializować dane formularza po ukończeniu tego pierwszego kroku, ale mogę zadać osobne pytanie, jeśli okaże się to konieczne.

Siatka

@(Html.Kendo().Grid(Model.ItemModelList) 
.Name("ItemGrid") 
.Columns(columns => 
{ 
    //Other columns omitted for brevity 
    columns.Bound(i => i.Description).Width(100); 
    columns.Command(command => 
    { 
     command.Destroy(); 
    }).Width(60); 
}) 
.ClientDetailTemplateId("ItemDetails") 
.ToolBar(toolbar => 
{ 
    toolbar.Create(); 
    toolbar.Save(); 
}) 
.Editable(editable => editable.Mode(GridEditMode.InCell).CreateAt(GridInsertRowPosition.Bottom)) 
.Pageable() 
.Sortable() 
.Scrollable() 
.Resizable(resize => resize.Columns(true)) 
.DataSource(dataSource => dataSource 
    .Ajax() 
    .Batch(true) 
    .ServerOperation(false) 
    .Events(events => 
    { 
     events.Error("ItemGrid_ErrorHandler"); 
    }) 
    .Model(model => 
    { 
     model.Id(i => i.ItemModelID); 
     model.Field(i => i.DimensionUOM).DefaultValue("in"); 
     model.Field(i => i.WeightUOM).DefaultValue("lbs"); 
    }) 
    .Create(create => create.Action("CreateProducts", "ItemGrid")) 
    .Read(read => read.Action("GetProducts", "ItemGrid")) 
    .Update(update => update.Action("UpdateProducts", "ItemGrid")) 
    .Destroy(destroy => destroy.Action("DeleteProducts", "ItemGrid")) 
) 

)

Szablon Szczegółowy

<script id="ItemDetails" type="text/kendo-tmpl"> 

@(Html.Kendo().TabStrip() 
    .Name("Details_#=uid#") 
    .SelectedIndex(0) 
    .Items(items => 
    { 
     items.Add().Text("test").Content(@<div>  
      <table id="testForm"> 
       <tr> 
        <td>TEST</td> 
       </tr> 
       <tr> 
       </tr> 
      </table> 
     </div>); 

     items.Add().Text("test2").Content(@<div>  
      <table id="test2Form"> 
       <tr> 
        <td><label>A</label></td> 
        <td><label>B</label></td> 
        <td><label>C</label></td> 
        <td><label>D</label></td> 
        <td><label>E</label></td> 
       </tr> 
       <tr> 
        <td> 
         <input class="k-textbox" value="#=objectA#"> 
        </td> 
        <td> 
         @(Html.Kendo().DropDownList() 
          .Name("objectB") 
          .Value("#=objectB#") 
          .DataTextField("Text") 
          .DataValueField("Value") 
          .BindTo(new SelectList((System.Collections.IEnumerable)ViewBag.objectBListing, "Value", "Value")) 
          .ToClientTemplate() 
         ) 
        </td> 
        <td> 
         @(Html.Kendo().DropDownList() 
          .Name("objectC") 
          .Value("#=objectC#") 
          .DataTextField("Text") 
          .DataValueField("Value") 
          .BindTo(new SelectList((System.Collections.IEnumerable)ViewBag.objectCListing, "Value", "Value")) 
          .ToClientTemplate() 
         ) 
        </td> 
        <td><input class="k-textbox" value="#=objectD#"></td> 
        <td><input class="k-textbox" value="#=objectE#"></td> 
       </tr> 
      </table> 
     </div>); 
    }) 
    .ToClientTemplate() 
) 

Odpowiedz

0
  1. Należy stworzyć model do dodatkowych informacji i dodać ją jako własność swojej ItemModelList jak ten:

    public class BaseMode 
    { 
        public string UID { get; set; } // Create your own UID, distinguished from Telerik UID by casing. 
    } 
    
    public class ExtraInfoModel : BaseModel 
    { 
        [DisplayName("Object A")] 
        [Required] // For example 
        public string ObjectA { get; set; } 
    
        [DisplayName("Object B")] 
        [UIHint("DropDownList")] 
        public int? ObjectB { get; set; } 
    
        [DisplayName("Object C")] 
        public int? ObjectC { get; set; } 
    
        public ExtraInfoModel(string uid) 
        { 
         this.UID = uid; 
        } 
    } 
    
    public class ItemModelList : BaseModel 
    { 
        public ExtraInfoModel ExtraInfo { get; set; } 
    
        public ItemModelList() 
        { 
         this.UID = Guid.NewGuid().ToString(); // Not sure about syntax, please review. 
         this.ExtraInfo = new ExtraInfoModel(this.UID); // Guarantee ExtraInfo.UID is the same as parent UID when you get model from DB. 
        } 
    } 
    
  2. Tworzenie częściowy widok dla szczegółów dodatkową informacją, stosując siatkę kendo w drugiej zakładce:

    @model ExtraInfoModel 
    
    @(Html.Kendo().TabStrip() 
        .Name("Details_#=UID#") 
        .SelectedIndex(0) 
        .Items(items => 
        { 
         items.Add().Text("test").Content(@<text> 
          <div>  
           <table id="testForm"> 
            <tr> 
             <td>TEST</td> 
            </tr> 
            <tr></tr> 
           </table> 
          </div> 
         </text>); 
    
         items.Add().Text("test2").Content(@<text> 
          @(Html.Kendo().Grid<ExtraInfoModel>() 
           .Name("gvDetail_#=UID#") 
           .Columns(c => 
           { 
            c.Bound(m => m.ObjectA).ClientTemplate(Html.Kendo().TextBox() 
             .Name("ObjectA") 
             .HtmlAttributes(new { id = "ObjectA_#=UID#" }) 
             .Value(Model.AgencyCode) 
             .ToClientTemplate() 
             .ToHtmlString()); 
            c.Bound(m => m.ObjectB).ClientTemplate(Html.Kendo().DropDownList() 
             .Name("ObjectB") 
             .HtmlAttributes(new { id = "ObjectB_#=UID#" }) 
             .Value((Model != null && Model.ObjectB.HasValue) ? Model.ObjectB.ToString() : string.Empty) 
             .OptionLabel("Select B...") 
             .BindTo(ViewBag.Data) 
             .ToClientTemplate() 
             .ToHtmlString()); 
    
            // Config ObjectC same as ObjectB. 
           }) 
           .BindTo(new ExtraInfoModel[] { Model }) // Your detail grid has only one row. 
          ) 
         </text>); 
        }) 
    ) 
    
  3. Na głównej stronie widoku, przy użyciu szablonu szczegółów serwera zamiast szablonu szczegółów klienta. Proponuję użyć szablonu serwera ponieważ używam serwera wiąże w punkcie 2. Oczywiście, można zmienić go do Ajaksu wiązania wiązanie lub lokalny (poprzez zdefiniowanie zdarzeń OnDetailExpand)

    @Html.Kendo().Grid(Model.ItemModelList) 
        ... 
        .DetailTemplate(@<text> 
         @Html.Partial("YourPartialName", item.ExtraInfo) // item stands for ItemModelList, which is the binding data item. 
        </text>) 
    
  4. i ostatni, na Twój pierwszy numer, serializowanie dodatkowych danych informacyjnych o zapisaniu, powinniśmy obsłużyć zdarzenie zmiany każdej dodatkowej właściwości informacji, aby ustawić wartość i brudną flagę do elementu danych podstawowych. Pamiętaj, że siatka kendo w edycji zbiorczej przesyła tylko brudne elementy danych. Powrót do kroku 2:

        c.Bound(m => m.ObjectB).ClientTemplate(Html.Kendo().DropDownList() 
             .Name("ObjectB") 
             .HtmlAttributes(new { id = "ObjectB_#=UID#" }) 
             .Value((Model != null && Model.ObjectB.HasValue) ? Model.ObjectB.ToString() : string.Empty) 
             .OptionLabel("Select B...") 
             .BindTo(ViewBag.Data) 
             .Events(e => e.Change("onChangeObjectB")) // Added this line 
             .ToClientTemplate() 
             .ToHtmlString()); 
    
    <script type="text/javascript"> 
        function onChangeObjectB(e) { 
         var selectedValue = this.value(); 
    
         var sender = e.sender; 
         if (sender != undefined && sender.length > 0) { 
          var detailRow = sender.closest(".k-detail-row"); 
          var masterRow = detailRow.prev(); 
          var mainGrid = $("#ItemGrid").data("kendoGrid"); 
          if (mainGrid != null) { 
           var masterRowIndex = masterRow.parent().find(".k-master-row").index(masterRow); 
    
           var dataItem = mainGrid.dataSource._data[masterRowIndex]; 
           dataItem.ObjectB = selectedValue; 
           dataItem._dirty = true; 
          } 
         } 
        } 
    </script> 
    

    A czynność zapisywania będzie działać normalnie.