Prośba o refaktoryzację klasy kontrolki

0

Witam. Jak w temacie. Prosiłbym o refaktoryzację tego kodu bo czuję, że przekombinowałem, bo logika do tego jest prosta. A jakoś nie mogę tego uprościć. Wszystkie takie kontrolki na formie muszą zmieniać swoją wartość podczas kliknęcia. Jeśli zmieni wartość, czyli jest aktywna lub nie to zmienia swój kolor. Muszę mieć też mieć możliwość zmiany aktywnośći bez kliknięcia, np. w innej metodzie.

  public class ButtonControl : Button
    {

        private int _value;
     
        public int Value
        {
            get { return _value; }
            set { _value = value; OnValueChanged(); }
        }

        public bool IsActive { get; set; }

        public event EventHandler ValueChanged;

        public ButtonControl()
        {
            InitializeComponent();

            SetEvents();
        }

        protected virtual void OnValueChanged()
        {
            if (ValueChanged != null) ValueChanged(this, EventArgs.Empty);
        }

        public void SetEvents()
        {

            EventHandler clickHandler = (object from, EventArgs args) =>
            {
                if (Form1.activeButton != null && Form1.activeButton != this) Form1.activeButton.Value = 0;
                if (Value == 1)
                    Value = 0;
                else
                {
                    Value = 1;
                    Form1.activeButton = this;
                }

            };
            Click += clickHandler;

            EventHandler valueHandler = (object from, EventArgs args) => SetActive();
            ValueChanged += valueHandler;

        }

        private void SetActive()
        {

            if (Value == 1)
            {
                BackColor = Color.SteelBlue;
                IsActive = true;

            }
            else
            {
                BackColor = default(Color);
                IsActive = false;
            }

        }
0

troche nie widze sensu robienia wlasnej konrolki po to by zmienic kolor. Przeciez to mozesz tez zrobic na normalnym buttonie

Po co Ci nowa klasa (a dokladniej nowa kontrolka)?

0

Zaczęło się od tego, że potrzebowałem właściwości Value do mojego Buttona, ponieważ niektóre będą miały kilka wartośći i muszę wiedzieć jaka jest aktualna wartość danej kontrolki.

0

a takie cos nie wystarczy?
http://stackoverflow.com/questions/33299682/get-the-text-value-of-the-button-that-was-clicked

i dlaczego button ma miec kilka wartosci?

Jezeli moze miec kilka dostepnych wartosci to zrob klase ktore zarzadza wartosciami, a nie, ze button rozszerzasz by dodac mu kilka wartosci ;)

0

Osobna kontrolka powinna chyba być niezależna, a ta ma w kodzie jakies Form1

0

Rzeczywiście muszę to zmienić, na początku był inny pomysł a teraz w zasadzie potrzebuję tylko czy dana kontrolka jest aktywna czy nie. A Form1.activeButton służyło mi do ustawiania flagi dla aktualnie aktywnej kontrolki.

0

To może jeszcze zapytam inaczej, żeby teraz to przerobić. Mam formę, na tej formie dookoła mam panele (odpowiednio LeftPanel, RightPanel, TopPanel, DownPanel). Do każdego panela dynamicznie tworzę i dodaję po 8 kontrolek Button (wcześniej ControlButton - ten twór który widać wyżej w poście :) )
Chciałbym rozszerzyć kontrolkę Button o właściwość IsActive, żeby wiedzieć, która kontrolka aktualnie jest aktywna. Kliknięcie na kontrolkę, "gasi" poprzednio aktywną i "zapala" aktualną. Obojętnie w którym panelu. Jak to zrobić najlepiej? Żeby nie powstał mi znowu jakiś dziwny twór (robiłem to w osobnej kontrolce, ponieważ domyślnie nie wiem ile będzie takich kontrolek w danym panelu, chciałem to łatwo ewentualnie "rozszerzać", poza tym do każdej z kontrolek mogą w trakcie dochodzić inne funkcjonalności).
Dodam jeszcze, że każdy Button oprócz zmiany stanu wyświetla jeszcze odpowiedni dla siebie panel na środku ekranu z różnymi kontrolkami.
A jeżeli chciałbym zmienić, żeby na przykład kontrolka z lewego panelu nie wygaszała aktywności z panelu dolnego?

0

P.S. Jeśli chcę rozszerzyć klasę Button to najlepiej utworzyć nową klasę po niej dziedziczącą?

1

Czy na pewno potrzebujesz własnego buttona? Przecież możesz sobie zrobić jakąkolwiek klasę, która będzie przechowywała wszystkie właściwości, jakie chcesz mieć. A potem obiekt tej klasy dodać sobie do właściwości Tag buttona. I faktycznie, jeśli to są jakieś pierdoły w sensie dodatkowe wartości, to może lepiej jednak posłużyć się tym TAGiem. Możesz tam se trzymać nawet zwykłego inta, jeśli nie potrzebujesz całej klasy. Właściwość TAG jest do użytku programisty. Może se z nią zrobić, co chce.

0

Chciałem wykorzystać TAG na początku, ale chciałem też mieć właściwość IsActive, oprócz wartości. Co do klasy wartości, w zależności od tego która kontrolka jest aktualnie aktywna, za pomocą innego Buttona, użytkownik wysyła komendę Execute do maszyny CNC i plan był taki, że czytam sobie która kontrolka jest aktywna plus resztę parametrów z innych kontrolek i wysyłam metodę Execute z tymi parametrami do maszyny. Ale teraz jeśli w każdym panelu logika działania Buttonow ma być inna, chyba lepiej będzie zrobić to na interfejsach?
Co do linka ze Stackoverflow: IsChecked to moje IsActive :)

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