To-Do program w C#

0

Witam wszystkich serdecznie!

Jest to moj pierwszy post wiec prosze o wyrozumialosc. Programowaniem zajmuje sie dopiero od pol roku co poniekad bylo wymuszone moimi studiami. Zostalo mi postawione zadanie napisania programu w C# uzywajacego Windows Forms, w stylu aplikacji ktora wiekszosc z nas posiada w telefonach komorkowych, a mianowicie programu ktory przechowuje liste zadan do wykonania w okreslonym limicie czasu.

Wymagania aplikacji:

• uzytkownik wprowadza nowe zadanie do wykonania
• zadanie zawiera tytul (do 16 znakow), i opis zadania (do 256 znakow)
• kazde zadanie ma posiadac swoj limit czasu
• program powinien informowac o zadaniach ktorych limit zbliza sie do konca
• program powinien wyswietlac informacje o tym czy zadanie zostalo wykonane badz tez nie
• program powinien przechowywac do 5 zadan
• uzytkownik moze usunac zadanie w kazdej chwili

Musze przyznac ze to zadanie przerasta moje obecne mozliwosci. Jest to moj pierwszy wiekszy projekt i pomimo iz zapoznalem sie juz z podstawami programowania (petle, konstruktory, klasy, zaleznosci itp.) dalej nie moge zaaplikowac zdobytej wiedzy w sposob praktyczny.

Bede bardzo wdzieczny za wszelkie pomoc i wskazowki jak zabrac sie za ten projekt.

Serdecznie pozdrawiam

0

Zrób sobie klasę ktora bedzie symbolizować zadanie czyli zawierająca w sobie stringi z tytulem, zadaniem i czasem.
Następnie uzyj kolekcji do przechowywania gotowych zadan (kolekcja o maksymalnej pojemnosci 5) i np co sekundę pętlą sprawdzaj czy do końca któregoś zadania nie została minuta itd.

Na formatce pododawaj odpowiednie przyciski, listboxa pokazującego aktualne zadania. W listboxie mozna pododawac zdarzenia obslugi klawiszy na które można ustawić kasowanie zadań.

0

No chyba, że do przechowywania tych zadań potrzebuje bazy danych, albo plików tekstowych/binarnych.
Ogólnie na początku powinieneś sobie zaplanować całą budowę klasy Zadanie oraz metod jakie powinna posiadać. Przetrzymywanie danych (tych zadań) możesz zrealizować na wiele sposobów. Jeśli te dane mają być przechowywane tylko w czasie działania programów to kolekcje czy nawet zwykła tablica powinna wystarczyć. Jednak jeśli chcesz trochę bardziej rozbudować swoją aplikację, możesz zapisywać potrzebne dane do pliku lub bazy danych - w C# jest to wyjątkowo przyjemne. Myślę, że warto zapoznać się z LINQ, który bardzo ułatwi Ci pracę w obu przypadkach.

Napisz więcej z czym konkretnie masz problem, bo ogólnikowo to można i cały projekt opisać ;)

0

Chlopak (jesli sie myle-poprawic) dopiero zaczyna przygode z programowaniem, nie ma go co oglupiac dawka wiedzy ktora mozna spokojnie rozlozyc na pol roku intensywnej nauki - bazy danych nie beda potrzebne, bo ilosc danych jaka zgromadzi po ustawieniu 5 zadan nie przekroczy pewnie 5 KB. W takim wypadku (o ile konieczne sa operacje na plikach) wystarczy zapoznac sie z serializacja XML. Szybkie i proste.

0

Dzieki panowie, to naprawde pomocne. Tak, to prawda, swoja przygode z programowaniem dopiero zaczynam ale bede ja kontynuowal conajmniej przez najblizsze 2 lata szkoly. Wracajac do mojego problemu to rozwiazanie z serializacja XML brzmi ciekawie, czy moglibyscie troche przyblizyc to zagadnienie? z gory dzieki!

0

Serializacja polega na zapisaniu obiektu w postaci drzewa do pliku XML. Taki plik pozwala potem bezproblemowo odczytac zapisany wczesniej obiekt.
http://www.altcontroldelete.pl/artykuly/xml-w-c-serializacja-obiektow-do-xmla/
XML i serializacja

W tych linkach jest sporo opisane. (moze nie wszystko, ale na razie nie ma sie co zaglebiac w same mechanizmy serializacji)

0

Witam Wszystkich ponownie!

Zabralem sie do pisania w/w programu i stosujac sie do zalecen stworzylem interface IMyTask i zawarlem w nim nastepujace zmienne:

    string MyTask_title; - reprezentujaca tytul zadania
    string MyTask_description; - reprezentujaca opis
    DateTime MyTaskDate_created; - reprezentujaca date utworzenia
    DateTime MyTaskDate_expiry; - reprezentujaca date wygasniecia
    bool MyTask_compleated; - reprezentujaca date zakonczenia

Zaprojektowalem rowiez form w ktorym umiescilem listboxa ktory ma na celu pokazywanie aktywnych zadan oraz pare buttonow do dodawania i usuwania zadan. W celu przechowywania aktywnych zadan zamierzam uzyc kolekcji listy <>.

Moj poziom pewnosci siebie co do tego programu jest bardzo niski i chcialbym wiedziec czy moj tok myslenia jest poprawny, wiec pytam:

*czy utworzenie interfejsu ktory definiuje nowe zadanie jest uzasadniony w przypadku tego programu?
*czy zmienne sie zgadzaja? (w szczegolnosci DateTime reprezentujace date utworzenia i wygasniecia zadania powinny byc wykorzystane w tym programie?)
*czy lista bedzie dobra kolekcja do przechowywania tych zadan, jesli nie ma potrzeby dalszych operacji na tych zadaniach? (czy tez "serializacja" (ktorej jeszcze nie ogarnalem) bedzie lepszym rozwiazaniem)?
*w jaki sposob limitowac wybrana kolekcje do okreslonej ilosci zadan (w tym przypadku liste do 5 zadan?)
*jak limitowac wczesniej zdefiniowane stringi do okreslonej ilosci znakow? (16 na tytul i 256 na opis?)
*w jaki sposob zaprogramowac i operowac w programie "bool MyTask_compleated" - reprezentujaca zakonczenie zadania?
*czy dobra praktyka bedzie wykorzystanie konstruktora w nowej klasie ktory bedzie inicjowal w/w zmienne?
*czy powienienem uzyc parametrow (get, set) przy definiowaniu zmiennych? jesli tak, to dlaczego?

Wybaczcie jesli pytam o fundamentalne aspekty programowania, ale jak juz wspomnialem, dopiero zaczynam :D

Z gory dziekuje za pomoc

Pozdrowienia :)

0
jaspernorth napisał(a)

Zabralem sie do pisania w/w programu i stosujac sie do zalecen stworzylem interface IMyTask i zawarlem w nim nastepujace zmienne:

    string MyTask_title; - reprezentujaca tytul zadania
    string MyTask_description; - reprezentujaca opis
    DateTime MyTaskDate_created; - reprezentujaca date utworzenia
    DateTime MyTaskDate_expiry; - reprezentujaca date wygasniecia
    bool MyTask_compleated; - reprezentujaca date zakonczenia

Kto Ci tu zalecił utworzenie interfejsu zawierającego pola? Osobiście wyjadę z raciczki.
Próbowałeś w ogóle skompilować ten swój interfejs? Bo interfejs pól zawierać nie może - taki szczegół.

*czy utworzenie interfejsu ktory definiuje nowe zadanie jest uzasadniony w przypadku tego programu?

Nie. Interfejs to taka uproszczona klasa abstrakcyjna służąca do definiowania zachowań (czyli metod), które są potem implementowane w konkretnych klasach. Przecież nie możesz nawet utworzyć obiektu interfejsu! Po co Ci on? Ty potrzebujesz przechowywać dane, więc musisz mieć zwykłą klasę.

I czemu każde pole Twojego interfejsu zaczyna się od nazwy tego interfejsu?

*czy zmienne sie zgadzaja? (w szczegolnosci DateTime reprezentujace date utworzenia i wygasniecia zadania powinny byc wykorzystane w tym programie?)

No raczej tak. Tak w ogóle, to "expiry" to prawidłowa nazwa?

*czy lista bedzie dobra kolekcja do przechowywania tych zadan, jesli nie ma potrzeby dalszych operacji na tych zadaniach? (czy tez "serializacja" (ktorej jeszcze nie ogarnalem) bedzie lepszym rozwiazaniem)?

Lista to kontener na dane, może do niej wstawić obiekty swojej klasy. Serializacja to zapis obiektu (także listy, w końcu jest ona obiektem) do pliku. A Ty o co pytasz?

*w jaki sposob limitowac wybrana kolekcje do okreslonej ilosci zadan (w tym przypadku liste do 5 zadan?)

To może lepiej jednak użyć pięcioelementowej tablicy?

