[C#] Control op een form beschikbaar maken voor andere forms

Pagina: 1
Acties:

  • reyan
  • Registratie: November 2003
  • Laatst online: 17-12-2021
Ik heb een form waarop een ListView control staat. De bedoeling van deze is een log weer te geven over wat er gebeurt met de applicatie (de keuze voor een ListView is omdat ik per regel een icoontje wil weergeven, maar dat doet nu niet terzake).

De applicatie bestaat uit meerdere forms en classes. Nu zouden al die classes en forms toegang moeten hebben tot die log ListView control. Al deze classes en forms worden vanuit de form waarin de ListView control staat aangeroepen (laten we deze form even HoofdForm noemen). Bijvoorbeeld:
code:
1
Class2 class2 = new Class2();
Nu is het de bedoeling dat al deze classes en forms gebruik kunnen maken van de log ListView.

Voor een dialog form zou je iets als volgt kunnen schrijven in HoofdForm:
code:
1
2
3
4
DialogForm df = new DialogForm;
df.ShowDialog();
if (df.Error)
    AddToLog(df.ErrorMessage)
Waarbij de functie AddToLog() natuurlijk de foutmelding naar de log ListView schrijft. Maar dat werkt enkel bij ShowDialog()... Als je gewoon Show() gebruikt dan krijg je een tweede form terwijl HoofdForm nog steeds bruikbaar blijft. Er wordt dus niet gewacht met verwerking tot venster df gesloten wordt.

Hoe kan ik in dit geval ervoor zorgen dat zaken in de tweede form vermeld kunnen worden in de log op HoofdForm? En liefst op het moment dat ze optreden (bij het ShowDialog() voorbeeld zou er pas naar de log geschreven worden als het dialoogvenster gesloten wordt - ongeacht wanneer de foutmelding optrad). Hetzelfde geldt voor classes die ik aanroep.

Een ideetje zou overerving zijn. De forms zouden dan overerven van HoofdForm, maar dat wil ik helemaal niet. Het zijn stuk voor stuk onafhankelijke forms die afgezien van de log en een paar variabelen niets van elkaar moeten hebben.

Ik had thans wel iets gevonden dat werkt, maar het is een vrij vuile oplossing: De ListView als public static declareren. Dan is deze vanuit alle classes en forms bereikbaar als HoofdForm.listViewLog. Maar hierdoor verdwijnt de ListView uit de designer (omdat this dan vervangen wordt door HoofdForm en de Windows Form Designer dit dan niet meer laat zien). Dat is nu desnoods wel iets waar ik nog mee kan leven, maar het lijkt me helemaal niet correct geprogrammeerd (allez, het werkt wel, maar het is niet netjes).

Dus, kan iemand me uitleggen hoe ik dit wel goed aanpak?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:54
Ik zou het doen mbhv een observer design pattern.

Je 'subject' is dan de classe die je 'log' is. Die classe bevat dan een AddToLog method.

Je observer kan dan bv een ListViewControlObserver class zijn.

Bv:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class LogStuff
{
     private ArrayList _logItems = new ArrayList();
     private ArrayList _observers = new ArrayList();

     public void AddObserver( IMyObserver observer )
     {
           observer.Subject = this;
          _observers.Add (observer);
     }

     public void AddToLog( string message )
     {
            _logItems.Add (message);

            foreach( IMyObserver o in _observers )
            {
                  o.Refresh();
            }
     }
}


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ListViewControlObserver : IMyObserver
{
        private ListView _listView;

        public LogStuff Subject;

        public ListViewControlObserver( ListView v )
        {
               _listView = v;
        }

         public void Refresh()
         {
                // Add new items to _listView.
         }
}


snel getypte pseudo-code, maar ik denk wel dat je het idee moet snappen

Op deze manier wordt dus, iedere keer dat je 'AddToLog' aanroept, de Refresh method van (alle) observer objecten die deze log 'in de gaten houden' aangeroepen.


Voor meer informatie moet je eens googlen op 'Observer design pattern'.

[ Voor 11% gewijzigd door whoami op 29-08-2005 15:10 ]

https://fgheysels.github.io/


  • reyan
  • Registratie: November 2003
  • Laatst online: 17-12-2021
Het heeft even geduurd eer ik die Observer-stuff begreep, maar het werkt nu! In .NET is het gebruik van observers overigens vrij eenvoudig.

Bedankt voor de hint in de richting van observer design patterns!