Laden...
M
Maliko myCSharp.de - Member
Fachinformatiker Anwendungsentwicklung Dabei seit 19.02.2012 117 Beiträge
Benutzerbeschreibung

Forenbeiträge von Maliko Ingesamt 117 Beiträge

14.01.2023 - 11:05 Uhr

Moin,

ich bin inzwischen relativ lange aus C# raus. Das letzte mal dass ich aktive C#-Entwicklung betrieben habe (abgesehen von ein wenig ASPxWebforms, was aber auch alte Technologie ist) war .net 4.5 aktuell gewesen (bin 2015 zu PHP gewechselt und inzwischen hauptsächlich im Java und Delphi-Umfeld unterwegs). Von daher bin ich definitiv nicht mehr auf dem Laufenden was aktuelle Technologien angeht. Ich wollte jetzt mal ein neues Projekt anfangen und dieses Modular aufbauen. Früher hat man für sowas dann auf MAF bzw. MEF zurückgegriffen. Wie sieht es heute aus? Was verwendet man heute für Modulare Programmierung unter WPF (werde ich auch das erste mal dann benutzen).

Und wo ich gerade schon mal hier bin, wie sieht es mit OR-Mappern aus? Ist das Entity Framework immer noch State of the Art oder gibt es dafür auch bereits einen Nachfolger, der inzwischen genutzt wird?

Würde mich freuen wenn ihr mir da ein paar kleine Tipps geben könntet, was heutzutage unter .Net 6/7 genutzt wird und modulare Anwendungen mit Datenbankanbindung umzusetzen (als Datenbank wird PostgreSQL genutzt).

Vielen Dank schon mal im Voraus.

Viele Grüße
Maliko

17.10.2022 - 13:19 Uhr

Jup. Das ist uns hier im Büro auch gerade aufgefallen. Wir lassens also einfach sein und melden den Benutzer einfach nur bei uns ab.

17.10.2022 - 12:18 Uhr

Ja, das sieht man sofort anhand von HttpContext.Current.GetOwinContext() - verursacht innerliche Schmerzen 😉

Ich würde wirklich gerne das Ding neu machen. Doch jedes mal wenn ich versuche das meinem Vorgesetzen zu erklären, heißt es immer, da haben wir keine Zeit für, machen wir nicht.

In der ASP.NET Core Pipeline würde man das in den Notification Handlern beim RedirectProvider konfigurieren; wie das beim uralten Owin Zeug geht weiß ich nicht; aber hast wenigstens ne Idee nach was Du suchen musst.

Uff. Ich schau mal ob ich da was entsprechendes Finde. Habs mit dem Login ja auch hinbekommen.

PS: damit loggt sich der User jedoch nur beim Anbieter aus, nicht bei euch in der App (by design, weil Token nur zeitlich ablaufen und nie "abgemeldet" werden können).

Das ist mir bewusst. Der Login von unserer Seite aus (sprich killen der Session und ähnliches) ist bereits fertig und funktioniert auch. Ich kann nur momentan den Login nicht an den Anbieter weiterleiten, der ja denke ich auch gerne wissen möchte, dass der User sich ausgeloggt hat.

17.10.2022 - 11:12 Uhr

Huhu,

ich hab da ein kleines Problem. Und zwar bin ich gerade dabei von einer unserer Seiten den Login auf OIDC umzustellen. Dafür habe ich mich an folgendes Tutorial gehalten:

Tutorial: Erstellen einer ASP.NET-Web-App, die Microsoft Identity Platform für die Authentifizierung verwendet - Microsoft Entra

Ich habe die Credentials an den Keycloakserver von unserem Anbieter angepasst und der Login funktioniert auch einwandfrei, jedoch der Logout funktioniert dann nicht mehr. Sobald ich den Logoutbefehl sende, bekomme ich folgende Fehlermeldung:

Fehlermeldung:
Es ist ein Fehler aufgetreten
Fehlender Parameter: id_token_hint

Diese Fehlermeldung steht dann direkt auf der Seite vom Anbieter wo der Logout stattfinden soll. Ich kann damit leider überhaupt nix anfangen was das überhaupt für ein Parameter ist den er da haben will, geschweige denn wie man ihn übergibt. Hier noch der Logoutcode den ich verwende:


HttpContext.Current.GetOwinContext().Authentication.SignOut(
    OpenIdConnectAuthenticationDefaults.AuthenticationType,
    CookieAuthenticationDefaults.AuthenticationType);

Und hier vorsichtshalber auch der Login-Code (der Problemlos funktioniert):


ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

HttpContext.Current.GetOwinContext().Authentication.Challenge(
    new AuthenticationProperties { RedirectUri = "http://localhost:44361/Pages/SSOLogin.aspx" },
        OpenIdConnectAuthenticationDefaults.AuthenticationType);

Könnt ihr mir da vielleicht weiterhelfen? Oder liegt der Fehler vielleicht gar nicht an meinem Code sondern auf der Seite des Anbieters?

Vielen Dank schon einmal im Voraus.

Viele Grüße
Maliko

PS: Unsere Seite basiert auf WebForms nicht auf ASPC.Net Core MVC.

16.03.2022 - 13:43 Uhr

Moin,

ich bin was C# angeht von den Kenntnissen leider sehr sehr veraltet, da ich seit 2014 fast gar nicht mehr mit C# (nur noch ein bisschen ASPX) arbeite und auch vorher nur WinForms gemacht habe. Das Thema WPF ist für mich ein absolutes Buch mit 7 Siegeln und das würde ich gerne einmal ändern.

Daher bin ich auf der Suche nach einem guten Buch / Kurs / Tutorial mit welchem ich WPF von Grund auf lernen kann. Was ich bereits gefunden habe sind einige Kapitel im C#-Buch von Rheinwerk, doch die kostenlose Variante ist auf dem Stand von Visual Studio 2012 und von daher gibt es mit Sicherheit aktuelleres. Die Aktuelle Ausgabe des Buches möchte ich mir bei dem Preis 50 Euro aber auch nicht kaufen, wenn es vielleicht bessere Werke zu dem Thema gibt (die idealerweise auch etwas weniger kosten).

Daher wollte ich mal fragen, ob jemand von euch für mich nen Tipp hat, was ich mir da mal zulegen sollte. Wichtig ist mir dass wenn es ein Buch ist, dass es ein EBook ist (idealerweise sogar wie die Rheinwerk-Onlinebücher im HTML Format), so dass ich bequem auch mal nach Schlagworten suchen kann. Am liebsten wäre mir aber tatsächlich ein Videokurs (Linkedin-Learning hat leider keine für WPF, wenn ich WPF eingebe, bekomme ich immer nur irgendwelche Was ist neu Videos angezeigt).

Natürlich muss das ganze nicht kostenlos sein, allerdings bin ich auch nicht bereit mehr als 50 - 60 Euro auszugeben, da ich das für mich selbst mache und das ganze so aus privater Tasche selbst zahlen muss.

