Laden...

Forenbeiträge von UNeverNo Ingesamt 153 Beiträge

30.04.2019 - 17:27 Uhr

Ich zerbreche mir gerade den Kopf wie ich schönstmöglich Filter darstellen und vom Benutzer befüllen lassen kann, so dass im Anschluss die DB damit gefüttert wird.

Aktuell mache ich es so:

Ich lege mir für die Controls, die als Filter dienen jeweils ein Feld (als string oder string[]) im Model an :

        [BindProperty]
        public string[] FilterSelectedInternalStates { get; set; }

und weise das dann den Controls als Rückgabewert zu:


    <form id="form_Paging" method="post">
        <div id="filtercriteria">
            <!-- die Klasse wird über jQuery entfernt wenn der Wert als Filterkriterium hinzugefügt wird -->
            <div class="hidden">
                <div>X</div>
                @Html.Label("", "Status:")
                <select asp-for="FilterSelectedInternalStates" asp-items="Model.InternalStates"></select>
            </div>
            <!-- hier aktivieren wir die zu verwendenden Filter -->
            <div class="floatleft">
                @Html.Label("", "Filter:")
                <select id="filter" asp-items="Model.Filters" onclick=""></select>
            </div>
        </div>
        <div>
            @Html.HiddenFor(item => Model.CurrentPage)
            @Html.HiddenFor(item => Model.MaxPage)
        </div>
    </form>

Außerdem hier zu sehen die Dropdownlist, über die ich die verwendeten Filter ein- bzw. ausblende. Die Filterwerte definiere ich im Model im Konstruktor wie folgt:

 Filters.Add(new SelectListItem() { Text = "", Value = "" });
 Filters.Add(new SelectListItem() { Text = "Status", Value = nameof(FilterSelectedInternalStates) });

Die Sichtbarkeit steuere ich über jQuery:

$(document).ready(function() {
    $('#filter').change(function () {
        //this returns the value of the list - getting the element by id
        //remove .hidden class        
        $('#' + this.value).parent().removeClass("hidden").addClass("floatleft");
        //hide entry
        $(this).find(':selected').addClass("hidden");
        //set selection
        $(this).val('');
    });

    $('div.hidden > div').click(function() {
        //add .hidden class
        $(this).parent().removeClass("floatleft").addClass("hidden");
        var value = $(this).siblings('select').attr('id');
        $('#filter').find('option[value=' + value + ']').removeClass("hidden");
    });
});

Nun frage ich mich ob es da nicht vielleicht etwas gibt, was so etwas in der Art schon macht, komme mir nämlich gerade so vor, als würde ich das Rad neu erfinden - und besonders schön sieht es aktuell noch nicht aus, abgesehen davon, dass ich noch nicht gelöst habe, wie ich den Filter denn am besten anwende.
Denn ich las von PRG und frage mich, wie ich das jetzt am besten umsetzen würde? Ich habe einen Klick auf den 'Filter anwenden'-Button, löse einen Post aus, der mich auf eine neue Seite leitet, wo dann die Filterung erfolgt und dann (wann/wie?) leitet sie wieder auf die ursprüngliche Seite weiter?

Also eigentlich zwei Fragen - gibt es sowas irgendwo (Nuget/Blog) schon in schön? Kennt ihr was?
Wenn nicht, wie kann ich es mit PRG umsetzen?

02.11.2017 - 16:59 Uhr

Hi, ich meine tatsächlich eine reale Person 😃

02.11.2017 - 10:19 Uhr

Ich suche nach einer Schulung, die keine Themen wie "Installation", "Vergleich mit HTML5" beinhaltet, ich möchte mich nur mit Xamarin.Forms befassen.

Kann da jemand was empfehlen?

26.04.2017 - 14:04 Uhr

Danke Euch, ich werde die Links mal sichten 👍

05.04.2017 - 13:50 Uhr

Freeman, Robson, Bates, Sierra: Head First Design Patterns.

Die Gang-Of-Four-Entwurfsmuster ausführlichst erklärt, begründet und anhand von praktischen Beispielen implementiert. Bonus: das Buch verwendet Java als Sprache, so dass man den Code der Beispiele nicht 1:1 übernehmen kann, sondern nachdenken und ihn anpassen muss. Hat sich gezeigt, dass auf die Weise sogar mehr hängenbleibt.

Das Buch habe ich schon und finde es tatsächlich sehr gut. Ich suche so etwas an einem konkreten Projektbeispiel. Ist Dir da etwas bekannt?

05.04.2017 - 13:06 Uhr

Hier mal der aktuelle Link. Aktuell sind es sogar schon 122 Bücher:

http://www.dotnetpro.de/update/lesenswert/122-kostenlose-buecher-entwickler-1174690.html

05.04.2017 - 13:03 Uhr

Kennt jemand etwas, was sich mit Architekturentscheidungen auseinander setzt?
Stichworte: Pattern, Vererbung, Interfaces.

04.12.2015 - 20:16 Uhr

Ich habe eine COM-Anwendung, wo ich gern Tastendrücke eines speziellen Fensters abfangen würde, bis ein bestimmter Button gedrückt wird.

Ich habe dazu globale Hooks auf die benötigten Keys per WinAPI gesetzt - das funktioniert.
Per WinEvents erkenne ich ob das Tab der Anwendung wechselt, dann verwerfe ich die Tastendrücke - das funktioniert auch.

Der Baustein, der mir jetzt noch fehlt, ist zu erkennen, wann ein bestimmter Bestätigungsbutton gedrückt bzw. per Enter bestätigt wird.
Ich habe keine Ahnung wie der Button intern heißt, ich kenne nur den Titel des Dialogs (und weiß, dass 'Ja' auf dem Button steht).

Komme ich irgendwie an die Information, dass ein beliebiger Button gedrückt wurde? Filtern könnte ich es mir ja sicher irgendwie selbst.
Ich sah zwar eine Möglichkeit für WinEvents, allerdings erhalte ich keine Callbacks wenn ich es so ähnlich wie hier mache: Setting up Hook on Windows message

