Laden...

Forenbeiträge von syn87 Ingesamt 87 Beiträge

22.05.2009 - 17:48 Uhr

Wenn ich beim deserialisieren den Typ der Objekte nicht kenne, werden daraus XMLNode[] Objekte.

22.05.2009 - 17:34 Uhr

class SettingsCollection
{
        [XmlElement("Settings")]
        public List<object> objs = new List<object>();

        [XmlIgnore]
        protected List<Type> types = new List<Type>();

        public void Save()
        {
            XmlSerializer serializer = new XmlSerializer(this.GetType(), types.ToArray());
            FileStream fs = new FileStream("configs\\settings.xml", FileMode.Create);
            serializer.Serialize(fs, this);
        }

        public bool Register(object o)
        {
            Type t = o.GetType();
            if (types.Contains(t))
                return false;

            objs.Add(o);
            types.Add(t);
            return true;
        }
}

Der Output sieht dann z.b. so aus:


<?xml version="1.0"?>
<SettingsCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Settings xsi:type="MainFormSettings">
    <Kuuuh>kuscheln</Kuuuh>
  </Settings>
</SettingsCollection>

Gruß,

Matze

22.05.2009 - 04:08 Uhr

Hallo und Tag,

ich bin zur Zeit etwas im Bereich "Verteilte Anwendungen" tätig.

Plugins können ein Objekt zur Speicherung anmelden:


SettingsRegister(object o);

Das Objekt wird dann automatisch beim Beenden der Anwendung zusammen mit allen anderen Settings in einer datei gespeichert.
Soweit klappt das auch alles ganz gut und er legt die XML-Datei korrekt an.
Ein Problem besteht momentan noch in der Deserialisierung der Objekte. Nach Start der Anwendung melden sich die Plugins zeitversetzt an. D.h. insbesondere, dass ich die Typdefinitionen nicht sofort zur Verfügung habe. Resultat dessen ist, dass alle Objekte, die mit SettingsRegister angemeldet wurden, nun zunächst als XMLNode[] vorliegen. Nun kommt die Frage: Kann man einen XMLNode nachträglich deserialisieren?

Meine momentane Lösung besteht darin, die XML-Datei erneut einzulesen, wenn das Plugin nach seinem Objekt fragt:


SettingsFetch(Type t);

Denn dann habe ich die Typdefinition und kann das Objekt finden. Nicht schön, aber selten.

Wäre schön wenn jemand eine Idee hätte.

Gruß,

Matze

07.05.2009 - 17:27 Uhr

Versteh mich jetzt nicht falsch. Ich moechte nicht dass ihr mir gleich die Lösung nennt (auch wenn das antuerlich schoen waere). Es geht mir eher um die Frage des Designs meines UserControls.

07.05.2009 - 17:08 Uhr

Ich hab das ganze einfach mal angehangen. Momentan beschränkt es sich auf die obere Positionbar und die Linke ResizeBar.

07.05.2009 - 17:05 Uhr

Hi,

im Moment beschränkt sich das Vergrößern/Verschieben des Controls ausschließlich auf die Berechnung von Location und Size. Alle Elemente innerhalb des COntrols sind per Anchors positioniert, sodass sie z.b. innerhalb des Controls immer rechts/oben/links bleiben. Für das selber zeichnen haette ich im ersten Moment keine wirkliche Idee, zumal fuer mich wie gesagt die Wiederverwendbarkeit im Vordergrund steht.

Gruß

Matthias

07.05.2009 - 16:57 Uhr

Hallo Jungs,

