Przejdź do treści

Mechanizm drag&drop

W technologii Neos istnieje możliwość przeciągania i upuszczania jednych obiektów na inne. W szczególności obiekt może reagować na elementy, które są na niego upuszczane. Aby to zrealizować należy zdefiniować w obiekcie akcję. W polu "Wykonaj tę akcję jako drop z:" należy wskazać obiekt źródłowy, na przeciągnięcie z którego akcja będzie reagowała (tak jak to zostało pokazane z prawej strony). Należy zwrócić uwagę na to, że akcja musi mieć "Widoczność akcji" ustawioną na "Tak". W przeciwnym razie, nie będzie działać. Można też zdefiniować metodę na widoczność akcji, która wpłynie w sposób dynamiczny na to, czy dana akcja drag&drop będzie aktywna, czy nie.

Metoda wykonawcza tak zdefiniowanej akcji będzie uruchamiana, gdy na obiekt będą upuszczane elementy. Metoda jako this otrzymuje docelowy rekord, na który coś upuszczono. Aby dostać się do rekordu źródłowego, z którego zainicjowano drag&drop użyj metod GetDropSourceField(...) lub GetDropSourceObject(...).

GetDropSourceField(string parametr)

Zwraca wartość pola dla rekordu będącego źródłem bieżącej operacji drag&drop. Jeśli parametr jest pusty, zostanie wybrane pierwsze pole klucza głównego

string uuid = GetDropSourceField("UUID");

Uwaga!

Wartości są dostępne jedynie dla pól klucza głównego.

GetDropSourceObject()

Funkcja zwraca obiekt(rekord), który został przeciągnięty w wyniku drag&drop. Jeśli w gridzie obiektu A klikniemy w wiersz i przeciągniemy go do grida obiektu B to funkcja GetDropSourceObject zwróci obiekt, który będzie rekordem grida A.

Uwaga!

Zwrócony obiekt będzie posiadał tylko pola śledzone, tzn. tylko te, które widoczne są w Neos Inspector

Note

Definiując akcję na drag&drop, jako obiekt źródłowy można podać ten sam obiekt, co obiekt w którym definiujemy akcję. Spowoduje to obsłużenie drag&drop w ramach tego samego obiektu. Zadziała to zarówno dla przeciągania rekordów w obrębie jednego grida, jak i w dwóch różnych oknach tego samego obiektu.

W takim wypadku należy używać jedynie funkcji GetDropSourceField(), gdyż funkcja GetDropSourceObject() nie działa prawidłowo, gdyż zwróci ten sam obiekt co this.

Mechanizm drag&drop dla wielu rekordów

Jeśli chcesz obsłużyć drag&drop w taki sposób, aby po zaznaczeniu kilku rekordów w obiekcie źródłowym przeciągnąć je wszystkie na obiekt docelowy, należy akcję na drop oprogramować w następujący sposób:

public void DropSingleOrMultipleRecords()
{
  MOJOBIEKT source = (MOJOBIEKT)GetDropSourceObject();
  if(source==null) //null może być z GetDrop...()
    return;
  if(source.SelectedRows.Count > 0) { //zaznaczono wiele rekordów
    foreach(var item in source.SelectedRows)
    {
      DoSomething(item["REF"],this.REF); //pierwszy parametr to REF rekordu źródła, a drugi to REF celu
    }
    source.DeselectAllRecords(); // odznacz obsłużone rekordy
  } else { // tylko bieżący rekord
    var sourceREF = GetDropSourceField("REF");//(***)source.REF mógł się już zmienić
    DoSomething(sourceREF,this.REF); //pierwszy parametr to REF rekordu źródła, a drugi to REF celu
  }
  RefreshData(); // odśwież dane w obiekcie docelowym
  source.RefreshData(); // odśwież dane źródła
}  

Note

Na wyjaśnienie zasługuje fakt użycia GetDropSourceField w miejscu oznaczonym (***). W przypadku gdy mamy formę na której mamy osadzone okno obiektu detail, jeżeli przeciągamy wiersze z detaila na mastera nie możemy w tym miejscu skorzystać z source.REF, ponieważ w momencie upuszczania na mastera, zmienia się bieżący rekord mastera, co za tym idzie są wczytane inne obiekty detaila i również bieżący rekord detaila ulega zmianie, w związku z czym source.REF ma już nową wartość. Użycie metody GetDropSourceField gwarantuje, że otrzymamy wartości oryginalnego rekordu detaila, który przesuwamy. W przypadku multiselekcji ten problem nie występuje, bo w kolekcji SelectedRecords dane się nie zmieniają.

Mechanizm drag&drop w drzewie

Jeśli prezentujesz dane w drzewie możesz korzystać z mechanizmu drag&drop w taki sposób jak opisano powyżej. Warunkiem jednak jest zaznaczenie w Neos Expercie w definicji okna, że komponent drzewa obsługuje drag&drop.

Jeśli przeciągasz coś na drzewo, to w zależności od miejsca upuszczenia możesz zdecydować, czy element przeciągasz pod bieżący element (niebieska ikonka) albo jako dziecko bieżącego elementu (żółta ikonka). W metodzie odczytujesz sposób upuszczenia przy pomocy właściwości:

this.DropMode

W drzewie można także obsługiwać ten mechanizm w sposób uproszczony. Jeśli drzewo ma wskazane pole klucza i pole rodzica i zaznaczony znacznik, że komponent drzewa obsługuje drag&drop ale nie będzie żadnej zdefiniowanej akcji obsługującej drag&drop z tego samego obiektu, to przeciąganie rekordów w obrębie tego samego drzewa będzie wpływało na zmianę wartości pola rodzica w taki sposób, aby przeciąganie dało wrażenie przemieszczania elementów w drzewie.