Vielen Dank schon einmal im Voraus.

Viele Grüße
Maliko

16.02.2022 - 09:35 Uhr

Das erste mal C# ist bei mir inzwischen auch 10 Jahre her (damals in der Berufsschule) und es war dann bis 2014 auch meine Primäre Programmiersprache. Danach bin ich dann ins PHP-Umfeld gewechselt und arbeite jetzt seit 3 Jahren wieder in sehr kleinem Rahmen mit C# (um genau zu sein das alte ASPX). Meine Primäre Programmiersprache ist inzwischen aber Delphi, da dies die Programmiersprache ist, in welcher bei uns im Unternehmen hauptsächlich gearbeitet wird.

29.11.2021 - 11:20 Uhr

Es war in der Tat recht einfach. Der größte Aufwand insgesamt war das Kopieren der Sourcen aus dem alten in das neue Projekt. Anschließend musste ich nur noch ein paar kleine Änderungen vornehmen, da das Settings-Konzept aus .Net-Framework in .NET nicht existiert (Settings.Default). Aber ansonsten war es überhaupt kein Problem. War halt pure Fleißarbeit (hätte meines erachtens sogar bis auf die paar Anpassungen im Code selbst sogar ein Praktikant hinbekommen müssen).

23.11.2021 - 21:51 Uhr

Ah. Das erklärt natürlich einiges. Na dann versuche ich mal das ganze zu migrieren.

23.11.2021 - 21:37 Uhr

Huhu,

ich hab da ein kleines Problem. Und zwar habe ich ein Projekt welches noch das .Net-Framework 4.7.2 verwendet. Jetzt benötige ich aber eine Funktion die es erst ab .Net 5 gibt. Daher habe ich mir jetzt die aktuellste Version des .Net-Frameworks geholt und wollte in den Projekteinstellungen das Upgrade vornehmen (Es gibt keine Nuget-Pakete). Allerdings steht mir in der Auswahl nur maximal 4.8 zur Verfügung. Wenn ich allerdings ein neues Projekt erstelle, kann ich 6.0 problemlos auswählen.

Kann mir vielleicht irgendjemand sagen, wie ich das Projekt upgegradet bekomme, ohne dass ich das Projekt wegschmeißen muss? Es handelt sich um ein WinForms-Projekt (ich hasse dieses XML-Geschreibsel von WPF und mags bei UI lieber klickibunti).

12.10.2021 - 14:55 Uhr

Deine Lösung hätte mir in diesem Fall nix gebracht, da sich die DataSources ja in den ASPX-Dateien befunden haben. Im Code-Behind mache ich es genauso wie du auch gesagt hast. Da erstelle ich direkt eine Connection. Nur funktioniert die halt nicht im "Frondend". Da muss man mit der Factory arbeiten (zumindest wenn ich das jetzt richtig verstanden habe). Und das eintragen der Factory in der web.config hat ja auch die Lösung gebracht. Jetzt läuft das System fast einwandfrei. Ich muss lediglich noch ein paar letzte Querys umschreiben, welche mit Postgresql nicht kompatibel sind (sprich aus getdate() current_date machen und sowas).

EDIT: Falls übrigens sonst noch mal jemand über das Problem stolpert. Folgendes Snippet muss in die web.config:


<system.data>
  <DbProviderFactories>
    <add name="Npgsql Data Provider" invariant="Npgsql" description=".Net Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"/>
  </DbProviderFactories>
</system.data>

Quelle: Installation | Npgsql Documentation

12.10.2021 - 11:09 Uhr

Jup. Die Anwendung ist knapp 15 Jahre alt. Da es aber halt nur ne einfache Informationsplattform ist, bekomme ich auch keine Kapazitäten dafür das Ding komplett neu zu machen (vor allem da ASP auch nicht mein Spezialgebiet ist). Über die eingedeutschten Fehlermeldungen bin ich regelmäßig am Fluchen, leider ist das ein Firmenrechner, auf dem halt alles vorinstalliert war. Das mit der Providerfactory werd ich mal ausprobieren.

Tatsächlich hab ich bisher gar keine Anleitung für den Provider gefunden. Hab halt geschaut welchen Provider ich über Nuget registrieren muss und habs dann einfach durch ausprobieren umgesetzt. Hat bisher auch sehr gut geklappt. Nur an dieser Stelle bin ich dann leider hängen geblieben.

Ich probier das jetzt mal über die ProviderFactory und melde mich dann noch mal obs funktioniert hat oder nicht.

EDIT: Scheint funktioniert zu haben. Zumindest bekomme ich jetzt ne PostgresException, dass ich nen Syntaxfehler habe (was wie im Startpost schon geschrieben habe daran liegt, dass ich die Queries selbst noch nicht angepasst habe.

12.10.2021 - 10:44 Uhr

Hey,

ich bin gerade dabei unser "Intranet" (eigentlich ist es nur eine kleine Webseite wo News stehen und man sich für Veranstaltungen anmelden kann) von MSSQL auf Postgresql umzustellen (wir ziehen gerade sämtliche Projekte auf ein einheitliches Datenbanksystem, vorher hatten wir Postgresql, MSSQL und MySQl) und stoße dabei ein ein sehr merkwürdiges Problem

Wenn ich ganz normal über die Code-Behind-Datei versuche eine Datenbankabfrage zu machen funktioniert alles einwandfrei. Ich kann die Daten abrufen und bekomme auch ein ergebnis. Versuche ich das aber über die ASPX-Seite mittels einer SQLDataSource dann bekomme ich folgende Fehlermeldung:

Fehlermeldung:
[ArgumentException: Der angeforderte .Net Framework-Datenprovider kann nicht gefunden werden. Er ist ggf. nicht installiert.]
System.Data.Common.DbProviderFactories.GetFactory(String providerInvariantName) +157
System.Web.UI.WebControls.SqlDataSource.GetDbProviderFactory() +66
System.Web.UI.WebControls.SqlDataSource.GetDbProviderFactorySecure() +22
System.Web.UI.WebControls.SqlDataSource.CreateConnection(String connectionString) +12
System.Web.UI.WebControls.SqlDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) +95
System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +17
DevExpress.Web.Internal.DataHelper.PerformSelect() +203
DevExpress.Web.Internal.GridDataHelper.PerformSelect() +285
DevExpress.Web.Internal.DataContainer.PerformSelect() +136
DevExpress.Web.ASPxDataWebControlBase.DataBindCore() +13
DevExpress.Web.ASPxDataWebControlBase.DataBindInternal() +109
DevExpress.Web.ASPxWebControl.DataBind() +37
DevExpress.Web.Internal.DataHelperBase.EnsureDataBound(Boolean ensureChildControls) +59
DevExpress.Web.Internal.DataContainer.EnsureDataBound() +142
DevExpress.Web.ASPxDataWebControlBase.OnPreRender(EventArgs e) +22
System.Web.UI.Control.PreRenderRecursiveInternal() +166
System.Web.UI.Control.PreRenderRecursiveInternal() +236
System.Web.UI.Control.PreRenderRecursiveInternal() +236
System.Web.UI.Control.PreRenderRecursiveInternal() +236
System.Web.UI.Control.PreRenderRecursiveInternal() +236
System.Web.UI.Control.PreRenderRecursiveInternal() +236
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4712