Ich verwende nur EVENT_OBJECT_INVOKED statt EVENT_OBJECT_NAMECHANGE - das sollte nach der Beschreibung eigentlich das richtige sein, dachte ich: Event Constants

Ich hab mir den Button auch mal mit Spy++ angeschaut, sehe aber auch kein EVENT_OBJECT_INVOKED.

23.10.2015 - 16:11 Uhr

Vielen Dank für die Antwort. Es hilft mir schon ein wenig weiter, allerdings ist das Verhalten immer noch "komisch".

Die Callbacks werden öfter gerufen als sie sollten - wenn ich 5 Elemente in der Liste habe - 10x.


        private bool Work()
        {
            _waiter = new CountdownEvent2(lstsDBAliasNames.Count);
            foreach (string sName in lstsNames)
            {
                oWS.WMGetDataAsync(sName, sName);
                oWS.WMGetDataCompleted += new WMGetDataCompletedEventHandler(oWS_WMGetDataCompleted);
            }
            _waiter.Wait();

            return true;
        }

        void oWS_WMGetDataCompleted(object sender, WMGetDataCompletedEventArgs e)
        {
            string sDaten = e.Result;
			string sName = e.UserState;
            _waiter.Signal();
        }

Ich bin ein wenig ratlos - es scheint definitiv etwas mit der Synchronität zu tun zu haben - aber was? Im Work dürfte es eigentlich keine Probleme geben, da ja niemand parallel darauf zugreift.

Ich dachte dann, dass es Probleme mit parallelen Callbacks geben könnte, was eigentlich auch keinen Sinn gibt - und ein lock drum herum änderte auch nichts am Ergebnis - hier mal ein Log (Liste: Name1,Name2,Name3,Name4,Name5):


foreach Name1
foreach Name2
foreach Name3
foreach Name4
foreach Name5
callback Name1
callback Name1
callback Name1
callback Name1
callback Name1
callback Name4
callback Name4
callback Name4
callback Name4
callback Name4

Oder brauche ich am Log eine Synchronisierung?

22.10.2015 - 12:52 Uhr

Ich hab schon ein wenig zum Thema gegoogelt, aber alle Treffer beschäftigen sich irgendwie mit Task als Rückgabeobjekt.

In meinem Fall rufe ich Async-Methoden von ASP.NET, die void als Rückgabetyp haben. Ich möchte nun sicherstellen, dass meine Konsolenanwendung erst dann beendet wird, wenn alle offenen Completed-Events gefeuert wurden.

Aktuell denke ich darüber nach jeden Aufruf über i++ zu inkremieren und jedes Completed-Event dies über i-- dekremieren zu lassen. Der Main-Thread läuft über while (i>0), allerdings erscheint mir das nicht sonderlich sauber zu sein - gibt es da ein einfacheres Handling, was unter VS 2010/.NET 3.5 verfügbar ist?

28.11.2014 - 10:38 Uhr

Da Du nicht sagst, was Du mit dem Setzen des NS erreichen willst, kann ich Dir auch keinen vernünftigen Endvorschlag machen.

Naja wie gesagt, die XML bekomme ich so, ich hab mir da gar nichts bei gedacht 😉

Morgen!
Der "Name" vom Root-Knoten ist nicht "nachricht", sondern "{[ &gt; ](http://mynamespace.de/123)}nachricht" (der Namespace - bzw. spezifischer die URI gehört da mit dazu).

Dein X-Path "/nachricht" matcht aber nur auf "nachricht" - drum kommt nix raus.
Zumindest mit X-Path 1.0. In X-Path 2.0 gibts die sogenannten Context-Namespaces, mit denen man sowas machen könnte; aber dafür braucht man halt auch die entsprechenden Libraries.

Wenn dir der Namespace bekannt ist, vergib einfach ein Prefix im XSLT, und benutz das:

<xsl:template match="/myns:nachricht" xmlns:myns="http://mynamespace.de/123">  
  <xsl:for-each select="myns:ebene1/myns:liste/myns:ebene2/myns:ebene3.1/myns:ebene4.1">  
    [...]  

Dank Dir das funktioniert 👍
Ich verwende wie gesagt Saxon, das unterstützt X-Path 2.0.

27.11.2014 - 17:51 Uhr

Mhh aber Saxon funktioniert bei mir auch nicht. Wie genau hast Du es denn in Visual Studio transformiert? Kann es sein, dass Visual Studio da nicht so genau ist bei Namespaces?

Ich habe es jetzt noch auf W3School versucht (http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog), da bekomme ich auch ein Ergebnis, allerdings ziemlichen Quatsch, nämlich 0001 0002 0702 0707, erwarten würde ich <text></text> oder <text/>, was kam denn bei Dir im Visual Studio?

Und war es nicht so, dass Visual Studio nur XSLT 1.0 unterstützt?

27.11.2014 - 17:28 Uhr

Hi, der Namespace ist vorgegeben. Ich habe das Problem nur etwas verkürzt/vereinfacht.

