Autor |
Beitrag |
HoPPeL
      
Beiträge: 51
|
Verfasst: Sa 05.03.11 16:19
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
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Sa 05.03.11 16:36
Hallo,
das Stichwort dafür lautet: Ereignis (bzw. Event).
Du definierst in deiner Klasse ein Event, abonnierst dieses von deiner Form aus und änderst dann in der entsprechenden Event-Methode das Label.
Du kannst dir mal meinen Artikel Kommunikation von 2 Forms durchlesen (bzw. den relevanten Abschnitt: Ereignisse).
|
|
HoPPeL 
      
Beiträge: 51
|
Verfasst: Sa 05.03.11 16:41
danke für die schnelle hilfe, werde mir das gleich mal zu gemühte führen 
|
|
HoPPeL 
      
Beiträge: 51
|
Verfasst: 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
C#-Quelltext
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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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 
      
Beiträge: 51
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 51
|
Verfasst: So 06.03.11 23:44
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 51
|
Verfasst: Mo 07.03.11 00:58
ja stimmt, dass hatte ich vergessen...
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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 51
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
Für diesen Beitrag haben gedankt: HoPPeL
|
|
HoPPeL 
      
Beiträge: 51
|
Verfasst: 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?
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 07.03.11 13:43
Hallo HoPPeL,
am besten, du liest dir mal selber die Grundlagen zu Ereignissen in einem Buch durch, z.B. im OpenBook "Visual C#": 5.2 Ereignisse eines Objekts
Du mußt einfach selber den Sinn dahinter verstehen, ansonsten bleibt es bei dir "ein Stochern im Nebel".
Und bei konkreten Fragen kannst du dich gerne hier wieder melden.
|
|