Laden...

Forenbeiträge von c#rookie123 Ingesamt 4 Beiträge

21.01.2014 - 11:37 Uhr

Hallo herbivore,

Danke für deine schnelle Antwort!
Ich möchte ein Rechteck verschieben, das mit Text gefüllt ist.
Die GraphicsPath-Klasse bietet ja die Möglichkeit, Strings oder Rechtecke zu zeichnen. Ich benötige wie gesagt, eine Kombination aus beiden, die ich dann verschieben kann.

Gruß,
c#rookie123

21.01.2014 - 09:11 Uhr

Hallo zusammen,

in Anlehnung an das [Tutorial] Gezeichnete Objekte mit der Maus verschieben habe ich noch eine folgende Frage:
Ich zeichne auf einem Panel.
Objekte werden auf ein Bild gezogen, um die Koordinaten auf diesem zu bestimmen.
Dieses Bild ist als Objekt einer von der GraphicsPath-Klasse abgeleiteten Klasse ebenfalls auf dem Panel gezeichnet, kann aber nicht verschoben werden.
Die Objekte, die ich auf das Bild ziehen möchte, sind im Moment strings.
Meine Frage: Gibt es eine Möglichkeit, einen Rahmen um diesen Text zu ziehen bzw. ein Rechteck mit Text zu füllen?

Ich freue mich auf eure Tipps und vielen Dank im Voraus! 🙂

Gruß,
c#rookie123

19.01.2014 - 00:57 Uhr

Hallo herbivore,

ein ganz herzliches Dankeschön! Das war der Anstoß, den ich benötigt habe. Die INotifyProptertyChanged hatte ich schon implementiert, aber es gab tatsächlich keine Trennung von Modell und GUI. Der HashSet war mir so nicht bekannt, evtl. kenne ich mich auch noch nicht gut genug bei MSDN aus.. Verwende jetzt die Dictionary<T>-Class und arbeite mit dem ListChange-Event, in dem ich die Validierung laufen lasse.
Nochmal Danke für den Input!

c#rookie123

17.01.2014 - 23:32 Uhr

Hallo zusammen,

erst einmal ein ganz großes Lob an euch! Ihr habt mir schon öfter weitergeholfen (-->c#ROOKIE123!), weswegen ich mich jetzt angemeldet und mich in der Hoffnung auf hervorragende Unterstützung an euch mit folgender Frage wende (ich hoffe, dass dies kein Doppelpost ist!).

Ich habe in einer WinForm eine ListBox und sechs TextBoxen. Diese sind wie unten beschrieben an eine BindingList gekoppelt, welche Objekte einer Klasse enthält. Über die TextBoxen werden die Attribute des selektierten Objekts gesetzt, die Navigation zwischen den Objekten (können manuell eingefügt oder importiert werden) läuft also über die ListBox.


 lB1.DataSource = GetObject();
 lB1.DisplayMember = "Name";
 lB1.SelectedIndex = 0;
 lB1.Focus();

 txt1.DataBindings.Add("Text", lB1, "Name");
 txt2.DataBindings.Add("Text", lB1, "Vorname");
 txt3.DataBindings.Add("Text", lB1, "Adresse");
 txt4.DataBindings.Add("Text", lB1, "Ort");
 txt5.DataBindings.Add("Text", lB1, "PLZ");
 txt6.DataBindings.Add("Text", lB1, "Staat");
...
private BindingList<Object> GetObject()
        {
            bindingList1.Add(new Object()
            {
                Name = Mustermann,
                Vorname = Max,
                Adresse = Musterstraße 1,
                Ort = Musterstadt,
                PLZ = 012345,
                Staat = Musterstaat,
                Alter = 123,
                Gewicht = 456
            });

            return bindingList1;
        }

Meine Aufgabenstellung: Ich möchte den Nutzer auf Duplikate in dieser Liste aufmerksam machen. Dafür sollen jeweils nur die einzelnen Attribute verglichen werden, es ist also nicht notwendig z.B. Namen und Vornamen gemeinsam zu untersuchen.

Meine Idee: Ein errorProvider soll - sofern ein Duplikat gefunden wird - das entsprechende Fehlerflag entsprechenden Textbox setzen. So wird dies in der ganzen Form schon für die Validierung des Textes und anderer Controls getan. Das Prüfen auf Duplikate soll am Besten bei Eingabe der Daten erfolgen bzw. beim Import, auf jeden Fall aber über einen entsprechenden Button. Untenstehender Code beschreibt die Suche nach Duplikaten, mit einer Schlossvariable sperre ich jeweils die entsprechende Variable, sofern ein Duplikat gefunden wurde (eigtl. wäre es aber auch interessant zu wissen, ob ein Duplikat öfter vorkommt)..

  for (int i = 0; i < bindingList1.Count; i++)
            {
                bool errSetName = false;
                bool errSetPLZ = false;
                bool errOrt = false;
                lB.SelectedIndex = i;

                for (int j = 0; j < i; j++)
                {
                    if (bindingList1[i].Name == bindingList1[j].Name && !errSetName)
                    {
                        errorProvider2.SetError(txt1, "Text");
                        errSetName = true;
                    }
                    else if (!errSetName)
                        errorProvider2.SetError(txt1, String.Empty);
                  //entsprechend für PLZ und Ort
                 }
               
                for (int j = i+1; j < bindingList1.Count ; j++)
                {
                    if (bindingList1[i].Name == bindingList1[j].Name && !errSetName)
                    {
                        errorProvider2.SetError(txt1, "Text");
                        errSetName = true;
                    }
                    else if (!errSetName)
                        errorProvider2.SetError(txt1, String.Empty);
                  //entsprechend für PLZ und Ort

Mein Problem: Es funktioniert nicht 🙂 Ich bin mir nicht sicher, in welchem Event ich die Funktion aufrufen soll, um automatisch bei Änderungen von Einträgen reagieren zu können, da ich ja jeweils den Index der ListBox ändere, um die entsprechenden Errorflags zu setzen. Dies führt wegen der Datenbindung ziemlich schnell zu einem StackOverflow. Es werden weiterhin die entsprechenden Errorflags des errorProviders jeweils für das letzte Objekt (sofern dies ein Duplikat ist) gesetzt, welches dann aber für alle Felder auftritt.

Meine Hoffnung: Dass ihr auf meinen Code schaut, wisst was man ändern kann und dies mir mitteilt.. 😉

In diesem Sinne, Danke im Voraus! Wenn ihr noch weitere Infos benötigt sende ich diese auch gerne.

Gruß,
c#rookie123