2009-03-14 5 views

Antwort

5

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); } 
} 
0

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.

+0

Durch Sichtbarkeit, sprechen Sie über Umfang (privat, geschützt, öffentlich?) – HardCode

+0

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. –

+0

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

1

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.

Verwandte Themen