Entwickler-Ecke
Basistechnologien - Textfeld aus anderer Klasse herraus akualisieren
HoPPeL - Sa 05.03.11 16:19
Titel: Textfeld aus anderer Klasse herraus akualisieren
Hiho,
habe ein kleines Problem, und zwar habe ich in einer separaten Klasse eine Variable, die sich gelegentlich ändert.
nun würde ich diese Varaible gerne in der mainform in ein label schreiben. Aber wie mache ich das, dass wenn sich die Varaible ändert auch mein labelinhalt ändern? Würde mich auch über einen Codeschnippsel freuen...
mfg
HoPPeL - Sa 05.03.11 16:41
danke für die schnelle hilfe, werde mir das gleich mal zu gemühte führen :)
HoPPeL - Sa 05.03.11 23:16
habe mir jetzt mal mit den events die zeit um die ohren geschlagen, komm aber einfach nicht aufn den trichter, wie ich das jetzt umsetzen muss... habe jetzt einfach mal in meine klasse
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| public event EventHandler MyEvent;
protected virtual void OnMyEvent(EventArgs e) { EventHandler myEvent = MyEvent; if (myEvent != null) { myEvent(this, e); } }
public void DoSomething() { OnMyEvent(EventArgs.Empty); } |
und in die form
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| public Form1() { InitializeComponent(); Operations.MyEvent += Operations_MyEvent; Operations.DoSomething(); }
public static void Operations_MyEvent(Object objSender, EventArgs e) { MessageBox.Show("myObject_MyEvent (" + objSender + ", " + e + ")"); } |
kopiert... weiß abernun nicht weiter, wie muss ich dass ganze denn nun anpassen, wenn ich den wert von z.B
immer aktuell ins label in der Form geschrieben habe möchte, ohne dass ichirgendwas klicke?!
vllt muss ich einfach mal ne mütze schlaf nehmen und dann morgen in alle ruhe gucken, wäre aber für hilfe super dankbar
mfg
jaenicke - So 06.03.11 06:24
Du gibst den Wert in deinen EventArgs (also entsprechend von dir geschrieben) mit und hast den so immer direkt topaktuell im Eventhandler. ;-)
Th69 - So 06.03.11 12:14
Hallo HoPPeL,
durch die Umsetzung des Codes nach HTML hatte ich leider vergessen, die < und > zu maskieren, daher wurden sie nicht korrekt dargestellt.
Ich habe nun den Artikel korrigiert - bitte schau dir das Beispiel nochmal an.
Entscheidend ist nun die Verwendung von EventHandler<TextEventArgs> (ansonsten hätte die Definition dieser Klasse TextEventArgs ja auch keinen Sinn gemacht).
Du bist ansonsten aber auf dem richtigen Weg und nach der Änderung müßte es dann auch bei dir funktionieren. Wenn du dann noch weitere Daten übergeben willst, dann fügst du einfach der Klasse TextEventArgs weitere Eigenschaften hinzu.
Sorry für den Fehler ;-)
HoPPeL - So 06.03.11 21:48
nochmals danke für die hilfe!
aber langsam komm ich mir dumm vor... irgendwie ist mein Kopf zu :(... habe jetzt meinen Code ein bissle angepasst:
in meiner Klasse
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| public event EventHandler updateLabel;
public void sendRange() { updateLabel(this, new EventArgs());
if (updateLabel != null) { double[] textX = SelectActorX.GetXRange(); string Text = textX[0].ToString(); } } |
und in der Form dann
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| private void label1_Click(object sender, EventArgs e) { Operations.updateLabel += new EventHandler(Operations_updateLabel); Operations.sendRange(); }
void Operations_updateLabel(object sender, EventArgs e) { label1.Text = e.ToString(); } |
soweit weit klappt das natürlich, nur das wenn ich aufs label klicke da halt system.eventargs steht... was sollte da auch anderes stehen... komm irgendwie nicht darauf klar, jetzt den Wert der Varibale mit reinzupacken :/
mfg
jaenicke - So 06.03.11 21:51
Ich würde sagen du musst eine eigene EventArgs-Klasse erstellen. Schau dir einfach einmal die Mausereignisse z.b. des Formulars an. ;-)
HoPPeL - So 06.03.11 23:44
so hab jetzt mal alles 1zu1 kopiert.... wenn ich auf das label klick müsste doch theoretisch "test" erscheinen...
tuts aber nicht :(
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| public class TextEventArgs : EventArgs { public TextEventArgs(string text) { Text = text; }
public string Text { get; set; } } |
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| public class TerrainOperations {
public event EventHandler<TextEventArgs> UpdateText;
protected virtual void OnMessage(TextEventArgs e) { if (UpdateText != null) { EventHandler<TextEventArgs> ev = UpdateText; if (ev != null) ev(this, e); } }
public void updateLabel() { double[] textX = SelectActorX.GetXRange(); OnMessage(new TextEventArgs("test")); } |
form:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| private void label1_Click(object sender, EventArgs e) { Operations.UpdateText += new EventHandler<TextEventArgs>(Operations_UpdateText); }
void Operations_UpdateText(object sender, TextEventArgs e) { label1.Text = e.Text; } |
jaenicke - So 06.03.11 23:55
HoPPeL hat folgendes geschrieben : |
wenn ich auf das label klick müsste doch theoretisch "test" erscheinen... |
Warum?
Ich sehe nirgends, dass du updateLabel aufrufst, du fügst nur den Eventhandler hinzu, aber solange der nicht aufgerufen wird, passiert auch nix.
HoPPeL - Mo 07.03.11 00:58
ja stimmt, dass hatte ich vergessen... :oops:
eine abscließende Frage hätte ich jetzt noch, wie muss ich es machen, damit das Label bei jeder Änderung von "RangeX" aktualisiert wird, und ich nicht immer irgendwas klicken muss oder so ?
mfg und viele Dank für eure Geduld
jaenicke - Mo 07.03.11 01:35
Dort, wo RandeX geändert wird, musst du das Event auslösen, sei das ein Setter oder was auch immer.
HoPPeL - Mo 07.03.11 12:39
hmmm das sind so meine beinde Problemkinder gewesen Events und set/get..
steh also schon wieder ein bisschen aufm Schlauch...
habe also in meiner Klasse " Operataions"
mehrere Methoden, die durchaus auf RangeX Einfluss nehmen könnten
ich weiß absolut nicht wo ich das in der Form hinschreiben muss, da wenn ich event in einem button aufrufe ich den ja immer klicken muss
private void button1_Click(object sender, EventArgs e)
{Operations.UpdateText += new EventHandler<TextEventArgs>(Operations_UpdateText);
Operations.updateLabel();}
was muss ich jetzt überhaupt mit set versehen? ja sicher irgendwas in der mainform?
mfg
jaenicke - Mo 07.03.11 13:03
HoPPeL hat folgendes geschrieben : |
habe also in meiner Klasse " Operataions"
mehrere Methoden, die durchaus auf RangeX Einfluss nehmen könnten |
Und genau dort, wo du das änderst, musst du auch das Event auslösen. Wobei du aufpassen musst, dass du nicht dadurch wiederum etwas änderst, so dass das ganze immer hin- und hergeht.
HoPPeL - Mo 07.03.11 13:31
ich glaub ich gebs auf irgenwie komm ich da einfach nicht hinter...
wie soll ich denn jetzt das event in meiner klasse aufrufen?
UpdateText +=new EventHandler<TextEventArgs>(UpdateText);
oderwie?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!