![]() |
[C#] Neuer Delegat und falscher Parameter?
Hi,
folgende Aufgabenstellung: Pseudocode:
Code:
Problem:
foreach MyObject Element in Liste
{ Erstelle neuen Menüeintrag mit Element.Name; Neuer Menüeintrag.OnClick = new Eventhandler( delegate(object sender, EventArgs e) { MessageBox.Show(Element.Id); } ); } Alle Menüeinträge zeigen zwar eine Messagebox, aber in der steht immer die Id des letzten durchlaufenen Elements und nicht die Id des Elements, das eigentlich angezeigt werden sollte. |
Re: [C#] Neuer Delegat und falscher Parameter?
Zitat:
wie weit ist denn überhaupt sichergestellt, dass die Liste korrekt gefüllt wurde? Hast Du das mit einem Debugger geprüft? Ich meine wenn die immer die ID des Vorgängers zeigen, was ist mit der ersten Message? Keine ID oder eine Falsche/Unerwartete? Gruß Der Unwissende |
Re: [C#] Neuer Delegat und falscher Parameter?
Ja, die Liste ist korrekt gefüllt.
Beim debuggen wird für die einzelnen Elemente auch die korrekte Id und der korrekte Text für den Menüeintrag angezeigt. Ich tippe einfach mal darauf, dass der delegat den ich Erzeuge eine Referenz auf MyObject erhält - und die dann beim weiteren durchlaufen eben diese ausgetauscht wird. Nur wenn dem so ist, dann dürfte das ja auch mit jedem anderen Objekt passieren. Wie bekomme ich nun einen String in die anonyme Methode rein, der dann statisch bleibt? |
Re: [C#] Neuer Delegat und falscher Parameter?
Zitat:
Mal ganz einfach gesagt, wie würdest Du das denn in Delphi lösen? Du würdest doch auch nicht in einer OnClick-Methode (annonym oder nicht) auf eine Variable zurückgreifen, sondern den Sender auswerten, hier musst Du nichts anderes tun!
Code:
Bei den äußeren Klammern des Castings bin ich mir nicht sicher ob Du sie brauchst oder ob es dann schon die Eigenschaft ID gibt.
delegate(object sender, EventArgs e)
{ MessageBox.Show(((MyObject)sender).Id); } ); } Gruß Der Unwissende |
Re: [C#] Neuer Delegat und falscher Parameter?
Der Sender ist das Toolbar-Item, und das hat nirgendwo die Id des Elements in der Liste.
Ich will aus Performancegründen vermeiden, dass ich bei jedem OnClick erstmal den Namen des Elementes vom Sender auslesen muss, in der Datenbank nach der passenden Id suche und dann weitermache. Und die Id kann ich auch nicht auf das Toolbaritem setzen, weil das Interface welches mir das Item letzlich erzeugt sowas nicht vorsieht und das auch nicht ohne weiteres geändert werden kann. Zudem kann der Name zweideutig sein - und dann hab ich ein massives Problem das richtige Element zu finden. |
Re: [C#] Neuer Delegat und falscher Parameter?
Zitat:
Zitat:
Ist das mit dem Array nicht möglich (z.B. weil sich die Positionen ändern können), dann kannst Du alternativ auch auf die Hash-Funktion des Objekts zurückgreifen. Was auch immer angeklickt wird, lässt sich (afaik) über das Eventarg ermitteln. Dieses Objekt hat einen Hash und es gibt bestimmt auch eine HashMap. Auch damit hast Du eine eindeutige Zuordnung, die nicht über den Namen sondern über das ausgewählte Objekt läuft und mit einer ID fest verknüpft werden kann (Änderungen bleiben natürlich auch möglich). |
Re: [C#] Neuer Delegat und falscher Parameter?
So müsste es funktionieren. Dann wird für jeden Schleifendurchlauf eine neue id erstellt. Bei den anonymen Methoden ist wichtig wo die Variable deklariert wurde.
Code:
foreach MyObject Element in Liste
{ Erstelle neuen Menüeintrag mit Element.Name; int id=Element.Id; Neuer Menüeintrag.OnClick = new Eventhandler( delegate(object sender, EventArgs e) { MessageBox.Show(id); } ); } |
Re: [C#] Neuer Delegat und falscher Parameter?
Meine Id ist zwar ein String, aber wenn ich das so mache und vorher einen neuen String deklariere passt das.
Okay, ich sollte mir die Sache mit dem Scope bei anonymen Methoden nochmal genauer angucken. Danke :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz