Лабораториска вежба 5 - finki-mk/VP GitHub Wiki
Треба да се направи Windows Forms апликација за приказ на резултати од спортски (фудбалски и кошаркарски) натпревари. При избор на натпреварот од листите, треба да се прикажат детали за истиот. За кошаркарскиот натпревар, треба да се прикажат најдобрите стрелци и бројот на поените кои ги постигнале, а за фудбалските натпревари треба да се прикажат стрелците на головите и минутата во која се постигнати. Треба да се направи и форма за додавање нови натпревари.
Деталите за натпреварите треба да бидат генерички, бидејќи за различните типови на натпревари се потребни различни податочни типови - за бројот на поени на кошаркарите е потребен int
, а за минутите во кои фудбалерите постигнале гол string
(пр. "45 min"). Затоа е потребно да се креира класа со генерички
податочни типови.
public class Details<K,V>
{
public K key;
public V value;
}
Потоа треба да се направи класа која ќе содржи листа од објекти од класата Details
:
public class GameDetails<K,V>
{
public List<Details<K, V>> gameDetails;
}
Од оваа класа се изведуваат соодветните класи за фудбал и кошарка:
public class Football : GameDetails<string,string>
public class Basketball : GameDetails<int, string>
Потоа, треба да се креира генеричка класа Game<T>
:
public class Game<T>
{
public string homeTeam;
public string visitorTeam;
public int scoreHome;
public int scoreVisitor;
public T detailsHome;
public T detailsVisitor;
public DateTime date;
}
Оваа генеричка класа ќе прима објекти од класите Football
и Basketball
и преку нив ќе се прикажуваат податоците за стрелците на натпреварите. За да се додаде нов натпревар, треба да се креира нова форма. Таа треба да ги има следниве атрибути:
public Game<Football> fGame;
public Game<Basketball> bGame;
public List<Details<int,string>> detaliD;
public List<Details<int, string>> detaliG;
Во двете листи ќе се чуваат деталите додадени од уште една помошна форма за додавање стрелци и минути/поени, кои и ако се фудбалски ќе се запишуваат со key
вредност int
(потоа ќе се креираат string
вредности), а во зависност од типот на натпреварот, ќе биде инстанцирана и пополнeта со податоци една од класите од типот Game
.
При клик на копчето за додавање натпревар, најпрво ќе треба да стандардно да се провери дали има празни вредности, а потоа да се сетираат вредностите на соодветните атрибути од класата Game<Football>
или
Game<Basketball>
во зависност од тоа кој тип е избран. Дополнително ако се избере фудбалски натпревар, ќе треба да се креираат нови стринг вредности:
Football detailsVisitor = new Football();
for (int j = 0; j < detaliG.Count; j++)
{
Details<int, string> detali = detaliG[j];
Details<string, string> dt = new Details<string, string>();
dt.key = detali.key + " min";
dt.value = detali.value;
detailsVisitor.gameDetails.Add(dt);
}
fGame.detailsVisitor = detailsVisitor;
Истото ќе треба да се направи и за detailsVisitor
. За date
да се зема моменталното време:
fGame.date = DateTime.Now;
Ако се избере кошаркарски натпревар, ќе треба само да се ископираат двете листи:
Basketball detailsVisitor = new Basketball();
for (int j = 0; j < detaliG.Count; j++)
{
detailsVisitor.gameDetails.Add(detaliG[j]);
}
bGame.detailsVisitor = detailsVisitor;
Откако ќе се креира натпреварот, во главната форма треба да се провери кој тип на натпревар бил креиран и да се додаде во соодветниот ListBox
:
if (d.ShowDialog() == DialogResult.OK)
{
if (d.type == "fudbal")
{
lstFudbal.Items.Add(d.fGame);
}
else
{
lstKosharka.Items.Add(d.bGame);
}
}
При промена на селекцијата на елемент од листите, треба да се променат и соодветните детали за натпреварот. Најпрво треба да се избришат постоечките елементи во листите на стрелци за да не останат и тие од претходната селекција:
lstStrelciHome.Items.Clear();
lstStrelciAway.Items.Clear();
Потоа треба да се земе селектираниот елемент:
Game<Football> game = (Game<Football>)lstFudbal.SelectedItem;
или
Game<Basketball> game = (Game<Basketball>)lstKosharka.SelectedItem;
и потоа ќе треба да се пополнат вредностите од овој елемент во соодветните TextBox
елементи и листите со стрелци. Листите со стрелци може да се пополнат на следниов начин:
List<Details<int,string>> strelciDoma = game.detailsHome.gameDetails;
for (int i = 0; i < strelciDoma.Count; i++)
{
lstStrelciHome.Items.Add(strelciDoma[i]);
}
Забелешка: Секаде каде што се користат List<>
елементи, истите треба да се инстанцираат во конструкторите, како на пример:
detaliD = new List<Details<int, string>>();
Исто така, во сите креирани класи ќе треба да се преоптоварат ToString()
методите за да се прикажуваат податоците во саканиот формат.