In der web.config ist der Server aber korrekt hinterlegt (wie schon gesagt, über die Code-Behind funktioniert es auch). Habe ich irgendwie noch ein Assambly vergessen, welches ich über Nuget installieren muss, bzw. muss ich in der Web.config noch irgendwas zusätzlich konfigurieren?

Derzeit habe ich als Verbindung zur Datenbank lediglich folgendes in der Web.config stehen:


<connectionStrings>
    <add name="MainConnectionString" connectionString="Server=127.0.0.1;Port=5432;Database=Intranet;User Id=Intranet;Password=XXX" providerName="Npgsql" />
</connectionStrings>

Als Konfiguration der DataSource benutze ich folgenden Code:


<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:MainConnectionString %>" ProviderName="<%$ ConnectionStrings:MainConnectionString.ProviderName %>" DeleteCommand="query" InsertCommand="query" SelectCommand="query" UpdateCommand="query">
    [. .. Diverse Parameter ... ]                                   
</asp:SqlDataSource>

Nicht wundern, dass bei den Commands nur query steht, die wirklichen Querys habe ich rausgenommen, damit das ganze etwas übersichtlicher wird (vor allem funktionieren die auch gar nicht, da die noch nicht auf postgres umgeschrieben wurden.

Kann mir da wohl vielleicht irgendjemand bei meinem Problem weiterhelfen? Mir fällt nämlich so langsam nix mehr ein.

03.06.2021 - 12:45 Uhr

Was auch ganz Praktisch wäre, wäre eine Möglichkeit PMs direkt in der Übersicht löschen zu können (gerne auch mehrere auf einmal). Momentan muss man bei jeder PM erst mal in die PM rein um sie zu löschen (es sei denn ich bin Blind und hab die Funktion nicht gefunden).

03.06.2021 - 08:10 Uhr

Jup. Viele Chefs kapieren es leider nicht dass es auch nachteile hat bestehende Systeme nicht zu modernisieren. Ich hätte das Portal gerne komplett neu gemacht, allerdings bekomme ich dafür nicht die Zeit. Chef ist der Meinung es läuft doch und das reicht. Da kann man auch nicht mit ihm drüber reden. Und zum Thema überholt. Die Hauptsoftware die von meinen Kollegen und mir Entwckelt wird (reine Inhouseapplication) ist knapp 20 Jahre alt und basierte bis Mitte letzten Jahres noch auf Delphi 7.

02.06.2021 - 14:00 Uhr

Ahhhh. Danke dir. Das kommt davon wenn man sich ASP selbst neben der eigentlichen Arbeit beibringt. Da fehlen einem dann solche Kenntnisse.

PS: es war auch bei WebForms noch nie eine gute Idee die Session als Store für Data aus der UserAuthentication zu missbrauchen 😉

EDIT: Sag das meinem Vorgänger. Ich darf mich damit jetzt nur rumärgern, seit der gekündigt hat.

02.06.2021 - 11:37 Uhr

Moin,

ich hab da ein kleines Problem. Und zwar habe ich eine relativ alte ASPX-Webseite, welche ich betreuen muss (zum Neumachen fehlt leider die Zeit). Ich bekomme dabei immer mal wieder folgende Exception in meinen Fehlerlog rein:

Fehlermeldung:
System.ApplicationException: Response.Redirect kann in einem Page-Rückruf nicht aufgerufen werden.
bei System.Web.HttpResponse.Redirect(String url, Boolean endResponse, Boolean permanent)
bei System.Web.HttpResponse.Redirect(String url)
bei Namespace.Klasse.Page_Load(Object sender, EventArgs e) in C:\Pfad\Klasse.aspx.cs:Zeile 39.
bei System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
bei System.Web.UI.Control.OnLoad(EventArgs e)
bei System.Web.UI.Control.LoadRecursive()
bei System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Bei der entsprechenden Zeile handelt es sich um einen Redirect auf die Login-Seite, wenn die Session des Benutzers abgelaufen ist. Leider passiert es immer mal wieder das der Benutzer sehr lange auf der Seite bleibt und dann versucht mit abgelaufener Session eine Funktion aufzurufen, welche einen Postback macht. Da tritt dann diese Fehlermeldung auf. Ich habe es sowohl mit Response.Redirect als auch mit Server.Transfer versucht, bei beiden kommt die Fehlermeldung.

Hier auch mal eben die Zeilen 37 - 40:


if (Session["userid"] == null)
{
    Response.Redirect("Default.aspx");
}

Hat jemand von euch einen Rat für mich wie ich den User auch bei einem Postback auf die Loginseite schicken kann?

Danke schon mal im Vorraus.

Viele Grüße
Maliko

22.09.2020 - 08:57 Uhr

Moin,

nope wir sind nicht auf Azure und das wird unsere Geschäftsleitung auch nicht zulassen. Wir verwenden außer für diese eine Application überhaupt keine Microsoft-Assoziierten Sprachen oder Dienste die nicht von uns selbst gehostet werden.

Von daher kommt die Keyvault sowieso nicht in Frage. Bei der Application handelt es sich lediglich um unsere Kundenportale (für jede Firma des Konzerns eines). Alleine dadurch wäre eine eigene API schreiben mit Kanonen auf Spatzen zu schießen. Wir haben unser eigenes Rechenzentrum und die Server stehen direkt nebeneinander. Sprich die Latenzen sind so gering, dass die zusätzlichen Datenbankzugriffe keine wirkliche Auswirkung haben werden.

Nur um mal eben für klarheit zu schaffen.

21.09.2020 - 11:44 Uhr

Hört sich nicht gerade nach einem ordentlichen Entwicklungsprozess an, wenn ihr quasi so eine Änderung ohne Update (und daher ohne Quellcodeverwaltungsystem?) hinbekommt 😉

Ich glaub da hast du mich falsch verstanden. Natürlich muss ich die Änderung mit einem Update machen. Es geht nur darum dass die Datenbankverbindungen jederzeit ohne Update geändert werden können müssen (sprich ein Austauschen der Connectionstrings). Natürlich arbeiten wir mit Versionierung (SVN).

21.09.2020 - 11:28 Uhr

Würde man so in PHP auch niemals tun.

Da gebe ich dir absolut recht. Ich werd das ganze jetzt auch vernünftig umbauen. Eine statische Verwaltung will unser PO nicht, aber wir handeln dass jetzt über eine zentrale Datenbank auf die immer zugegriffen wird, welche dann den ensprechenden Connectionstring zurückgibt. Ist zwar auch nicht optimal, aber die einzige Lösung die mir einfällt OnTheFly die Zugangsdaten der Datenbankserver ändern zu können ohne die Application an sich zu updaten.

21.09.2020 - 08:18 Uhr

Der Connection String kann dynamisch sein, wenn man die Datentrennung pro User / Tenant auf physikalischer Ebene umsetzt. Da hilft einem die Config nicht.

Das ist in diesem Fall auch so. Wir haben eine Application die je nachdem welche Domain aufgerufen wird einen anderen Datenbankserver aufruft. Von daher bringt uns die Config nichts.

Sicher ist jedoch, dass die Art und Weise nur krachen kann und ein grober Programmierfehler ist:
Sessions sind kein statischer Speicher sondern laufen aus. Sie also für ein statisches Feld zu nutzen ist ein richtig dicker Patzer.
nur eine Frage der Zeit, bis die Session hier Null ist und damit bei einem Zugriff eine NullReferenceException geworfen wird..

Und das ist das merkwürdige. Die Session wird automatisch auf der Loginseite gefüllt. Sprich auf der Seite auf der man zuvor war. Sprich die befüllung ist nicht mal eine Minute vorher. Liegt das daran dass Sessions in ASP.Net unzuverlässiger sind als in PHP? Weil anders kann ich es mir nicht vorstellen, dass ein und der selbe Code nach dem Neustarten der Application wieder funktioniert.

Aber ja, dann werde ich wohl mal die Zeit investieren müssen und das System komplett umbauen (ich hoffe dass ich sie bekomme). Das ist leider etwas dass sich durch die komplette Application zieht und von meinem Vorgänger so implementiert wurde. Hoffen wir mal dass ich das Zeitkontingent dafür bekomme.

17.09.2020 - 08:29 Uhr

Moin,

es hat leider bis heute gedauert bis die Seite mal wieder komplett abgeschmiert ist und jetzt habe ich auch endlich eine vernünftige Fehlermeldung über den Server bekommen. Nur wirklich weiter bringt diese mich nicht.

Die Meldung lautet: > Fehlermeldung:

[NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.]

Die Codezeile die mir dabei angezeigt wird ist folgende:

public static string connetionStringtestdb = System.Web.HttpContext.Current.Session["connectionstring1"].ToString();

Die Session wird direkt beim Betreten der Seite gesetzt und funktioniert auch. Auf der Hauptseite bekomme ich nämlich keine Fehler obwohl er sachen aus der Datenbank ausliest.

Der Fehler tritt erst nach dem Login auf. Nachdem ich jetzt den Applicationpool neugestartet habe funktioniert es auch wieder. Ich bin da gerade etwas ratlos woran das liegen kann (vor allem da ich wie schon gesagt das Projekt auch nur zwangsweise übernommen habe).

11.09.2020 - 08:37 Uhr

Moin,

ich hoffe hier kann mir jemand weiterhelfen. Meine ASP-Kenntnisse sind nur rudimentär und reichen gerade mal dazu aus unsere Seite weiterzuentwickeln (ich bin zu der Aufgabe wie die Jungfrau zum Kinde gekommen, da der Kollege, der das Ding ursprünglich entwickelt hat gekündigt hat und ich der einzige bin, der zumindest in der Ausbildung mal mit ASP in Berührung gekommen ist).

Und zwar habe ich momentan das Problem dass ständig die Webseite komplett abschmiert. Sprich die Seite kann noch aufgerufen werden, doch sobald man versucht sich einzuloggen landet man auf der Fehlerseite weil irgendeine Exception geworfen wird, ich weiß aber nicht welche, da das Problem bei mir local nicht auftritt und die Exceptions vom Server unterdrückt werden.

Das einzige was dann noch hilft ist den kompletten Applicationpool einmal neu zu starten. Hat vielleicht irgendjemand von euch eine Ahnung woran das liegen könnte? Weil ich hab davon nicht die geringste Ahnung und weiß nicht einmal wonach ich da suchen muss. Wenn jemand von euch ein paar Tipps hat, wonach ich mal schauen könnte um das Problem zu lokalisieren wäre ich euch schon sehr dankbar.

Wie schon gesagt, ich hab seit fast 10 Jahren kein ASP mehr wirklich gemacht und stümper hier momentan nur rum um das Ding überhaupt betreuen zu können. Ich bin inzwischen eigendlich eher im Bereich Java und Delphi aktiv. Von daher würde ich mich über ein paar Tipps sehr freuen.

08.01.2015 - 11:31 Uhr

OK, Fehler ist behoben. Die Antwort ist ganz einfach. Meine Projektmappe beinhaltet 4 Projekte. Das Assembly habe ich in das Projekt eingebunden, welche das Assembly nutzt. Allerdings da es sich um ein Erweiterungs-Assembly handelt muss dieses auch noch in das Projekt eingebunden werden, welches als Startprojekt angegeben ist. Solange das nicht passiert, crasht das System.

08.01.2015 - 10:59 Uhr

Lokale Kopie steht per Default beim Projekt auf True. Ich habs aber auch schon versucht abzuschalten, bringt aber auch nichts. Der Pfad, auf den die Assembly verweist ist folgender:

C:\Program Files (x86)\Microsoft SDKs\Expression\Blend.NETFramework\v4.0\Libraries\System.Windows.Interactivity.dll

08.01.2015 - 09:57 Uhr

Hoi,

ich hab gerade ein etwas merkwürdiges Problem. Ich versuche momentan gerade ein Event auf ein Command umzuleiten um das Event im ViewModel behandeln zu können. Darum habe ich das Assembly System.Windows.Interactivity im Projekt eingebunden und im XAML den entsprechenden Namespace angelegt.

Er kann im Designer die Assembly auch finden und zeigt mir auch die entsprechende Intillisence an. Wenn ich jetzt aber versuche das Projekt zu starten, bekomme ich folgende Fehlermeldung:

Fehlermeldung:
Die Datei oder Assembly "System.Windows.Interactivity, PublicKeyToken=31bf3856ad364e35" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.

Die Assembly ist allerdings im Projekt referenziert (hab nachgeschaut) und im XAML hab ich sie wie folgt eingebunden:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

Das hier ist der Code, welchen ich für die Umleitung verwende:


<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <i:InvokeCommandAction Command="{Binding Path=InitAnlagenzuordnung}" CommandParameter="{Binding Path=SelectedLeistungserbringer}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

Ich steh hier gerade etwas auf dem Schlauch, da das nur passiert wenn ich versuche das Projekt zu starten. Wenn ich die Projektmappe komplett neu erstellen lasse, bekomme ich keine Fehler angezeigt. Der Fehler wird mir auch nicht im Fehlerbereich von Visual Studio angezeigt sondern nur sobald ich versuche das Projekt zu starten.

Jemand eine Idee was da los sein könnte?

Lg
Maliko

06.01.2015 - 12:02 Uhr

Die Fliegt auch noch raus. Ist momentan nur ne Übergangslösung, da die Daten derzeit noch über die ObservableCollection kommen. Das wird aber noch umgestellt und dann fliegt auch die ObservableCollection raus.

06.01.2015 - 11:52 Uhr

Weil als das ganze noch nicht MVVM war, dort das Objekt gefüllt war.

Ich habs inzwischen allerdings komplett umgestellt. Der Filter ist ebenfalls ins ViewModel gewandert (so wie es sich auch gehört).

View:


<TextBox Width="200" Margin="0,0,0,5" x:Name="tb_Search" Text="{Binding Path=FilterValue, UpdateSourceTrigger=PropertyChanged}"/>
<ListView Grid.Row="1" Name="lv_Leistungserbringer" SelectionChanged="lv_Leistungserbringer_SelectionChanged" ItemsSource="{Binding Path=LeistungserbringerCollection}" Height="150" VerticalAlignment="Bottom">
    <ListView.View>
        <GridView>
            [...] <!-- Hab die Columns mal rausgenommen wegen Platz-->
        </GridView>
    </ListView.View>
</ListView>

ViewModel:


//Die Datenquelle
private ObservableCollection<ILeistungserbringer> _Leistungserbringer;
public ObservableCollection<ILeistungserbringer> Leistungserbringer
{
    get { return this._Leistungserbringer; }
    set 
    { 
        this._Leistungserbringer = value;
        this._LeistungserbringerCollection = CollectionViewSource.GetDefaultView(this.Leistungserbringer);
        this._LeistungserbringerCollection.Filter = this.Filter;

        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs("Leistungserbringer"));
    }
}

