Telerik MVC-Netz mit Dynamischen Spalten zur Laufzeit aus einer Sammlung oder Wörterbuch
Nach den Ausgaben der letzten paar Tage Suche, bin ich offiziell stecken. Ich arbeite an einer Bindung ein Objekt der Telerik MVC-3-Raster, aber der Haken ist, dass es braucht, um dynamisch erstellte Spalten (nicht automatisch generiert). Drei Spalten sind bekannt, andere sind unbekannt, und das ist der schwierige Teil. Im Grunde, kann es sein, wie diese Beispiele:
KnownColumn1 | KnownColumn2 | UnknownColumn1 | KnownColumn3
KnownColumn1 | KnownColumn2 | UnknownColumn1 | UnknownColumn2 | UnknownColumn3 | KnownColumn3
etc.
Weil ich Stelle das unbekannte Spalten in einer Liste (habe ich versucht, ein Wörterbuch zu so kann ich die Spalten-Namen), hat sich dieser komplizierte Dinge für mich als verbindlich an. Mein code ist unten:
Modell (Es können auch null sein, um Hunderte von Zeilen, aber dieses Modell ist in einer Ansicht-Modell des Typs Liste, es können aber auch 0 bis 20 plus-Spalten, die dynamisch Hinzugefügt werden)
public class VendorPaymentsGLAccount
{
public string GeneralLedgerAccountNumber { get; set; }
public string GeneralLedgerAccountName { get; set; }
public string DisplayName { get { return string.Format("{0} - {1}", GeneralLedgerAccountNumber, GeneralLedgerAccountName); } }
public Dictionary<string, double> MonthAmount { get; set; }
public double Total { get { return MonthAmount.Sum(x => x.Value); } }
public List<string> Columns { get; set; }
public List<double> Amounts { get; set; }
public VendorPaymentsGLAccount() { }
}
Ansicht (Der Abschnitt, der auskommentiert wurde versucht, mit dem Wörterbuch)
<fieldset>
<legend>General Ledger Account Spend History</legend>
@if (Model.VendorPaymentsGLAccounts != null)
{
<br />
@(Html.Telerik().Grid(Model.VendorPaymentsGLAccounts)
.Name("Grid")
.Columns(columns =>
{
columns.Bound(gl => gl.DisplayName).Title("General Ledger Account").Width(200).Filterable(false).Sortable(false);
//foreach (var month in Model.VendorPaymentsGLAccounts[0].MonthAmount)
//{
// //columns.Bound(gl => gl.MonthAmount[month.Key.ToString()].ToString()).Title(month.Key.ToString()).Width(100).Filterable(false).Sortable(false);
// //columns.Template(v => Html.ActionLink(v.VoucherID, "VoucherSummary", new { id = v.VoucherID, bu = v.BusinessUnitID, dtt = v.InvoiceDate.Ticks })).Title("Voucher").Width(100);
// columns.Template(gl => Html.ActionLink(gl.MonthAmount[month.Key.ToString()].ToString(), "VoucherSummary")).Title(month.Key.ToString()).Width(100);
//}
for (int i = 1; i <= (Model.VendorPaymentsGLAccounts[0].Columns.Count() - 1); i++)
{
string colTemp = Model.VendorPaymentsGLAccounts[0].Columns[i - 1];
columns.Template(gl => gl.Amounts[i - 1]).Title(colTemp).Width(100);
}
columns.Template(gl => String.Format("{0:C}", gl.Total)).Title("Total");
})
.Sortable()
.Pageable()
.Filterable()
.Footer(true))
}
else
{
<br />
@:There are no records that match your selected criteria.
}
</fieldset>
Mit dem Wörterbuch Ansatz, ich war in der Lage, um die Spalten korrekt erzeugt mit dem richtigen header-text, aber die Werte für die Spalten (in meinem Test waren es nur 2 Spalten) waren die gleichen. Kann mir jemand helfen mit diesem? Dies scheint eine merkwürdige Frage. Nur versuchen, herauszufinden, wie Sie dies tun richtig.
Update: Hier ist ein Screenshot mit dem Wörterbuch Ansatz, der zeigt das Problem. Die Spaltenüberschriften werden korrekt, aber die Werte sind die gleichen für sowohl die dynamischen Spalten.
InformationsquelleAutor Eric Garrison | 2012-07-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwendung von dynamisch definierten Spalten mit den Telerik grid-control kann schwierig sein. Aber in deinem Fall, es ist vor allem ein typischer Fallstrick der Verschlüsse.
In der folgenden Schleife wird der compiler binden jede Instanz von
gl => gl.Amounts[i - 1]
auf die variablei
und bewerten Sie es später:In der Tat, es ist ausgewertet, nachdem die Schleife beendet wurde. So
i
immer den Wert haben, führen zur Beendigung der Schleife.Der fix ist für die Verwendung einer temporären variable:
Wie verwenden von gl.Mengen[columnIndex] in ClientTemplate. Für mich gibt es Fehler columnIndex nicht definiert
Öffnen Sie bitte eine neue Frage, und fügen Sie Ihren code ein. Es ist schwer zu sagen, warum Sie eine Fehlermeldung erhalten, ohne zu sehen, den code.
InformationsquelleAutor Codo
Ich hatte das gleiche problem, und war googeln viele Stunden herum und habe schon viele versuche von verschiedenen Hilfe-Linien. Aber auch so war es nicht so trivial zu lösen!
Und für, dass Grund und haben auch ein anderes, funktionierendes Beispiel hier, werde ich Ihnen auch meine Lösung!
Informationen: Es funktioniert nur an meinem Platz mit einer IList Modell. Andere Sammlungen hatte auch Probleme verursacht!
Controller:
Modelle:
FieldDefinition
Feld
InformationsquelleAutor florian.isopp
Ich dynamisch binden die Spalten zur Laufzeit mit reflection:
InformationsquelleAutor thepirat000
Hier die Lösung:
)
//Extension-Methode genarate Spalten dynamisch
//Spalteneinstellungen-Klasse
InformationsquelleAutor sajid khan
Habe ich diese einfache Art und Weise. HINWEIS : die folgende Lösung funktioniert in ajax-edit-Modus auch (nicht nur eine nur-lese-raster) :
wenn die ViewModels sind :
public class PriceSheetColumnViewModel
{
public int Id { get; set; }
public string Titel { get; set; }
}
die anzeigen kann wie diese (Teil-Ansicht.cshtml-Datei...) :
und die
PriceSheetCellPrice.cshtml
editor-template-Datei (in shared\editortemplates Ordner) :InformationsquelleAutor Mahmoud Moravej