Laden...

Warum erhalte ich beim Casten mit der "as"-Syntax eine NullReferenceException?

Erstellt von tristar vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.739 Views
T
tristar Themenstarter:in
98 Beiträge seit 2016
vor 4 Jahren
Warum erhalte ich beim Casten mit der "as"-Syntax eine NullReferenceException?

Hallo,

da ich an meinem Projekt das Layout ändern möchte, würde ich dazu gerne eine einfache Methode schreiben, die ich dann pro Form aufrufen kann.


public static void StyleReadOnlyTextBox(Form f)
        {
            foreach (var control in f.Controls)
            {
                TextBox textBoxReadOnly = control as TextBox;
                if (textBoxReadOnly.ReadOnly)
                {
                    textBoxReadOnly.BackColor = Color.AliceBlue;
                }
            }
        }

Beim Aufruf erhalte ich allerdings eine NullReferenceException. Weshalb??

2.298 Beiträge seit 2010
vor 4 Jahren

Hallo tristar,

um MrSparkle's Antwort ein wenig verständlicher darzustellen:

Nicht jedes Control auf einem Form / UserControl muss eine TextBox sein. Dein Code geht aber gänzlich davon aus.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

W
955 Beiträge seit 2010
vor 4 Jahren

... ja aber der hier passende type-pattern wird ja in dem (alten) Beitrag nicht erklärt, vllt sollte das mal angepasst werden.

16.783 Beiträge seit 2008
vor 4 Jahren

Der Type Pattern ist nur Syntaxzucker.
Ändert nichts an der Funktionweise von is - und das ist im Beitrag abgedeckt.

Gerne kannst Du aber eine sachliche Erweiterung in der FAQ hinzufügen 😃

1.040 Beiträge seit 2007
vor 4 Jahren

Gerne kannst Du aber eine sachliche Erweiterung in der FAQ hinzufügen 😃

Wie kann man denn dort eine Antwort verfassen? Wollte den Eintrag ergänzen, habe aber keine Rechte...

16.783 Beiträge seit 2008
vor 4 Jahren

Oh...

T
tristar Themenstarter:in
98 Beiträge seit 2016
vor 4 Jahren

Hab es nun wie folgt gelöst


 public static void StyleStatusStrip(Form f)
        {
            foreach (var control in f.Controls)
            {
                if (control is StatusStrip)
                {
                    StatusStrip sStrip = control as StatusStrip;
                    sStrip.BackColor = Color.WhiteSmoke;
                }
            }
        }

Führe ich solgenden Code allerdings beim Aufruf einer Form im Konstruktor aus, so wird der StatusStrip farblich nicht angepasst.
Beim Debuggen scheint es so, als ob der Strip nicht als Control der Form erkannt wird. Zumindest enthält die ControlCollection nicht den StatusStrip. Weshalb?

4.919 Beiträge seit 2008
vor 4 Jahren

Du solltest nicht zweimal casten (einmal is, und dann noch as):


public static void StyleStatusStrip(Form f)
{
    foreach (var control in f.Controls)
    {
        StatusStrip sStrip = control as StatusStrip;
        if (sStrip != null)
            sStrip.BackColor = Color.WhiteSmoke;       
    }
}

oder noch kürzer:


StatusStrip sStrip = control as StatusStrip;
sStrip?.BackColor = Color.WhiteSmoke;

Hast du den Code (bzw. den Aufruf) vor InitializeComponent() eingefügt?
Der Code muß zwingend danach, da in dieser Methode ja erst die Unterelemente erzeugt werden.

5.657 Beiträge seit 2006
vor 4 Jahren

Evtl. liegt ja der StatusStrip auch in einem anderen Control (Panel?), aber wir kennen den Aufbau deiner Forms ja nicht.

Weeks of programming can save you hours of planning

T
tristar Themenstarter:in
98 Beiträge seit 2016
vor 4 Jahren

Du solltest nicht zweimal casten (einmal is, und dann noch as):

Danke für den Hinweis

Evtl. liegt ja der StatusStrip auch in einem anderen Control (Panel?), aber wir kennen den Aufbau deiner Forms ja nicht.

Danke für den Tipp, genau das war das Problem!