//Die Collection der Datenquelle, die gebunden wird
private ICollectionView _LeistungserbringerCollection;
public ICollectionView LeistungserbringerCollection
{ 
    get { return this._LeistungserbringerCollection; }
}

//Der Filterbegriff
private string _FilterValue;
public string FilterValue
{
    get { return this._FilterValue; }
    set
    {
        this._FilterValue = value;

        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs("FilterValue"));

        this._LeistungserbringerCollection.Refresh();
    }
}

//Die Filtermethode
private bool Filter(object item)
{
    if (item != null)
    {
        if (String.IsNullOrEmpty(this._FilterValue))
            return true;
        else
        {
            int test;
            int.TryParse(this._FilterValue, out test);

            if (test == 0)
                return ((item as ILeistungserbringer).Beschreibung.IndexOf(this._FilterValue, StringComparison.OrdinalIgnoreCase) >= 0);
            else
                return ((item as ILeistungserbringer).ID.ToString().IndexOf(this.FilterValue, StringComparison.OrdinalIgnoreCase) >= 0);
        }
    }
    else
        return false;
}

06.01.2015 - 10:16 Uhr

Hoi,

ich hab da gerade ein kleines Problem und stehe auf dem Schlauch. Vielleicht könnt ihr mir da ein wenig weiterhelfen.

