Wenn Du das Feld Property impelemntierst, kannst Du mit INotifyPropertyChanged bei jeder Änderung darauf reagieren.
Google liefert mit dem suchbegriff xsd to sql foglende Ergebnisse.
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.
@MarsStein
Die kenne ich leider nicht X(
TableRowEventArgs dieses Event ist gemäss Suche auf Google nur im Infragistics Grid vorhanden. Ich beziehe mich auf das Standard GridView von .NET.
Also mein vorgeschlagener Ansatz hat bis jetzt immer funktioniert 😉
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
MyDropDonwListBox.Controls.OfType<TreeView>()
zum suchen verwenden.
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.
Vielleicht hilft Dir Page.Request.Params weiter, was in diesem Artikel (Understanding the JavaScript __doPostBack Function) erklärt wird.
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.
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.
Erstellen einer einfachen ASP.NET-Seite mit mehreren UpdatePanel-Steuerelementen wäre sicherlich ein guter Einstiegspunkt.
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.
Vielleicht hilft Dir das hier ein wenig weiter.
Ich selber vewende zu 80% immer $find, da ich auch schon an Dein Problem gestossen bin. Mittlerweile verwende ich JQuery zum finden der Controls.
.FetchSize, dort kannst Du angeben wieviele Treffer zurück kommen sollen. sowei ich weiss kannst Du mit Hibernate Query Language eingreifen.
Dann frage ich mich aber welche Existenzberechtigung Silverlight noch hat? Müsste man sich aber auch bei Flash fragen...
Dacht ich's mir doch 😃 Freu, Silverlight bleibt auch weiter bestehen 😃
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 😉 )
Auch die UpdatePanels generieren viel Overhead.
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.
Vielleicht die bessere Alternative zur Darstellung ListView WebServerControl.
Gibt zwar mehr Aufwand als der Repeater, ist aber umso mächtiger. Vgl. auch diesen Artikel.
Wenn du ein identisches Objekt brauchst, also 1 zu 1 Copy dann würde ich mal ICloneable anschauen.
Vielleicht findest Du in diesem Learning Guide etwas dass Dir weiterhelfen kann.
Dann wäre es auch schon wenn der Post als gelöst markiert werden würde und man auch an der Lösung teilhaben könnte.
Mach es doch so:
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.
Ergänzend findest Du hier sehr viele gute Beispiele wie das ListViewControl verwendet werden kann.
Alle DataControls von ASP.NET auf einen Blick. Prima Einstiegspunkt.
Also eingentlich nichts anderes als der ModalPopUpExtender des AjaxControlToolkits. Der hat nähmlich Ok und Cancel.
Vielleicht ein guter Einstiegspunkt für Deine Problematik.
- bei jeder Änderung die Seite neu laden muss
- ändern und löschen, aber einfügen über Visual Studios automatisch erzeugte SQL-Befehle (nur in der GridView) nicht möglich ist.
1.) Da ist AJAX notwendig. Vorzugsweise würde ich JQuery verwenden. Bedingt aber relativ viel Programmieraufwand (Kleines Beispiel wie die Zeilenweise Aktualisierung realisiert werden könnte). Wenn Du Dritthersteller Controls verwenden kannst, dann wäre Infragistics sicherlich nicht schlecht.
2.) Die DataSourceControl sind schlecht. Mache das Binding manuell und Du hast keine Probleme bei der Wartbarkeit. Hier ein guter [URL=1. bei jeder Änderung die Seite neu laden muss 2. ändern und löschen, aber einfügen über Visual Studios automatisch erzeugte SQL-Befehle (nur in der GridView) nicht möglich ist.Artikel dazu.
Meinst Du sowas in der Art?
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
</asp:ToolkitScriptManager>
<p>
<asp:Label Text="Wieviele AccordionPanes sollen erstellt werden?" runat="server" />
<asp:TextBox ID="CounterTextBox" runat="server" />
<asp:Button Text="Erstelle AccordionPanes" runat="server" OnClick="Button_OnClick" />
</p>
<div id="AccordionContainer">
<asp:Accordion ID="RootAccordion" runat="server">
</asp:Accordion>
</div>
</asp:Content>
protected void Button_OnClick(object sender, EventArgs e)
{
TextBox CounterTextBox = (TextBox)this.Form.Controls.OfType<ContentPlaceHolder>().ToList().First().Controls.OfType<TextBox>().First();
int anzahl = Int32.Parse(CounterTextBox.Text);
IList<AccordionPane> panes = new List<AccordionPane>();
for (int index = 0; index < anzahl; index++)
{
AccordionPane pane = new AccordionPane();
pane.ID = string.Format(@"AccordionPane_{0}", index.ToString());
pane.HeaderContainer.ID = string.Format(@"AccordionHeader_{0}", index.ToString());
pane.HeaderContainer.Controls.Add(new Image() { AlternateText = "Hier wäre ein Bild der Pane." });
pane.ContentContainer.ID = string.Format(@"AccordionContent_{0}", index.ToString());
pane.ContentContainer.Controls.Add(new Label() { Text = string.Format(@"Ich bin der Inhalt des Accordion Panels {0}", index.ToString()) });
panes.Add(pane);
}
foreach (var accpane in panes)
{
Accordion RootAccordion = (Accordion)this.Form.Controls.OfType<ContentPlaceHolder>().ToList().First().FindControl("RootAccordion");
RootAccordion.Panes.Add(accpane);
//AccordionContainer.Controls.Add(accpane);
}
}
Ist nur Husch-husch zusammengebastelt, hoffe es hilft Dir aber trotzdem weiter.
Vielleicht noch ein Input, trotzdem dass Du es als gelöst "geflagged" hast.
Doppelpost sind nicht so gern gesehen ASP.NET Zone
Eine dritte Variante wäre, in dem Control in welchem der Text angezeigt wird, dass Du cleintseitig mit JavaScript zuerst
overflow="hidden"
machst und wenn ein Klick darauf geschieht den overflow wieder zulässt.
Als Beispiel (Ist VS2010 und daher JQuery-Syntax)
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
CodeBehind="Default.aspx.cs" Inherits="ASP.NET.LangenTextperKlickeinUndAusklappen._Default" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
<script type="text/javascript" language="javascript" src="Scripts/jquery-1.4.1-vsdoc.js" ></script>
<script type="text/javascript">
$(document).ready(function () {
$("#Header").click(function () {
var headerBefore = $("#Header");
$("#Header").css("width", "auto");
$("#Header").css("height", "auto");
$("#Header").css("background-color", "Yellow");
});
});
</script>
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>
Welcome to ASP.NET!
</h2>
<div id="NewsContent" style="width:auto; height:auto; overflow:hidden;">
<div id="Header" style="width:50px; height:15px; overflow:hidden; border:2px; border-bottom-style:groove;">Dies ist ein öffentlicher oder freigegebener Computer</div>
<br />
<div id="Content" style="width:auto; height:auto;">
Ok. Super. Werde ich morgen noch machen...
Ich habe vorhin (um ca. 20.00 uhr) noch schnell darauf geschaut. Diagramm eins (Aufg.a) finde ich ok. Bei B&C musst du mehr oder weniger nur die 2 Buchungen (objekte) reinzeichnen. Sonst sahen die ok aus! Also näm z'lang...
Ha geng no kes UML Buech ufta... I maag eifach nid ;-)
Hilbä!
</div>
</div>
</asp:Content>
Wenn man dann auf das entsprechende Div klickt wirds gelb und der ganze Inhalt wird sichtbar. Bei einem weiteren Klick passiert noch nichts. (Quick and dirty)
Zur Komplettheit: INotifyPropertyChanged-Schnittstelle
Oder Du kann den DatePicker von JQuery verwenden.
Um das richtig zu verstehen:
Dann müsstest Du zuerst diese Suchen Page. FindControl("ControlName"). Achtung Verschachtelung der Controls beachten.
Meistens über den Mittag 3x die Woche Kraftsport, viel mit der Familie unterwegs und mit dem Rad zur Arbeit.
Ich mache es immer so dass ich das Control, welches ich verändern will, bei der statischen WebMethode mitgebe und dann im Resultat auch speichere. So kann ich dann im OnSucceded des Ajax Auftrufs mit
$('clientIddesUserControls')
holen und gleich mit dem Resultat manipulieren.
hm...aber sonstige Funktionen kann ich aufrufen, oder?
Geht nämlich irgendwie auch nicht...
Nein leider nicht, dass ist der Nachteil von statischen WebMethoden.
Am besten rufst Du per JQuery eine solche Methode auf und baust Dir dann die Controls dynamisch mit JTemplates auf.
EDIT: Sowas in der Art hier.
Wenn ich jetzt noch auf die Controls in der zugehörigen aspx Seite zugreifen könnte wäüre ich glücklich. 👶
Ist leider nicht möglich, da es eine statische Methode ist.
Ist zwar in ASP.NET, aber vielleicht ein kleiner Input wie das MVP-Pattern umgesetzt werden kann, denke aber das kann man auch in Windows Forms einbringen.
Hallo schuppsl,
Du liegst nur halb daneben: um Ajax kommst Du nicht drumherum, um das UpdatePanel schon.
Das UpdatePanel hat den Nachteil, daß der Lifecycle der Seite (inklusive Page_Load) ausgeführt wird. Das willst Du ja eben verhindern. Deshalb der Hinweis von schaedld auf WebMethodAttribute und EnablePageMethods, damit geht's auch ohne Page_Load. Sieh Dir mal die Doku zu den fett markierten Begriffen an.Gruß, MarsStein
Danke @MarsStein für den Hinweis, vielleicht habe ich mich auch unglücklich ausgedrückt...
Also mir ist überhaupt nicht klar, was dieser Blogeintrag mit meinem Problem zu tun haben könnte...
- Soll er Dir zeigen dass es auch ohne Postback geht
- Ohne UpdatePanel und daher die Seite schlanker ist
- Das der Timer auch selber implementiert werden kann
Eventuell findest Du hier mit was Du etwas anfangen kannst.
Eigentlich brauchst Du analog Facebook folgendes:
Das Ganze könntest Du ja so gestalten und wenn der Benutzer der den Link erhalten hat bereits in der DB zu diesem Event eine Antwort gegeben hat, dann ist es für ihn nicht mehr möglich an diesem Event teil zu nehmen.
Vielleicht findest Du was bei DotNetNuke oder Mojoportal.