2 Stimmen

C# this.Controls.Remove Problem

Was ist das Problem mit diesem Code?

for (int w = 0; w < this.Controls.Count; w++)
{
    if (this.Controls[w] is TransparentLabel)
    {
        la = (TransparentLabel)this.Controls[w];
        if (la.Name != "label1")
        {
            la.Visible = false;
            la.Click -= new System.EventHandler(Clicked);
            this.Controls.Remove(this.Controls[w]);
            la.Dispose();
         }
     }
}

Ich möchte den Bildschirm von den Etiketten befreien, aber es funktioniert nicht.

7voto

Brian Mains Punkte 50145

Ändern Sie das for in:

for (int w = this.Controls.Count - 1; w >= 0; w--)

Andernfalls erhalten Sie möglicherweise eine Fehlermeldung über die Änderung der Steuerelemente. Wenn das nicht hilft und die Steuerelemente auf dem Bildschirm sind, dann liegt es an der Auswertung der if-Anweisung. Debugging würde helfen, das zu beheben.

6voto

djdd87 Punkte 65008

Ich nehme an, der Code entfernt nicht alle erwarteten Steuerelemente? Das liegt daran, dass Sie ein Element aus der Steuerelementsammlung entfernen und dann w inkrementieren.

Sie sollten anrufen w--; après this.Controls.Remove(...);

Wenn Sie nicht anrufen w--; Nach dem Entfernen des Steuerelements gehen Sie über das Steuerelement, das den Platz des Steuerelements bei Index w einnimmt.

Und noch etwas: Müssen Sie wirklich Folgendes anrufen?

la.Visible = false;
la.Click -= new System.EventHandler(Clicked);
la.Dispose();

Wenn Sie das Steuerelement entfernen, wird es unsichtbar und ist nicht mehr anklickbar. Und wenn Sie es nicht wieder hinzufügen, wird es aus dem Bereich gehen und von der GC gesammelt werden.

Und um die Kritiker zufrieden zu stellen, sollten Sie dies auf korrekte Weise tun, indem Sie sich rückwärts durch die ControlCollection arbeiten. Brian hat dies in seinem respuesta .

0voto

abatishchev Punkte 94886

Es ist zweifelhaft, ob CF unterstützt LINQ, so dass Sie nächste tun könnte:

this.Controls
  .OfType<TransparentLabel>()
  .Where(c => c.Name != "label1")
  .ToList()
  .ForEach(c => this.Controls.Remove(c));

0voto

qiuyl Punkte 21

Ctrl.Visible = false;

Es behebt das gleiche Problem, das ich hatte. Keine HTML-Ausgabe, wenn die Seite gerendert wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X