Aktualizacja kontrolek w funkcjach innej klasy.

0

Mam w formie kontrolki różne, buttony labele etc.

Mam również klasę statyczną, która zawiera funkcje statyczne, w których chciałbym mieć możliwość aktualizowania kontrolek z Formy.

Czy stworzenie dodatkowej klasy, która będzie przechowywać referencje do kontrolek z Formy, i utworzenie jej instancji w Formie, i przekazywanie tego obiektu do funkcji jest tym najwłaściwszym rozwiązaniem ? Czy może robi się to przeważnie jakoś inaczej ?

2

Nie robi się tak. Tzn. może ktoś tak robi, ale to jest złe, bo łamie zasady takie jak hermetyzacja i SRP.

Kontrolki nie powinny nigdy być znane poza klasą Formy. Ta klasa powinna mieć właściwości i metody, które operują na jej wewnętrznych kontrolkach. Te metody i właściwości mogą niech będą zgrupowane w jakimś interfejsie, który Form implementuje. I teraz - ponieważ jest interfejs, to można napisać klasę, która będzie na nim operowała, i która może być całkowicie niezależna od technologii GUI.

I z grubsza w ten sposób działa wzorzec MVP.

Przykład kodu:

interface ICustomerView
{
    string Description { get; set; }
}

public class EditForm: Form, ICustomerView
{
    // InitizalizeComponents i inne rzeczy standardowe

    public string Description
    {
        get { return this.textBoxDescription.Text; }
        set { this.textBoxDescription.Text = value; }
    }    
}

class CustomerPresenter
{
   private ICustomerView customerView;

   public CustomerPresenter(ICustomerView customerView)
   {
      this.customerView = customerView;
   }

   public DoSomething()
   {
      this.customerView.Description = "coś";
   }
}
 
0

A jeżeli mam wiele kontrolek w formie, i wiele ich parametrów chciałbym modyfikować, to jest jakiś sposób, aby tak nie przeładowywać Formy kodem (pisanie właściwości dla każdego parametru każdej kontrolki)?

0

Zawsze możesz grupować swoje kontrolki w ramach jakichś UserControl. Ale to co opisałem, to jest właśnie sposób na nieprzeładowywanie Formy kodem. Bo w klasie Form zostaje tylko kod dostępu do kontrolek, a wszelka logika jest przenoszona do Prezentera (a nawet dalej).

0

Powinienem w każdej klasie, w której chciałbym móc modyfikować kontrolki deklarować interfejs, czy może stworzyć klasę dla danej kontrolki, bądź wszystkich kontrolek, które będzie zawierać interfejs i tam wypisać wszystko możliwe stany, i później w innych klasach odwoływać się do tej klasy?
Czy rozwiązać to jeszcze jakoś inaczej ?

0

To zależy - interfejs deklarujesz dla czegoś, co ma sens jako całość. Czy implementacja będzie samą formatką, czy kilkoma user controlkami nie ma znaczenia na tym poziomie, interfejs ma opisać abstrakcję.

0

To może podam przykład:

Tworzę sobie klasę statyczną, w której piszę metody statyczne, po to, aby móc wywoływać je w różnych funkcjach różnych klas.
Czy może zamiast tego powinienem Dla każdej tej klasy, która zawiera funkcję, w której chciałbym modyfikować kontrolkę dodawać interfejs?

using System.Drawing;

namespace CSharpSecondTry
{
    public static class LabInfoProperties
    {
        private static IControlsProperties _controls;
        public static void SetInterface(IControlsProperties controls)
        {
            _controls = controls;
        }

        public static void StartPosition(float x, float y, int width = 150, int height = 30)
        {
            _controls.LabInfoLocation = new Point((int)x, (int)y);
            _controls.LabInfoSize = new Size(width, height);
        }

        public static void WhiteMove()
        {
            _controls.LabInfoText = "White To Move";
            _controls.LabInfoForeColor = Color.White;
        }

        public static void BlackMove()
        {
            _controls.LabInfoText = "Black To Move";
            _controls.LabInfoForeColor = Color.Black;
        }

        public static void WhiteWon()
        {
            _controls.LabInfoText = "White Won";
            _controls.LabInfoForeColor = Color.White;
        }

        public static void BlackWon()
        {
            _controls.LabInfoText = "Black Won";
            _controls.LabInfoForeColor = Color.Black;
        }

        public static void Draw()
        {
            _controls.LabInfoText = "Draw";
            _controls.LabInfoForeColor = Color.DarkRed;
        }

    }
} 

1 użytkowników online, w tym zalogowanych: 0, gości: 1