nicht gleich in Panik ausbrechen. Ich hab das Forum schon durchsucht 😃 Es geht um folgendes: Ich bin gerade dabei ein neues UserControl zu entwerfen. Im Wesentlichen soll es aehnlich aufgebaut sein wie ein Sequencer aus dem Musiktool Bereich (z.b. "Cool Edit"). Dabei sollen die einzelnen Frames beliebig verschiebar und auch größenänderbar sein. Nun gestalte ich mein UserControl sehr frei. Das heisst man kann von einer Klasse FrameBase erben, die man dann selber im Designer vervollstaendigen kann. Weiterhin besitzt FrameBase verschiedene Properties, die mir jeweils die Controls für das Verschieben und das Vergrößern/Verkleinern liefern. Ich setze die MouseDOwn/Up/Move Events also erst später im eigenen Control. Das Verschieben klappt wunderbar und großteils auch flackerfrei, aber das Vergrößern macht Probleme. Ich hab jetzt schon viele Beiträge gelesen zum Thema flackerfrei etc. allerdings laufen diese meines Erachtens nach immer auf eigenes Zeichnen hinaus. Für potentielle Nutzer meines UserControls wäre das natuerlich nich so schoen, da man das ganze dann nich mehr ueber den Designer entwerfen koennte. Könnt ihr mir ausser DoubleBuffered etc. noch weitere Tipps geben?

Gruß

29.08.2008 - 11:33 Uhr

dankeschoen 🙂

28.08.2008 - 21:13 Uhr

Es kennen sicher einige von euch das Feature der Databindings. Man uebergibt ein Objekt, dessen Eigenschaft man mit einer anderen Eigenschaft verbindet.

Dabei ist die Eigenschaft jeweils durch einen String gegeben.