Und zwar habe ich eine ListView, welche ich mit Daten fülle. Die Daten werden auch angezeigt, wenn ich dann allerdings versuche ne Filterung zu bauen, habe ich das Problem, dass das ItemsSource-Property der ListView wenn das DataContextChanged-Event feuert noch null ist. Ich hab mal geschaut ob in ItemsSource überhaupt was drin ist und wenn ich im SelectionChanged-Event nen Breakpoint setze ist ItemsSource auch gefüllt.

Nun zu meiner Frage. Welches Event nutze ich am besten um die CollectionView für die ListView zu definieren (da DataContextChanged ja scheinbar zu früh ist).

Hier der Code so wie ich ihn derzeit habe:

View:


<ListView Grid.Row="1" Name="lv_Leistungserbringer" DataContextChanged="lv_Leistungserbringer_DataContextChanged" SelectionChanged="lv_Leistungserbringer_SelectionChanged" ItemsSource="{Binding Path=Leistungserbringer}" Height="150" VerticalAlignment="Bottom">
    <ListView.View>
        <GridView>
            [...] <!-- Hab die Columns mal rausgenommen wegen Platz-->
        </GridView>
    </ListView.View>
</ListView>

CodeBehind:


private void lv_Leistungserbringer_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lv_Leistungserbringer.ItemsSource);
    view.Filter = this.Filter;
}

private bool Filter(object item)
{
    if (String.IsNullOrEmpty(tb_Search.Text))
        return true;
    else
    {
        int test;
        int.TryParse(tb_Search.Text, out test);

        if (test == 0)
            return ((item as ILeistungserbringer).Beschreibung.IndexOf(tb_Search.Text, StringComparison.OrdinalIgnoreCase) >= 0);
        else
            return ((item as ILeistungserbringer).ID.ToString().IndexOf(tb_Search.Text, StringComparison.OrdinalIgnoreCase) >= 0);
    }
}

Das Binding der Source läuft über ein ViewModel ab, welches an den DataContext gebunden wurde.

Kann mir da vielleicht jemand nen Anstoß geben wo ich da ansetzen muss?

Danke schon mal im Vorraus.

LG
Maliko

11.12.2014 - 14:35 Uhr

Klar ist das möglich. Du benötigst lediglich nen Bool oder was auch immer, den du abfragen kannst. Dann kannst du ganz normal den Bool mit nem DataTrigger (oder auch MultiDataTrigger) abfragen und für die entsprechende Row die Hintergrundfarbe ändern.

01.12.2014 - 15:42 Uhr

Weil ich euch nur einen Auszug gezeigt habe. Das ist nicht der einzige Trigger. Darum Trigger und darum Style.

01.12.2014 - 11:37 Uhr

Sowas in der Art habe ich schon vermutet gehabt, konnte nur leider nix entsprechendes finden. Stand in meinem WPF-Buch leider auch nicht drin. Danke dir für die Info.

01.12.2014 - 09:52 Uhr

Hoi,

ich hab da mal ne Frage an euch. Und zwar habe ich gemerkt, das es Probleme gibt, wenn man versucht ein Steuerelement mit einem Trigger zu aktivieren, wenn dieses per Default auf Disabled gesetzt wurde.

Umgekehrt gibt es da aber kein Problem. Ich meine Folgendes:

Funktioniert:


<DatePicker SelectedDate="{Binding ElementName=StandartPitBis, Path=SelectedDate}">
    <DatePicker.Style>
        <Style TargetType="DatePicker">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=IsChecked}" Value="False">
                    <Setter Property="IsEnabled" Value="False" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DatePicker.Style>
</DatePicker>

Funktioniert nicht:


<DatePicker SelectedDate="{Binding ElementName=StandartPitBis, Path=SelectedDate}" IsEnabled="False">
    <DatePicker.Style>
        <Style TargetType="DatePicker">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=IsChecked}" Value="True">
                    <Setter Property="IsEnabled" Value="True" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DatePicker.Style>
