BindingSource DataGridView LINQ a prezentacja danych

0

Witajcie,

chciałbym prosić Was o pomoc.
Mam przykładowo 2 tabele:
Miejscowość(która zawiera: Id, Nazwa)
Osoba(która zawiera: Id, Nazwisko, Id miejscowości).
Przez LINQ to SQL pobieram dane z bazy, wiąże je poprzez BindingSource z DataGridView. Tabla Osoby wyświetla mi takie coś:

Id Nazwisko Id Miejscowości
1 Kowalski 1
itd.

Chciałbym żeby zamiast Id miejscowości wyświetlała mi się jej nazwa, jednak z możliwością zachowania możliwości edytowania/dodawania/usuwania danych poprzez DataGridView w bazie danych. Z początku zrobiłem tak:

var query = db.Osoby.Select(os => new 
{ 
    Id = os.Id, 
    Nazwisko = os.Nazwisko, 
    Miejscowosc = db.Miejscowosci.Where(m => m.Id == os.IdMiejscowosci).Select(m => m.Nazwa).Single()
}); 

I tak przygotowane dane wiązałem z DataGridView. Niestety przez to traciłem możliwość łatwej edycji bezpośrednio właśnie z DataGriedView. Co byście poradzili? Czy istnieje możliwość poprawnej prezentacji danych wraz możliwością zachowania bezpośredniego bindingu baza<->grid?
Oczywiście podane dane są przykładowe, tabele w rzeczywistości są trochę bardziej skomplikowane.
Będę wdzięczny za podpowiedzi.

0

No ja bym raczej pomyślał w kierunku umieszczenia w gridzie kolumny typu ComboBox dla miejscowości. Musiałaby ona jako Value mieć Osoba.IdMiejscowosci, a jako Text Miejscowosc.Nazwa. Wówczas wybierałbyś z comboboxa miejscowość po nazwie, ale cały czas operował na obiekcie typu Osoba i jemu zmieniał właściwość Miejscowość lub IdMiejscowości. W zasadzie, to jeśli użyjesz BindingSourców, to wystarczy zrobić DataContext.SubmitChanges i zmiany się same zapiszą.

0

Odpowiedź somekind z mojego punktu widzenia jest jak najbardziej ok.

Innym wyjściem byłoby zwrócenie 2 tabel z join tyle, że wtedy miałbyś w tabeli zarówno id miejscowości jak i jej nazwę, oraz musiałbyś odświeżać po edycji nazwę miejscowości, co nie jest optymalne.

aaa i zamiast

Miejscowosc = db.Miejscowosci.Where(m => m.Id == os.IdMiejscowosci).Select(m => m.Nazwa).Single()

polecam użyć (łatwiej i logiczniej)

Miejscowosc = db.Miejscowosc.Signle(m=>m.id == os.IdMiejscowosci).Nazwa;

0

@up - co do Single, to masz rację, ale jeśli @qwass użyje BindingSourców, to w ogóle żadnego Where ani Single nie będzie musiał używać, wszystko będzie automagiczne.

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