Laden...
Avatar #avatar-2316.jpg
JuyJuka myCSharp.de - Experte
Fachinformatiker: Anwendungsentwicklung Deutschland Dabei seit 30.11.2005 2.187 Beiträge
Benutzerbeschreibung
Ich liebe OO und vor allem OOD. Mit Klassen, Interfaces, Assoziaitonen, Vererbung, Kapselung, Patterns und und und verbring ich meine Arbeits- und meine Freizeit. *stahl*

Forenbeiträge von JuyJuka Ingesamt 2.187 Beiträge

27.08.2009 - 12:10 Uhr

Hallo kraier,

Die Frage ist, wie du die CheckedListBox gefüllt hast.


private void button4_Click(object sender, EventArgs e)
{
  foreach(object obj in this.checkedListBox1.CheckedItems)
  {
    // hier hast du genau das was du in this.checkedListBox1.Items.Add(...) rein getan hast.
    // wenn du also z.B. eine eigene Klasse schreibst, die Namen und Pfad beinhaltet, wird auch diese wieder zurück gegeben.
  } 
}

Gruß
Juy Juka

26.08.2009 - 12:02 Uhr

Hallo schabe,

Das ist normal. Vermutlich wird die Zeile einfach komplett weg optimiert und der BrackePoint deshalb so na wie möglich dort plaziert.

Gruß
Juy Juka

25.08.2009 - 13:34 Uhr

Hallo Second Sun,

Eine xml-Datei (oder besser gesagt xml-Daten) kannst du auf vielen Wegen erzeugen. Mir bekannt und auch schon von mir verwendet Wege liste ich hier mal kurz auf:

  1. Text/Textersetzung: Man schreibt sich einfach das xml per Hand runter und ersetzt vorher definierte Platzhalter durch die Daten die man setzen will. Ist schnell gemacht und auch relatief flexiebel, wenn man die "Vorlage" aus einer Datei einliest. (Hier für kann ich dir auch JuyJuka.Reports empfehlen)

  2. DataSet: Man kann sich ein DataSet zusammen stellen und darin alle Elemente des xml als als DataTables abbilden und dies wiederrum als xml speichern. Man kann sogar Typisierte DataSet's aus *.xsd-Dateien erstellen lassen (weiß jemand wie das Programm dazu heißt?). Das ist im Code relativ einfach zu benutzen und mit typisierten DataSet's beinahe Typensicher.

  3. XmlDocument/System.Xml: Im System.Xml-Namespace gibt es jede menge Klassen, mit denen man eine Xml-Struktur vollständig als Objekt-Baum abbilden kann. Damit lässt sich wirklich jede Xml-Struktur abbilden und das ganze ist 100%ig Objektorientiert. Es ist so zu sagen der Königsweg, jedoch auch am kompliziertesten.

Gruß
Juy Juka

24.08.2009 - 13:33 Uhr

Hallo ProGamer,

-> Elfenlied (Blut ohne ende!)

Ja!!!! Mehr Elfenlied-Fans! Ich mag Nana-chan und Wanta und .... 😁

-> South Park (Einfach nur Geil!) (<- wieso das wohl noch nicht erwähnt worden ist O.o)

Weil es nicht erwähnt werden muss. JEDER weiß das South Park geil ist.

Wie geil! Wie Geil!

Gruß
Juy Juka

19.08.2009 - 08:55 Uhr

Hallo DavidT,

In VisualStudio kann man in der xml-Ansicht einer Datei ist über die Eigenschaften (F4) ein oder mehrere Schema auswählen.
Als Tipp: man kann die App.config mittels des configSource Attributs aufteilen.

Was ist der ConfigManager ?

Gruß
Juy Juka

18.08.2009 - 09:18 Uhr

Hallo sth_Weird,

Wieso verwendest du nicht ein Interface um alle verschiedenen Arten von Einstellungen unter einen Hut zu bekommen.
Für die Verschiedenen Arten kannst du dann jeweils wieder ein Klasse programmieren:


public interface IEinstellung{...}
public class MinMaxEinstellung : IEinstellung {...}
public class WerteListeEinstellung : IEinstellung {...}
public class BooleanEinstellung : WerteListeEinstellung {...}

Gegen eine Implementation über Strategie-Pattern (mit der "Wertebereichsbasisklasse") spricht nichts, ich seh aber auch keinen Grund dafür.

Gruß
Juy Juka

03.08.2009 - 17:33 Uhr

Hallo sl3dg3hamm3r,