Deine beiden Vorschläge scheinen nicht zu funktionieren. Sowohl das hier (http://www.freeformatter.com/xsl-transformer.html) als auch Saxon wirft (wenig aussagekräftige) Fehler.

Meine Beispiel-Xsl funktioniert ja auch (wenn der Namespace entfernt werden würde).

27.11.2014 - 15:27 Uhr

Ich habe folgende XML-Datei:


<?xml version="1.0" encoding="utf-8"?>
<nachricht xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://mynamespace.de/123">
  <ebene1>
    <kopf>
        <code xmlns="">0001</code>
    </kopf>
    <liste>
      <ebene2>
        <ebene3.1>
          <kopf>
            <typ>
              <code xmlns="">0002</code>
            </typ>
          </kopf>
          <ebene4.1> <!--das möchte ich selektieren -->
            <typ>
              <code xmlns="">0702</code>
            </typ>
          </ebene4.1>
        </ebene3.1>
      </ebene2>
      <ebene2>
        <ebene3.2>
          <kopf>
            <typ>
              <code xmlns="">0707</code>
            </typ>
          </kopf>
          <ebene4.2>
          </ebene4.2>
        </ebene3.2>
      </ebene2>
    </liste>
  </ebene1>
</nachricht>

und folgende Transformation:


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://mynamespace.de/123">
	<xsl:template match="/">
		<xsl:for-each select="nachricht/ebene1/liste/ebene2/ebene3.1/ebene4.1">
			<text></text>
		</xsl:for-each>
	</xsl:template>
</xsl:stylesheet>

Allerdings wird eben in for-each nichts selektiert.
Das Problem scheint mit dem namespace zusammen zu hängen, da wenn ich das xmlns="http://mynamespace.de/123" aus der XML-Datei entferne die Selektion funktioniert.

Allerdings sollte es auch irgendwie anders gehen - nur wie?

29.08.2014 - 09:08 Uhr

Manchmal kann es so einfach sein. Obwohl ich nicht ganz verstehe wieso er den Namespace nicht anhand der Reference.cs erkennt.

Vielen! Dank!

28.08.2014 - 17:18 Uhr

Ich habe eine wsdl als Service Referenz eingebunden. Mir wird automatisch eine Klassenstruktur erzeugt, die ungefähr so aussieht:

    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.18408")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.xoev.de/schemata/xkfz/1_1")]
    public partial class xkfzNachrichten : TypeXKfzNachrichten {
    }

    [System.Xml.Serialization.XmlIncludeAttribute(typeof(TypeXKfzFehlernachrichten))]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.18408")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(TypeName="Type.XKfzNachrichten", Namespace="http://www.xoev.de/schemata/xkfz/1_1")]
    public partial class TypeXKfzNachrichten : object, System.ComponentModel.INotifyPropertyChanged {
                
        private vorsystemantrag0707 vorsystemantrag0707Field;        
        private auskunftanfragehalterauskunft0801 auskunftanfragehalterauskunft0801Field;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("vorsystem.antrag.0707", Order=29)]
        public vorsystemantrag0707 vorsystemantrag0707 {
            get {
                return this.vorsystemantrag0707Field;
            }
            set {
                this.vorsystemantrag0707Field = value;
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("auskunft.anfragehalterauskunft.0801", Order=30)]
        public auskunftanfragehalterauskunft0801 auskunftanfragehalterauskunft0801 {
            get {
                return this.auskunftanfragehalterauskunft0801Field;
            }
            set {
                this.auskunftanfragehalterauskunft0801Field = value;
            }
        }       
    }

Ich habe folgende XML-Datei die ich in ein Objekt deserialisieren möchte (die Validierung gegen XSD ist fehlerfrei):

<?xml version="1.0" encoding="utf-8"?>
<_1:xkfzNachrichten xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:_1="http://www.xoev.de/schemata/xkfz/1_1" xmlns:elem="http://www.kba.de/elemente" xmlns:aus="http://www.kba.de/zfzr/auskunft" xmlns:mit="http://www.kba.de/eVB/mitteilung" xsi:schemaLocation="http://www.xoev.de/schemata/xkfz/1_1 D:\XOEV_Produktionsumgebung_XKfz_1_1_1\XKfz\build\xsd\xkfz-kommunikation.xsd">
	<_1:vorsystem.antrag.0707>
           ...
	</_1:vorsystem.antrag.0707>
</_1:xkfzNachrichten>
        public static xkfzNachrichten GetNachricht()
        {
            xkfzNachrichten nachricht = new xkfzNachrichten();
            XmlSerializer serializer = new XmlSerializer(typeof(xkfzNachrichten));
            using (StreamReader reader = new StreamReader(@"c:\2.xml"))
            {
                xkfzNachrichten x = (xkfzNachrichten)serializer.Deserialize(reader);
            }

            return nachricht;
        }

Allerdings bekomme ich folgende Fehlermeldung:

ex.GetBaseException()
{"<xkfzNachrichten xmlns='http://www.xoev.de/schemata/xkfz/1_1'> wurde nicht erwartet."}
    [System.InvalidOperationException]: {"<xkfzNachrichten xmlns='http://www.xoev.de/schemata/xkfz/1_1'> wurde nicht erwartet."}
    Data: {System.Collections.ListDictionaryInternal}
    HelpLink: null
    InnerException: null
    Message: "<xkfzNachrichten xmlns='http://www.xoev.de/schemata/xkfz/1_1'> wurde nicht erwartet."
    Source: "pnlhqhoh"
    StackTrace: "   bei Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderxkfzNachrichten.Read321_xkfzNachrichten()"
    TargetSite: {System.Object Read321_xkfzNachrichten()}

Was mache ich falsch?

09.07.2014 - 17:05 Uhr

Ich weiß echt nicht, was die unfreundliche Antwort soll?

