[C#] [Forms] Wypisanei object w label

Witam,

Zaczynam już głupieć z funkcją Peek w kolejce niegenerycznej. Mam program okienkowy, w nim plik cs na klasy danych i list.

namespace Nazwa
{
    public class Dane
    {
        public string dane { get; set; }

        public Dane(string dane)
        {
            this.dane = dane;
        }

        public override string ToString()
        {
            return dane;
        }
    }

    public class Kolejka
    {
        public Queue QKolejka;
        
        public Kolejka()
        {
            QKolejka = new Queue();
        }

        public object Zwroc()
        {
            return QKolejka.Peek();
        }
    }
}

W oknie po kliknieciu przyciusku ma wywolac sie “Zwroc” i wypisać wynik do label, zamisat wypsiać się wynik z Peek, to wypisuje mi się nazwa namespacea i klasy (Nazwa.Dane)

private void button4_Click(object sender, EventArgs e)
        {
            label3.Text = QKolejka.Zwroc().ToString();
        }

Moje pytanie, o co chodiz i jak to naprawić?

  1. Metoda Zwroc zwraca obiekt - może lepiej zwracać obiekt typu Dane? Ewentualnie w klasie pobierającej musisz rzutować na właściwy typ.

  2. W takiej implementacji musisz przeciążyć metodę ToString dla obiektu Dane. (Dodać poniższą metodę w klasie Dane). 

    public override string ToString()
    {
    return this.dane;
    }

Dzięki :slight_smile: Dokładnie tego samego sie dzisiaj dowiedzieliśmy, miałem zamykać juz temat temat a tu odpowiedź od Ciebie :slight_smile:

 

A może wiesz jak tutaj uzyć Contains? Bo ta metoda ma zwraać bool’a, ale mi w labelce zawsze wyskakuje False mimo, że powinno byc True ;/

public object CzyZawiera(string x)
        {
            return QKolejka.Contains(x);
        }

Tu nie jestem pewien ale obstawiam że taka implementacja:

public bool CzyZawiera(object x)
        {
            return QKolejka.Contains(x);
        }

Do tego metoda powinna zwracać bool a nie object.

 

Dobrze by też zacząć używać kolejki generycznej, wtedy można operować na konkretnym typie.

Przykład: http://msdn.microsoft.com/en-us/library/3hb6387f(v=vs.110).aspx

Wiem, że bool, ale juz łapałem sie wszytskich mozliwośći, i bool i object, i typ paprametru na stringu i objectie ale nie chaiąłem dawać kilku kodów błędnych.

 

Tak jak podałeś też próbowałem ;/

public bool CzyZawiera(object x)
        {
            return QKolejka.Contains(x);
        }

private void button5_Click(object sender, EventArgs e)
        {
            QKolejka.QKolejka.Contains(textBox2);
            bool b = QKolejka.QKolejka.Contains(textBox2);
            label4.Text = b.ToString();
        }

i tak, i bezpośrednio wynik z Constains do labelki ale kicha dalej false ;/ juz ni mam pomysłów

 

A co do generycznej kolejki, to będę używał w innym dziale programu (pokzaanie niegenerycznych i genreycznych kolekcji :P)

 

//Edit:

 

A tak przy okazji. Może wiesz jak zabić wątki po ich wykonaniu? na końcu wątku używam .Dispose() ale to chyab zwalnia tylkoelemnty na ktorych pracowal watek? .Abort() mi nie wykrywa, nie wiem czemu (może dać nie tylko using System.Threading.Tasks; ale tez using System.Threading;)

private void NGLWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
            MetodaNGL();
            NGLWorker1.Dispose();
        }

Czy w zmiennej QKolejka (brr, ale okropna nazwa, na dodatek nie mówi do czego służy) przechowujesz TextBoxy, skoro próbujesz jakiegoś TextBoxa w niej znaleźć?

 

Co takiego złego zrobił Ci wątek, że chcesz go zabijać?

Niczego nie zwalnia, bo wątek nie ma takiej metody.

Używasz w ogóle obiektu Thread czy jakiegoś innego? To by tłumaczyło, czemu masz nieistniejące metody, a istniejących nie masz.

Z .Text tez nie działa, pisałem, że propowałem roznych sposoób i że nie wklejam wszytskich kodow bo za duzo zajmuja miejsca.

 

 

Uzywam System.Threading.Tasks i Workerow.