DevExpress - GridLookUpEdit - pobieranie źródła danych

0

Cześć,

Wykorzystuję komponenty DevExpress.

Mam dwie tablice - pierwsza ma dwa pola, druga również.

Chcę zrobić GridControl z GridView oraz trzema kolumnami, gdzie pierwsze dwie kolumny to będzie lista danych z tablicy numer 1 z bazy danych - tablica 1 składa się z dwóch pól. Pierwsze pole to marka pojazdu, drugie to opis pojazdu.

Trzecia kolumna to kontrolka GridLookUpEdit - gdzie źródłem danych będzie SELECT do tablicy drugiej, w której polami są marka pojazdu (która występuje w tablicy 1) oraz kolory dostępne pojazdu.

I teraz mechanika działania - dla danej kolumny 1 (marka pojazdu) - należy w GridLookUpEdit (3 kolumna) pobrać dostępne kolory dla danego pojazdu z kolumny 1.

Jak to najlepiej wykonać? Poratujecie?

Dziękuję.

0
AdamWox napisał(a):

Wszystko jest na DevExpressie, trzeba tylko szukać po angielsku

podany przez Ciebie przykład nie spełnia moich oczekiwań - tam jest jedno źródło danych do każdego wiersza, ja potrzebuję różne źródła danych w GridLookUpEdit na podstawie tego co jest w 1 kolumnie

2

No ale jaki to problem zmodyfikować przykład pod siebie? Zwyczajnie LookUpEdit.DataSource przyjmie pofiltrowane dane na podstawie pierwszej kolumny. DevExpress poleca, aby wczytać wszystkie opcje do kolumny z LookUpEdit i filtrować w momencie kiedy pojawi dropdown - event EditorShown

How to filter LookUpEdit data based on a value in another column in grid
How to dynamically change LookUpEdit's data source based on a selected row

2

W skrócie:

  1. BindingSource bsCars z samochodami (klasa Car ma pola Id, Marka, Opis, ColorId).

  2. BindingSource bsColors dla kolorów (Klasa Color ma pola Id, Name)

  3. Tabela w DB z konfiguracją dostępnych kolorów dla marek. Będzie wykorzystywana w filtrowaniu kolorów dla marki

  4. W gridzie podpiętym do bsCars ma kolumny Id, Marka, Opis, ColorId.

  5. Dla kolumny ColorId dodajesz LookUpEdit dla edycji.

  6. LookUpEdit ma mieć ustawione:
    DataSource -> bsColors,
    DisplayMember -> Name,
    KeyMember -> Id,
    ValueMember -> Id.

  7. LookUpEdit ma mieć zdefiniowane zdarzeni QueryPopup i CLoseUp.

  8. W QueryPopup definiujesz logikę filtrowania kolorów dla wpisamej wcześniej marki. Jeśli marki nie ma to cośtam (np. lista się nie rozwija). Tu moze być zapytanie do DB o kolory dostępne dla marki albo jakieś filtrowanie istniejącego zbioru.

  9. W QueryClose ma być z powrotem załądowanie do bsColors wszystkich kolorów.

Ogólnie to trik polega na tym, że w zdarzeniu QueryPopup dla LookUpEdit-a ograniczasz to co ma być widoczne na liście a w QueryCLose z powrotem ładujesz wszystko, żeby wszystkie kolory były dostępne dla rekordów w gridzie bo każdy rekord może mieć inne ColorId.

Tu przykład

https://github.com/JacekCzapla/DxGridLookupExample.git

Edit

To jest projekt w VS 2015 WinForms na .NET Framework. DX w wersji 16.1 (chyba). Pewnie będziesz musiał zaktualizowąć DX Project Converterm.

Szukanie kolorów po Marka to zły pomysł. Powinna być raczej tabela z Markami samochodów Marki(Id, Marka) i sam samochód miałby Id, MarkaId, Opis, ColorId...

1

W pkt 8 powinno być zdarzenie CloseUp a nie QueryClose.

Co to znaczy u Ciebie "opuści pole LookUp"? ClosePopup?

Zapis rekordu powinien do DB być w RowUpdated.

Jesli do BD zapisze się ColorId w rekordze samochodu to (znowu) jeśli bsColors ma załadowane wszystkie kolory to kolor powinien się pojawić bez żadnego wyszukiwania.

Pokaż kod Twoich zdarzeń lookup-a i grida. A Najlepiej całego Form-a jeśli nie jest zbyt duży.

1

GridLookup będzie wymagał takiego samego filtrowania kolorów w momencie rozwinięcia (pokazania).

Użycie Leave jest złym pomysłem bo zapisuje Ci rekord, który wcale nie musi być jeszcze zapisany bo np. możesz chcieć dodać opis po ustawieniu marki i koloru.