Mit der Fehlerbeschreibung kann das so ziemlich alles sein.
Das 100%tig identisch kann man eigentlich ausschließen; sonst würds gehen, wa? Erst eine Unterstellung. Und ja, die Funktion ist 100% gleich, aber natürlich sind auf der live-Server-Seite mehr Controls und JS-Code, die aber keinen Einfluß darauf haben sollten.
Wenn Du keine selbstausführende Funktion verwendest, dann kann es gut sein, dass die Ausführung läuft, obwohl die nötigen HTML Elemente noch gar nicht da sind.
Deswegen verwendet man i.d.R. auch selbstausführende Methoden, da die erst laufen, wenn wirklich alles (nötige) da ist.
Lokal hast Du vielleicht einfach das Glück, dass es einfach schneller lädt. Wie gesagt poppt ja was hoch, u.a. auch die Textbox mit dem Autocomplete was nicht ausgeführt wird, also daran sollte es nicht liegen.
Selbst im jQuery Beispielcode wird auf $(function() {}); hingewiesen und es verwendet. Man muss natürlich auch lesen. Genau, ich lese nicht, nur weil ich es nicht genauso mache wie es irgendwo gemacht wird.
Du sagst zwar, dass Du gedebuggt hast; aber nicht wie. Ich schrieb doch bereits was von Firebug? Ich habe dort Breakpoints u.a. im obigen Codeblock gesetzt und gesehen, dass er dort auf dem Server nie reinläuft, lokal hingegen schon.
Spätestens dann siehst Dus ja. Wir können und werden so ein Debuggung nicht für Dich übernehmen. Schreib ich irgendwo, dass das irgendjemand machen soll? Ich fragte nach, wie ich an den Fehler der da offenbar auftritt, rankomme - und damit meine ich Tools oder sonstige Vorschläge - und wie mir da console.log() weiterhilft wüsste ich nicht.
Aber so ist das stupides Raten mit der Glaskugel. Ist es, wenn Du andere Vorschläge hast, nur her damit. Danke.

09.07.2014 - 14:06 Uhr

Davon das du eine Function in eine .js auslagerst wird sie noch lange nicht ausgeführt.

Hast du das in eine
>
geschrieben?

Nein, habe ich nicht.

Wird aber, wie geschrieben, auch so ausgeführt. Das sehe ich im Debugger und auch der Dialog kommt hoch. Wird nur sofort wieder geschlossen.

nur so eine Vermutung.
Die Textbox besitzt nicht rein zufällig runat="server"?
Wenn doch, musst du diese im JS über die Klasse suchen und nicht per ID.

Nein, die Beispiele sind wirklich zu 100% identisch. Die Textbox injeziere ich per JS erst am Anfang der Funktion.

09.07.2014 - 09:40 Uhr

Ja, ich hab wie gesagt im Firebug debuggt.

08.07.2014 - 17:05 Uhr

Ich habe derzeit ein Problem, was mich ein wenig ratlos macht. Ich habe mir eine Funktion gebastelt, die bei Buttonclick mittels JQuery Dialog und JQuery Autocomplete mich nach Daten in einer Quelle suchen läßt. Das funktioniert als lokale Datei (1.html) wie erwartet.

Wenn ich das Ding jetzt in meine ASP.NET-Seite in einer js-Datei einbette und aufrufe funktioniert nur noch ein Teil davon. So wird der Dialog aufgepoppt, aber nach kurzer Denkpause (der Aufbereitung der Daten) wieder geschlossen. Das Verhalten weicht also von dem lokalen ab. Der Code ist 100% identisch, ich habe es extra nochmal abgeglichen.

Ich konnte jetzt identifizieren, dass er im Autocomplete ein Event offenbar nicht feuert, ich habe aber keine Ahnung wieso nicht.


    var tag = $("#txbSearchDataSource").autocomplete({
        minLength: 0,
        source: function (request, response) {
            //hier kommt er nie rein
        }
    })

Da er den Dialog wieder zuklappt und ein Postback ausgelöst wird, gehe ich eigentlich davon aus, dass ein Fehler aufgetreten ist - gibt es einen Weg an den ranzukommen?

02.06.2014 - 10:45 Uhr

Soweit ich es derzeit sehe brauche ich je Transformationsrichtung ein eigenes XSLT. Korrekt? Gibt es ein Tool, das mir das vielleicht vereinfacht? Auf Basis eines XSLTs das andere generiert oder so.

Könnt ihr Tools empfehlen, die einen in dem Prozess der XSLT-Generierung unterstützen? Kostenlos wäre toll. Oder macht ihr alles mit dem VS?

02.06.2014 - 10:39 Uhr

Hi,

das meinte ich etwa mit dem was ich schrieb. Vielen Dank, hat schön funktioniert 👍

12.05.2014 - 17:53 Uhr

Mhh soweit ich das überblicke beschäftigt sich der Artikel hauptsächlich mit mehreren Thread, die man auch unter Kontrolle hat. In meinem Fall rufen mehrere Instanzen einer Anwendung jeweils eine Webservicemethode auf und unter der Haube ist dann im Backend die im Sessionstate gehaltene Klasse.
Oder übersehe ich was?

Könnte das Kapseln innerhalb der Methoden von Lock/Unlock jeweils innerhalb von lock {} mein Problem vielleicht schon beheben?

12.05.2014 - 13:33 Uhr

Was ich realisieren wollte war ein Locking im Backend. Mehrere Anwendungen holen sich Datensätze mit einer Meldungsnummer und diese Kombination soll eben nur 1x exklusiv abgeholt werden.

Ich habe dazu folgendes Konstrukt gebaut:


private class EVT_Standardeventhandler_Lock
{
	public int Meldungsnummer { get; set; }
	public DateTime Lockdate { get; set; }
}

public class EVT_Standardeventhandler_Locks
{
	List<EVT_Standardeventhandler_Lock> lstLocks = new List<EVT_Standardeventhandler_Lock>();

	/// <summary>
	/// Gibt True zurück wenn Lock erfolgreich gesetzt wurde, sonst False
	/// </summary>
	public bool Lock(int iMeldungsnummer)
	{
		DateTime datNow = DateTime.Now;
		lstLocks.RemoveAll(x => x.Lockdate.AddMinutes(2) < datNow); //alle Locks älter als 2 Minuten sind Schrott -> freigeben

		if (lstLocks.Any(x => x.Meldungsnummer == iMeldungsnummer))
			return false;

		lstLocks.Add(new EVT_Standardeventhandler_Lock() { Lockdate = datNow, Meldungsnummer = iMeldungsnummer });
		return true;
	}

	public void Unlock(int iMeldungsnummer)
	{
		lstLocks.RemoveAll(x => x.Meldungsnummer == iMeldungsnummer);
	}
}