</DatePicker>

Hat vielleicht jemand eine Idee woran das liegen könnte? Das Databinding funktioniert bei beiden Varianten einwandfrei. Der Trigger wird ausgelöst wenn eine bestimmte Checkbox gecheckt wird (IsEnabled ist allerdings ein Property des Datenobjektes, welches von der Checkbox gesetzt wird, da sich die Checkbox in einer GridView befindet).

25.11.2014 - 10:25 Uhr

Hoi,

ich hätte da mal ne kurze Frage. Und zwar gab es in WinForms für eine Combobox die Möglichkeit diese beim AutoCompleteMode auf SuggestAppend zu setzen. Gibt es die Möglichkeit bei WPF zufällig auch?

Bisher hab ich es lediglich geschafft die Combobox auf Autovervollständigung zu setzen. Ausklappen und nur die zutreffenden Items anzeigen tut sie beim Tippen allerdings noch nicht.

Hat da jemand nen Tipp für mich welches Property ich da noch setzen muss?

Mein Code:


<ComboBox Grid.Column="1" Name="cb_Tag" Margin="0,0,2,0" IsEditable="True" ItemsSource="{Binding ElementName=TagControl, Path=ItemsSource}" IsTextSearchEnabled="True" IsTextSearchCaseSensitive="False" DisplayMemberPath="Description">
    <ComboBox.Resources>
        <!--<sys:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">0</sys:Double>-->
    </ComboBox.Resources>
    <ComboBox.InputBindings>
        <KeyBinding Key="{Binding ElementName=TagControl, Path=SplitKey}" Command="cmd:Commands.Split" />
    </ComboBox.InputBindings>
</ComboBox>

24.11.2014 - 16:56 Uhr

Ich hab inzwischen eine andere Möglichkeit gefunden. Ich verwende ein normales Label, welchem allerdings über die InputBindings mit einem MouseBinding ein Command übergeben wird. Und dieser Command wird dann bei einem "LeftClick" gefeuert.


<Label Content="X" Grid.Column="1">
    <Label.InputBindings>
        <MouseBinding MouseAction="LeftClick" Command="cmd:Commands.Delete" />
    </Label.InputBindings>
</Label>
21.11.2014 - 10:29 Uhr

Ich würde das DataGrid gerne nutzen, dies ist allerdings nicht möglich, da ich im Grid ein weiteres Grid anzeige, welches über alle Zeilen geht (sprich ich hab eine Zeile als Grid, und darunter ein weiteres Grid).

Davon mal abgesehen arbeite ich erst ne Woche mit WPF (ich komme aus dem WinForms-Sektor).

20.11.2014 - 11:32 Uhr

Das Problem das ich habe ist, das ich eine ListBox und kein DataGrid oder GridView verwende und daher die Überschriften (ich missbrauche die ListBox als Grid) Labels sind. Mit einem Klick auf das Label soll allerdings nach der entsprechenden Spalte sortiert werden.

Der C#-Code steht im MousLeftButtonUp-Event des Labels.

20.11.2014 - 11:09 Uhr

Hoi,

ich bin jetzt bereits schon die ganze Woche am suchen und finde einfach nix was mir da weiterhelfen könnte. Und zwar möchte ich über die xaml.cs-Datei an eine CollectionViewSource herankommen, welche sich im Resource-Bereich eines Grids befindet, welches sich wiederrum in einem ContentTemplate in einem ResourceDictionary befindet. Die CodeBehind-Datei gehört zur ResourceDatei.

Ich habs zwar schon geschafft an die CollectionViewSource zu kommen, aber aus irgendeinem Grund ist die leer (sprich CollectionViewSource.View ist null). Kann mir vielleicht jemand sagen, ob ich das ganze falsch angehe und mir vielleicht nen Ansatz nennen, wie es richtig sein müsste? Bei Google finde ich irgendwie nix dazu.

So versuche ich es derzeit:


ControlTemplate template = this["LeistungserbringerVertraegeTemplate"] as ControlTemplate;
            
Grid grid = template.LoadContent() as Grid;
//ListBox box = grid.FindName("lb_Vertraege") as ListBox;

CollectionViewSource viewSource = grid.FindResource("VertraegeSource") as CollectionViewSource;

viewSource.SortDescriptions.Clear();
viewSource.SortDescriptions.Add(new System.ComponentModel.SortDescription("VertragsID", System.ComponentModel.ListSortDirection.Ascending));

viewSource.View.Refresh();


<Grid>
    <Grid.Resources>
        <CollectionViewSource Source="{Binding Path=Vertraege}" x:Key="VertraegeSource">
            <CollectionViewSource.SortDescriptions>
                <scm:SortDescription PropertyName="Vertrag.Gruppe.ID" Direction="Ascending" />
            </CollectionViewSource.SortDescriptions>
        </CollectionViewSource>
    </Grid.Resources>

    [...]

    <ListBox Name="lb_Vertraege" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3" ItemTemplate="{StaticResource VertragsListBoxTemplate}" ItemsSource="{Binding Source={StaticResource VertraegeSource}}" ScrollViewer.VerticalScrollBarVisibility="Visible" />
</Grid>

Vielen Dank euch schon mal im Voraus.

Lg
Maliko

17.11.2014 - 15:08 Uhr

Hi,

ich hab da mal ne kurze Frage. Und zwar hab ich ein Label und hätte gerne, das bei einem Click darauf ein Trigger ausgelöst wird. Leider hab ich da bisher nix zu gefunden und immer wird auf das MouseLeftButtonUp-Event verwiesen.

Hat da jemand von euch vielleicht ne Idee, wie man das mit nem Trigger lösen kann oder muss ich da tatsächlich auf ein Event zurückgreifen?

Lg
Maliko

17.11.2014 - 15:03 Uhr

Genauso hab ich es letztlich auch gemacht. Ich hab im Objekt nen bool angelegt, welcher automatisch auf True gesetzt wird wenn der Fall zutrifft und den anschließend an den Trigger gebunden.

12.11.2014 - 15:14 Uhr

Hoi,

ich hab da mal ne Frage an euch. Und zwar habe ich zwei DataTemplates welche ineinander Verschachtelt sind (sprich das zweite DataTemplate wird von einer ListBox verwendet, welche sich im ersten DataTemplete befindet).

Nun würde ich gerne von DataTemplate2 (das innere Template) ein Property eines Controls aus DataTemplate1 verändern (über einen Trigger).

Meine Templates sehen wie folgt aus (in Auszügen):

DataTemplate 1


<DataTemplate x:Key="VertragsListBoxTemplate">
    <Border CornerRadius="2" BorderThickness="1" SnapsToDevicePixels="True"
        BorderBrush="Green">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="50" />
            <ColumnDefinition Width="20" />
            <ColumnDefinition Width="705" />
            <ColumnDefinition Width="100" />
            <ColumnDefinition Width="100" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>

        [...]
        <Image Grid.Column="1" Source="{StaticResource iconError}" Height="16" Width="16" x:Name="img_Error" />
        [...]
    </Grid>