Metadaten sind keine Todeskriterium für O/R Mapper, im .Net Framework gibt es sogar eine sehr schönes Konzept für Metadaten auf Klassenebene (Siehe auch System.Attribute). Dies sollte auch das Thema mit zentraler Steuereung klären.
Wie man das jetzt anpackt hängt jetzt vom konkreten O/R Mapper ab.

Allgemein gibt es zu dem Thema schon schön viel im Forum zu lesen:
typed oder untyped Dataset
(schade, die anderen Thread find ich nicht mehr 🙁 )

Gruß
Juy Juka

24.07.2009 - 18:17 Uhr

Hallo Loomis,

Hauptsache es hat geholfen. 😃
Gern geschehen.

Gruß
Juy Juka

23.07.2009 - 16:31 Uhr

Hallo Loomis,

Ich bin nicht sicher ob das funktioniert aber du kannst ja mal folgendes Ausprobieren:

  • VisualStudio im Debug-Modus offen halten und die Maus über den Unterbrechen-Button stellen.
  • Knopf drücken
  • (ganz schnell) den Unterbrechen-Button im VisualStudio anklicken.

Mit Hilfe der Aufrufliste (im Menü unter Debug zu finden) solltest du damit näher an deine Methode ran kommen.

Gruß
Juy Juka

23.07.2009 - 16:26 Uhr

Hallo madjoe,

... Aber das mir ADO.NET entscheiden kann, ob ein SELECT TOP oder LIMIT benötigt wird bzw. UPPER oder UCASE oder was auch immer ist mir neu. ...

Das kann ADO.NET nicht. Ich hab die ganze Zeit von ANSI-SQL geredet. So ein pfusch wie TOP geht natürlich nicht mit standard ADO.NET.

Gruß
Juy Juka

23.07.2009 - 15:13 Uhr

Hallo,

an alle die sich über Frau-Man-Denken aufregen.

Dies ist ein Spaß-Thread, oder? Hier kann man ruhig mal Klisches und Co. schreiben (auch falsche Klishes). Ist ja alles maximal halb-ernst gemeint.

Zumindest würd ich das so empfinden.

Gruß
Juy Juka

PS: OMG, ich beteilige mich an einer Offtopic-Diskusion 🙁

23.07.2009 - 15:07 Uhr

Hallo madjoe,

Das ganze hab ich auch schon hinter mir.

Als erstes kann ich dir sagen, dass du DBMS spezifische Dinge einfach ADO.NET überlassen kannst udn auch solltes, da ADO.NET diese Funktion schon hat.

Als zweite kann ich dir sagen, dass ich mich für das Besuchermuster (Visitor Pattern) entschieden habe und den Baum im moment noch gut erweitern kann. (z.B. mit Dekorator Pattern usw.)

Das sauberste wäre natürlich ein SqlWriter, der wiederum für jedes Objekt des Abfragekakül's eine eigen Startegie (Stragety Pattern) sucht und verwendet. Im gegenzug wäre es aber auch am aufwändigsten zu warten.

Eine entgültige Entscheidung kann ich dir leider nicht geben.

Gruß
Juy Juka

23.07.2009 - 10:44 Uhr

Q00000074

Warum nicht mal wieder die Zwischenablage posten 😄

23.07.2009 - 10:10 Uhr

Hallo,

Mich würde es total ankotzen wenn Windows ohne IE oder WMP ausgeliefert wird.
Ich will an einem System so wenig wie möglich Konfigurieren, Instalieren oder sonst wie machen. Wenn ich jetzt dazu gezwungen werde manuell Browser und Mediaplayer zu installieren empfinde ich das als Schikane.

Außerdem: Alles wettert über Microsoft. Was ist aber die Alternative? Google Inc.? Da bleib ich lieber bei Microsoft. 😉

Gruß
Juy Juka

23.07.2009 - 09:41 Uhr

Hallo Golo Roden,

Das PDF von Tom DeMarco hört sich irgend wie an, als würde ein alter Mann über sein Leben nachdenken und es bedauern. ... Ich würde den Artikel mit vorsicht geniesen.

Die Grundaussage, so wie ich Sie verstanden habe ist, das Metriken überbewertet sind und das stricktes Projektmanagement überbewertet sind. Dazu kann ich leider keine Aussage treffen. 🙁

Seine Unterscheidung von Projekten mit niedriger Gewinnspanne (unwichtigen Projekten) und Projekten mit hoher Gewinnspanne (wichtige Projekte) kann ich nachvollziehen und der würde ich auch zustimmen. Nur ist es fraglich, ob man die (un)wichtigkeit eines Projekts vorneweg ermitteln kann.