EVT_Standardeventhandler_Locks befindet sich im Sessionstate und von Zeit zu Zeit bekomme ich bei der Any()-Prüfung eine

System.InvalidOperationException: Die Auflistung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden.

Ich schon mal ein wenig Google zum Thema befragt und es scheinen konkurrierende Threads der Auslöser zu sein. Anscheinend ist Any hier nicht threadsafe.

Tja die Frage ist jetzt, ob das irgendwie schöner mit Boardmitteln (.NET 3.5) geht, oder ob ich hier tatsächlich alles auf for-Schleifen-Handling

for (int i = x.Count - 1; i >= 0; i--)

umbauen muss.

06.01.2014 - 14:52 Uhr

evtl. würde es helfen, weiter einzugrenzen, in welche Richtung du gehen möchtest - Softwarearchitektur ist jetzt ja auch kein so kleines Feld. Oder geht es mehr "ums Große Ganze"? Best Practices? Entwurfsmuster? Architekturen verteilter Anwendungen? ...?

Ich kann ja mal beschreiben was ich verbessern möchte.

Ich brauche Werkzeuge/Modelle um schneller modellieren zu können.
Ich möchte eine bessere Balance finden zwischen universeller Einsetzbarkeit und schneller Lösung/Umsetzung.
Ich möchte Patterns sinnvoll einsetzen.
Ich möchte bestehende Systeme in vertretbarer Zeit optimieren können.

@Joetempes: War Dein Freund komplett da? Oder nur beim Intensiv-Training? Softskills kann man sich vermutlich sparen.
Hat er die Prüfung absolviert?

06.01.2014 - 08:55 Uhr

Ich möchte mich architektonisch ein wenig weiterentwickeln und bin derzeit auf der Suche nach einem guten Seminar zum Thema. Es sollte maximal 5 Tage gehen und max. 3k€ kosten.

Ich habe auch schon einige Angebote gefunden, allerdings finde ich kein unabhängiges Teilnehmerfeedback - und das ist mir letztlich wertvoller als klangvolle Namen (wie bspw. Fraunhofer).

Hat vielleicht jemand Empfehlungen für Referenten bzw. konkrete Kurse im Raum FFM/Kaiserslautern?

01.06.2012 - 16:01 Uhr

In der Registry kannst du das reinfummeln.
In CLASSES_ROOT schauen was bei .exe steht. Bei mir steht da exefile.
Dann bei exefile schauen, dort unter shell einen neuen Schlüssel z.B. "mymenu" erstellen, unter dem einen Schlüssel "command" mit der Kommandozeile drin. Schau dir am besten an was da schon alles drin ist und wie das gemacht wird.
Das ist ein Weg unter XP, man kanns noch anders lösen, aber da wirds komplizierter.

Das ist leider nicht das was ich suche. Ich suche eine Lösung für die Taskbarkontextmenüs 😉

01.06.2012 - 15:09 Uhr

Mhh bei XP hilft mir das leider nicht weiter und wie es dann bei Windows 8 aussehen soll weiß ich derzeit auch nicht 🙁

01.06.2012 - 13:37 Uhr

Ich würde gerne global das Kontextmenü aller Anwendungen erweitern. Also Rechtsklick auf beliebige Anwendung und dann dort einen Menüpunkt x.

