2010-12-14 1 views
1

Ich habe ein MDI-Kind-Formular als einen andockbaren Inhalt in meiner Anwendung und ich möchte eine Listbox darin von der Elternform abhängig von einem bestimmten Ereignis zu aktivieren/deaktivieren. Ich dachte, das wäre so einfach wie:C# Disable Listbox von übergeordnetes Formular

_child.listBox1.Enabled = false; 

Aber es scheint nicht zu deaktivieren. _child ist eine Objektreferenz des mdi Kindformulars btw. Warum funktioniert es nicht und wie kann ich das beheben?

+0

Sie sollten Ihre ListBox umbenennen. – SLaks

Antwort

1

_child verweist wahrscheinlich auf eine andere Instanz der untergeordneten Form. Stellen Sie sicher, dass sich _child auf dieselbe Instanz bezieht, die Sie Show() aufgerufen haben.

+0

Hey, du hattest Recht. Ich hatte 2 Instanzen des Formulars und ich habe den anderen benutzt. Jetzt funktioniert es;) – david

0

Können Sie keine Funktion auf Ihrem MDI-Kind erstellen, das die Listbox deaktivieren würde, die Sie vom übergeordneten MDI aufrufen könnten?

Ich denke, dass hier listBox1 privat ist (die Standardeinstellung ist, wenn Sie Ihre Form VS-Designer gebaut haben)

+0

Dann würde er einen Compilerfehler bekommen, was er anscheinend nicht ist. – SLaks

+0

Ich könnte das tun, aber ich möchte keine Funktion dafür machen. Außerdem ist es öffentlich. – david

0

Obwohl es funktioniert, die Steuerung einer Form ausgesetzt wird als öffentliches Eigentum ein schlechtes Design Praxis betrachtet wird .

Nehmen wir an, dass Sie zu einem späteren Zeitpunkt den internen ListBox in einen anderen Typ wie ListView ändern müssen, um einige Funktionen hinzuzufügen.

Wenn Sie in diesem Szenario eine Methode mit dem Namen DisableList im Formular erstellen, müssen Sie nur eine Stelle im Code ändern, um die Art und Weise zu aktualisieren, in der die Liste deaktiviert werden soll.

Aber wenn Sie die Methode zum Schreiben von Code wie _client.listbox1.Enabled = false; wählen, müssen Sie durch alle Teile des Codes gehen, die die ListBox berühren, und aktualisieren Sie sie.

Ein sehr wichtiges Prinzip im Design ist es, die internen Implementierungsdetails der Klasse nicht denen auszusetzen, die sie verwenden müssen. In diesem Fall profitieren Sie, wenn das übergeordnete Formular nicht wissen muss, dass die Liste als ListBox implementiert ist.

+0

Nun, Sie haben Recht damit, dass es eine schlechte Übung ist, aber ich beabsichtige nur, die ListBox einmal zu deaktivieren und zu aktivieren (wenn zwischen zwei Tabs gewechselt wird), also sollte es nicht viel ausmachen. In dem Fall, dass ich der ListBox mehr Code hinzufügen muss, werde ich diesen Ansatz in Betracht ziehen. Danke für den Hinweis. – david