Laden...

StackPanel.Children.Remove entfernt kein Element und wirft keinen Fehler

Erstellt von ChrisProg vor 6 Jahren Letzter Beitrag vor 6 Jahren 5.185 Views
ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren
StackPanel.Children.Remove entfernt kein Element und wirft keinen Fehler

Hallo zusammen,

ich habe ein StackPanel, das ich folgendermaßen fülle:


Expander dynamicExpander = new Expander();
dynamicExpander.Header = "Test";
dynamicExpander.HorizontalAlignment = HorizontalAlignment.Left;
dynamicExpander.Background = new SolidColorBrush(Colors.Lavender);
dynamicExpander.Width = this.stackPanel1.Width;
dynamicExpander.IsExpanded = false;
dynamicExpander.Content = "Test2";

stackPanel1.Children.Add(dynamicExpander);

(das ganze natürlich mit mehreren unterschiedlichen Childs)
wenn ich nun ein bestimmten Child löschen möchte, so sollte es doch eigentlich mit


foreach (UIElement child in this.stackPanel1.Children)
{
     if (((HeaderedContentControl)((child as FrameworkElement))).Header.ToString().Trim()) == "Test"
     {
            this.stackPanel1.Children.Remove(child);
            break;
      }
}

aber leider wird nichts gelöscht 🤔

auch ein

this.stackPanel1.Children.Clear()

lösch kein einziges der Objekte ...

Was mache ich falsch ?

MfG ChrisProg

5.299 Beiträge seit 2008
vor 6 Jahren

ich denke, der Code wird nicht durchlaufen, oder er berbeitet ein anderes StackPanel als was du denkst - also das wären Erklärungsmöglichkeiten.

Der frühe Apfel fängt den Wurm.

4.931 Beiträge seit 2008
vor 6 Jahren

Außerdem ist dein Code


((HeaderedContentControl)((child as FrameworkElement)))

fehlerhaft, zumindestens für den Fall, daß du noch andere Elemente außer HeaderedContentControl in das StackPanel packst -> InvalidCastException s.a. [FAQ] Casten aber richtig: () / is / as.
Schreibe besser


HeaderedContentControl headeredContentControl as HeaderedContentControl;
if (headeredContentControl != null)
  if (headeredContentControl.Header.ToString().Trim()) == "Test")
    // ...

Und für dein eigentliches Problem solltest du mal den Debugger benutzen, s. [Artikel] Debugger: Wie verwende ich den von Visual Studio?.

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren

@ErfinderDesRades:

Der Code wird definitiv durchlaufen, aber ohne Fehlermeldung.

Wenn ich dort einen Haltepunkt setze und dann im Direktfenster

this.stackPanel1.Children.Remove(child)

eingebe, erscheint als Antwort:

Der Ausdruck wurde ausgewertet und weist keinen Wert auf.

Das gleiche gilt für den Befehl

this.stackPanel1.Children.Clear()

Kann es daran liegen, das ich im Content ein UserObject eingebaut habe - Asche auf mein Haupt, ich war wohl heute Nacht ein wenig Müde es muß heissen

dynamicExpander.Content = UserControl;

@Th69: wie gesagt, ich benutze natürlich den Debugger, erhalte aber keinerlei Fehlermeldungen ...

MfG ChrisProg

4.931 Beiträge seit 2008
vor 6 Jahren

Dann benutzt du ihn falsch - Fehlermeldungen sollten vom Debugger auch nicht kommen, sondern du solltest dir mal die Objekte 'stackPanel1' bzw. 'stackPanel1.Children' im Überwachen(Watch)-Fenster anschauen, um zu schauen welche Inhalte es hat.

P
441 Beiträge seit 2014
vor 6 Jahren

Wenn ich dort einen Haltepunkt setze und dann im Direktfenster

this.stackPanel1.Children.Remove(child)  

eingebe, erscheint als Antwort:

Der Ausdruck wurde ausgewertet und weist keinen Wert auf.
Das gleiche gilt für den Befehl

this.stackPanel1.Children.Clear()  

Die Methoden Clear() und Remove(..) haben als Rückgabetyp void. Insofern ist das, was der Debugger sagt genau richtig.

5.657 Beiträge seit 2006
vor 6 Jahren

Hi ChrisProg,

du könntest dir eine Menge Arbeit und genau solche Probleme ersparen, wenn du stattdessen mit DataBinding arbeiten würdest: [Artikel] MVVM und DataBinding

Weeks of programming can save you hours of planning

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren

Kurzer Zwischenstand:

es scheint daran zu liegen, das es das StackPanel nicht mag, wenn es aus sich heraus (also wenn es den Focus hat ...) ein Element löschen soll ...

Mach ich das über einen Button, dann funktioniert es wie gewollt 🤔

Mal schauen, wie ich das löse ...

Der geplante Ablauf:
Ich wähle ein UserControl, welches als Content am Expander hängt, per Rechtsklick aus, um diesen Expander samt UserControl dann zu löschen.

MfG Christian

1.040 Beiträge seit 2007
vor 6 Jahren

Was heißt wenn es aus sich heraus ein Element löschen soll? 🤔