Hat jemand eine Idee, wie man das bewerkstelligen kann? WinAPI? Registry?
Oder nur Subclassing? X(

21.05.2012 - 14:49 Uhr

Was mir an dem new Filter einfach nicht so gefällt ist eine Verdopplung der Überladungen, wie ich es oben schon mal versuchte zu beschreiben.
Habe ich standardmäßig

GetXYZ()
GetXYZ(iRow)
GetXYZ(iRow, sTable)

hätte ich nun

GetXYZ()
GetXYZ(oFilter)
GetXYZ(iRow)
GetXYZ(iRow, oFilter)
GetXYZ(iRow, sTable)
GetXYZ(iRow, sTable, oFilter)

Und das würde ich - wenn möglich - verhindern. Oder habe ich mich gerade gedanklich verrannt? Dass ich das selbst umsetzen kann ist klar und das will ich auch 😉

Alternativ könnte man es wohl auch mit optionalen Parametern machen, aber empfindet ihr/empfindest du das als eine saubere Alternative?

17.05.2012 - 14:38 Uhr

Wobei der Filter seine eigenen fluent Methoden haben kann. Im Ergebnis

MyObject m = GetXYZ (new Filter (iRow, sTableName).Add (sKey1, sValue1).Add (sKey2, sValue2)... );  
  

Das sorgt dann für klare Trennung und beseitigt das Problem von Darth Maims Vorschlag, dass sich MyObject und Filter gegenseitig kennen müssen. Es reicht, wenn MyObject Filter kennt. Außerdem vermeidet man die Konstruktion mit dem zusätzlichen Get am Ende.

Hi herbivore,
das Get stört mich persönlich am Ende auch, allerdings bin ich mir nicht sicher bzw. sehe momentan nicht, wie ich Deinen Vorschlag effektiv umsetze. Das iRow und sTableName sind Überladungen der GetXYZ unabhängig vom Filter (die paar würde ich auch belassen). Wenn ich es nun so wie Du vorschlägst umsetze, dann hätte ich wieder eine Überladungsebene mehr, was die Anzahl selbiger verdoppelt. Korrigiere mich, wenn ich es falsch verstehe.

Parallel dazu mal den aktuellen Stand meiner Bemühungen:


    public class MyObject
    {
        private Dictionary<string, object> myDic = new Dictionary<string, object>();

        public Dictionary<string, object> Dic
        {
            get { return myDic; }
            set { myDic = value; }
        }
    }

    public static class FluentFactory<T>
    {
        public static IFluentMethods<T> Create(MyObject myObject)
        {
            return new Fluent<T>(myObject);
        }
    }

    public class Fluent<T> : IFluentMethods<T>
    {
        private MyObject _myObject;

        public Fluent(MyObject myObject)
        {
            _myObject = myObject;
        }

        public IFluentMethods<T> Where(string key, object value)
        {
            _myObject.Dic.Add(key, value);
            return this;
        }

        public T Get(string key)
        {
            return (T)Convert.ChangeType(this._myObject.Dic[key], typeof(T));
        }
    }

    public interface IFluentCreate<T>
    {
        IFluentMethods<T> Create(MyObject myObject);
    }

    public interface IFluentMethods<T>
    {
        IFluentMethods<T> Where(string key, object value);
        T Get(string key);        
    }

Hier ärgere ich mich genau mit der Rückgabe herum. In meinem Test hier muss ich schon bei der Factory-Initalisierung einen Datentyp angeben, eigentlich würde ich dies aber nur beim Get machen wollen.

var fluentObject = FluentFactory<string>.Create(myObject).Where("1", "5").Where("2", "7").Where("3", "11");
string s = fluentObject.Get("2");

Vielleicht nochmal ein wenig ausführlicher, was ich hier machen will. Ich habe ein altes 1.1-Objekt und will einfacher und intuitiver darauf zugreifen, fluent interfaces scheinen mir dafür eine schöne Umsetzung zu sein. Ich will dieses Objekt nun wrappen und die in ihm enthaltenen Unterobjekte in verschiedene Datentypen (string, bool, int, double) casten.

15.05.2012 - 15:19 Uhr

Hallo,

du kannst nen Sprachfeature verwenden, welches es seit .Net 1.1 gibt: params

Kenn ich, finde ich aber bei Erweiterungen problematisch, da dann keine Überladung hinten angefügt werden kann.

Und ein Parameter-Objekt gefällt dir nicht?

  
public class GetXyzParams  
{  
   public int Row { get; set; }  
   public string TableName{ get; set; }  
   public string Key1 { get; set; }  
   public string Value1 { get; set; }  
}  
  
public void GetXYZ(GetXyzParams parameters) { ... }  
  

Die kannst du dann auch einfach via Objektinitialisierer aufrufen:

  
GetXYZ(new GetXyzParams{ Row = 1,TableName = "Customer" });  
  

Oder, wenn du (nur) deine Key-Value-Paare beliebig oft übergeben möchtest:

  
public void GetXYZ(int row,string tableName,params KeyValuePair[] keyValuePairs) { ... }  
  

Wie auch oben geschrieben kenne ich es, auch wenn ich an die Auslagerung in eine Klasse nicht nachgedacht habe, allerdings gefällt mir der Aufruf irgendwie auch nicht hundertprozentig:


MyObject m = GetXYZ(iRow, sTable, new KeyValuePair(key1, value1), new KeyValuePair(key2, value2), KeyValuePair(key3, value3), ....);

Wie wärs mit Fluid Interfaces, ungefähr so

clsDataQuery qry = new clsDataQuery("fa").fa_adnr().IsEqual(10101).And().fa_admatch().IsLike("H%");  
// oder so  
MyObject m = GetXYZ(iRow, sTableName).AddKey(key1, value1).AddKey(key2, value2);  
  

?

Grüße Bernd Sowas wie die 2. Lösung würde ich persönlich anstreben, allerdings hapert es bei der Umsetzung ein wenig (AddKey müsste ja jeweils MyObject zurückgeben). Wie ich allerdings grad sehe müsste ich wohl eigentlich immer nur

return this;

in den entsprechenden Methoden zurückgeben, was an und für sich ja auch logisch ist.
Immer schön, wenn man einen Namen zu dem hat, was man sucht 👍

Allerdings müsste ich dann in AddKey irgendwie einschränken an welchen Methoden es aufrufbar ist, ansonsten habe ich ja wieder das gleiche Problem wie bei Extensions.

15.05.2012 - 14:48 Uhr

Wir haben hier eine 1.1er-GetXYZ-Methode, die 47 Überladungen beinhaltet, fast alle in der Art (filtere auf key1/value1, ..., keyn/valuen). Deutlich zu viele, wie ich meine.

Aufruf wäre bspw.


MyObject m = GetXYZ(iRow, sTableName, sKey1, sValue1, sKey2, sValue2, sKey3, sValue3, sKey4, sValue4, sKey5, sValue5);

Ich möchte diese nun reduzieren und bin auf der Suche nach der intuitivsten Strukturierung davon.

Man könnte es mit einem Dictionary<string, string> als Parameter definieren:


MyObject m = GetXYZ(iRow, sTableName, myDic);

Nachteil hieran wäre, dass ich immer ein myDic initialisieren muss und alle Key-Value-Paare hinzufügen müsste.

Ich könnte auch Extensionmethods für MyObject definieren:


m.Add(key1, value1);
m.Add(key2, value2);

Beim dann folgenden Aufruf von GetXYZ würde ich dann die Key-Value-Paare berücksichtigen. Nachteil hier wäre, dass die Extensions eben immer aufrufbar wären und nicht nur dann, wenn ich GetXYZ aufrufe. Man müsste also immer auf den Anwender vertrauen, dass er das Ding auch wieder cleart (oder das eben immer automatisch am Ende von GetXYZ tun, was auch nicht immer gewollt sein könnte).

Optionale Parameter gingen auch, allerdings empfinde ich die auch irgendwie als unsauber, hinzu kommt, dass die Anzahl der Key-Value-Paare auf n begrenzt ist (analog zum Ist-Zustand).

Tja, wie mache ich das nun? Gibt doch bestimmt noch coole andere Sprachfeatures von C# 4.0 die mir das erleichtern, oder?

29.03.2012 - 10:06 Uhr

Habe hier grad ein sehr komisches Phänomen. Ich stelle ein Projekt von 1.1 auf 3.5 MP um. Dabei fliegt die manuelle Eventzuweisung aus der aspx.cs-Datei raus und ich verbinde diese im Designer neu (wo mir zur Auswahl die in der aspx.cs definierten Events angezeigt werden). Wenn ich jetzt jedoch das Projekt starte bekomme ich über Server.GetLastError()

  • Server.GetLastError()	{&quot;d:\\Projekte\\Proj\\Proj\\FormFSA1.aspx(26): error CS1061: \&quot;ASP.formfsa1_aspx\&quot; enthält keine Definition für \&quot;btnSuche_Click\&quot;, und es konnte keine Erweiterungsmethode \&quot;btnSuche_Click\&quot; gefunden werden, die ein erstes Argument vom Typ \&quot;ASP.formfsa1_aspx\&quot; akzeptiert (Fehlt eine Using-Direktive oder ein Assemblyverweis?).&quot;}	System.Exception {System.Web.HttpCompileException}
    

Das Event ist aber definitiv vorhanden. Momentan kann ich mir damit behelfen, alle Events durchzugehen und ein neues Event [alter Eventname + "1"] zu erstellen, die Inhalte des alten Events zu kopieren, das alte zu löschen und das neue ins alte umzubenennen. Aber wie es sich schon liest...das ist megaaufwändig.

Hatte vielleicht schon mal jemand das selbe Problem?

02.02.2012 - 14:08 Uhr

Hi Herbivore,

wieso fragst Du nach den Typen, willst Du es mit where eingrenzen? Generell bin ich an einer allgemeinen Lösung interessiert.

In meinem Fall wären es derzeit so:

o (s): object
o (d): string
T: datetime, string, bool und int

02.02.2012 - 12:26 Uhr

um einen String in einen numerischen Typ zu wandeln, reicht ein Cast nicht.

Hab den Thread grad über die Suche ausgegraben und hab genau dieses Problem. Ein cast eines Objects in String über (T)o funktioniert, ein cast in int scheitert. Ich habe auch schon alternativ sowas probiert Convert.ChangeType(o, typeof(T)) aber da erzählt der Compiler mir, dass eine explizite Konvertierung existieren würde (nur eben diese funktioniert ja nicht :evil: ).

Gibt es hier im Rahmen neuer Sprachfeatures inzwischen einfachere Methoden beliebige Werte zu casten als die oben erwähnten?

16.12.2011 - 10:05 Uhr

Mhh ich hätte wohl noch schreiben sollen, dass das 1.1 ASP ist :evil:

15.12.2011 - 17:38 Uhr

Ich habe eine Form mit unterschiedlichen Controls, bspw. TextBox, DropDownList, etc.

Zur Laufzeit erzeuge ich bei Eingabefehlern dynamisch weitere Controls: Checkbox, Images und speichere das als Zuweisung "Control.ID -> Klasse(Checkbox, Image)" in einem Dictionary.

Wenn alle Checkboxen angehakt sind möchte ich die Werte dynamisch aus den Controls auslesen, allerdings sitzen die auf unterschiedlichen Properties bspw. TextBox.Text, DropDownList.SelectedItem.Value, DropDownList.SelectItem.Text (der Genickbrecher ist hier wohl die Dropdownlist mit zwei Optionen, so dass mir ein "Control is Typ" nicht weiterhilft 😦)

Kann ich in meiner Klasse eine Property anlegen, das auf das gewünschte Property verweist und wenn ja wie mach ich das?
Oder muss ich mir einen Enum-Wrapper definieren?

11.12.2011 - 14:42 Uhr

Kann mir jemand sagen, welche API/Webservice Amazon dafür anbietet? Ich möchte Produkte anhand bestimmter Kriterien suchen und dann die Informationen dazu verarbeiten.

Ich habe eine Product Advertising API gefunden, die verlangt bei der Registrierung aber gleich die Seite, auf der sie eingesetzt werden soll und ich möchte ja eigentlich erst einmal damit rumprobieren.

Dann fand ich HowTo: Produktsuche mit den Amazon Web Services allerdings scheint das nicht mehr aktuell zu sein, da unter E-Commerce nur noch der "Amazon Fulfillment Web Service (FWS)" zu finden ist (auf dieser Übersichtsseite), der aber auch bald vom "Amazon Marketplace Web Service (Amazon MWS)" abgelöst wird. Wenn ich mich dafür anmelden möchte muss ich aber anscheinend ein Reseller sein.

Bin da momentan ein wenig ratlos...

25.11.2011 - 14:24 Uhr

Ich habe hier ein bestehendes Programm das aus einer Kindklasse heraus eine Progressbar der Form aktualisieren möchte. Wie realisiere ich das am besten?

Die normale Vorgehensweise ist ja, dass man in der Klasse ein Event definiert, dieses in der Form abonniert und dann über Invoke die Form aktualisiert. Jetzt habe ich aber das Problem, dass die Kindklasse nicht an die Form senden kann, sondern einen Umweg über seine Mutterklasse nehmen müsste.


    public partial class Form1 : Form
    {
        private BackgroundWorker bw = new BackgroundWorker();
        private MainClass m = new MainClass();

        public Form1()
        {
            InitializeComponent();
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);            
        }

        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("Fertig!");
        }

        void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            m.RefreshLabel += new MainClass.RefreshLabelEventhandler(m_RefreshLabel);
            m.Start();
        }

        void m_RefreshLabel(string text)
        {
            RefreshControl(text);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            bw.RunWorkerAsync();
        }

        private void RefreshControl(string text)
        {
            if (this.InvokeRequired)
            {
                this.Invoke((MethodInvoker)delegate { RefreshControl(text); });
                return;
            }
            label1.Text = text;
        }
    }


    class MainClass
    {
        ChildClass1 c = new ChildClass1();

        public delegate void RefreshLabelEventhandler(string text);
        public event RefreshLabelEventhandler RefreshLabel;

        protected void OnRefreshLabel(string text)
        {
            if (RefreshLabel != null)
                RefreshLabel(text);
        }
    }