1

Pisz normalnie w wiadomościach a nie w komentarzach jeśli to jest na temat.
Jakie 2 kolumny w Gridzie? Ja mam 3 kolumny. Marka, Opis i ColorId. Czy u CiebieSamochód ma w tabeli w DB ColorId?

Jak gadasz z bazą danych? W moim przykładzie bsCars przyjmuje listę samochodów. Możesz pobrać samochody z DB, Zmapować na List<Car> i przypisać do bsCars.DataSource.

Pokaż jak pobierasz z DB dane samochodów, kolorów i konfigurację jakie kolory są dostępna dla jakich marek.

Ogólnie zamiast

public Form1()
        {
            InitializeComponent();
            
            Colors = CreateColors();
            ColoryDlaMarki = CreateKoloryDlaMarki();

            bsCars.DataSource = Cars;
            bsColors.DataSource = Colors;
        }

Można tak

public Form1()
        {
            InitializeComponent();
            
            LoadColors();
            LoadCars();
        }
private void LoadCars()
{
  var cars = ... //tu odczyt danych z DB i utworzenie List<Car> cars
  bsCars.DataSOurce = cars;
}

private void LoadColors()
{
  var colors = ... //tu odczyt kolorów z DB i utworzenie List<Color> 
  bsColors.DataSOurce = colors;
}

Nie napiszę przykładu z bazą bo nie chce mi się robić bazy. Dla mnie odczyt z bazy to _db_Cars.ToList(); albo _carService.GetCars();

0

@jacek.placek:

tworzę sobie obiekt LINQ dbml mapuję tablicę, której chcę użyć - później metoda z zapytaniem: (nazwy nieco przerobione) - przy debugowaniu widzę, że zwraca prawidłowo dane z tablicy, ale dodaje puste rekordy do GridView (w momencie jak rozpocznę wprowadzać z ręki tekst i przejdę do następnej komórki to usuwa wprowadzoną wartość)

var _bsCars = dbContex.Select(x => new WybierzKolory { nazwa = x.nazwa, opis = x.opis }).ToList();
            bsCars.DataSource = _bsCars;

1

Pokaż jakie masz tabele w bazie danych. Zaczynam tracić cierpliwość.

0

@jacek.placek: jeszcze pytanko jedno, zamiast źródeł danych, które Ty użyłeś w przykładzie określiłem sobie zapytanie do bazy i przypisuję : bsColors.DataSource = colors (w QueryPopUp) - mechanizm filtruje dane poprawnie, ale gdy opuszczę pole to wartość jest usuwana - co powinienem wykonać, aby po wyborze wartości w kontrolce gridlookupedit ona została w polu?

0

Skąd ja mam wiedzieć jak nie widzę kodu?

0

@jacek.placek: jeszcze kluczowe pytanie dotyczące zbioru danych, jeśli posiadam źródło danych i na nich się opieram definiując odpowiednie kolory, ale w jednym przypadku chcę użyć wpisania koloru innego niż w źródle danych, ale nie chcę go dodawać do źródła, jak to najlepiej i najłatwiej rozwiązać?

1

W prosty sposób się nie da. Jeśli w gridzie masz RepositoryLookupEdit podpięty pod kolumnę to to co się wyświetla w tabeli to element ze zbioru wartości podpiętego do LookupEdit. Więc wszystkie wartości powinny być w słowniku kolorów.

Można coś kombinować. Jak ładujesz kolory z DB do listy (zbioru) dla LookupEdit to trzeba by też odczytać wszystkie kolory w samochodach i jeśli w liście dla LokkupEdit jakiegoś nie ma (tego wyjątkowego) to dodać go ręcznie. Paskudne ale może działać. Szczególnie, ze Ty chyba masz powiązanie nie przez id tylko wartość koloru.

0
jacek.placek napisał(a):

W prosty sposób się nie da. Jeśli w gridzie masz RepositoryLookupEdit podpięty pod kolumnę to to co się wyświetla w tabeli to element ze zbioru wartości podpiętego do LookupEdit. Więc wszystkie wartości powinny być w słowniku kolorów.

Można coś kombinować. Jak ładujesz kolory z DB do listy (zbioru) dla LookupEdit to trzeba by też odczytać wszystkie kolory w samochodach i jeśli w liście dla LokkupEdit jakiegoś nie ma (tego wyjątkowego) to dodać go ręcznie. Paskudne ale może działać. Szczególnie, ze Ty chyba masz powiązanie nie przez id tylko wartość koloru.

jesteś w stanie podać mały przykład? będę wdzięczny, dziękuję

edit - zrobiłem

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