Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C# - aplikacja drag&drop, kafelki, database itp.

kafus6 19 Wrz 2014 01:38 5334 79
  • #1 19 Wrz 2014 01:38
    kafus6
    Poziom 14  

    Witam,

    Wymyśliłem sobie dzisiaj programik drag and drop.

    Zamieściłem obrazek, żeby lepiej wytłumaczyć o co chodzi.

    C# - aplikacja drag&drop, kafelki, database itp.

    Pomijając logowania itp- tak ma wyglądać przykładowo główny pulpit dla Manager 1.
    Ideą programu jest to, żeby można było "rozdawać" pracowników innym menagerom lub/i zmieniać ich działy itp. za pomocą drag&drop ( pod windowsem 7!!).

    Managerów, działy oraz pracowników programik brałby z bazy danych.
    Prosiłbym o idee jak się za takie coś zabrać.
    Chodzi mi o:

    1. Windows form czy WPF.
    2. Jak, czym, w jaki sposób zrobić "dynamiczne" tworzenie się kafelków (np. pojawianie się ich po dopsaniu pracownika w bazie danych. Może dodać pule nieprzydzielonych pracowników tak, aby każdy mógł "wziąć" go do swojego działu?).
    3.Czym byłby kafelek? buttonem, labelem, obrazkiem?


    Proszę o ogólne- nawet luźne- sugestie. Od razu mówie, że nie chodzi mi o wodotryski. Na początku coś prostego :) ewentualnie potem będę dodawać wiązanie krawatów, robienie gofrów i usuwanie ciąży :)

    0 29
  • #2 19 Wrz 2014 10:09
    truski
    Poziom 16  

    Pytanie czy interesuje cię przerzucanie pracowników graficznie - mam tu na myśli jakiś wizualny graf połączeń czy nazwijmy to tabelarycznie - masz listy i przerzucasz pracowników między listami.
    Tak czy inaczej, skoro jest to Windows 7 to WPF, tym bardziej jeśli chciałbyś robić to w postaci grafu.

    Jeśli byłbyś zainteresowany wizualizacją na grafach, to musiałbyś się rozejrzeć za jakąś kontrolką wspomagającą operacje na grafach - kiedyś używałem ILOG Diagram for .Net i było to bardzo fajnie zrobione, niestety było to płatne i z jakiegoś powodu zostało wycofane ze sprzedaży. Możesz również spróbować GraphX ze zdjęć na stronie wygląda, że posiada kontrolki do tworzenia diagramów osobowych i wspiera mechanizmy rozkładu elementów

    0
  • #3 19 Wrz 2014 12:23
    przemko07
    Poziom 16  

    ja proponuje WPF,
    obiekty można przesyłać do widoków i przedstawiać je niezaleznie od struktury obiektu.
    może być wyświetlony w tabeli albo na grafie, WPF + XAML + Binding oddziela logikę biznesową od prezentacji/widoków.

    0
  • #4 19 Wrz 2014 13:01
    marcinj12
    Poziom 40  

    To ja tylko dodam, że w WinFormsach też można próbować wyrzeźbić jakieś rozwiązanie. W załączniku taki mały, prosty przykład na labelach i panelach (kontenerach na te labele), przesuwanych standardowymi zdarzeniami myszy.
    Nie wiem jak będzie z wydajnością przy znacznie większej ilości itemów, można też stworzyć strukturę w pamięci i rysować jej elementy za pomocą GDI, ale z tym więcej zabawy.

    0
  • #5 19 Wrz 2014 14:44
    kafus6
    Poziom 14  

    Dzięki wszystkim za sugestie :)

    marcinj12 : pytanie, czy label'e i Panel'e można podpiąć do bazy danych?
    Jeden Label do jednego pracownika, jeden Panel do jednego działu.
    Dodatkowo czy Labele mogą być generowane z automatu w zależności ilu jest pracowników?

    truski : wystarczy 'tabelarycznie'

    0
  • Pomocny post
    #6 19 Wrz 2014 14:52
    marcinj12
    Poziom 40  

    kafus6 napisał:
    marcinj12 : pytanie, czy label'e i Panel'e można podpiąć do bazy danych?
    Jeden Label do jednego pracownika, jeden Panel do jednego działu.
    Dodatkowo czy Labele mogą być generowane z automatu w zależności ilu jest pracowników?
    Pewnie, można generować kontrolki dynamicznie. To jest tylko przykład, jeżeli chcesz użyć automatu, to musisz sobie go wykombinować :).

    0
  • #7 19 Wrz 2014 15:01
    kafus6
    Poziom 14  

    Wykombinować... ok :) podejrzewam, że temat jeszcze długo będzie tutaj męczony przeze mnie :)

    0
  • #8 19 Wrz 2014 16:03
    truski
    Poziom 16  

    Jeśli jednak chcesz korzystać w WinForms to ja bym się skłaniał w kierunku rysowania GDI+, wbrew pozorom to wcale trudne nie jest, a na pewno będzie działać lepiej niż przesuwanie labeli/paneli czy czegokolwiek innego. Ewentualnie możesz napisać swoją własną kontrolkę, zawierającą tylko tobie potrzebne właściwości. Z drugiej strony do takich rzeczy wykorzystuje się właśnie WPF, który ma wsparcie sprzętowe do renderowania grafiki i jest po prostu prostszy niż WinForms i GDI+.

    0
  • #9 19 Wrz 2014 18:06
    kafus6
    Poziom 14  

    Z tym, że w WPF jeszcze nie robiłem. Nie jestem też na tyle biegły w C# żeby pisać swoje kontrolki. Jakbyś podał jakieś przykłady drag&drop oraz kontrolki do tego to byłbym wdzięczny. Wybrałem WinForms bo marcinj12 podał przykadł i miałem już jakiś zalążek.:) Jak masz gdzieś coś to prosiłbym o załączenie- każda pomoc mi się przyda :)

    Nie upieram się przy WinForms... chciałbym coś takiego napisać i chciałbym umieć coś takiego zrobić :) jakoś się trzeba uczyć tego C# :)

    0
  • #10 19 Wrz 2014 23:32
    marcinj12
    Poziom 40  

    Jeśli nie potrzebujesz wodotrysków, to możesz na początku zamiast takiego "bajeranckiego" przeciągania zastosować coś prostszego - często można spotkać taki efekt zrobiony na standardowej kontrolce TreeView, bo domyślnie wspiera ona przeciąganie itemów między gałęziami, trzeba tylko oprogramować kilka zdarzeń.

    Zerknij na kolejny załącznik z gotowym przykładem - ten ma dwie funkcje, które na razie udają, że pobierają dane z bazy danych, ale można je łatwo zastąpić zapytaniami SQL. Jeśli dobrze rozumiem strukturę, to jeden manager może mieć pod sobą kilka działów - w związku z tym ludzi można "przeciągać" z jednego działu do drugiego upuszczając ich na oznaczone na niebiesko działy.

    Warto dodać, że część właściwości kontrolek została ustawiona z designera - jeśli będziesz chciał zrobić coś podobnego, to zwróć uwagę we właściwościach na wytłuszczone pozycje.

    0
  • #11 20 Wrz 2014 20:11
    kafus6
    Poziom 14  

    Skąd Ty to bierzesz ? :) Też mógłbym poszukać jakbym wiedział gdzie :)

    Jeśli chodzi o Twój ostatni przykład:
    Chciałbym tylko wiedzieć czy można 'dorysować' efekt przeciągania- zależałoby mi na nim bo chciałbym, żeby aplikacje można było wykorzystać na ekranie dotykowym (win 7 przypominam)

    ps. W designerze nie widzę nic oprócz pustego treeView'a tak ma być ?

    0
  • #12 20 Wrz 2014 20:39
    Defice
    Poziom 25  

    Każdą kontrolkę można niemal w każdym aspekcie dowolnie konfigurować i zmieniać. Samego efektu chyba nie ma, koledzy już wcześniej wspomnieli, że do tego typu bajerów służy WPF. WinForm, jest ubogi w graficzne.

    0
  • #13 20 Wrz 2014 20:41
    marcinj12
    Poziom 40  

    kafus6 napisał:
    Skąd Ty to bierzesz ? :) Też mógłbym poszukać jakbym wiedział gdzie :)
    Z Internetu?? Google -> c# treeview drag and drop..
    kafus6 napisał:
    Jeśli chodzi o Twój ostatni przykład:
    Chciałbym tylko wiedzieć czy można 'dorysować' efekt przeciągania- zależałoby mi na nim bo chciałbym, żeby aplikacje można było wykorzystać na ekranie dotykowym (win 7 przypominam)
    Jakiś tam efekt przeciągania domyślnie jest - pojawia się taki mały prostokącik przy kursorze. Bardziej zaawansowane animacje wymagają bardziej zaawansowanych kroków lub użycia innej technolgii (choćby wspomnianego WPFa)- nie widziałem potrzeby komplikowania tematu, drzewko to tylko jedna z propozycji, uboższa graficznie, ale i prostsza w implementacji.
    kafus6 napisał:
    ps. W designerze nie widzę nic oprócz pustego treeView'a tak ma być ?
    Tak. Węzły i itemy tworzysz samemu w kolekcji Nodes.

    Z jednej strony piszesz że dopiero zaczynasz i nie znasz się na tym za bardzo, z drugiej strony - rzucasz się od razu na głęboką wodę niestandardowych modyfikacji... Proponuję powoli i krok po kroku. Zrób tak, jak potrafisz i w czym potrafisz, nie licz na gotowce - co najwyżej możesz się nimi podeprzeć jako podstawą swojego projektu.

    0
  • #14 20 Wrz 2014 22:13
    kafus6
    Poziom 14  

    Jak najbardziej nie liczę na gotowce! Nawet nie chcę, ale jak wspomniałeś- chciałbym mieć podstawę. Jeśli chodzi o rzucanie się na głęboką wodę to... po prostu lubię tak zaczynać. Od razu coś trudnego- wiem, są złe i dobre strony takiego rozwiązania.
    W takim razie postaram się bazować na tym TreeView lub poszukać czegoś jednak w WPF... hmm, tylko jak szukałem to nie umiałem znaleźć nic ciekawego.

    edit:
    Czy takie coś mi się przyda ? Może ktoś podpowiedziec? :)
    WPF drag&drop

    0
  • #15 23 Wrz 2014 17:50
    kafus6
    Poziom 14  

    No więc...

    WPF jest dziwny :) ale podjąłem się wyzwania...

    zacząłem więc od początku.
    Szukam teraz skryptu dzięki, któremu będę mógł tworzył Label'e automatycznie z danych z bazy danych. Np:

    mam tabele workers [imie] [nazwisko]
    gdy kliknę sobie na button "zaladuj_dane" to program ma automatycznie utworzyć labele tych pracowników. Label będzie np. z kolorem, wielkości etc.

    Jakby ktoś znalazł "przypadkiem" jakiś przykład tego, byłbym bardzo wdzięczny. :)

    Edit:
    Zapewne będzie potrzebna pętla foreach - moze ktoś podpowiedzieć jakie założenia miałaby mieć pętla? Nie wiem czy zaczynam dobrze...

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #17 24 Wrz 2014 03:12
    kafus6
    Poziom 14  

    O widzisz :) Dzięki za info.

    Nie umiem jedna poradzić sobie z zamianą z forms'ów:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Niestety w WPF nie ma (po prostu) panel'a. Próbowałem na różnych innych panelach, ale żaden nie ma metody Controls.Add


    Edit:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    To chyba będzie dobre. Jednak wywala mi błąd przy linijce:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    błąd: Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.

    ConnectString jest ustawiony w pliku app.config. Czy o czymś zapomniałem ?

    Edit:

    boszsz...nie było pytania. Za długo już patrze na to...

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Dodano po 5 [godziny] 16 [minuty]:

    utknąłem.
    Nie chce pobierać danych z bazy danych.
    Tzn.
    tworzy Textboxa (w finalnej wersji nie bedzie textboxa ale tylko jego widać wiec jest to tylko dla testów) ale go nie wypełnia.
    Natomiast bo labelu ani śladu :(

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Zasadniczo podejrzewam gdzie może być błąd( i na pewno jest), ale nie umiem inaczej tego wymyślić... jakby ktoś podpowiedział z tym foreach- moim przekleństwem

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #18 24 Wrz 2014 11:10
    przemko07
    Poziom 16  

    WPF'owe aplikacje nie buduje sie tak samo jak WinForm.
    WPF to nie jest tylko zmiana nazw kontrolek ale idea tworzenia aplikacji desktopowych, tą ideą jest MVVM.
    zamieszczam app w MVVM jako przykład.

    jest tam okazane jak prezentowac kolekcje na ekranie i nimi zarzadzac.
    natomiast Drag&Drop dla MVVM znajdziesz tutaj:

    http://www.codeproject.com/Articles/420545/WPF-Drag-and-Drop-MVVM-using-Behavior

    mi się już nie chciało z dragdropem bawić w tym przykładzie więc zostawiam to tobie.

    0
  • #19 24 Wrz 2014 20:01
    kafus6
    Poziom 14  

    hmmm... myślałem, że będzie to trochę prostsze :) (bardziej podobne do C#)
    Możecie mi więc powiedzieć, jeszcze raz, na podstawie tego co chciałbym napisać- co stracę pisząc w C#? - czegoś nie będzie można zrobić? Pytam po prostu trzeba do tego wykorzystywać WPF'a. Jeśli podobny efekt będzie w C# - to czemu nie on ?:)

    ps. Dziękuje Ci za przykłady, posłużą mi do powolnego wdrażania się w WPF :)

    0
  • Pomocny post
    #20 24 Wrz 2014 20:07
    Defice
    Poziom 25  

    No cóż, to nadal jest C#. A Pytanie co stracisz, chyba nie jest odpowiednie. Ja powiedziałbym raczej, co zyskasz przechodząć na WPF. WinForm pozbawiony jest "fajerwerków" czyli stracisz na efekcie wizualnym (oczywiście można ściągnąć sobie jakieś graficzne nakładki). Co więcej WinForm nie jest dedykowany do zaawansowanej grafiki (wielu elementów w formie) gdy mamy spore nagromadzenie komponentów graficznych zwyczajnie "zamula" oraz długo wczytuje się wywoływana forma (zwykle za pierwszym razem).

    Natomiast prawda jest taka, że jeśli ilość elementów będzie nieduża, to nie zauważysz jakiejś wielkiej różnicy. Pozostaje Ci podjąć decyzje mając na uwadze, ile elementów docelowo znajdzie się na formie.

    0
  • #21 24 Wrz 2014 20:11
    kafus6
    Poziom 14  

    Defice napisał:

    Natomiast prawda jest taka, że jeśli ilość elementów będzie nieduża, to nie zauważysz jakiejś wielkiej różnicy. Pozostaje Ci podjąć decyzje mając na uwadze, ile elementów docelowo znajdzie się na formie.


    Tak prawdę mówiąc "na raz" na pulpicie będzie...hmmm... 6-8 elementów graficznych("graficznych":) - czyt. label z jakimś tam tłem etc)
    Reasumując: duże aplikacje = WPF (?)

    Edit: Mówiąc C# mam na mysli oczywiście WindowsForms.

    0
  • #22 24 Wrz 2014 20:17
    Defice
    Poziom 25  

    Głowy nie dam, ale pewnie nie będziesz widział różnicy przy takiej ilości elementów. Śmiało możesz pozostać przy Windows Form. Jeśli sobie wszystko "ładnie" poustawiasz (tła, buttony itp) oczywiście też będzie wyglądało estetycznie.

    0
  • #23 24 Wrz 2014 20:33
    kafus6
    Poziom 14  

    Czyli się nie dowiemy zanim tego nie napisze :)

    ps. ten twój avatar.... mam wrażenie, że gdy piszesz post to się ze mnie śmiejesz i/lub trollujesz mnie :)

    0
  • #24 24 Wrz 2014 20:40
    Defice
    Poziom 25  

    Raczej wiele pisania mieć nie będziesz, wystarczy, że zbudujesz sobie elementy graficzne, co działo się będzie w tle raczej nie ma większego znaczenia. Będą to proste operacje z tego co pisałeś, jeśli baza załaduje się podczas startu wszystko będzie śmigało.

    A o avatara się nie bój, jakbym coś próbował wykombinować to moderatorzy czuwają i rozdają "nagrody" dla takich pomocników :)

    0
  • #25 24 Wrz 2014 21:44
    kafus6
    Poziom 14  

    Wracając do tematu- jestem w kropce.
    No więc kontynuując:

    Tutaj cały kod, poniżej fragment do wymiany:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Ta pętla foreach wpędzi mnie w depresje:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Problem jest z linijką:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    "Istnieje już skojarzony z tym poleceniem otwarty element DataReader, który należy najpierw zamknąć poleceniem (Command)."
    Niby wiem o co chodzi, no ale jak zamknąć DataReader skoro musi być otwarty ?:)

    Do app.config dodałem nawet MARS'a, ale to nic nie zmienia.
    Edit: Edit: Edit:
    Postanowiłem usunąc połowę tego postu, bo nic nie wnosił.

    0
  • #26 25 Wrz 2014 20:02
    Defice
    Poziom 25  

    Coś tu namieszane w tym kodzie, jeśli możesz wrzuć w załączniku projekt. Poprawie Ci to, ale muszę mieć to otwarte w VS.

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Te linie nie mają sensu. Jeśli wartość bierzesz z DGV, to niepotrzebny Ci reader. On służy do odczytania czegoś z bazy i wrzucenia do np. DGV. A jak masz to już wyświetlone to wrzucasz to do zmiennej tak:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #27 25 Wrz 2014 23:03
    kafus6
    Poziom 14  

    Wiem, namieszałem strasznie.
    poprawiłem i pojawił się kolejny błąd w linii:

    lbl1[i].Text = getValue;

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    W załączniku wysyłam cały projekt w VS.
    Powiem o co chodzi:

    Chiałbym utworzyć Label z Database. Potem ten lbl będzie mi służył do zrobienia Drag&drop do panel'u, ale to już dalszy problem :)

    0
  • #28 25 Wrz 2014 23:27
    marcinj12
    Poziom 40  

    Proponuję najpierw zapoznać się z podstawami obsługi baz danych - co to jest i jak używać SqlCommand, DataTable, jak odczytać coś z bazy, czym się różni ExecuteScalar od ExecuteReader etc, bo na razie widzę mnóstwo błędów typu "zobaczę, co się stanie jak ten kod tu wstawię"...
    Np. ten link albo ten.

    0
  • #29 25 Wrz 2014 23:30
    kafus6
    Poziom 14  

    Marcinie, masz racje- tak trochę działam - po omacku :)

    Posłucham twoich zaleceń i w między czasie poczytam/pooglądam. Chociaż muszę przyznać, że czytanie to jedno, a pisanie to co innego- przynajmniej w moim przypadku.

    Edit: no więc wyedukowałem się i prawie mi wyszło. Pokazuje Labele (3 labele- i to jest ok bo mam 3 wiersze w database) ale takie same- wypełnione pierwszym wierszem.

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Edit:
    ok. ślepy jestem
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    zmieniłem na:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Zastanawia mnie tylko jedna rzecz. Dlaczego/skąd program wie, że ma zmienić(jak on to zmienia) row[0] na row[1] itd.
    a jakbym chciał czytać co drugą? (to tak na przyszłość zebym wiedział)

    Aha, pytanie nr2: jak uniknąć błędu podczas kliknięcia drugi raz na "wczytany" button? "Indeks wykraczał poza granice tablicy."

    0
  • Pomocny post
    #30 26 Wrz 2014 18:01
    marcinj12
    Poziom 40  

    ]

    kafus6 napisał:
    Zastanawia mnie tylko jedna rzecz. Dlaczego/skąd program wie, że ma zmienić(jak on to zmienia) row[0] na row[1] itd.
    a jakbym chciał czytać co drugą? (to tak na przyszłość zebym wiedział)
    Pętla forech automatycznie bierze kolejne wiersze z tabeli i zapisuje je do zmiennej row. To, którą kolumnę ma wczytać, podajesz sam pisząc
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    . Analogicznie, kolejne kolumny to row[1], row[2] etc. - można też odwołać się do nazwy kolumny, tj.
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    etc.

    kafus6 napisał:
    Aha, pytanie nr2: jak uniknąć błędu podczas kliknięcia drugi raz na "wczytany" button? "Indeks wykraczał poza granice tablicy."
    Pisać poprawny kod...
    Takie użycie globalne zmiennych i, r, c, x jest bardzo brzydkie, a jak się do tego nie wie jak je zastosować - prowadzi to do błędów jak w przykładzie... W tym wypadku nie zerujesz zmiennych po kliknięciu przycisku, więc drugie jego kliknięcie startuje od ostatnio ustawionej wartości i indeks wykracza poza tablicę labeli. Ale i tak nie ma żadnych przesłanek, żeby stosować te zmienne globalnie - wystarczy umieścić je w zdarzeniu obsługi przycisku. W dodatku nie ma potrzeby stosowania aż 4 zmiennych - wszystko można załatwić jedną.

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Pomijając bezsensowne użycie tutaj metody ExecuteScalar() i w ogóle wykonywania zapytania w tym miejsc - co jak piszesz poprawiłeś - metoda ToString() nigdy nie da wartości null, więc ten warunek if będzie zawsze spełniony. Jeśli już, porównuj do pustego ciągu znaków: "", string.Empty albo użyj metody string.IsNullOrEmpty()

    0