*jak limitowac wczesniej zdefiniowane stringi do okreslonej ilosci znakow? (16 na tytul i 256 na opis?)

Najprościej to chyba ograniczyć rozmiar TextBoxa, żeby użytkownik nie mógł więcej wpisać.

*w jaki sposob zaprogramowac i operowac w programie "bool MyTask_compleated" - reprezentujaca zakonczenie zadania?

Przycisk "Zakończ zadanie", który ustawia to pole/właściwość na true?

*czy dobra praktyka bedzie wykorzystanie konstruktora w nowej klasie ktory bedzie inicjowal w/w zmienne?

Nie zaszkodzi, ale nie jest to konieczne.

*czy powienienem uzyc parametrow (get, set) przy definiowaniu zmiennych? jesli tak, to dlaczego?

To nie są żadne parametry tylko akcesory, które mogą być zastosowane we właściwościach.
Publiczne pola są nieładne z punktu widzenia programowania obiektowego, a poza tym tworzą pewne komplikacje np. przy wiązaniu danych z kontrolkami GUI. Przyjętą i stosowaną praktyką oraz konwencją jest używanie właściwości.

0
jaspernorth napisał(a)

*czy utworzenie interfejsu ktory definiuje nowe zadanie jest uzasadniony w przypadku tego programu?

Zależy, co masz na myśli mówiąc "interfejs" - jeżeli chodzi Ci o klasę to jak najbardziej tak. Natomiast jeśli mówisz o czystym interface z C#, to jest raczej zbędny w tym momencie. Interfejsy tworzy się wtedy, gdy różne klasy mają korzystać z tych samych funkcji, tylko definiują je na swój sposób. W Twoim przypadku należy stworzyć zwykłą klasę opartą o te wartości, które utworzyłeś w powyższym "interfejsie".

*czy zmienne sie zgadzaja? (w szczegolnosci DateTime reprezentujace date utworzenia i wygasniecia zadania powinny byc wykorzystane w tym programie?)

Skoro określone zadania mają swój czas, to utworzenie takich zmiennych jest wymagane.

*czy lista bedzie dobra kolekcja do przechowywania tych zadan, jesli nie ma potrzeby dalszych operacji na tych zadaniach? (czy tez "serializacja" (ktorej jeszcze nie ogarnalem) bedzie lepszym rozwiazaniem)?

Lista może być wykorzystywana w czasie działania programu do gromadzenia zadań. Jednak jeśli chcesz mieć dostęp do tych zadań po ponownym uruchomieniu programu, wtedy serializacja jest konieczna. Możesz też zapisywać zadania do zwykłego pliku tekstowego i przy ponownym korzystaniu z programu, po prostu łądować dane do programu.

*w jaki sposob limitowac wybrana kolekcje do okreslonej ilosci zadan (w tym przypadku liste do 5 zadan?)

Sprawdzasz rozmiar listy.

*jak limitowac wczesniej zdefiniowane stringi do okreslonej ilosci znakow? (16 na tytul i 256 na opis?)

Podobnie, jak listy - sprawdzasz długość danego string'a.

*w jaki sposob zaprogramowac i operowac w programie "bool MyTask_compleated" - reprezentujaca zakonczenie zadania?

Zwykła flaga mówiąca o tym czy dane zadanie jest w trakcie prac, czy jest zakończone. Status zadania możesz również zapisywać do pliku i aktualizować za każdym razem, gdy coś na nim wykonasz.

*czy dobra praktyka bedzie wykorzystanie konstruktora w nowej klasie ktory bedzie inicjowal w/w zmienne?

Zdecydowanie tak, aby mieć stworzony konkretny obiekt.

*czy powienienem uzyc parametrow (get, set) przy definiowaniu zmiennych? jesli tak, to dlaczego?

Powinieneś, aby w nagłym przypadku mieć szybki dostęp do odczytu/zapisu danych. C# posiada tzw. właściwości.

0

Dzieki za szybkie odpowiedzi, wlasnie skonczylem poprawiac swoj kod i wprowadzielm w nim nastepujace zmiany:

  • pozbylem sie interface-u i w jego miejsce stworzylem zwykla klase (czy ona nie powinna byc abstract?)
  • dodalem accesory get set do zmiennych
  • stworzylem konstruktora ktory inicjuje zmienne
  • na glownym formie zamiast lisboxa uzylem checked listboxa ktory bedzie wyswietlal zadania oraz dawal mozliwosc zaznaczenia konkretnego zadania w celu jego edytowania badz tez usuniecia
  • zdecydowalem sie rowniez uzyc tablicy do przechowywania zadan oraz zapisywac dane do pliku tekstowego (serializacja dalej nie opanowana - ciagle w delegacji :))

