DataSet - relacja po kolumnie, w której w większości przypadków wartość jest null

0

Witam.
Wstępnie chciałbym zaznaczyć, że próbuje ogarnąć master-detail w DevExpress. Można to w prosty sposób uzyskać tworząc relację w DataSet. No właśnie... Nie taki prosty.

Mam tabele Towary, które mogą być towarami złożonymi i tabele Recepty, które przechowują składniki jakie wchodzą w skład towaru złożonego. Lista towarów jest głównym gridem, a lista składników jest tym master-detail. Problem jest w tym, że kolumna po której tworze relacje, jest często NULL, ponieważ towar nie jest złożony, lub jest usługą. Nie mogę zrobić warunku, aby pokazywał tylko złożone, ponieważ potrzebuje wyświetlać wszystkie.

DataSet ds = GetDataSet();
GridColumn gcTowary = ds.Tables["Towary"].Columns["ReceptaID"];
GridColumn gcRecepty = ds.Tables["Recepty"].Columns["ReceptaID"];

ds.Relations.Add("TowaryRecepty", gcTowary, gcRecepty); // <-- wyjątek, że klucz nie jest unikatowy

Dodanie opcji AllowDBNull na kolumnie nic nie daje. Jest jakiś sposób na obejście tego?

0

Ja podłączam list z list do grida i działa. Jesli masz model dla widoku z listami to ladukesz go do BindingSourse i ten bs do grida.
Działa lepiej jeśli kolekcje to zwykle List<>.

Jak jakiś master rekord nie ma details to nie ma i już. Wystarczy się ikoną z plusem do rozwijania detale.

0

No właśnie problem w tym, że przykład na DevExpresie jest tylko z DataSet. Te całe łączenie relacją miało automatycznie ładować grida z master-details, który jest level niżej. Mam modele i miałem na początku listy wyciągane dapperem i walczyłem z grupowaniem tego, kiepski rezultat. Później wpadłem na to rozwiązanie i kombinuje. Mógłbyś zarzucić przykładem jak ustawić DataSource do master-details? On jest typu GridView, a jego DataSource jest tylko get. Czy to znaczy, że wiersze muszę generować ręcznie?

1

Tak ma szybko z fona to.
Masz listę obiektów master. Te obiekty mają w środku listę detailsa.
Wstawiasz na formę komponent BindingSource
Podpinasz W kodzie listę obiektów master do BindingSourse.datasouurce. BindingSoource ustawiasz w gridzie jako datasource. Tyle. Typowo grid powinien pokazać wszystkie listy details jakie znajdzie w obiektach master. Można to ustawić, zeby pokazywał tylko zdefiniowane gv dla details.
To nie jest konieczne ale możesz dodać do grida drugi level GridView o nazwać go tak jak property z listą details w obiekcie master.

0

Działa, dzięki wielkie ;)

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