Software Engineering würde ich im ganzen nicht für Tot erklären. Ob alle Teile sinnvoll sind oder nicht und ob aktualisierungen nötig sind ist nicht ausgeschlossen.
Ich persönlich schätze die anderen Aspekten der Softwarentwicklung (Programiersprachen, Programierpardigmen, Entwicklungswerkzeuge, Frameworks, Bibliotheken, etc.) für wichtiger und hilfreicher.

Gruß
Juy Juka

21.07.2009 - 11:46 Uhr

Hallo Votug,

Im Konstruktor ist Reflection bestimmt nicht sehr sinnvoll, aber du kannst dir mit Reflection ja alle Member auflisten lassen und so den Quellcode schnell zusammen setzen (ich verwende für sowas immer gerne ein Tabellenkalkulations-Programm, da man dort den sich wiederhohlenden teil einfach "runter ziehen" kann).

Gruß
Juy Juka

13.07.2009 - 16:31 Uhr

Hallo orwell,

Bin mir bei meinem Post jetzt nicht ganz sicher, ob er nicht schon offtopic ist, lasse es jetzt aber erst mal normal.

MVC und "Submuster":
MVC ist eigentlich schon gar keine Entwurfsmuster mehr, sondern kann schon als Architektur-Stiel/Muster* gezählt werden. Da man alle Architektur-Stiele dann mit Entwurfsmustern umsetzt passt MVC hervorragend hinein.

Vielleicht kennst du den Thread schon, aber ich hab mir vor eine weile auch schon die selbe Frage gestellt wie du: Architektur/Pattern(s)/Framework für UI-Abkopplung

Gruß
Juy Juka

* Architektur-Stiel/Muster ist einfach größer und nicht so detailiert wie ein Entwurfsmuster

09.07.2009 - 23:36 Uhr

Hallo,

Auch wenn ich kein Rechtsexperte bin, man darf Kurzarbeit anmelden, so bald keine Aufträge (oder wenige Aufträge) verfügbar sind, damit der Gewinn/Umsatz nicht sinkt und die Firma keine Leute entlassen muss. (hier kann man über details streiten und tut es auch, aber ich glaube nicht, dass man das jetzt unbedingt muss). Außerdem wurde die Kurzarbeitsregel sehr, sehr Aufgeweicht wegen der Wirtschaftskriese.

Gruß
Juy Juka

09.07.2009 - 18:41 Uhr

Hallo @All,

Wir haben auch Kurzarbeit angemeldet weil wir einfach keine Aufträge haben. Nicht 100% aber so bald die letzen Aufgaben erledigt sind können wir zu hause bleiben.

Ich bin nicht auf den letzten Euro meines Gehaltes angewiesen, deshalb freuch ich mich auf die Freizeit.

Gruß
Juy Juka

09.07.2009 - 18:30 Uhr

Hallo sinfoe,

Theoretisch hast du recht, aber drei Gründe sprechen dagegen, überhaupt darüber nach zu denken:

  1. Heut zutage gewinnt man durch so etwas keinen signifikaten Vorteil.
  2. Die heutigen Compiler kümmern sich da selber drum.
  3. Der Code ist in dieser form viel einfacher zu lesen.

Gruß
Juy Juka

09.07.2009 - 15:12 Uhr

Hallo TheSihian,

Bei uns in der Firma gibt hierfür ein standard vorgehen:

  1. Die ComboBox wird ganz normal an eine BindingSource gebunden (siehe auch)
  2. Dann werden zwei Properties geschrieben und im Code ausschließlich über diese zugegriffen:

public IEnumerable<XXX> XXXListe
{
  get{return this.XXXBindingSource.DataSource as IEnumerable<XXX>;}
  set
  {
    BindingList<XXX> list = Microkernel.Create<BindingList<XXX>>();
    foreach(XXX x in value??GetDefaultXXX())
    {
      list.Add(x??this.nullXXX);
    }
    this.XXXBindingSource.DataSource = list;
  }
}
private readonly nullXXX = new XXX();
private IEnumerable<XXX> GetDefaultXXX()
{
  return new XXX[]{null}; // oder wie auch immer die standard anzeige gefüllt wird;
}
public XXX SelectedXXX
{
  get
  {
    XXX re = this.XXXBindingSource.Current as XXX;
    if(re==this.nullXXX)
      re = null;
    return re;
  }
  set
  {
    value = value ?? this.nullXXX;
    int pos = this.XXXBindingSource.IndexOf(value);
    if(pos<decimal.Zero) throw new ArgumentOutOfRangeException("value");
    this.XXXBindingSource.Position = pos;
  }
}

  1. Im Konstruktor der Form wird nach InitalizeComponents() folgende Zeile eingefügt:
this.XXXList = null;

So weit ich weiß kann man hier mit alle möglichen Fälle abdecken.

Gruß
Juy Juka

08.07.2009 - 06:50 Uhr

Hallo carom,

Ein paar kleiner Verbesserungen für die RegisterCommand-Methode:


public virtual void RegisterCommand(string alias, ICommand command)
{
  alias = (string.Empty + alias).ToLower().Replace(" ",string.Empty); // alias muss ja immer klein sein und " " sind ja nicht erlaubt und leer ja sowieso nicht.
  if(string.IsNullOrEmpty(alias)) throw new ArgumentException("alias");
    allowedCmds.Add(alias, command);
}

public virtual void RegisterCommand<C>(string alias)
  where C : ICommand, new()
{
  this.RegisterCommand(alias,new C());
}

public virtual void RegisterCommand<C>()
  where C : ICommand, new()
{
  this.RegisterCommand<C>(typeof(C).Name);
}

ansonsten Sieht das ganze gut und solide aus.

Gruß
Juy Juka

05.07.2009 - 09:46 Uhr

Hallo carom,

Die Verzögerung ist ganz normal. Beim Laden der Form werden nicht viele Properties aufgerufen (unter andrem auch nicht das Dictionary für die ICommands), weshalb die Fehldenden Properties erst beim aufruf der PutIn-Methode aufgerufen und somit initalisiert werden.

Die längste Zeit wird vermutlich das Laden der ICommand-Objekte benötigen.

Gruß
Juy Juka

04.07.2009 - 03:18 Uhr

Und hier das Projekt:

04.07.2009 - 03:13 Uhr

Beschreibung:

Der User carom hat hier allgemein gefragt, wie man eine Konsole programmieren würde.
Das hat mich dazu inspiriert ein eigenes Design aufzusetzen und auch zu Programmieren.

Eventuell kann es jemanden nützlich sein oder zumindest als Beispiel für die Implementation von einigen Patterns dienen.
Eventuell hat auch jemand eine andere Idee wie man so was implementieren würde und macht ein weiteres Design.

Schlagwörter: Cosol, Konsole, Command, Command-Pattern, Pattern,

03.07.2009 - 23:13 Uhr

Hallo carom,

Eine Konsole ist das 0815-Beispiel für ein Command-Pattern (einfach wikipedia fragen).
(Diagramm und Beispiel-Projekt (weil ich lust drauf habe) sind in arbeit.)

Gruß
Juy Juka

[EDIT] |JuyJuka.Console| Möchtegern Konsole [/EDIT]

03.07.2009 - 13:35 Uhr

Hallo bOrNsLeEpY,

Du kannst uns ja mal so eine leere Klasse posten und natürlich in die (hoffentlich vorhandene und verständliche) Doku dazu schauen.

Gruß
Juy Juka

03.07.2009 - 11:51 Uhr

Hallo bOrNsLeEpY,

Du solltest eine eigene Klasse schreiben, die das interface Implementiert oder von der "Basisklasse" (Sagede.OfficeLine.Shared.ClientCallback) ableitet, falls diese Existiert.
Die Methoden die dort von dir Verlangt werden sollten die Sache etwas klarer machen.
Beim Methodenaufruf übergibst du dann eine Instanz deiner eigenen Klasse.

Greetings
Juy Juka

02.07.2009 - 09:00 Uhr

Hallo Da_Flo,

Das Problem hab ich auch schon mal gehabt. DesignMode wird leider erst nach dem Konstruktor gefüllt!
Ich hab auch noch keine brauchbare Lösung gefunden, ich hab bei mir einfach die benötigten DLLs und Konfigurationen dem VisualStudio hinzugefügt, so dass mein Komponente auf die Datenbank zugreifen konnte.

Gruß
Juy Juka

02.07.2009 - 08:54 Uhr

Hallo taraneas,

Das ist in keinster weiße übertrieben. Definier dir eine Schnittstelle für die Funktion deiner Assemblie, programmier dagegen (beides sollte man eigentlich ja standardmäßig machen) und dann schnapp dir ein fertiges PlugIn-Framework [eigenwerbung]z.B. Aisys.ReflectionVersion.Implementation das man mit meinem O/R Mapper runterladen kann[/eigenwerbung] und setz es ein.

Diese Technik ist völlig normal und wird unter anderem auch bei UnitTests eingesetzt (und dort als Mocking benannt).