Oto kod mojej glownej klasy ktora reprezentuje zadanie:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class MyTask
{
public string Title { get; set; }
public string Description { get; set; }
public DateTime Created { get; set; }
public DateTime Expiry { get; set; }
public bool Compleated { get; set; }

public MyTask(string nTitle, string nDescription, DateTime nCreated, DateTime nExpiry, bool nCompleated)
{
    Title = nTitle;
    Description = nDescription;
    Created = nCreated;
    Expiry = nExpiry;
    Compleated = nCompleated;
}

}

No i tutaj pojawiaja sie nastepne problemy...:)

Po zaprojektowaniu glownej klasy spodziewam sie iz powinienem sie zabrac za pisanie glownego kodu programu w program.cs, ale szczeze mowiac nie wiem jak sie za to wziac i od czego zaczac (POMOCY!), do tego nasuwaja mi sie nastepne pytania:

  • pomyslalem ze najlepiej by bylo jesli uzytkownik dodajac zadanie przeniesie sie do nowego formu ktory umozliwi mu wpisanie tych wszystkich informacji. Po wypelnieniu user zostanie przeniesiony do glownego okna gdzie jego zadanie zostanie wyswietlone w listboxie - czy to nie bedzie zbyt komplikowac calej sytuacji?
  • chcialbym aby moj listbox wyswietlal wszystkie zmienne zawarte w kazdym zadaniu (tytul, opis, date utworzenia i zakonczenia oraz info czy zadanie zostalo zakonczone, czy jest to mozliwe uzywajac tylko jednego checked listbox-a?)

Jak juz wspomnialem, czuje jak bym walil glowa w mur, nie wiem w jaki sposob zabrac sie za program.cs aby tknac ducha w ten cholerny program. Myle ze dam sobie rade z zaprogramowaniem buttonow ale reszta mnie przeraza... Bede serdecznie wdzieczny za wszelkie wskazowki ktore moga mnie naprowadzic na dobry trop. Z gory dzieki!

Pozdrowienia!

0
jaspernorth napisał(a)
  • pozbylem sie interface-u i w jego miejsce stworzylem zwykla klase (czy ona nie powinna byc abstract?)

Ty potrzebujesz obiektów, w których będziesz trzymał dane o swoich zadaniach, więc potrzebujesz zwykłej klasy. Nie można tworzyć obiektów klas abstrakcyjnych, więc do niczego Ci się tu taka klasa nie przyda. Klasę abstrakcyjną tworzymy, jeśli inne klasy będą z niej dziedziczyły, tymczasem Ty tu nie masz żadnego dziedziczenia.

  • stworzylem konstruktora ktory inicjuje zmienne

"Stworzyłem konstruktora" mógłbyś powiedzieć, gdybyś był jakimś bogiem, który może stwarzać ludzi określonych zawodów.

  • zdecydowalem sie rowniez uzyc tablicy do przechowywania zadan oraz zapisywac dane do pliku tekstowego (serializacja dalej nie opanowana - ciagle w delegacji :))

Serializacja XML to dwie linijki kodu, deserializacja również. Zapis i odczyt obiektów z pliku tekstowego będzie trudniejszy, ale jak wolisz.

public MyTask(string nTitle, string nDescription, DateTime nCreated, DateTime nExpiry, bool nCompleated)

Po co te prefiksy "n"? Nie ładniej tak?

public MyTask(string title, string description, DateTime created, DateTime expiry, bool compleated)

Po zaprojektowaniu glownej klasy spodziewam sie iz powinienem sie zabrac za pisanie glownego kodu programu w program.cs

Nie ma potrzeby, żebyś coś pisał w Program.cs. Dlaczego chcesz tam coś pisać?

  • pomyslalem ze najlepiej by bylo jesli uzytkownik dodajac zadanie przeniesie sie do nowego formu ktory umozliwi mu wpisanie tych wszystkich informacji. Po wypelnieniu user zostanie przeniesiony do glownego okna gdzie jego zadanie zostanie wyswietlone w listboxie - czy to nie bedzie zbyt komplikowac calej sytuacji?

Raczej nie, raczej trudno wymyślić inne rozwiązanie takiej funkcji w programie.

  • chcialbym aby moj listbox wyswietlal wszystkie zmienne zawarte w kazdym zadaniu (tytul, opis, date utworzenia i zakonczenia oraz info czy zadanie zostalo zakonczone, czy jest to mozliwe uzywajac tylko jednego checked listbox-a?)