Habe gerade testweise 2 Button in ein StackPanel gepackt, einer davon hat einen Eventhandler.
In diesem Eventhandler habe ich einmal _stackPanel.Children.Clear() getestet - funktioniert.
Ebenso funktioniert _stackPanel.Children.Remove(child) in einem foreach.

Wann genau, bei welchem Ereignis, möchtest du etwas entfernen?

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren

Ich will mit einem Rechtsklick auf ein UserControl, welches über den Expander.Content an einem StackPanel hängt, genau dieses nach einer Sicherheitsabfrage löschen (also den Expander mit dem enthaltenen UserControl)

Ich habe dann also im Rechtsklick des UserControls eine Prozedur in der MainForm aufgerufen; in dieser ermittle ich das entsprechende StackPanel.Child um es dann zu löschen ...

Ich muß das ganze dynamisch machen, da die einzelnen Elemente des StackPanel erst zur Laufzeit vorhanden sind und dauernd welche hinzu kommen können ...

Stell dir das Board eine Fluglotsen vor, in dem immer wieder neue Flugzeuge (Streifen) hinzukommen und die erledigten herausgenommen werden ...

MfG Christian

1.040 Beiträge seit 2007
vor 6 Jahren

Kannst du mal dein Projekt (in abgespeckter Variante) zur Verfügung stellen?
Ich kann hier munter Controls aus dem StackPanel entfernen, egal von wo ich komme.

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren

@p!lle:

Ja, ich versuche es heute Abend zusammen zu stellen (sonst am WE).

Da ich anscheinend keine Datei an eine PN hängen kann, schicke ich Dir das per E-Mail, wenn es OK ist ?

MfG Christian

1.040 Beiträge seit 2007
vor 6 Jahren

Du kannst es an den Beitrag anhängen.

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren

@p!lle:
Hier ist das Testprojekt...

MfG Christian

1.040 Beiträge seit 2007
vor 6 Jahren

Wenn du mit der rechten Maustaste auf einen Auftrag klickst, machst du anschließend folgendes:

MainWindow x_window = new MainWindow();

Du legst ein neues Hauptfenster an und löscht aus diesem den Auftrag.
Aus dem tatsächlich angezeigten Hauptfenster entfernst du nichts.

Schaue dir mal, wie schon von MrSparkle erwähnt, [Artikel] MVVM und DataBinding an.

Ach ja, und deine Anwendung beendet sich nach dem Schließen nicht richtig. 😁

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren

Du legst ein neues Hauptfenster an und löscht aus diesem den Auftrag.
Aus dem tatsächlich angezeigten Hauptfenster entfernst du nichts.

🙁 -da war ich wohl völlig verpeilt, als ich das geschrrieben habe, oh man ...
So funktioniert´s dann auch ..

((Test.MainWindow)(((Grid)((ScrollViewer)((StackPanel)((Expander)(this.Parent)).Parent).Parent).Parent).Parent)).delete_element(sender);

Kann man das eigentlich noch vereinfachen ?

Danke, für´s drüberschauen 👍

Schaue dir mal, wie schon von MrSparkle erwähnt,
>
an.

Wenn ich ehrlich bin, habe ich mir das schon mal angeschaut, aber leider nicht wirklich viel verstanden X(

Ach ja, und deine Anwendung beendet sich nach dem Schließen nicht richtig. 😄

Und damit meinst Du was ?

Ich sehe nichts mehr im TaskManager, nachdem ich das Prg geschlossen habe ...

MfG Christian

1.040 Beiträge seit 2007
vor 6 Jahren

Und damit meinst Du was ?

Ich sehe nichts mehr im TaskManager, nachdem ich das Prg geschlossen habe ...

Startet man das Programm aus dem Visual Studio und schließt es, dann bleibt der Debugger des VS aktiv. Auf normalem Wege habe ich es nicht gestartet.

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren

also mit VS 2010 beendet sich auch der Debugger ... 🤔

Vorschläge ?

MfG Christian

1.040 Beiträge seit 2007
vor 6 Jahren

Hängt vermutlich mit dem neuen Fenster zusammen. Will man in der alten Variante einen Auftrag löschen (in dem das neue Fenster angelegt wird), beendet sich der Debugger nicht richtig.

Löscht man nichts, dann geht es ordnungsgemäß zu. 👍

Also alles in Ordnung, das nimmst du ja sowieso raus. 😁

T
461 Beiträge seit 2013
vor 6 Jahren
((Test.MainWindow)(((Grid)((ScrollViewer)((StackPanel)((Expander)(this.Parent)).Parent).Parent).Parent).Parent)).delete_element(sender);  
  

Kann man das eigentlich noch vereinfachen ?

Ähm, ich war auch mal am Anfang, nur solche Kunstwerke hatte ich nie erschaffen 😉

Es wäre wirklich empfehlenswert das mit dem Binding in Betracht zu ziehen. Wenn man sich wo nicht auskennt, erstellt man einfach im richtigen Thread ein neues Thema um genau dort die Frage zu stellen.

Dann ersparst du dir diesen ganzen HickHack...
Das eher am Ende umzubauen kann man fast vergessen, da kannst das gleich alles ein 2tes Mal schreiben. Glaube mir, erspare dir die schöne Zeit die du hast 😁

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