Ich habe ein Objekt, das in meinem form1-Fenster aufgerufen wird. Wie kann ich etwas vom form1-Objekt innerhalb dieses Objekts ändern, zum Beispiel ein Label oder eine Prozessleiste?Wie kann ich Komponenten eines Formulars innerhalb eines anderen Objekts ändern?
Antwort
Es wäre ein schlechter (kreisförmiger) Entwurf, um Ihrem Objekt einen Verweis auf Ihr Formular zu geben. Verwenden Sie eine Schnittstelle oder einen Delegaten (Rückruf).
// untested code
class MyObjectClass
{
public delegate void Reportback(int percentage);
public void DoSomething(Reportback callBack) { ...; callback(i*100F/total); ...}
}
class Form1: Form
{
private void reportProgress(int percent) { ...; progressbar1.value = percent; }
void SomeMethod() { myObject1.DoSomething(reportprogress); }
}
ich mit Henk zustimmen ... aber trotzdem, können Sie ein beliebiges Element in einem Formular ändern, wenn Sie die Sichtbarkeit der Kontrollen zu ändern, gibt es sogar eine Eigenschaft, dies zu tun.
Im Allgemeinen, wenn Sie sich mit einem Bedürfnis nach einem Objekt finden, um die privaten Felder eines anderen zu manipulieren, muss Ihr Design funktionieren.
Zum Beispiel sollte eine Klasse, die eine Art lang andauernde Geschäftslogik ausführt, keine ProgressBar
aktualisieren. Erstens, das ist nicht seine Aufgabe. Zweitens verbindet dies die Funktionsweise der Geschäftslogik mit den Implementierungsdetails der Benutzerschnittstelle.
Es ist viel besser, wenn die Klasse einfach Ereignisse auslöst, während sie ihre langwierige Aufgabe ausführt. Zum Beispiel, schauen Sie sich diese Klasse:
public class BusinessLogic
{
public event EventHandler ProgressChanged;
private int _Progress;
public int Progress
{
get { return _Progress; }
private set
{
_Progress = value;
EventHandler h = ProgressChanged;
if (h != null)
{
h(this, new EventArgs());
}
}
}
}
Immer wenn ein Verfahren in dieser Klasse setzt die Progress
Eigenschaft, das ProgressChanged
Ereignis ausgelöst wird. In dem Formular können Sie das Objekt mit Logik wie folgt instanziiert:
private BusinessLogic Task;
private void Form1_Load(object sender, EventArgs e)
{
Task = new BusinessLogic();
Task.ProgressChanged += Task_ProgressChanged;
}
void Task_ProgressChanged(object sender, EventArgs e)
{
taskProgessBar.Value = ((BusinessLogic) sender).Progress;
}
nun jedes Mal, wenn ein Verfahren in dem Task
Objekt setzt die Progress
Eigenschaft wird die ProgressBar
in Form aktualisiert.
Dies ist ein bisschen mehr Code zu schreiben als nur das Objekt ProgressBar
, sicher zu aktualisieren. Aber schau, was du daraus machst. Wenn Sie Ihr Formular in zwei Formulare umgestalten und die Aufgabe in ein neues Formular verschieben müssen, müssen Sie die Klasse BusinessLogic
nicht berühren. Wenn Sie Ihren ProgressBar
von einem Steuerelement auf dem Formular zu einem ToolStripProgressBar
auf einem ToolStrip
verschieben, müssen Sie die Klasse BusinessLogic
nicht berühren. Wenn Sie entscheiden, dass die Fortschrittsberichte nicht wichtig sind, müssen Sie die Klasse BusinessLogic
nicht berühren.
Im Wesentlichen schützt dieser Ansatz die BusinessLogic
Klasse davor, irgendetwas über die Benutzeroberfläche zu kennen. Dies macht es viel einfacher, sowohl die Geschäftslogik als auch die Benutzerschnittstelle während der Entwicklung Ihres Programms zu ändern.
- 1. Array innerhalb eines Arrays innerhalb eines Objekts? .?
- 2. Wie lese ich die Länge eines Wertes innerhalb eines Objekts?
- 3. Ändern eines JavaScript-Objekts
- 4. Wie rufe ich Funktionen eines Objekts innerhalb desselben Objekts auf?
- 5. Wie kann ich die Farbe eines Javascript-Objekts ändern?
- 6. Abrufen eines Objekts innerhalb eines Objekts von JSON ohne Arrays
- 7. Kann Reflexion den Zustand eines Objekts ändern?
- 8. Javascript-Callbacks innerhalb eines Objekts
- 9. Wie zu verändern Array innerhalb eines Objekts
- 10. Speichergröße eines Hash oder eines anderen Objekts?
- 11. Wie überschreibe ich den Hauptteil eines Formulars innerhalb eines Bereichs für einen bestimmten Pfad?
- 12. innerhalb eines Arrays Objekts Looping
- 13. Hinzufügen mehrerer Instanzen eines Objekts zum Array eines anderen Objekts;
- 14. Ändern eines unveränderlichen Objekts F #
- 15. Wie kann ich einen Dienstleister innerhalb eines anderen anrufen - angularjs2
- 16. Zugriff auf ein Objekt innerhalb eines anderen Objekts in meteor.js
- 17. Wie ändert man die Größe eines Divs innerhalb eines Objekts?
- 18. Klonen von Attributen eines Objekts zum anderen
- 19. Schleifen durch ein Objekt innerhalb eines anderen Objekts
- 20. Wie kann ich den Wert eines Parameters innerhalb eines Objekts festlegen?
- 21. Symfony2 ändern Feldoptionen eines eingebetteten Formulars
- 22. Verschieben eines Benutzersteuerelements innerhalb eines anderen Benutzersteuerelements
- 23. Position eines randlosen Formulars ändern (C#)
- 24. Ausgabe eines Teils eines Objekts
- 25. Wie kann ich den Wert eines Elements eines Objekts namens pages.total ändern? PHP
- 26. Wie die Referenz von innerhalb eines Objekts an den Konstruktor eines anderen übergeben
- 27. Wie WinForms-Komponenten basierend auf dem Typ eines Objekts
- 28. Verwenden eines Repository innerhalb eines anderen
- 29. Kann Formular in der Prozedur eines anderen Formulars nicht verweisen
- 30. Array innerhalb eines anderen Array
Durch Sichtbarkeit, sprechen Sie über Umfang (privat, geschützt, öffentlich?) – HardCode
Ja. Wenn Sie es in öffentlich oder intern ändern, können Sie darauf zugreifen. Ich benutze diesen Ansatz in einem Projekt, aber es ist unordentlich, also werde ich heute die Henks-Lösung umgestalten. –
Ja, wollte ich sagen. Formkontrollen selbst machen Die Öffentlichkeit ist ein schreckliches Ideal. Im schlimmsten Fall sollte eine öffentliche Funktion im Formularcode erstellt werden, die die Steuerelemente für das private/geschützte Formular festlegt. – HardCode