Chyba tak, ale moim zdaniem do prezentowania danych w postaci tabelki lepiej użyć DataGridView.

0

Pierwsza rzecz - kod w znaczniki.

To jedziemy:

  • pozbylem sie interface-u i w jego miejsce stworzylem zwykla klase (czy ona nie powinna byc abstract?)

Nie ma takiej potrzeby. Klasy abstrakcyjne stosuje się głównie przy budowaniu hierarchii klas, gdzie z klasy bazowej (abstrakcyjnej) dziedziczą kolejne i rozbudowują API.
W Twoim przypadku zwykła prosta klasa jest jedynym wyborem.

  • na glownym formie zamiast lisboxa uzylem checked listboxa ktory bedzie wyswietlal zadania oraz dawal mozliwosc zaznaczenia konkretnego zadania w celu jego edytowania badz tez usuniecia

Można tak, ale można też zrobić listBox, na którym będziesz po prostu wybierał dane zadanie i edytował czy to przez dodadtkowy button czy też doubleClick na danym elemencie listy.

Co do samego kodu, to niewiele na razie można powiedzieć. Jednym szczegółem, który ja osobiście uwzględniam podczas pisania jest wskaźnik this dla podkreślenia tożsamości obiektu. Wszelkie operacje, które odwołują się do zmiennych czy metod w danej klasie poprzedza się właśnie this.

Po zaprojektowaniu glownej klasy spodziewam sie iz powinienem sie zabrać za pisanie glownego kodu programu w program.cs, ale szczeze mowiac nie wiem jak sie za to wziac i od czego zaczac (POMOCY!)

Jak to od czego? Wiesz co ten program ma robić, utworzyłeś zapewne już jakieś GUI co zobrazowało mniej więcej sens działania Twojego algorytmu. Nie pozostało Ci teraz nic innego jak napisanie tego co chcesz zrobić. Lecz - ważna uwaga - nie wszystko naraz. Po kolei zacznij kodować kolejne elementy, np. Dodawanie kolejnych zadań do listy, następnie okodowanie button'a odpowiedzialnego za zapisywanie dych obiektu w pliku itd.

  • pomyslalem ze najlepiej by bylo jesli uzytkownik dodajac zadanie przeniesie sie do nowego formu ktory umozliwi mu wpisanie tych wszystkich informacji. Po wypelnieniu user zostanie przeniesiony do glownego okna gdzie jego zadanie zostanie wyswietlone w listboxie - czy to nie bedzie zbyt komplikowac calej sytuacji?

Można zrobić w taki sposób - tworzysz nową formę, w której tworzysz nowy obiekt danego typu. Następnie te dane zapisujesz w swojej liście/tablicy, którą przekazujesz do tej formy lub tworzysz w osobnej klasie.
Drugim sposobem może być po prostu zrobienie wszystkiego na jednej formie o ile będzie czytelne i zrozumiałe, jak i dla user'a, jak i dla programisty. W jakimś groupBox'ie wyodrębniasz elementy (textboxy) odpowiedzialne za nowe zadanie i albo przy tworzeniu ustawiasz jego visible na true, albo masz go na widoku przez cały czas.

  • chcialbym aby moj listbox wyswietlal wszystkie zmienne zawarte w kazdym zadaniu (tytul, opis, date utworzenia i zakonczenia oraz info czy zadanie zostalo zakonczone, czy jest to mozliwe uzywajac tylko jednego checked listbox-a?)

Tak. W jednym wierszu wyświetlasz wszystkie dane zadania oddzielone spacją/tabulatorem/czymkolwiek.

Jak juz wspomnialem, czuje jak bym walil glowa w mur, nie wiem w jaki sposob zabrac sie za program.cs aby tknac ducha w ten cholerny program. Myle ze dam sobie rade z zaprogramowaniem buttonow ale reszta mnie przeraza... Bede serdecznie wdzieczny za wszelkie wskazowki ktore moga mnie naprowadzic na dobry trop. Z gory dzieki!

Tu nic nie przeraża, po prostu musisz wiedzieć, jak to ma działać i to... napisać ;). Tak, jak wspomniałem wyżej - po kolei i spokojnie koduj następne elementy, a całość złoży się cała. Tu akurat z tym nie ma żadnej filozofii.

0

