Gdzie przechowywać dane w programie okienkowym?

0

Witam, chcę napisać aplikację do przechowywania mojej listy książek wczytywanej z pliku. Aplikacja składa się na razie z okna głównego oraz z okienek(pop-upów) do dodawania/edycji. Jak obsłużyć komunikację tych okienek z książkami. Czy tablicę z danymi przechowywać jako pole klasy okna głównego i przy wywoływaniu okien pomocniczych przekazywać referencję, zczytywać każdorazowo dane z pliku, czy może jest jakieś inne, bardziej wydajne rozwiązanie, które pozwoli klasie okien do dodawania/edycji uzyskać dostęp do pól klasy okna głównego?

0

Ja to bym do bazy danych wrzuciła. Lubię bazy danych.

0

Poczytaj o wzorcu projektowym MVC.

0

Dla aplikacji WinForms bardziej sensowny jest chyba MVP.
Ja bym w pliku trzymał zserializowane obiekty, zaś kontrolki na Formie wypełniał nimi poprzez BindingSource.

0

Witam

Obecnie przerabiam podobny temat.
Napisałem prostą aplikacje z wykorzystaniem Sqlite.
Całość operacji wykonywanych jest na obiekcie DataTable.
a dane prezentowane są w Datagridview.

Jestem początkującym, więc z chęcią posłucham opinii.

Załączam kod projektu wykonany w VS2010:
Ściągnij bookdb.zip

0

Pytającemu chyba bardziej chodzi o wymianę danych między oknami a nie sposób zapisu danych.

0

Najlepiej jak byś użył jakiejś bazy danych. Ale jeżeli musisz korzystać z pliku, to jeżeli główna forma na starcie wczytuje listę książek z pliku to warto ją upublicznić dla reszty formatek, żeby nie musiały wczytywać za każdym razem listy. Możesz operować na tej liście podczas działania programu, a przy wyłączaniu programu ją zapisywać z powrotem na dysk. Tylko jest kilka problemów. Co się stanie jak program nie zakończy się prawidłowo? Wszystkie zmiany zostaną utracone. Można zapisywać listę co zmianę, ale to mija się z celem. Dla takich rzeczy zostały stworzone bazy danych i powinieneś jakiejś tutaj użyć.

0

@rychu22: Jak upublicznić listę książek?

Chcę przechowywać dane w pliku dla wygody i możliwości łatwiejszego przenoszenia danych (program + lista książek) zamiast tworzenia specjalnie bazy danych. A do zapisywania posłuży mi przycisk zapisz(ctrl+s).

0

W głównej formie utwórz zmienną publiczną bedacą listą ksiazek, np.:

public partial class Form1 : Form
    {
        public List<string> ksiazki;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

        }
    }

Teraz musisz utworzyc w kazdej innej formie, ktora ma miec dostep do ksiazek, zmienna typu Form1 i zmodyfikować konstruktor w np. taki sposób:

public partial class Form2 : Form
    {
        private Form1 f1;

        public Form2(Form1 f)
        {
            InitializeComponent();

            f1 = f;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            
        }
    }

W głównej formie, nową formę wywołujesz tak:

Form2 f2 = new Form2(this);
f2.Show();

I teraz w drugiej formatce możesz już się odwoływać do ksiazek z głównej formatki:

MessageBox.Show(f1.ksiazki[0]);
f1.ksiazki[0] = "betowen";

Gotowy przykład wrzuciłem Ci na rapida: http://rapidshare.com/files/420170158/WindowsFormsApplication1.zip

W dalszym ciągu jestem zdania, że powinieneś użyć bazy danych. Program z MSSQL-ową bazą danych też się przenosi tylko "program + baza"

0

jak mowi stare pozekadlo wszystkie Ryśki to fajne chlopaki, ale przyklad ryska jest nie-fajny

lista ksiazek - pole okna glownego
przekazanie czegos do okien popup'ow - jesli popup ma dzialac na jednej ksiazce, to przekazanie mu referencji do obiektu tej ksiazki (nie calej listy) ma sens
jesli jakis popup ma dzialac na liscie ksiazek, tez mozna mu smialo przekazac liste (ale nie referencje do okna), bo lista to reference type

czesto stosuje sie tez taka taktyke, ktora oddziela forme prezentacji obiektow od danych
tzn. okno popup dostaje albo obiekt ksiazki, albo poszczegolne cechy ksiazki, na ktorych umozliwia jakies akcje, kiedy ten popup jest zamykany form, ktory go wywolal sprawdza czy klikniety zostal przycisk OK czy Anuluj, jesli OK, wtedy modyfikuje obiekt ksiazki

0

Super po prostu, warstwa danych w warstwie interfejsu użytkownika.

0
somekind napisał(a)

Super po prostu, warstwa danych w warstwie interfejsu użytkownika.

:-D Podsumował nas :D
Już nie chcę Ci źle podpowiadać, ale może zrób sobie osobną klasę która by przechowywała w sobie listę książek i udostępniała operacje na tej liście takie jak Dodaj(), Usuń(), Edytuj(), a przede wszystkim Wczytaj() i Zapisz(). W głównej formatce byś tworzył egzemplarz tej klasy, a do innych formatek przekazywał referencje tej klasy.

0

rychu22: po co przekazujesz całą formę, jak można samą listę?

0

Tak, wiem. Tak na szybko i nie do końca przemyślałem, ale chodziło o sam sposób.

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