D.h.

  1. ich müsste auch in der Kindklasse ein Event definieren an die Hauptklasse schicken und es von dort aus weiterrouten.

    class MainClass
    {
        //...

        internal void Start()
        {
            c.RefreshLabel += new ChildClass1.RefreshLabelEventhandler(c_RefreshLabel);
            c.Start();
        }

        void c_RefreshLabel(string text)
        {
            this.RefreshLabel(text);
        }
    }


    class ChildClass1
    {
        public delegate void RefreshLabelEventhandler(string text);
        public event RefreshLabelEventhandler RefreshLabel;

        protected void OnRefreshLabel(string text)
        {
            if (RefreshLabel != null)
                RefreshLabel(text);
        }

        internal void Start()
        {
            this.OnRefreshLabel("Hallo");
        }
    }

  1. Oder ich kann das zu verwendende Event übergeben.

    class MainClass
    {
        //...
        internal void Start()
        {
            c.Start(this.RefreshLabel);
        }
    }

    class ChildClass1
    {
        internal void Start(MainClass.RefreshLabelEventhandler refreshLabelEventhandler)
        {
            refreshLabelEventhandler("Kindklasse");
        }
    }

Persönlich gefällt mir Lösung 2 besser, aber geht es noch irgendwie anders/besser?

17.11.2011 - 13:55 Uhr