Typ projektu jaki realizujesz to nie ConsoleApllication(aplikacja w czarnym okienku) tylko WindowsForms(okienkowe).
W przypadku winforms w Program.cs nic nie piszesz- tam jest tylko informacja jaka formatka ma być odpalona jako pierwsza po uruchomieniu programu.
Tobie pozostaje dodać do tej pierwszej formatki (po uruchomieniu) odpowiednie kontrolki (przyciski i listboxa lub jak napisał somekind dataGridView) pododawać obsługę odpowiednich zdarzeń, kolejne formatki do dodawania nowych Zadań.

Do każdej dodanej kontrolki podchodzisz jak do obiektów klas, czyli odpowiednie metody i właściwości wywołujesz sobie za pomocą kropki po nazwie kontrolki np:

 listbox1.Items.Add(zadanie); 
0

do allocer:

Pierwsza rzecz - kod w znaczniki.

Faktycznie, nie zauwazylem znacznikow, bede o nich pamietal

Można tak, ale można też zrobić listBox, na którym będziesz po prostu wybierał dane zadanie i edytował czy to przez dodadtkowy button czy też doubleClick na danym elemencie listy.

To rozwiazanie jest tez ciekawe, ale jednak kusi mnie bardziej DataGridView i dodanie bazy danych do programu. Czy moglbys mi naswietlic jak powinno sie zastosowac baze danych do takiego programu?

Jednym szczegółem, który ja osobiście uwzględniam podczas pisania jest wskaźnik this dla podkreślenia tożsamości obiektu

Nie rozumiem o co chodzi.. :) moglbys rozwinac zagadnienie uzycia tego wskaznika?

do somekind:

"Stworzyłem konstruktora" mógłbyś powiedzieć, gdybyś był jakimś bogiem, który może stwarzać ludzi określonych zawodów.

Faktycznie, moj blad - zdefinowalem konstruktora

Po co te prefiksy "n"?

Zdecydowanie sie zgadzam, Twoj sposob jest duzo bardziej przyjazny, dzieki

Serializacja XML to dwie linijki kodu, deserializacja również. Zapis i odczyt obiektów z pliku tekstowego będzie trudniejszy, ale jak wolisz.

Faktycznie, serializacja nie jest taka trudna jak sie spodziwalem, w przyszlosci na pewno bede jej uzywal czesciej zamiast zapisywac dane do pliku tekstowego

Chyba tak, ale moim zdaniem do prezentowania danych w postaci tabelki lepiej użyć DataGridView

DataGridView wydaje sie najbardziej odpowiednim rozwiazaniem do tego projektu. Podoba mi sie pomysl wyswietlania tych danych w formie ladnej tabelki, nie umiem niestety operowac ta opcja i nie wiem czy bede musial tworzyc nowa baze danych do przechowywania danych, ale tak jak mowilem ten pomysl wydaje sie najbardziej atrakcyjny...

do przecier:

Typ projektu jaki realizujesz to nie ConsoleApllication(aplikacja w czarnym okienku) tylko WindowsForms(okienkowe)

W pierwszym semestrze nauki zajmowalismy sie tylko ConsoleApllication i glowny program pisalo sie w Program.cs, z tego wpowodu bylem swiecie przekonany iz powinienem program pisac wlasnie w tym pliku. To jest moja pierwsza aplikacja uzywajaca WindowsForms. Dzieki za naprowadzenie

Serdeczne dzieki za Wasze szybkie (jak zwykle) odpowiedzi. Musze przyznac ze forum takie jak to wraz z jego aktywnymi uzytkownikami (tacy jak Wy) polaczone z dodatkowa literatura jest niesamowicie pomocne w nauce - dzieki!

Tak wiec trzymam sie zwyczajnej klasy ktora definiuje zadanie i chcialbym uzyc bazy danych do przechowywania zadan oraz wyswietlac te zadania na glownym formie za pomoca DataGridView. Kwestia uzycia bazy danych bedzie teraz moja najwieksza bolaczka; jakies sugestie jak zrobic to w najprostrzy sposob? No i jeszcze jedno laickie pytanie... jakiego kodu uzyc w celu przeniesienia sie z jednego formu do drugiego (tzn. otworzyc nowy form przy dodawaniu nowego zadania?)

0
jaspernorth napisał(a)

do allocer:

Można tak, ale można też zrobić listBox, na którym będziesz po prostu wybierał dane zadanie i edytował czy to przez dodadtkowy button czy też doubleClick na danym elemencie listy.

To rozwiazanie jest tez ciekawe, ale jednak kusi mnie bardziej DataGridView i dodanie bazy danych do programu. Czy moglbys mi naswietlic jak powinno sie zastosowac baze danych do takiego programu?