Gruß
Juy Juka

30.06.2009 - 12:28 Uhr

Hallo @All,

Vielen Dank für die regel Beteiligung! verbeug

Bis jetzt wurden nicht viele Gründe für oder Gegen StrongNames genannt, besonders nicht für/gegen private Assemblies mit StrongNames.
Falls da jemand noch was weiß, immer her damit.

Zu dem bis jetzt am heißesten debatierten Grund: Sicherheit.
Ich hab jetzt versucht eine eigene Test-Dll mal zu ändern, ohne die Signatur anzupassen. Einmal bekamm ich eine Meldung dass die Signatur falsch ist einmal nicht (na klasse). Jedoch fehlt mir auch ein richtig gutes Tool um die DLL zu manipulieren (ohne die Signatur anzupassen), kennt hier jemand so was?

Gruß
Juy Juka

30.06.2009 - 12:21 Uhr

Hallo,

Hier mal Microsoft's Meinung dazu:
Richtlinein für Namen
bzw. genauer Namen für Felder(Controls sind ja Felder der Klasse)

Ich schließ mich übrigens JAck30lena an.

Gruß
Juy Juka

29.06.2009 - 17:09 Uhr

Hallo gfoidl,

Danke für deinen Link. Es dürfen hier natürlich nicht nur Microsoft-Mitarbeiter oder .Net-Framework-Entwickler posten, Links zu deren Aussagen reiche mir völlg. 😃

Noch eine Anmerkung zu meiner Frage: Mich würde besonders "StrongNames+private Assemblies" interesieren.

Gruß
Juy Juka

29.06.2009 - 16:38 Uhr

Hallo @All,

Ich dachte eigentlich, dass ich so einen Thread schon mal eröffnet habe, konnte jetzt aber selbst mit der Forensuche nichts finden. (Bitte diesen Thread/Post dort anhängen, falls jemand doch schon einen existierenden Findet.)

Nun zur eigentlichen Frage:
Es geht hier nicht um "Soll man StrongNames verwenden oder nicht?", sondern um "Warum soll man StrongNames verwenden?" und "Empfiehlt Microsoft StrongNames zu verwenden?"

Mich würden besonders direkte Empfehlungen von Microsoft oder den Entwicklern des .Net-Frameworks interesieren.

Meine Suche im Netz war nicht völlig Ergebnislos, aber wenn jemand noch mehr , genauere oder aktuellere Quellen für mich hat, wäre ich sehr dankbar:
Security Guidelines: .NET Framework 2.0

From a security point of view, there are no reasons not to use strong names. MSDN
AssembliesShouldHaveValidStrongNames

Ich danke schon mal für jede Hilfe und jeden Leser.

Gruß
Juy Juka

29.06.2009 - 13:54 Uhr

Hallo pkoeppe,


public abstract class FooBarClass<T> where T : class // der Name FooBar wäre besser alls FooBarClass
{
  internal static Dictionary<string, HashSet<T>> foo2BarsDict = new Dictionary<string, HashSet<T>>();

  // ...
} 

public class FooBarProvider
{
  internal static readonly object LockObjekt = new object();
  private static FooBarProvider _Instanz;

  public static FooBarProvider Instanz
  {
    get
    {
      lock(LockObjekt)
      {
        if(_Instanz==null) _Instanz = new FooBarProvider(); // Factory oder Microkernel wären besser.
      }
      return _Instanz;
    }
  }

  public virtual HashSet<T> GetBars<T>(string blubb)
    where T : class
  {
    lock(LockObjekt)
    {
      HashSet<T> bars = null;
      FooBarClass.foo2BarsDict.TryGetValue(foo, out bars);
      return bars;
    }
  }
}

Gruß
Juy Juka

29.06.2009 - 11:52 Uhr

Hallo pkoeppe,

Wenn du dir ganz ganz ganz ... sicher bist, dass diese Methode so belassen werden muss kannst du die Meldung in FxCop unterdrücken:


[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1000:DoNotDeclareStaticMembersOnGenericTypes", Justification = "...")]
public static void ...

Gruß
Juy Juka

28.06.2009 - 17:31 Uhr

Hallo Neals,

Man "muss" einfach nur die Parameter des jeweiligen Kommunikations-Kanals in eine eigen Klasse auslagern und kann diese weiter verwenden um die passenden Präsentation zu laden und anzuzeigen.

Mir war langeweilig und da hiab ich dann ein bischen programmiert, ich hoffe dein Microkernel kann mit Generics umgehen (sorry, etwas lang geworden):


namespace Funktionssicht
{
  [Implementation(DefaultImplementationType=typeof(TcpIp.TcpIpKommunikatioskanal))]
  public interface IKommunikationskanalUntyped
  {
    object Parameter { get;}
    void Aufbauen();
  }

  [Implementation(DefaultImplementationType = typeof(TcpIp.TcpIpKommunikatioskanal))]
  public interface IKommunikationskanal<P> : IKommunikationskanalUntyped
    where P : class
  {
    new P Parameter { get;}
  }

  [Implementation(DefaultImplementationType = typeof(TcpIp.TcpIpKommunikatioskanal))]
  public abstract class Kommunikationskanal<P> : IKommunikationskanal<P>, IKommunikationskanalUntyped
    where P : class
  {
    #region IKommunikationskanal<P> Member

    private P _Parameter = Microkernel.Create<P>();
    public virtual P Parameter
    {
      get { return this._Parameter; }
    }

    public abstract void Aufbauen();

    #endregion

    #region IKommunikationskanalUntyped Member

    object IKommunikationskanalUntyped.Parameter
    {
      get 
      {
        return this.Parameter;
      }
    }

    #endregion
  }

  namespace TcpIp
  {
    public interface ITcpIpParameter
    {
      string IpAdresse{get;set;}
    }

    public class TcpIpParameter : ITcpIpParameter
    {
      private string _IpAdresse;
      public string IpAdresse
      {
        get { return _IpAdresse; }
        set { _IpAdresse = value; }
      }
    }

    public interface ITcpIpKommunikatioskanal : IKommunikationskanal<ITcpIpParameter>
    {
    }

    public class TcpIpKommunikatioskanal : Kommunikationskanal<ITcpIpParameter>, ITcpIpKommunikatioskanal
    {
      public override void Aufbauen()
      {
        // ...
      }
    }
  }
}

namespace Praesentationsschicht
{
  public interface IParameterPraesentation<P>
    where P : class
  {
    P Parameter { set;}
    Control ToControl();
  }

  public class ParameterPraesentation<P> : PropertyGrid, IParameterPraesentation<P>
    where P : class
  {
    #region IParameterPraesentation<P> Member

    public virtual P Parameter
    {
      set
      {
        this.SelectedObject = value;
      }
    }

    public virtual Control ToControl()
    {
      return this;
    }

    #endregion
  }

  public class ParameterForm<P> : Form
    where P : class
  {
    private P _Parameter;
    private IParameterPraesentation<P> _Praesentation;
    private Control _Control;

    public virtual P Parameter
    {
      get { return this._Parameter; }
      set
      {
        this._Parameter = value;
        if (this._Control != null)
        {
          this.AcceptButton = null;
          foreach (Control c in this.Controls)
            if (c != null)
              c.Dispose();
          this.Controls.Clear();
        }
        if (value != null)
        {
          this._Praesentation = Microkernel.Create<IParameterPraesentation<P>>();
          this._Praesentation.Parameter = value;
          this._Control = this._Praesentation.ToControl();
          this._Control.Dock = DockStyle.Fill;
          this.Controls.Add(this._Control);
          Button b = new Button();
          b.Text = "&Ok";
          this.AcceptButton = b;
          b.DialogResult = DialogResult.OK;
          b.Dock = DockStyle.Bottom;
          this.Controls.Add(b);
        }
      }
    }
  }

  public class Fasade
  {
    #region Sigelton
    private static Fasade _Instanz = Microkernel.Create<Fasade>();

    public static Fasade Instanz
    {
      get { return Fasade._Instanz; }
      set { Fasade._Instanz = value; }
    }

    protected Fasade() { }
    #endregion

    public virtual IKommunikationskanalUntyped Show()
    {
      return this.Show<IKommunikationskanalUntyped>();
    }

    public virtual IKommunikationskanalUntyped Show<K>()
      where K: IKommunikationskanalUntyped
    {
      return Show(Microkernel.Create<K>());
    }

    public virtual IKommunikationskanalUntyped Show(IKommunikationskanalUntyped kanal)
    {
      if (kanal != null && this.ShowUntyped(kanal.Parameter) == kanal.Parameter)
      {
        return kanal;
      }
      return null;
    }

    protected virtual object ShowUntyped(object o)
    {
      object x;
      IKommunikationskanalUntyped kanal = o as IKommunikationskanalUntyped;
      if (kanal != null)
      {
        x = kanal.Parameter;
      }
      else
      {
        x = o;
      }
      if (x != null)
      {
        DialogResult zwi = DialogResult.Cancel;
        try
        {
          zwi = (DialogResult)typeof(Fasade).GetMethod("InterneMethode", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).MakeGenericMethod(x.GetType()).Invoke(this, new object[] { x });
        }
        catch (System.InvalidCastException)
        {
        }
        if (zwi == DialogResult.Cancel)
          o = null;
      }
      return o;
    }

    private DialogResult InterneMethode<T>(T t)
      where T : class
    {
      ParameterForm<T> frm = Microkernel.Create<ParameterForm<T>>();
      frm.Parameter = t;
      return frm.ShowDialog();
    }
  }
}

Gruß
Juy Juka

26.06.2009 - 11:00 Uhr

Hallo ErfinderDesRades,

Danke! Ich arbeite schon einige Zeit mit der ObjectBindingSource und hab halt schon einige Mängel und Fehler mitgemacht. Mal schauen was deine Komponente besser macht (oder auch nicht 😉 ).

Gruß
Juy Juka

26.06.2009 - 10:54 Uhr

Hallo herbivore,

ConvertAll ist von System.Collection.Generic.List, hab aber gerade festgestellt, dass der Konstruktor von List nur IEnumerable und nicht IEnumerator entgegen nehmen kann.

Gruß
Juy Juka

26.06.2009 - 10:46 Uhr

HI,

Ungetestet aber so sollte es gehen:

IEnumerable<Customer> re = new List<object>(customers.GetEnumerator()).ConvertAll<Customer>(delegate(object o){return o as Customer;})

Gruß
Juy Juka

25.06.2009 - 11:42 Uhr

Hallo dr4g0n76,

Das Klassendiagramm ist statisch und man kann dort nur statische Dinge beschreiben. Methodenaufrufe, Programmflüsse, etc. sind dort nicht möglich.

Du müsstest ein Sequenz- oder Kolaborations-Diagram benuzten, in dem Programm-Flüsse und abläufe zwischen Objekten dargestellt werden können (ich rate zum Sequenz-Diagramm, da es übersichtlicher ist).

Gruß
Juy Juka

25.06.2009 - 07:52 Uhr

Hallo ErfinderDesRades,

Genau das kann auch bei "normalem Binden" pasieren, da ist überhaupt nichts schlimmes am Value-Property der Controller-Klasse. Wegen so etwas unbdingt einen ErrorProvider auf die Maske packen, um mögliche DataBinding-Fehler (wie z.B. der von dir beschriebene Fall) anzuzeigen, da nicht alle zu einer unbehandelten Ausnahme führen.

Für dieses konkrete Problem bräuchte ich auch noch eine Lösung ... Naja, dazu kann/sollte ein neuer Thread her.

Gruß
Juy Juka

24.06.2009 - 17:52 Uhr

Hallo Bad_Hoshi,

Ob du die Reihenfolge änderts oder nicht ist dem Designer herzlich egal.
Der wird es immer und immer wieder "falsch" herum erzeugen, die einzige Möglichkeit die ich sehe ist es zwei DataSources zu verwenden und diese in der "richtigen" Reihenvolge zu setzen.

Gruß
Juy Juka

24.06.2009 - 14:46 Uhr

Hallo Bad_Hoschi,

Warum es nicht geht hab ich auch nciht 100%ig raus gefunden. Irgend wie bekommt die ComboBox nicht mit, dass sich die DataSource geändert hat.
Die ComboBox ist beim DataBinding ohne hin ziemlich fehleranfällig.

Ein Workaround ist es hinter bindingSource.DataSource = ... einfach noch ein bindingSource.ResetBindings(false) aufzurufen. Aber warum die TextBox nicht auf die änderung der Datenquelle reagiert konnte ich nicht ermitteln.

[EDIT]
Ich hab's gefunden:
In *.Designer.cs liegt die "Fehlerquelle":
So sieht der Code aus:

          this.comboBox1.DataBindings.Add(new System.Windows.Forms.Binding("SelectedItem", this.bindingSource1, "Value", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
          this.comboBox1.DataBindings.Add(new System.Windows.Forms.Binding("DataSource", this.bindingSource1, "ValueList", true));

So müsste er aussehen:

          this.comboBox1.DataBindings.Add(new System.Windows.Forms.Binding("DataSource", this.bindingSource1, "ValueList", true));
          this.comboBox1.DataBindings.Add(new System.Windows.Forms.Binding("SelectedItem", this.bindingSource1, "Value", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));

Es wird zuerst SelecteItem "datengebunden" und somit auch zuerst aktualisiert, weshalt der gesetzte Wert nicht in der Auflistung (die noch nicht "datengebunden" wurde) enthalten ist und nicht ausgewählt werden kann.
[/EDIT]

Gruß
Juy Juka

23.06.2009 - 16:20 Uhr

Hallo andrgrau,

Hier für wäre ein neuer Thread nicht schlecht, da es ja ein konkretes neues Problem ist. [EDIT=herbivore]Siehe .Netz gepackte EXE: dll dynamisch laden[/EDIT]

Hast du schon versucht einfach das Programm selbst auch mit zu durchsuchen, vielleicht können die mit ,Netz eingebundenen Typen ja so gefunden werden (ich hab nie mit .Netz gearbeitet).

Gruß
Juy Juka

23.06.2009 - 15:42 Uhr

Hallo herbivore,

... dass dies das falsche Kriterium ist und das richtige Kriterium (Zustand vs. Verhalten) genannt.

Oh man! an den Kopf lang Ja, vor lauter Feinheiten das wichtigste Vergessen.

Bei den Nebenefekkten muss ich wiedersprechen. Ein Event auszulösen ist Grundsätzlich kein (ernst zu nehmender) Nebeneffekt und was die EventHandler machen kann die Klasse ja schlecht beeinflussen. Sollte die Klasse jedoch selbst einen EventHandler registrieren oder gar im Property etwas machen ist das fragwürdig.

Gruß
Juy Juka

23.06.2009 - 11:36 Uhr

Hallo herbivore,

Hat hier jemand von einer Wahlmöglichkeit gesprochen? Wir haben besprochen wann man ein Property und wann eine Methode implementiert.
Bitte lies die Posts noch mal durch und sag uns(mir) genau, was man falsch verstehen könnte.

Ach ja, hab folgende Seite beim blättern in der neusten Version von den Entwurfsrichtlineine gefunden, womit jede diskusion zu Punkt 1 eigentlich erledigt ist:
Auswählen zwischen Eigenschaften und Methoden ((Eigenschaft=Property)

Gruß
Juy Juka

22.06.2009 - 15:30 Uhr

Hallo andrgrau,

Immer den gleichen Namen zu verwenden ist schlecht. Man soll die Tests ja unterscheiden können und so.
Mir fallen zwei bessere Lösungen ein:

  1. Alle Assemblies im Ausführungsverzeichnis (auch sich selbst) durchsuchen und alle Typen die von einem interface (ITest) oder einer bestimmten Klasse (TestUserControl) erben instanziieren. Falls man mehr als eine Instanz erschafft, muss man alle dem User anzeigen (ein Name-Property nicht vergessen) und er eines auswhälen. Wenn man nur einen findet fällt das natürlich weg.
  2. Über ein Konfigurationsdatei den AssemblieQualifiedName des auszuführenden Tests an das Framework übergeben (Activator.CreateInstanc(Type.GetType("..."),new object[]{})).

Falls noch zeit bleibt solltest du auf jeden fall noch versuchen UI und Test/BL auch für die Test trennen, so dass man ein allgemeinen Steuerelment hat (z.B. mit PropertyGrid) und wenn man will ein eigenes Entwerfen kann.

Ansonsten finde ich das Framework so weit gut, nicht zu viel und nicht zu wenig.

Gruß
Juy Juka

22.06.2009 - 09:23 Uhr

Hallo Gepro,

zu 1) Man verwendet ein Propety (egal ob man get und/oder set benötigt) immer dann, wenn man schnell genug darauf zugreifen kann, dass es sich nicht lohnt den Rückgabewert des Properties zu speichern. Dauert der Zugriff auf die Information jedoch länger (z.B. muss man aufwändige Berechnungen durchführen) und sollte man die Funktion/Methode nicht so oft aufrufen und das Ergebnis besser speichern (variable), so verwendet man eine Methode.
Für Initalisierungs-Aufwand ist die Regel noch etwas feiner: ist der erste Zugriff langsam, die Folgenden jedoch schnell, verwendet man das Property.

zu 2) Man sollte so gut wie nie statische Member verwenden. Ein Singelton ist viel besser (habe ich gelernt), da man hier noch alle Vorteile von Objektorientierung hat. Im Zweifelsfall ist aber auch vom Singelton noch abzuraten.

Ein eventuell guter Link könnten für die Entwurfsrichtlinien für die Entwicklung von Klassenbibliotheken sein. (Wenn hier jemand den Link für die aktuellere Version findet, immer gerne her damit.

Gruß
Juy Juka

20.06.2009 - 22:35 Uhr

Hallo bonzy,

gern geschehen.

Gruß
Juy Juka