Publikowałem kiedyś tutorial na temat drag and drop, zebrałem się i postanowiłem rozwinąć ten wątek. Dzisiaj zajmę się bardziej przydatną wersją drag and drop mianowicie będziemy z jednej tabeli przenosić element do drugiej i będziemy mogli to zapisać. Jest to o tyle ciekawe i przydatne, że możemy użyć tego w pracy np przy przydzielaniu pracowników do projektu bądź przydzielaniu jakiegoś ekwipunku pracownikowi. Zaczynamy standardowo od zrobienia nowego projektu. Teraz dodamy lokalną bazę danych:
Przyciskamy next
Można swoją nową bazę danych jakoś nazwać albo zostawić bez zmian. Przyciskamy Finish i tym samym mamy utworzona lokalną bazę danych. teraz naszą bazę trzeba wypełnić tabelami. Aby to zrobić otwieramy „Data explorer” po lewej stronie i znajdujemy naszą bazę danych, rozwijamy ją przyciskamy prawym przyciskiem na folder „Tables” i wybieramy „create table” teraz program powinien przekierować nas na naszą nową tabele.
Wypełniamy ją tak jak poniżej:
Musimy pamiętać o tym aby utworzyć kolumnę id aby można było edytować nasze rekordy, musi ona mieć „Primary key” ustawiony na „yes” musi być typu liczbowego czyli „int” albo „bigint” i najlepiej jeśli zaznaczymy opcje „identity” na „true” będzie wtedy tworzyć się automatycznie a my nie będziemy musieli w nią ingerować. Teraz analogicznie tworzymy dodatkowe dwie tabele:
Zamysł jest taki, mamy tabelę wyposażenie gdzie powpisujemy jakieś wyposażenia pracowników np: młotek, wiertarka. Pracownikowi na początku zmiany przydzielane są te urządzenia i na koniec zmiany oni oddają te wyposażenie :] . Jeśli wszystko poszło dobrze nasz „data explorer” powinien wyglądać tak:
Teraz musimy stworzyć „data sources” dla naszych tabel. przechodzimy do „Data Sources” po lewej stronie:
i przyciskamy „Add new Data sources” zostanie przekierowani na edytor dodawania źródła danych:
Wybieramy nasze tabele i wciskamy Finish.
Teraz nasze tabele są zamontowane do programu.
Trzeba teraz wszystko ładnie na formie poukładać, pododawać przyciski pousuwać zbędne rzeczy. Ja zmieniłem sposób wyświetlania się kolumny wartość tak aby dodawalo mi ” zł” i wyświetlało na środku:
Ostatecznie moja forma wygląda tak:
Jeśli ktoś nie wie jak co dodać zapraszam do lektury wcześniejszych postów. Musimy ustawić naszym DataGrid opcje „AllowDrop” na „true” aby umożliwić przenoszenie elementów, ja tym dwóm datagrid dla pracownika1 i pracownika2 ustawiłem dodatkowo „AllowUserToAddRow” na „false”. Najpierw zajmiemy się opcją przyciskową, naszym zadaniem jest aby po zaznaczeniu wiersza albo wielu wierszy po przyciśnięciu przycisku „>>>” wiersze te przeniosły się do innej tabeli. Jeśli programujemy bazę danych wygląda to trochę inaczej, tutaj idąc na łatwizne jeśli zakotwiczymy do formy bazę danych tabele liczone są odpowiednio:
Trzeba się tylko odwołać do naszej bazy danych czyli w tym wypadku „Database1” i tabeli.
1 2 3 4 5 6 7 8 9 10 |
For Each r As DataGridViewRow In WyposarzenieDataGridView.SelectedRows Dim Drto As DataRow = Database1DataSet1.Tables(0).NewRow For c As Integer = 1 To WyposarzenieDataGridView.ColumnCount - 1 Drto(c) = r.Cells(c).Value Next Database1DataSet1.Tables(0).Rows.Add(Drto) WyposarzenieDataGridView.Rows.Remove(r) Next |
Funkcja dla każdego wybranego wiersz będzie najpierw tworzyła nowy wiersz w tabeli pracownik1, następnie będzie kopiowała wartości i wklejała je do nowego wiersza, i tutaj bardzo ważny szczegół, ponieważ nawet jeśli kolumny są niewidoczne i tak są widoczne dla funkcji. Dlatego moja funkcja for dla elementu „c” zaczyna się od „1” aby pominąć kolumnę „id” która ma numer 0, można by było też usunąc -1 dla ColumnCount. W moim zamyśle jest aby tabela sama przypisywała sobie id, problem mógłby się pojawić jeśli przenieśliśmy wiersz z jednej tabeli do drugiej i id byłby takie same, taka sytuacja nie może mieć miejsca i program wywali nam błąd. Następne elementy Dodają wartości do wierszy i usuwają wiersz z tabeli „wyposażenie”. Teraz powtarzamy nauke dla każdego przycisku:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click For Each r As DataGridViewRow In WyposarzenieDataGridView.SelectedRows Dim Drto As DataRow = Database1DataSet1.Tables(0).NewRow For c As Integer = 1 To WyposarzenieDataGridView.ColumnCount - 1 Drto(c) = r.Cells(c).Value Next Database1DataSet1.Tables(0).Rows.Add(Drto) WyposarzenieDataGridView.Rows.Remove(r) Next End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click For Each r As DataGridViewRow In Pracownik1DataGridView.SelectedRows Dim Drto As DataRow = Database1DataSet1.Tables(2).NewRow For c As Integer = 1 To Pracownik1DataGridView.ColumnCount - 1 Drto(c) = r.Cells(c).Value Next Database1DataSet1.Tables(2).Rows.Add(Drto) Pracownik1DataGridView.Rows.Remove(r) Next End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click For Each r As DataGridViewRow In WyposarzenieDataGridView.SelectedRows Dim Drto As DataRow = Database1DataSet1.Tables(1).NewRow For c As Integer = 1 To WyposarzenieDataGridView.ColumnCount - 1 Drto(c) = r.Cells(c).Value Next Database1DataSet1.Tables(1).Rows.Add(Drto) WyposarzenieDataGridView.Rows.Remove(r) Next End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click For Each r As DataGridViewRow In Pracownik2DataGridView.SelectedRows Dim Drto As DataRow = Database1DataSet1.Tables(2).NewRow For c As Integer = 1 To Pracownik2DataGridView.ColumnCount - 1 Drto(c) = r.Cells(c).Value Next Database1DataSet1.Tables(2).Rows.Add(Drto) Pracownik2DataGridView.Rows.Remove(r) Next End Sub |
U mnie to wyglądało tak. Odpalamy i sprawdzamy jak to działa. Powinno działać. Teraz dodamy możliwość „Drag and Drop” . Aby to zrobić musimy dodać „Event” do naszych datagrid, można skopjować ze strony albo poszukać w opcjach Datagrid. Należy w tym celu zaznaczyć interesujący nas „DataGrid” w prawym dolnym rogu pokaże się nam jego „Properties” Znajdujemy ikonkę z piorunem i przyciskamy ją teraz jesteśmy w „event’ach” znajdujemy „DragEnter” przyciskamy dwukrotnie i program sam utworzy suba i przeniesie nas do kodowania. tam wpisujemy:
1 2 3 4 5 6 7 |
Private Sub Pracownik1DataGridView_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Pracownik1DataGridView.DragEnter e.Effect = DragDropEffects.All End Sub Private Sub Pracownik2DataGridView_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Pracownik2DataGridView.DragEnter e.Effect = DragDropEffects.All End Sub |
Powtarzamy czynność i znajdujemy event „DragDrop” i wpisujemy to co wpisywaliśmy dla przycisku:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Private Sub Pracownik1DataGridView_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Pracownik1DataGridView.DragDrop For Each r As DataGridViewRow In WyposarzenieDataGridView.SelectedRows Dim Drto As DataRow = Database1DataSet1.Tables(0).NewRow For c As Integer = 1 To WyposarzenieDataGridView.ColumnCount - 1 Drto(c) = r.Cells(c).Value Next Database1DataSet1.Tables(0).Rows.Add(Drto) WyposarzenieDataGridView.Rows.Remove(r) Next End Sub Private Sub Pracownik2DataGridView_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Pracownik2DataGridView.DragDrop For Each r As DataGridViewRow In WyposarzenieDataGridView.SelectedRows Dim Drto As DataRow = Database1DataSet1.Tables(1).NewRow For c As Integer = 1 To WyposarzenieDataGridView.ColumnCount - 1 Drto(c) = r.Cells(c).Value Next Database1DataSet1.Tables(1).Rows.Add(Drto) WyposarzenieDataGridView.Rows.Remove(r) Next End Sub |
Teraz musimy tylko dodać dodatkowy event dla naszego „WyposażenieDatagrid” aby można było przenosić całe wiersze, nie chcemy przenosić przecież samych komórek. Znajdujemy znowu event tym razem „MouseDown” i wpisujemy:
1 2 3 4 5 6 |
Private Sub WyposarzenieDataGridView_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles WyposarzenieDataGridView.MouseDown If WyposarzenieDataGridView.SelectedRows.Count = 0 Then Exit Sub End If WyposarzenieDataGridView.DoDragDrop(WyposarzenieDataGridView.SelectedRows(0), DragDropEffects.All) End Sub |
Teraz możemy przenosić nasze wiersze. Dla przycisków „zapisz” wstawiłem opcje:
1 2 3 4 5 |
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click Me.Validate() Me.WyposarzenieBindingSource.EndEdit() Me.TableAdapterManager.UpdateAll(Me.Database1DataSet1) End Sub |
Dla przycisku Odśwież
1 2 3 |
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click Form1_Load(Me, Nothing) End Sub |
Zapraszam do komentowania :] mam nadzieje, że komuś pomogłem. Zapraszam do przeczytania toturiali
Drag and Drop i Licznik też używane są tam podobne opcje jak w tym tutorialu więc może tam znajdziecie coś co wam pomoże.
Program do pobrania DragAndDrop2
Pozdrawiam i życzę przyjemnej lektury.
1 |