Ich will mich da jetzt nicht in die Nesseln setzen, aber für mich wären solche Sachen die Du da machen möchtest in der VIEW oben.
Das MVVM Pattern sieht ja vor die UI mit dem Rest mittels Vermittler (ViewModel) zusammen zubringen ohne dass diese von einander was wissen.
Canvas etc. sehe ich nicht als Bestandteil, dass man im MVVM verwenden sollte hierfür müsstest Du dir ja entsprechende UserControls machen und auch die Styles dementsprechend dort oder in einem ResourceDictionary definieren.
Wenn ich ein Control suchen will, dass in einem Template vorhanden ist, dann mache ich dass im OnRowDataBound. Dort kannst Du mit
foreach(var cell in e.row.cells){
Control myControl = (Control)cell.FindControl("MyControl");
}
Danach suchen.
Wichtig ist, dass Du am Anfang überprüfst ob die Row eine Header oder eine DataRow ist. Wenn das Control in keiner Header-Row vorhanden ist, dann hast Du die NULL-Reference Exception darum prüfe ich immer so:
if (e.Row.RowType == DataControlRowType.DataRow){
foreach (DataControlFieldCell cell in e.Row.Cells.OfType<DataControlFieldCell>().ToList())
{
if (cell.Controls.OfType<CheckBox>().FirstOrDefault<CheckBox>() != null && cell.Controls.OfType<CheckBox>().FirstOrDefault<CheckBox>().ID.Contains("SmartCardExpress"))
{
smartcardexpress = cell.Controls.OfType<CheckBox>().FirstOrDefault<CheckBox>();
}
if (cell.Controls.OfType<CheckBox>().FirstOrDefault<CheckBox>() != null && cell.Controls.OfType<CheckBox>().FirstOrDefault<CheckBox>().ID.Contains("PermanentService"))
{
permanentservice = cell.Controls.OfType<CheckBox>().FirstOrDefault<CheckBox>();
}
}
}
So funktionierts bei mir eigentlich immer. Und wenn Du die DropDownListBox gefunden hast, kannst Du dort wiederum
Das sieht so aus wie MarsStein vermutet. Es sind wohl zuwenige Einträge vorhanden als dass die Button's aktiviert werden. Vielleicht noch schnell hier (ListView Web Server Control Overview) vergleichen, soweit ich gesehen habe, wird dort Schritt-für-Schritt eine Einführung ins ListView gegeben.
Das DataPaging ist etwa in der Mitte der Seite erklärt.
UpdatePanels können auch Controls erhalten und das würde dann so aussehen:
UpdatePanel childPanel = new ChildPanel();
MyParentPanel.Controls.Add(childPanel);
Soweit ich dann aber weiss muss der Update Mode auf Conditional stehen, wenn Aktionen vom Codebehind her kommen.
Zitat
Gibt es eine Möglichkeit das eleganter zu Lösen um unnötige Ladezeit zu verkürzen und den Traffic zum Datenbankserver zu minimieren?
Gibt es, aber Performananz und Seitensource-Quelltext werden mit MS-Ajax immer grösser. Alternativ würde ich Dir raten JQuery und JQueryTemplates anzuschauen.
Wenn Du sowas wie Page_Load() etc nutzen willst, bist Du mit MVC nicht richtig bedient.
Würde ich jetzt auch meinen. Du hast immer nur den Controller /View /Model zur Verfügung und machst alle Logik im Controller und die "Controls" werden mithilfe des InlineCode in der ASPX mit dem HtmlHelper generiert /erstellt.
Wenn Du ein Grid in MVC brauchen willst, musst Du mit MVC 3 arbeiten. Dort haben sie die neue Razor-Engine (glaub ich sie heisst so) implementiert, dass per Templating ein Grid herstellt. Hier ein Einstiegspunkt.
Ich würde mal behaupten dass dass beim Trim das String-Objekt noch gar nicht vorhanden ist. Darum würde ich vorher mit string.IsNullOrEmpty überprüfen ob überhaupt was daher kommt.
Bis der Standard HTML5 etabliert und vollständig bei den Browserherstellern implementiert ist gehen noch Jahre vorbei, dann reden wir ob Silverlight 8 oder 9 noch eine Rolle neben Flash und HTML5 spielt...
Der Overhead entsteht aber hauptsächlich in Richtung Server -> Client beim de rAntwort, und nicht im Request, da für den ScriptManager und die UpdatePanels jede Mange Script-Code generiert werden muss.
Und genau das ist ja das Problem (ich dachte ich hät's erwähnt )
Meine Frage: Gibt es irgendwelche Nachteile (Performance?), wenn ich so "viele kleine" UpdatePanels erzeuge?
Gibt es. Das AjaxControlToolkit generiert sehr viele Scripts, die sehr gross sein können. Aus diesem Grund würde ich so ausgrauen etc. mittels JQuery realisieren. Ist performanter und bläht den Seitenquelltext nicht so auf.
Ich habe mal einen Vergleich mit einem TabPanel vom AjaxControlToolkit gemacht und dasselbe in grün mit JQuery. Der Seitensource steigt exponentiell zu jedem Control dass Du vom AjaxControlToolkit verwendest.
1.) Wenn OK geklickt wird, dann geht ein asynchroner Call an die Codebehind
2.) In der codebehind wird gewerkelt
3.) Wenn alles i.O ist hat jede PageMethod einen onSucced und einen onError Handler (Funktion) in welchen Du reagieren kannst
4.) Wenn alles i.O. ist und ein Postback geschehen soll, kann Du den PageRequestManager anweisen einen Postback zu machen.
5.) Versehe alle Buttons mit einem
return false;
Nachfolgend mache ich in etwa was ähnlliches.
//Function to to printermodel change when in the appropriate
//modalpopupextender the ok button was clicked
function OnReplacePrinterModel(args) {
var gridView = document.getElementById(args.split('/')[0]);
var netBiosName = args.split('/')[1];
var selectedRow = null;
var hiddenField = null;
for (var index = 0; index ≤ gridView.rows.length; index++) {
if (gridView.rows[index] != null) {
if (gridView.rows[index].style.backgroundColor.search('#ffffcf') != -1) {
selectedRow = gridView.rows[index];
break;
}
}
}
hiddenField = $('input', selectedRow);
var articleId = hiddenField[0].value;
PageMethods.ReplacePrinterModel(netBiosName, articleId, OnSuccededReplacePrinterModel, OnErrorReplacePrinterModel);
ShowPopUp('ProgressModalPopUpExtender');
}
function OnSuccededReplacePrinterModel(result, usercontext, methodname) {
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm._doPostBack();
}
Dennoch weiß ich nicht genau: Kann ich mit ajax auch einfügen oder nur auslesen?
AJAX beschreibt auch nur die asynchrone Weise wie man Daten holt und schreibt. Das schreiben und lesen geschieht immer noch im Code-behind, es passiert aber kein Postback.