Ja, das hilft mir leider nicht, da die Intellisense dann eben trotzdem auf MimeType.MimeTypes zugreift und nicht auf MimeType.Audio.

17.11.2011 - 10:53 Uhr

Bin grad dabei ein Enum zu definieren, das man sehr schön in verschiedene Untergruppen verpacken könnte (MIME-Typen: App, Audio, Image, etc.).

Allerdings frage ich mich, wie ich das am komfortabelsten für den verwendenden Entwickler einsetze.
Mit Bordmitteln vom Standard-Enum scheint es nicht zu gehen.

Ich könnte statische Konstanten verwenden, allerdings habe ich dann das Problem, dass keine Intellisense-Unterstützung angeboten wird, wenn er die Methode mit Übergabeparametern befüllt, da ja eine wie auch immer geartete Konstante erwartet wird und kein Enumwert einer Aufzählung.

14.11.2011 - 11:05 Uhr

Vielen Dank für das Response.End aber auch der Hinweis mit dem IHttpHandler 👍

In einem anderen Thread fand ich Folgendes verlinkt: Daten mit ASP.NET zum Client schicken, oder: Wieso eigentlich HttpHandler?

11.11.2011 - 15:49 Uhr

Forms 3.5, ich werde das gleich mal im Titel ergänzen.

11.11.2011 - 15:26 Uhr

Ja, das habe ich sowohl vor meinem Codebsp. oben (keine Änderung) als auch danach (Excel-Code weg) versucht.

Also nochmal eine genauere Beschreibung von dem was ich erreichen möchte: Auf einer Auswahlseite kann man einen von n Buttons anklicken. Je klick wird eine Datei an den Client geschickt, ohne dass man eine aufpoppende Seite hat, die man wieder schliessen muss (also zur Not geht aufpoppen, muss sich aber wieder schliessen). Nach einem Klick soll die Auswahlseite weiterhin offen sein (und sich keine Daten durch einen ggf. ausgelösten Postback neubesorgen müssen).

Stand derzeit sieht so aus:


<?xml version='1.0'?>
<?mso-application progid='Excel.Sheet'?>
<s:Workbook xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:s="urn:schemas-microsoft-com:office:spreadsheet">
  <s:Styles>
    ...
  </s:Styles>
  <s:Worksheet s:Name="Tabelle1">
    <s:Table>
      ...
    </s:Table>
  </s:Worksheet>
</s:Workbook>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<head>
    <title>
...

11.11.2011 - 14:21 Uhr

Folgendes Problem:
Ich habe mir eine XML-Excel-Datei nach Klick erzeugt (MemoryStream), packe diese in den Response.OutputStream, der Download wird angestossen, allerdings ist in der erzeugten Datei dann auch der Text der ursprünglichen Auswahlseite enthalten (nach der Excel-Datei), was schließlich zu einem Fehler beim Öffnen des Dokuments führt.


//xls generieren...
Response.ContentType = "application/vnd.ms-excel";
memory.WriteTo(Response.OutputStream);

Kann ich das irgendwie lösen, ohne für jeden Download eine neue leere Seite zu generieren, die vom Benutzer geschlossen werden muss?

04.11.2011 - 09:47 Uhr

Ich hatte den Datepicker gar nicht gesehen. Hatte den unter UI vermutet :evil:

Danke...

03.11.2011 - 16:08 Uhr

Ich möchte auch jQuery benutzen, allerdings wirklich nur den Part des Datepickers. Kann mir jemand sagen, welche Komponenten ich beim Custom Download http://jqueryui.com/download benötige, damit es lauffähig ist?

02.11.2011 - 10:15 Uhr

Mhh offensichtlich hat VS ein Problem mit dem Umbenennen von aspx-Dateien. Ich habe die bestehende gelöscht und genau den gleichen xhtml-Code in eine neue Datei reinkopiert und nun funktioniert wieder alles 🙄

01.11.2011 - 17:14 Uhr

Wenn ich doppelt auf einen Button klicke sollte mir VS eigentlich automatisch ein Event erzeugen, was bei mir allerdings nicht der Fall ist. Ebensowenig funktioniert es, wenn ich selbst einen Namen bspw. für Click des Buttons vergebe und Enter drücke - er erzeugt keinen Code 🤔

Ist dieses Phänomen schon bekannt (tritt bei mir bei ASP.NET auf) und gibt es dafür eine Lösung? Google brachte mir nix, aber vielleicht habe ich auch nur die falschen Schlagwörter.