DataGridView jest tu bardzo dobrym pomysłem, o którym nie pomyślałem pisząc posta.
Jednak baza danych w Twoim przypadku konieczna nie jest, lecz jeśli bardzo chcesz potrenować ten sposób to stworzenie takiej prostej bazy danych jest łatwe. Visual Studio posiada zakładkę Server Explorer, w której po porostu "wyklikujesz" nową bazę danych, ustawiasz poszczególne tabele i wypełniasz je czy to ręcznie czy programowo. Ogólnie radzę zapoznać się z ADO.NET i LINQ to SQL, które pod tym względem bardzo ułatwiają pracę z bazą danych. Na necie jest pełno przykładów i tutoriali, jak od podstaw zbudować bazę danych.

Jednak, tak jak mówię - baza danych dla stałej liczby (w dodatku tak małej) danych, nie jest potrzebna. Zastosowanie serializacjii XML czy zwykłych plików tekstowych jest tu wystarczające. Trzymasz sobie zserializowaną listę obiektów typu Zadanie i deserializując ją wpisujesz jej dane do listBox'a/dataGridView.

Jednym szczegółem, który ja osobiście uwzględniam podczas pisania jest wskaźnik this dla podkreślenia tożsamości obiektu

Nie rozumiem o co chodzi.. :) moglbys rozwinac zagadnienie uzycia tego wskaznika?

this to nic innego jak wskaźnik tożsamości obiektu stosowany przy programowaniu obiektowym - http://msdn.microsoft.com/en-us/library/dk1507sz(v=vs.80).aspx

Ale zamiast zaśmiecać sobie głowę wszystkimi możliwościami rozwiązania tego problemu - skoncentruj się na wspomnianym, czyli serializacja obiektu do pliku XML.

0
jaspernorth napisał(a)

Faktycznie, moj blad - zdefinowalem konstruktora

Ja bym jednak powiedział, że konstruktor, to "a" na końcu ciągle wskazuje na osobę.

Kwestia uzycia bazy danych bedzie teraz moja najwieksza bolaczka; jakies sugestie jak zrobic to w najprostrzy sposob?

Ale jakiej bazy danych? Poprzednio pisałeś o tym, że dane będziesz trzymał w plikach...

0

I jeszcze to:

Jakiego kodu uzyc w celu przeniesienia sie z jednego formu do drugiego (tzn. otworzyc nowy form przy dodawaniu nowego zadania?)

0

Nie ma czegoś takiego jak przenoszenie się z jednego formu do drugiego. Formatki do zwykłe obiekty zwykłych klas, można je tworzyć i wywoływać na nich metody, a potem niszczyć.

NoweZadanieForm nzf = new NoweZadanieForm();
nzf.ShowDialog(); 
0

Baza danych != plik z danymi. Poczytaj w internecie.

0

Witam ponownie,

Zabralem sie za kodowanie formu "Dodaj zadanie" a konkretnie buttona "Zapisz zadanie" ktory zapisuje informacje wprowadzone przez usera (TextBox z tytulem i opisem, dzisiejsza date oraz DateTimePicker z data wygasniecia zadania). Przy probie serializacji danych wyskakuje mi blad: 'to_do.AddTask.Tasks' is a 'field' but is used like a 'type'

Oto kod:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Serialization;
using System.IO;

namespace to_do
{
    public partial class AddTask : Form
    {
        List <MyTask> Tasks = new List <MyTask>();

        public DateTime DateNow = DateTime.Now; 
        
        
        
        public AddTask()
        {
            InitializeComponent();
        }

        private void AddTask_Load(object sender, EventArgs e)
        {

            
            createddate_lbl.Text = DateNow.ToShortDateString();
        }

        
        private void addtsk_btn_Click(object sender, EventArgs e)
        {
            MyTask MyTask = new MyTask();

            MyTask.title = title_txtbx.Text;
            MyTask.description = description_txtbx.Text;
            MyTask.created = DateNow;
            MyTask.expiry = dateTimePicker.Value;
            MyTask.compleated = false;

            
            Tasks.Add(new MyTask(MyTask.title, MyTask.description, MyTask.created, MyTask.expiry, MyTask.compleated));

            XmlRootAttribute RootAttr = new XmlRootAttribute();
            RootAttr.ElementName = "Tasks";
            RootAttr.IsNullable = true;

            XmlSerializer Serializer = new XmlSerializer(typeof(List<Tasks>), RootAttr);
            StreamWriter StreamWriter = null;

            try
            {
                StreamWriter = new StreamWriter("Tasks.xml");
                Serializer.Serialize(StreamWriter, Tasks);
            }
            catch (Exception oException)
            {
                Console.WriteLine("Appplication generated following exception: " + oException.Message);
            }
            finally
            {
                if (null != StreamWriter)
                {
                    StreamWriter.Dispose();
                }
            }
        }

        
    }
}
 

