2016-05-02 8 views
3

Wie kann ich den Löschen-Knopf in einer Reihe durch einen gegebenen boolean sperren?Befehl durch Datenbedingung in Kendogrid deaktivieren

Vor diesem Beispiel Modell:

public class Example 
{ 
    public bool CanDeleted {get; set;} //Delete Button only if true 
    //...   
} 

KendoGrid<Example>:

columns.Command(c => c.Destroy()); //I want something something like m => m.CanDeleted 
+0

Haben Sie in diesem http://stackoverflow.com/a/19840309/1876572 suchen – Eldho

+0

@Eldho, ja, ich habe einen Blick auf sie genommen. Es scheint aber so zu sein, dass dies alle Zeilen auf der Serverseite deaktiviert/aktiviert. Mein Anliegen ist die Clientseite basierend auf den Daten, nicht das ViewBag/ViewModel. –

+1

Werfen Sie auch einen Blick auf diese http://www.telerik.com/forums/how-do-i-conditional-set-the-visibility-of-the-command-edit-button-on-a-row-by -rower-Basis- – Eldho

Antwort

0

Nach der Situation mit ein wenig mehr Wissen über MVC bewerten, fand ich eine signficant bessere Lösung, eine Erweiterungsmethode mit:

public static class KendoExtensions 
{ 
    public static GridTemplateColumnBuilder<TModel> DestroyConditional<TModel>(this GridColumnFactory<TModel> factory, Expression<Func<TModel, bool>> expression) 
     where TModel : class 
    { 
     var template = "# if (" + ExpressionHelper.GetExpressionText(expression) +") { # <a class=\"k-button k-button-icontext k-grid-delete\"><span class=\"k-icon k-delete\"></span>" + TextStrings.Delete + "</a># } #"; 

     return factory.Template(e => "").ClientTemplate(template).Title(""); 
    } 
} 

Fühlen Sie sich frei TextStrings.Delete, was auch immer Sie sich wohl fühlen zu ersetzen. Es ist einfach meine T4 Lokalisierungslogik.

Jetzt in Ihrem Raster Definition ist es wirklich einfach:

.Columns(columns => 
{ 
    columns.DestroyConditional(c => c.CanBeDeleted).Width(120); 
})) 
1

Dank @Eldho, der mich auf die right solution

Javascript hingewiesen hat:

function onDataBound() { 
    var grid = $("#GridID").data("kendoGrid"); //Set GridID 
    var gridData = grid.dataSource.view(); 
    for (var i = 0; i < gridData.length; i++) { 
     var gridItem = gridData[i]; 
     if (!gridItem.CanBeDeleted) { //Condition 
      grid.table.find("tr[data-uid='" + gridItem.uid + "']").find(".k-grid-delete").hide(); //Remove button 
     } 

     //Second Iteration, if we have grouped columns 
     if (gridItem.items) { 
      for (var j = 0; j < gridItem.items.length; j++) { 
       var gridSubItem = gridItem.items[j]; 
       if (!gridSubItem.CanBeDeleted) { //Condtion 
        grid.table.find("tr[data-uid='" + gridSubItem.uid + "']").find(".k-grid-delete").hide(); //Remove button 
       } 
      } 
     } 
    } 
} 

KendoGrid Helper:

.Events(e => e.DataBound("onDataBound")) 

Sehen Sie sich meine other answer für eine bessere Lösung.