</DataTemplate>

DataTemplate 2:


<DataTemplate x:Key="VertragsAnlagenListBoxTemplate">
    <Border CornerRadius="2" BorderThickness="1" SnapsToDevicePixels="True"
                                            BorderBrush="Green">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="510" />
                <ColumnDefinition Width="98" />
                <ColumnDefinition Width="98" />
                <ColumnDefinition Width="98" />
                <ColumnDefinition Width="98" />
            </Grid.ColumnDefinitions>

            [...]
            <Label Grid.Column="4" Content="{Binding Path=Anlage.SysPitBis}" HorizontalAlignment="Left" VerticalAlignment="Center" ContentStringFormat="dd.MM.yyyy">
                <Label.Style>
                    <Style TargetType="{x:Type Label}">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=Anlage.SysPitBis}" Value="01.01.1900">
                                <Setter Property="Background" Value="Red" />
                                <Setter Property="Foreground" Value="White" />
                                <Setter Property="FontWeight" Value="Bold" />
                                <Setter TargetName="img_Error" Property="Visibility" Value="Visible" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Label.Style>
            </Label>
        </Grid>
    </Border>
</DataTemplate>

Hiermit hab ich es bereits versucht:

<Setter TargetName="img_Error" Property="Visibility" Value="Visible" />

Kann mir vielleicht da irgendjemand weiterhelfen?

EDIT: Was ich vergessen habe zu erwähnen, das erste DataTemplate wird auch wiederum von einer ListBox verwendet.

17.10.2014 - 10:08 Uhr

na dann kann ich natürlich auch lange nach der Fehlerquelle suchen. Ist auf jedem Fall gut zu wissen (hatte ich bisher nie ausprobiert und in der Ausbildung wurde uns das auch nicht gesagt).

16.10.2014 - 11:49 Uhr

Ich benutze den Namespace "System.Linq". Desweiteren wird hier (bisher) keine Datenbankstruktur verwendet, daher auch kein EntityFramework. AdressArt ist ein von mir erstelltes Datenobjekt und typen ist vom Typ List<AdressArt>. search ist der Lambda-Operator um auf das Beschreibungsattribut des Listen-Elementes zuzugreifen (Beschreibung ist ein Attribut von AdressArt).

Allerdings scheint der Fehler nur in der Überwachung aufzutreten. Wenn ich es einfach im Programm ausprobiere, dann macht er es (bin auf die Idee gekommen, da er den Eintrag nicht gelöscht hatte, was aber an einem anderem Fehler lag).

16.10.2014 - 10:14 Uhr

Hoi,

ich hätte da mal ne Frage. Und zwar habe ich mir ein kleines Datenobjekt geschrieben, welches ich in eine generische Liste lade (List<T>).

Nun will ich einen bestimmtes Item finden und verwendet dafür die Funktion Find(). Allerdings bekomme ich dann die Fehlermeldung > Fehlermeldung:

Der Ausdruck darf kein "lambda expressions" enthalten.

Ich hab jetzt schon mehrere Beispiele mir angeschaut und in sämtlichen Beiträgen wird es genauso gemacht wie ich es auch mache (inkl. MSDN). Hier der Code:

AdressArt item = typen.Find(search => search.Beschreibung == "Datenlieferung")

Hat da vielleicht jemand ne Idee, woran das liegen kann? Hier auch noch die Datenklasse:


public class AdressArt
    {
        private int _ID;
        public int ID
        {
            get { return _ID; }
            set { _ID = value; }
        }

        private string _Beschreibung;
        public string Beschreibung
        {
            get { return _Beschreibung; }
            set { _Beschreibung = value; }
        }

        public AdressArt(int id, string beschreibung)
        {
            this._ID = id;
            this._Beschreibung = beschreibung;
        }

    }

12.07.2014 - 20:11 Uhr

Hoi,

ich hätte da ein Problem, welches mich momentan etwas verwirrt. Und zwar habe ich eine Form, dessen Steuerelemente komplett Dynamisch anhand den Informationen einer XML-Datei erstellt werden (es kann sich dabei endweder um TextBoxen, RadioButtons oder ComboBoxen handeln). Das funktioniert auch alles so weit.

Anschließend soll die Form ausgefüllt werden und mit einem Klick auf einen Button soll eine XML-Datei mit den entsprechenden Inhalten der Steuerelemente generiert werden.

Da es sich um ein TabControl handelt gibt es für jede TabPage einen Oberabschnitt in der XML. Darunter sollen dann die Inhalte der Steuerelemente eingefügt werden und zwar immer in folgendem Schema:

<ParameterWert Id="1" Wert="xyz"/>

Für jedes Steuerelement soll so ein Eintrag erstellt werden, so das es am Ende dann so aussehen würde:


<Oberteil>
	<ParameterWert Id="1" Wert="xyz"/>
	<ParameterWert Id="2" Wert="1"/>
	<ParameterWert Id="3" Wert="5"/>
</Oberteil>

Wenn ich jetzt aber versuche den zweiten Eintrag dem XElement hinzuzufügen, crasht das Programm und ich bekomme lediglich die Fehlermeldung Doppeltes Attribut. Mehr nicht.

Hat vielleicht irgendjemand eine Ahnung was ich da Falsch mache? Hier auch noch der Quellcode in Auszügen:


private void button3_Click(object sender, EventArgs e)
        {
            XDocument xml = new XDocument();
            XNamespace ns = "http://xxx.xxxx.de";
            xml.Declaration = new XDeclaration("1.0", "utf-8", "yes");
            xml.Add(new XElement(ns + "StatusFilter", new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance")));

            XElement root = xml.Root;
            
            [...]

            foreach (TabPage item in tc_censored.TabPages)
            {
                int id = 0;
                XElement zeile = new XElement("Oberteil");
                foreach (Object control in item.Controls)
                {
                    switch (control.GetType().FullName)
                    {
                        case "System.Windows.Forms.TextBox":
                            {
                                zeile.Add("ParameterWert", new XAttribute("Id", id+1), new XAttribute("Wert", ((TextBox)control).Text));
                                id++;
                            }
                            break;
                        case "System.Windows.Forms.Panel":
                            {
                                if(((RadioButton)((Panel)control).Controls[0]).Checked)
                                    zeile.Add("ParameterWert", new XAttribute("Id", id + 1), new XAttribute("Wert", 1));
                                else
                                    zeile.Add("ParameterWert", new XAttribute("Id", id + 1), new XAttribute("Wert", 0));
                                id++;
                            }
                            break;
                        case "System.Windows.Forms.ComboBox":
                            {
                                zeile.Add("ParameterWert", new XAttribute("Id", id + 1), new XAttribute("Wert", ((ComboBox)control).SelectedIndex + 1));
                                id++;
                            }
                            break;
                        default:
                            break;
                    }
                }
                root.Add(zeile);
            }
            xml.Save("test.xml");
        }

[...] Kennzeichnet eine Codestelle, die ich nicht Zeigen darf, da dort ein großer Teil der XML generiert wird, welcher auch problemlos funktioniert.

Achja und wenn mir vielleicht noch jemand sagen könnte, warum zum Geier in jedem Node direkt unterhalb des RootNodes ein leerer Namespace steht und zwar nur da? Gehört zwar nicht zum Thema, bereitet mir aber auch leichte Kopfschmerzen.

Danke schon mal im Vorraus.

Lg Maliko

EDIT: Argh. Ich bin so dämlich. Ich hab den Fehler. Ich muss der XElement.Add() Methode natürlich auch sagen, was für ein Typ das Anzufügende Element ist.

zeile.Add(new XElement("ParameterWert", new XAttribute("Id", id + 1), new XAttribute("Wert", ((ComboBox)control).SelectedIndex + 1)));

Und schon funktioniert es.

02.06.2014 - 10:40 Uhr

Na da ist ja schon mal ne ganze Menge womit ich was anfangen kann. Da sag ich mal ganz lieb danke (auch wenn ich mich gerade frage, wie zum Geier ist den Artikel in den FAQ übersehen konnte).

01.06.2014 - 19:37 Uhr

Hi,

ich hab da mal ne kurze Frage. Und zwar möchte ich gerne meine Software mit Plugins erweitern können, die aber von Drittanbietern geschrieben werden. Daher müssen diese Dynamisch beim Start registriert werden. Im Netz habe ich bisher dazu lediglich als PluginSystem das MEF gefunden. Ist das noch Aktuell (weil letzter Release scheinbar 2011) oder gibt es da schon was aktuelleres was ihr mir empfehlen könnt?

Danke schon mal im Vorraus.

Lg Maliko

27.05.2014 - 09:57 Uhr

Ich weiß dass MVC dafür besser geeignet ist und normalerweise würde ICH es auch mit MVC machen. Allerdings ist das nicht mein Projekt, sondern das eines Kollegen, welchen ich wegen Krankheit gerade vertrete. Das heißt ich muss damit irgendwie klar kommen. Eine Änderung der Technologie ist also leider nicht drin.

Hab den Übeltäter aber gefunden. Er heißt JQuery Mobile und hatte das Gesicht dieses div-Tags:

<div id="main" data-role="page">...</div>

Nachdem ich den jetzt entfernt habe funktioniert es (warum auch immer)

27.05.2014 - 08:37 Uhr

Hallo,

ich hab hier ein sehr merkwürdiges Verhalten einer ASPX Website, welches ich nicht erklären kann. Vielleicht hat ja jemand von euch schon mal ein ähnliches Problem gehabt und kann mir da weiterhelfen.

Und zwar habe ich eine Seite, welche ein kleines Formular hat. Dieses Formular macht einen einfachen Postback. Wenn ich die entsprechende Seite direkt über die URL aufrufe, dann funktioniert alles einwandfrei, aber wenn ich die Seite über einen Link aufrufe, läuft er durch die CodeBehind-Datei einmal durch (er liest die Daten korrekt aus der Datenbank aus und zeigt sie an), doch wenn ich nun etwas eingebe, reagiert das Javascript zur Validierung nicht und wenn ich auf Absenden drücke, macht er keinen Postback, sondern ich lande automatisch auf der default.aspx (obwohl diese dadei auf der Seite nicht einmal erwähnt wird).

Hat vielleicht jemand ne Ahnung woran das liegen könnte? Wenn ich die Seite über einen Link aufrufe und dann einen Reload mache, funktioniert es plötzlich wieder.

Danke schon mal im Vorraus. Hier auch noch schnell der Inhalt der CodeBehind-Datei:


protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                int id = int.Parse(Request.QueryString["id"]);
                if(IsPostBack)
                {
                    DateTime beladen = DateTime.Parse(String.Format("{0} {1}", istdatumBeladung.Text, istzeitBeladung.Text));
                    DateTime entladen = DateTime.Parse(String.Format("{0} {1}", istdatumEntladung.Text, istzeitEntladung.Text));
                    SqlHandler.UpdateIstDatum(id, beladen, entladen, infos.Value);
                    Response.Redirect(String.Format("auftrag.aspx?id={0}", id));
                }
                else
                {
                    Auftrag auftrag = SqlHandler.GetLadezeiteninfos(id);

                    auftragsnummer.InnerHtml = auftrag.Auftragsnummer;
                    l_SollBe.Text = auftrag.SollBeladung.Value.ToString();
                    if (auftrag.IstBeladung != null)
                    {
                        istdatumBeladung.Text = String.Format("{0:d}", auftrag.IstBeladung.Value);
                        istzeitBeladung.Text = String.Format("{0:t}", auftrag.IstBeladung.Value);
                    }
                    l_SollEnt.Text = auftrag.SollEntladung.Value.ToString();
                    if (auftrag.IstEntladung != null)
                    {
                        istdatumEntladung.Text = String.Format("{0:d}", auftrag.IstEntladung.Value);
                        istzeitEntladung.Text = String.Format("{0:t}", auftrag.IstEntladung.Value);
                    }
                    infos.Value = auftrag.Infos;
                }
            }
            catch
            {
                //Nicht wundern wegen Google, das war ein test
                Response.Redirect("http://www.google.de");
            }

Und hier das Javascript:


$("#istdatumBeladung").change(function (e) {

            var value = $("#istdatumBeladung").val();
            if (value.indexOf('.') == -1) {
                var date = new Date(value);
                var day = null;
                if (date.getDate() < 10)
                    day = "0" + date.getDate();
                else
                    day = date.getDate();
                var month = null;
                if (date.getMonth() + 1 < 10)
                    month = "0" + (date.getMonth() + 1);
                else
                    month = date.getMonth() + 1;

                $("#istdatumBeladung").val( day + "." + month + "." + date.getFullYear())
            }
            
        })

Danke schon einmal im Vorraus.

LG
Maliko

26.05.2014 - 14:25 Uhr

Hmm. Ich habs jetzt einfach gesplittet (der Kunde hat es grummelnd hingenommen) und dann anschließend das Datum einfach mit nem Javascript umgestellt.

26.05.2014 - 12:29 Uhr

Merkwürdig. Beim IPhone 4 von unserer Sekreterin hats nicht funktioniert und hier steht auch das es nicht unterstützt wird: http://stackoverflow.com/questions/18445927/ios-7-mobile-safari-no-longer-supports-input-type-datetime

Ne aufspaltung möchte der Kunde eigentlich nicht, aber wenns nicht anders geht, werde ich noch mal mit ihm reden.