Zastanawiam sie rowniez w jaki sposob zserializowane juz dane moge deserializowac do DataGridView w glownym formie

Pozdrawiam

0

Drobna sugestia: dane w pliku przechowuj wtedy kiedy np. wyłączasz cały program. Wtedy po uruchomieniu programu można je odczytać. Listę zadań utwórz sobie w pierwszej formatce. W formatce AddTask stwórz sobie pojedyncze zadanie i publiczną właściwość która będzie ci je zwracać. Wtedy w pierwszej formatce będziesz mógł je odczytać i dodać do listy.

Tu masz przykładowy kod pierwszej formatki:

 
    public partial class Form1 : Form
    {
        private List<Task> Tasks;

        public Form1()
        {
            InitializeComponent();
            Tasks = new List<Task>();
        }

        private void newTask_Click(object sender, EventArgs e)
        {
            NewTask nt = new NewTask();
            if (nt.ShowDialog() == DialogResult.OK)
            {
                Tasks.Add(nt.returnTask);
            }

        }


    }

A tu drugiej:

    public partial class NewTask : Form
    {
        private Task task;

        public Task returnTask
        {
            get { return task; }
        }

        public NewTask()
        {
            InitializeComponent();
            task = new Task();
        }

        private void NewTask_Load(object sender, EventArgs e)
        {

        }
    }
 

A tu jest link do drobnego tutoriala z jak używać datagridview:
http://www.dotnetperls.com/datagridview

0

Witam ponownie :)

Popracowalem troche nad moim kodem i obecnie mam problem z dwoma bledami:

  • Po zapisaniu zadania w DataGridView wyswietla sie tylko w pierwszym wierszu "MyTask" a konkretne dane ktore wprowadzilem
  • Przy probie serializacji danych program tworzy plik tasks.xml ale jego zawartosc to tylko:
 <?xml version="1.0" encoding="utf-8"?>
<DataTable

Oto kod glownej formatki nad ktora pracowalem:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Serialization;
using System.IO;

 namespace to_do
{
    public partial class TO_DO : Form
    {
        private List<MyTask> Tasks;
        private DataTable table;
 
 
 
        public TO_DO()
        {
            InitializeComponent();
            Tasks = new List<MyTask>();
            table = new DataTable();
 
        }
 
        private void addtsk_Click(object sender, EventArgs e)
        {
            AddTask at = new AddTask();
            DialogResult dr = at.ShowDialog(); 
            if (dr == DialogResult.OK)
            {
                Tasks.Add(at.NewTask); 
 
                DataTable table = ConvertListToDataTable(Tasks); //Convert to DataTable.
                dataGridView.DataSource = table;                       //Displays new task in DataGridView
 
            }
        }
 
        private void endtsk_btn_Click(object sender, EventArgs e)
        {
            serializacja(table);
            Application.Exit();
        }
 
 
        static public void serializacja(DataTable table)
        {
            XmlRootAttribute oRootAttr = new XmlRootAttribute();
            XmlSerializer oSerializer = new XmlSerializer(typeof(DataTable), oRootAttr);
            StreamWriter oStreamWriter = null;
            try
            {
                oStreamWriter = new StreamWriter("tasks.xml");
                oSerializer.Serialize(oStreamWriter, table);
            }
            catch (Exception oException)
            {
                Console.WriteLine("Aplikacja wygenerowała następujący wyjątek: " + oException.Message);
            }
            finally
            {
                if (null != oStreamWriter)
                {
                    oStreamWriter.Dispose();
                }
            }
        }
 
 
        static DataTable ConvertListToDataTable(List<MyTask> Tasks)
        {
            //New table
            DataTable table = new DataTable();
 
            //Add columns
            table.Columns.Add("Title");
            table.Columns.Add("Description");
            table.Columns.Add("Start Date");
            table.Columns.Add("Expiry Date");
            table.Columns.Add("Compleated");
 
            // Add rows.
            foreach (MyTask element in Tasks)
            {
                table.Rows.Add(element);
            }
 
            return table;
        }
    }
}

Czy ten kod pozwoli na zapis danych do xml kiedy uzytkownik zmieni dane manualnie w DataGridView?

Z gory dzieki za pomoc!

Pozdrawiam!

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