c# dziedziczenie z kontrolki

0

Witam,
jestem początkującym programistą c#, jako zadanie mam do napisania kilka aplikacji typu:

Utwórz aplikację z klasą która dziedziczy z kontrolki ListBox co pozwala na reakcję i wyświetlenie np. MessageBox'a w przypadku wybrania z listy el. o indeksie parzystym lub nieparzystym.

Sporo czytałem o dziedziczeniu, klasach i kontrolkach ale niestety nie mogę wpaść na metodę napisania tego typu programu. Bardzo proszę o pomoc. Poniżej kod utworzonej przeze mnie klasy generującej liczbę elementów i dodanie ich do ListBox'a.

 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace z6_c4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public class generuj
        {
            Random rnd = new Random();

            public virtual int generator()
            {
                int liczba;
                liczba = Math.Abs(rnd.Next(-255,255));
                return liczba;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();

            generuj g = new generuj();

            int max = g.generator();

            for (int i = 1; i <= max; i++)
            {
                listBox1.Items.Add(i);
            }
        }
    }
}
0

Dziedziczenie klasy z kontrolki ListBox wygląda tak:

public class MyListBox : ListBox
{
    // tu umieszczasz resztę np. metody przy zaznaczeniu
}

W tej klasie możesz też umieścić metodę generowania itemów.

W celu wyświetlenia mboxa przy wybraniu jakiegoś itema, posłuż się na zewnątrz eventami.

0

Co ciekawe. Jak wrzucisz taką klasę, która dziedziczy po kontrolce do osobnego pliku w twoim projekcie, to ikonka tego pliku zmieni się na ikonę komponentu, a w Toolboxie przybędzie ci nowa kontrolka, ta twoja. I będziesz ją mógł przeciągnąć na formę.

0

Utworzyłem jedną klasę, która dziedziczy z listboxa, dodałem do niej metodę generowania itemów. Stworzyłem też metodę sprawdzania zaznaczonego elementu, ale wydaje mi się że to jednak nie o to dokładnie chodzi, bo w moim rozwiązaniu pobieram wybrany index na sztywno i tylko sprawdzam if'ami. Niestety nie mam pomysłu na coś innego.

 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace z6_c4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public class listb : ListBox
        {
            Random rnd = new Random();

            public virtual int generator()
            {
                int liczba;
                liczba = Math.Abs(rnd.Next(-255, 255));
                return liczba;
            }

            public void sprawdz(int index)
            {
                if ((index+1) % 2 == 0)
                {
                    MessageBox.Show("Wybrałeś element parzysty");
                }
                else
                {
                    MessageBox.Show("Wybrałeś element nieparzysty");
                }
            }
        }

        listb gen = new listb();

        private void button1_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();           

            int max = gen.generator();

            for (int i = 1; i <= max; i++)
            {
                listBox1.Items.Add(i);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {            
            int index = listBox1.SelectedIndex;
            gen.sprawdz(index);
        }
    }
}
0

Przede wszystkim nie zagnieżdżaj klasy listb w klasie Form1, a najlepiej umieść ją w oddzielnym pliku i nazwij porządnie.

0
somekind napisał(a):

Przede wszystkim nie zagnieżdżaj klasy listb w klasie Form1, a najlepiej umieść ją w oddzielnym pliku i nazwij porządnie.

A czy dużo zmieni to jeśli przeniosę klasę do nowego pliku?

Trochę przerobiłem program, wydaje mi się że teraz pracuje on bardziej sensownie i ewidentnie korzysta z właściwości klasy którą dziedziczy. Proszę o opinie.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public class lista : ListBox
        {
            public lista listb;
            public Form formularz;

            Random rnd = new Random();

            public void utworz(Form aFrom)
            {
                formularz = aFrom;
                listb = new lista();
                listb.Location = new Point(12, 12);
                listb.Size = new Size(130, 250);
                listb.Name = "listbox";
                listb.SelectedIndexChanged += new EventHandler(zmiana);
                formularz.Controls.Add(listb);
            }

            private void zmiana(object sender, EventArgs e)
            {
                if ((listb.SelectedIndex+1) % 2 == 0)
                {
                    MessageBox.Show("Wybrałeś element parzysty");
                }
                else
                {
                    MessageBox.Show("Wybrałeś element nieparzysty");
                }
            }

            public void generator()
            {          
                int liczba;
                liczba = Math.Abs(rnd.Next(-255, 255));
                
                for (int i = 1; i <= liczba; i++)
                {
                    listb.Items.Add(i);
                }
            }

            public void wyczysc()
            {
                formularz.Controls.Remove(listb);
            }            
        }
        
        lista l = new lista();

        private void button1_Click(object sender, EventArgs e)
        {            
            l.utworz(this);   
            l.generator();        
        }        

        private void button2_Click_1(object sender, EventArgs e)
        {
            l.wyczysc();
        }
    }
}

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