listview.Bindings.Add(new Binding("Text", kunde, "Name");

ist jetzt nur ausm Kopf geschrieben. Auf jeden fall korrospondieren die Eigenschaften Text von Listview und Name von Kunde.

NUN DIE FRAGE:

Wie kann man selbst über einen gegebenen String auf ein Property zugreifen?

Danke im voraus 🙂

28.08.2008 - 13:07 Uhr

Nach etwas aehnlichem hab ich genau gesucht! Ich habs u.a. mit Application.DoEvents() probiert und dachte, dadurch kommt das zweite Feuern vllt eher dran, aber nix wahr 🙁

Ich probiers nachher aus und meld mich dann nochmal 🙂

28.08.2008 - 12:24 Uhr

Also ich habs ausprobiert und es zeigt noch nicht den gewuenschten Effekt.

Sowohl ItemSelectionChanged als auch SelectedIndexChanged feuern beim Wechsel eines Elements 2 mal. Dabei signalisieren sie zuerst den Zustand, dass kein Item selektiert ist und beim naechsten Feuern dann das ausgewählte. Folge ist, dass meine Groupbox flackert, da ich sie deaktivieren moechte falls kein Element ausgewählt ist. Die Prüfung auf SelectedItems.Count > 0 verwende ich bereits!

Gruß

28.08.2008 - 11:53 Uhr

thanks for your guidance 🙂 ich werds gleich ausprobieren.

Gruß

syn87

28.08.2008 - 02:56 Uhr

Hallo zusammen,

wiedermal eine Frage bzgl der (fuer mich) verwirrenden Events. Ich hab schon ein bisschen rumgelesen und grundlegend kann ich ja verstehen, dass es so gemacht wurde. Allerdings hab ich zeitweise erhebliche Probleme wenn das ItemSelectionChanged-Event beim wechsel der selektion 2 mal feuert.

Szenario in meinem fall:
ich habe eine Listview und eine eigenschaftsgroupbox. ist ein element selektiert soll die groupbox enabled sein, ansonsten disabled. vllt kann man sich jetzt schon denken, dass beim selektionswechsel die groupbox kurz flackert weil sie halt kurz auf disabled gesetzt wird. meine einzige loesung besteht darin mit dem ersten feuern einen timer zu starten, der dann kurz danach nochmal auf listview.SelectedItems.Count > 0 prueft.

LG

syn87

30.07.2008 - 23:51 Uhr

Nein, ich glaube du hast das nicht ganz verstanden.

DataSource bleibt immer gleich. Nur der ausgewählte Text/Value soll korrekt uebermittelt werden.

Gruß

30.07.2008 - 23:35 Uhr

Hat denn niemand eine Idee? Ums nochmal kurz zu formulieren:

ComboBox ist an eine Liste gebunden mit Valuemember (positive ganze zahl) und displaymember (strassennamen).
Weiterhin moechte ich die Auswahl der ComboBox binden. Im falle der auswahl eines Items soll value in die variable eingetragen werdne. Wird jedoch eine nicht vorhandene Auswahl getroffen (Leeres Feld / Neues Item), dann soll die gebundene Variable 0 werden.

gruß matze

30.07.2008 - 11:19 Uhr

Hallo Leute.

Langsam weiß ich mir mit folgendem Problem nicht mehr zu helfen. Vllt und wahrscheinlich mach ich irgendetwas falsch.

Ich habe DataSource der ComboBox an eine Liste gebunden. Value und Display sind jeweils strings. (Bis hierhin muesste auch alles funktionieren)

Die Auswahl der ComboBox wollte ich nun an eine Eigenschaft binden.

new Binding("SelectedValue", kunde, "Strasse")

In der Liste sind also sehr viele Strassen. Die Value gibt mir dabei die ID aus. Wenn ich nun die Daten kontrolliere, die meine Variable durch das Binding erlangt, dann stimmen diese Werte nicht. Es ist nämlich so, dass gerade in dem Fall, dass ich ein Item auswähle, welches keine Value hat (also eine eigene Eingabe), das schreiben von Strasse nicht ausgeführt wird. Ebenso verhält es sich bei mir mit den Events SelectionChanged (ist vorher ein Item ausgewaehlt, und ich gehe rein und loesche es, so wird das event nicht ausgeloest).

Gruß Matze

19.06.2008 - 09:48 Uhr

Geht das auch mit C#? Denn es soll C#(!) in C++ eingebunden werden und nicht umgekehrt.

19.06.2008 - 09:42 Uhr

Naja es soll gewissermaßen Zeigen mit welchen Hürden ich fertig werde (denke ich). Nebenbei ist die aktuelle Entwicklung ebenfalls auf diesem Level.

Zurueck zum Problem: Dafür 2 verschiedene Projekte machen kommt mir schon sehr sinnvoll vor, da ich nämlich keine Fremden Codedateien in das jeweils andere Projekt packen kann (C# -> C++ und umgedreht). Wie allerdings füge ich Eventhandler und aehnliches zur GUI hinzu? Und ueberhaupt: Wie bette ich das C# Panel in ein C++ Fenster ein?

19.06.2008 - 09:36 Uhr

Hallo,

als Einstieg in einen Nebenjob hab ich u.a. die Aufgabe bekommen, eine GUI in C# zu schreiben bei der ich die Events allerdings in C++ programmiere.

Bei der Befragung von Google ist mir nix brauchbares untergekommen. Vllt kann mir einer von euch ein besseres Stichwort nennen oder direkt helfen.

Genauer Wortlaut:

"Das C# Panel soll reine GUI ohne Logik sein. Im C++ Fenster sollen einige Buttons im C# Panel mit EventHandler versehen werden, die Aktionen ...."

Lg

19.06.2008 - 09:05 Uhr

Zu meinen oben genannten vorstellungen: Man könnte ja auch auf Basis des Mainboards eine Registrierung vornehmen. Dies wird für gewöhnlich nicht so oft ausgetauscht. Sollte dies trotzdem passieren kann man immernoch bei der Hotline anrufen. Ich möchte an der Stelle auch nochma sagen, dass so ein System natuerlich nur bei Software mit hohen Entwicklungskosten Sinn macht (was natürlich mit der Qualität der Software einhergeht). In Anbetracht dessen halte ich es fuer einen vertretbaren Kopierschutz.

19.06.2008 - 01:41 Uhr

Das Thema liegt nun schon eine Weile zurück, aber ich möchte dennoch meine Vorstellungen von einem nutzbaren System andeuten:

  1. Aktivierungsschluessel eingeben (brauch garnicht SO lang sein)

  2. Anfrage mit Schlüssel an den Produkthersteller

  3. Identifizierung des Rechners über die MAC Adresse oder irgendetwas anderes Rechnerspezifisches

  4. Assoziation Key - Rechner in Datenbank speichern

Sollte eine Installation fuer einen neuen Rechner angefordert werden, so kann man diese gleich abweisen. Unter anderem übersteht dieses System auch das Formatieren des Rechners (dies ist der Grund, weshalb ich viele Schlüsselverfahren so scheisse finde). Sollte dennoch eine Neuinstallation (vllt auf einem neuen Rechner) noetig sein. So könnte man beim hersteller anrufen und dies anfordern.

Kritik dennoch erwuenscht

11.06.2008 - 20:01 Uhr

Eine Eigenschaft wird an den Text einer Textbox gebunden. Die Eigenschaft wird allerdings erst beim Verlassen der Textbox gesetzt. Jedenfalls habe ich dieses Verhalten beobachtet, nachdem ich einen Thread gestartet habe, der mir alle 5 Sekunden das Objekt in der Console anzeigt.

Dieses "Verlassen des Textfeldes" wird in einem Fall nicht getriggert. Nämlich wenn ich in dem Textfeld bin und Strg+S drücke (für diese Tastenkombination ist eine Aktion im MDI Fenster vereinbart). Falls dieser Eventhandler Relevanz enthaelt (was ich nicht glaube), hier einmal kurz aus dem Kopf ein bisschen Pseudocode dazu:


Key_Down {
  if (KeyData == Strg + S && activeMDIChild is saveable) {
    // Saveable ist ein Interface mit der Funktion save()
    if (MessageBox("Daten sichern?").ShowDialog() == DialogResult.Yes)
        ((Saveable)activeMDIChild).save();
  }
}

Ich hoffe die Sache ist jetzt etwas klarer.

Danke im Voraus.

10.06.2008 - 16:32 Uhr

Hi Leute,

seit kurzem nervt mich eine kleine Eigenheit des DataBindings. Angenommen ich habe eine ComboBox. Der ausgewählte Text ist an die Eigenschaft eines Objektes gebunden. Soweit funktioniert alles korrekt. Jedoch habe ich im MDI Parent ein KeyPreview für Strg+S eingerichtet, die die save() Prozedur vom jeweiligen Child aufrufen soll. Durch diese Vorgehensweise verlasse ich die ComboBox. Jedoch wird der Text vom DataBinding nicht mit der Anzeige synchronisiert. Die Anzeige hat beinhaltet nämlich das ausgewählte Element. Im Objekt steht etwas vollkommen anderes.

Jemand eine Idee?

Gruß

25.05.2008 - 23:23 Uhr

Ok danke.

Vllt findet sich noch jemand, der was zum eigentlichen Problem sagen kann.

25.05.2008 - 22:46 Uhr

Ich hab leider noch nix von DataTable gehoert. Aber ich denke du gehst davon aus, dass das Program Zugriff auf die DB hat, was jedoch nicht so ist. Die Daten werden vom Server abgerufen und jede Zeile wird mittels eines Objekts folgender Klasse gespeichert


    [Serializable]
    public class Row
    {
        Dictionary<string, string> row;

        public Row()
        {
            this.row = new Dictionary<string, string>();
        }

        public string this[int key]
        {
            get
            {
                int i = 0;
                foreach (string k in row.Keys)
                {
                    if (i == key)
                        return this[k];
                    i++;
                }
                return "";
            }
        }

        public string this[string key]
        {
            get
            {
                return row[key];
            }
            set
            {
                row[key] = value;
            }
        }

        public bool ContainsKey(string k)
        {
            return row.ContainsKey(k);
        }

        public Dictionary<string, string>.KeyCollection Keys
        {
            get
            {
                return row.Keys;
            }
        }
}

und danach zu einer List zusammengefasst. Um die Netzwerklast zu minimieren, koennen verschiedene Listen von Rows synchronisiert werden. Aendert sich zum Beispiel die Ort Tabelle, so wird diese Liste neu verschickt. Deshalb ist der Typ beim uebertragen (List<Row>) auch nicht mehr aenderbar... (zumindest nach meinem momentanen stand) ... ja is schon kompliziert 🙁

25.05.2008 - 21:42 Uhr

ja das mit dem control hab ich leider vergessen. in meinem fall handelt es sich um eine combobox.

meine idee ( um nochmal darauf zu sprechen zu kommen ) war es, fuer alle moeglichen db tabellen einen typ zu erstellen, der die Row Klasse im grunde nur um 2 Eigenschaften erweitert (zur laufzeit). naemlich display und value (was man zum binden der liste ja braucht) eigenschaft.

meine momentane idee geht in die richtung, dass ich fuer alle moeglichen feldnamen eine eigenschaft in der Row Klasse anlege. zb.

public string ORT_ID { get { return this["ORT_ID"]; } }

gefaellt mir allerdings auch nicht so sehr. es ist schade dass man beim datasource binden keine funktionen mit parameter uebergeben kann 🙁 oder geht das vllt doch? hab es bisher nur mit eigenschaften gesehen.

lg matze

25.05.2008 - 19:20 Uhr

Hallo Jungs,

ich hab mal wieder ein kleines Problem beim programmieren meiner Server-Client Anwendung.

Der Client bekommt vom Server ein List<Row> Element. Row ist ein selbst erstellter Datentyp, der eine Antwortzeile der Datenbank repräsentiert.

Bei SELECT NAME, VORNAME FROM KUNDE hab ich also eine Liste von Rows, die über this["NAME"] und this["VORNAME"] die jeweiligen Daten returnen (alternativ auch this[0] und this[1]).

Wo ich jetzt Probleme habe ist beim DataSource anlegen. Im grunde genommen wäre es so, dass ich pro DB Table eine weitere Klasse anlege. Wie z.b.


class Ort {
public string Display { get { return this["ORT"]; } }
public string Value { get { return this["ORT_ID"]; } }
}

Dabei muesste Ort meiner meinung nach nur noch von Row erben und ich muesste die List<Row> auf List<Ort> casten. Geht jedoch nicht. Leider bin ich in dieser Idee relativ festgefahren und weiss nich so recht weiter. Eine neue Liste zu generieren kann ja auch nicht Sinn der Sache sein.

Hat jemand eine Idee oder anderen Ansatz?

Danke füers durchlesen und hoffentlich faellt jemanden was ein 🙂

20.05.2008 - 16:24 Uhr

Das heisst im Endeffekt ich muss die volle Funktionalitaet in die DLL schreiben?

20.05.2008 - 15:57 Uhr

Hallo Jungs,

ich hoffe der Thread sagt noch das nötigste aus. Wusste nicht so recht wie ichs beschreiben sollte.

Es geht darum dass ich eine Remoting.dll habe, die der Server sowie der Client als Assembly Verweis besitzen.

In der Remoting.dll gibt es eine serialisierbare Klasse Data. Diese möchte ich mit dem partial Schlüsselwort versehen, um sie auf Server und Client Seite einzeln zu erweitern. Die Idee dahinter ist, dass logischerweise der Server nur Setzen muss und der Client nur Lesen. Bzw gibt es auch noch weitere Methoden, die z.b. nur auf Server Seite zur Verfügung stehen sollen.

Bei einem kleinen Test musste ich allerdings feststellen, dass ich kein Zugriff auf die Methoden habe, die in der Remoting.dll vorhanden sind und umgekehrt.

Hat jemand eine Lösung parat bzw einen Tipp wie ichs besser machen kann?

Mfg

Matze

17.05.2008 - 16:04 Uhr

Ok ihr habt (natürlich) recht. Den Thread über die Controls hab ich auch gelesen. Aber manchmal sieht man den Wald vor lauter Bäumen eben nicht 🙂 Dank an euch beide.

17.05.2008 - 15:52 Uhr

Hallo Leute,

für eine Client-Server Applikation benötige ich eine Möglichkeit, ein bestehendes Form zu klonen. Hintergrund des ganzen ist, dass jedes verwendete Form innerhalb der Anwendung beim start geladen wird. Gleichzeitig werden auch diverse Felder mit Daten gefüllt, die vom Server kommen. Um also Datentransfer einzusparen, möchte ich z.b. ein "Kunde Anlegen" Form klonen, ohne das urspruengliche Form (das am anfang geladen wurde) zu veraendern. Kann mir vllt jmd helfen bzw eine Idee geben?

Mfg Matze

14.05.2008 - 00:53 Uhr

wenn ich in die combobox reinklicke und die pfeiltasten benutze, geht er die einzelnen eintraege durch. die items fuege ich ueber Items.Add(...) hinzu.. also was soll jetz falsch sein?

10.05.2008 - 23:17 Uhr

Hallo an alle,

normalerweise kennt man von solchen Dropdown Feldern ja die Eigenschaft, dass man sich alle bereits verfuegbaren Eintraege anzeigen lassen kann (dropdown eben). in meinem fall klappt das aber nicht mehr. es gibt zwar eintraege, die er auch versucht zu vervollstaendigen (autocomplete), aber ich kanns nich aufklappen.

zur info, es ist ueber ein großes usercontrol erst zum form hinzugefuegt worden zur laufzeit un hat die flat eigenschaft (sollte nich relevant sein, aber ich sags trotzdem mal dazu 🙂

mfg matze

24.04.2008 - 14:05 Uhr

Hi el_zorro_100,

was du geschrieben hast klingt ja schonmal sehr gut (CAO) eine solche Beschreibung hab ich vorher noch nicht gefunden.

Hat vllt noch jemand gute Links, die sich mit dieser Methode beschaeftigen? Fuer mich waere auch interessant, ab wann ein CAO zerstoert wird.

Lg

24.04.2008 - 00:17 Uhr

Die Identifizierung soll aber ueber die Datenbank Accounts erfolgen. Andererseits wäre es sicherlich garnicht so schwer. authentication mode oder sowas... ich habs bei msdn gelesen.... aber wie gesagt, das wichtige ist
*Objektgedaechtnis *Verknuepfen eines Clients mit einem Datenbank Account

mfg

24.04.2008 - 00:02 Uhr

Hi Xynratron,

es geht nicht nur um die Datenbank. In der alten Version der Software war diese schon auf einem Server bereitgestellt. Das Ziel jetzt ist es, den Client und den Server unabhaengig voneinander zu programmieren und weiterhin ein 3 Schichten Modell einzufuehren. Also GUI, Logik, Datenbank (aehnlich dem OSI-Modell).

Danke trotzdem 🙂

23.04.2008 - 23:14 Uhr

Hallo an alle erstmal, da dies mein erster Post ist.

Ich habe schon einiges aus dem Netzwerktechnologie Bereich gelesen. So richtig hab ich aber noch nichts gefunden, was auf mein Problem passt.

Es soll eine bisher clientseitige Anwendung umgestellt werden, sodass es eine zentrale Serveranwendung gibt, die Grundoperationen bereitstellt und ebenfalls mit der Datenbank kommuniziert.

Jeder Mitarbeiter hat einen Account der in der Datenbank hinterlegt ist. Operationen die innerhalb der Anwendung ausgefuehrt werden, sollen auch mit dem Benutzer verknuepft werden, der sie ausgeführt hat.

Sprich: Nutzer A meldet sich mit Benutzername und Kennwort an. Fuegt er einen neuen Kunden hinzu, soll auch seine BenutzerID mit in die entsprechende Tabelle geschrieben werden.

Mein momentaner Stand: Grundsaetzlich habe ich das Remoting fuer mich entdeckt. Da es den Transport komplexer Datentypen erlaubt. Ich habe dahingehend das Tool von Rainbird entdeckt. Wäre ja an sich eine tolle Sache. Allerdings stehe ich vor dem Problem, dass ich nicht weiss wie ich mir auf der Serverseite den jeweiligen Client merken soll (nachdem er sich angemeldet hat) bzw die bereitgestellten Dienste nur angemeldeten Clients erlaube.

Ich hoffe es findet sich jemand, der mir weiterhelfen kann 🙂

Mfg matze